blob: 2d6f057aa7038ae0fa7e4cc43934e9dd5efeca0c [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 *
buzbee76833da2016-01-13 13:06:22 -08002016 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002017 *
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
buzbee1452bee2015-03-06 14:43:04 -08002036 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002037 GOTO_OPCODE ip @ jump to next instruction
2038
2039/* ------------------------------ */
2040 .balign 128
2041.L_op_aget_wide: /* 0x45 */
2042/* File: arm/op_aget_wide.S */
2043 /*
2044 * Array get, 64 bits. vAA <- vBB[vCC].
2045 *
2046 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2047 */
2048 /* aget-wide vAA, vBB, vCC */
2049 FETCH r0, 1 @ r0<- CCBB
2050 mov r9, rINST, lsr #8 @ r9<- AA
2051 and r2, r0, #255 @ r2<- BB
2052 mov r3, r0, lsr #8 @ r3<- CC
2053 GET_VREG r0, r2 @ r0<- vBB (array object)
2054 GET_VREG r1, r3 @ r1<- vCC (requested index)
2055 cmp r0, #0 @ null array object?
2056 beq common_errNullObject @ yes, bail
2057 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2058 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2059 cmp r1, r3 @ compare unsigned index, length
2060 bcs common_errArrayIndex @ index >= length, bail
2061 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2062 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2063 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2064 GET_INST_OPCODE ip @ extract opcode from rINST
2065 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3
2066 GOTO_OPCODE ip @ jump to next instruction
2067
2068/* ------------------------------ */
2069 .balign 128
2070.L_op_aget_object: /* 0x46 */
2071/* File: arm/op_aget_object.S */
2072 /*
2073 * Array object get. vAA <- vBB[vCC].
2074 *
2075 * for: aget-object
2076 */
2077 /* op vAA, vBB, vCC */
2078 FETCH_B r2, 1, 0 @ r2<- BB
2079 mov r9, rINST, lsr #8 @ r9<- AA
2080 FETCH_B r3, 1, 1 @ r3<- CC
2081 EXPORT_PC
2082 GET_VREG r0, r2 @ r0<- vBB (array object)
2083 GET_VREG r1, r3 @ r1<- vCC (requested index)
2084 bl artAGetObjectFromMterp @ (array, index)
2085 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
2086 PREFETCH_INST 2
2087 cmp r1, #0
2088 bne MterpException
2089 SET_VREG_OBJECT r0, r9
2090 ADVANCE 2
2091 GET_INST_OPCODE ip
2092 GOTO_OPCODE ip @ jump to next instruction
2093
2094/* ------------------------------ */
2095 .balign 128
2096.L_op_aget_boolean: /* 0x47 */
2097/* File: arm/op_aget_boolean.S */
2098/* File: arm/op_aget.S */
2099 /*
2100 * Array get, 32 bits or less. vAA <- vBB[vCC].
2101 *
2102 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2103 * instructions. We use a pair of FETCH_Bs instead.
2104 *
buzbee76833da2016-01-13 13:06:22 -08002105 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002106 *
2107 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2108 * If this changes, specialize.
2109 */
2110 /* op vAA, vBB, vCC */
2111 FETCH_B r2, 1, 0 @ r2<- BB
2112 mov r9, rINST, lsr #8 @ r9<- AA
2113 FETCH_B r3, 1, 1 @ r3<- CC
2114 GET_VREG r0, r2 @ r0<- vBB (array object)
2115 GET_VREG r1, r3 @ r1<- vCC (requested index)
2116 cmp r0, #0 @ null array object?
2117 beq common_errNullObject @ yes, bail
2118 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2119 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2120 cmp r1, r3 @ compare unsigned index, length
2121 bcs common_errArrayIndex @ index >= length, bail
2122 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2123 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2124 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002125 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002126 GOTO_OPCODE ip @ jump to next instruction
2127
2128
2129/* ------------------------------ */
2130 .balign 128
2131.L_op_aget_byte: /* 0x48 */
2132/* File: arm/op_aget_byte.S */
2133/* File: arm/op_aget.S */
2134 /*
2135 * Array get, 32 bits or less. vAA <- vBB[vCC].
2136 *
2137 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2138 * instructions. We use a pair of FETCH_Bs instead.
2139 *
buzbee76833da2016-01-13 13:06:22 -08002140 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002141 *
2142 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2143 * If this changes, specialize.
2144 */
2145 /* op vAA, vBB, vCC */
2146 FETCH_B r2, 1, 0 @ r2<- BB
2147 mov r9, rINST, lsr #8 @ r9<- AA
2148 FETCH_B r3, 1, 1 @ r3<- CC
2149 GET_VREG r0, r2 @ r0<- vBB (array object)
2150 GET_VREG r1, r3 @ r1<- vCC (requested index)
2151 cmp r0, #0 @ null array object?
2152 beq common_errNullObject @ yes, bail
2153 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2154 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2155 cmp r1, r3 @ compare unsigned index, length
2156 bcs common_errArrayIndex @ index >= length, bail
2157 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2158 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2159 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002160 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002161 GOTO_OPCODE ip @ jump to next instruction
2162
2163
2164/* ------------------------------ */
2165 .balign 128
2166.L_op_aget_char: /* 0x49 */
2167/* File: arm/op_aget_char.S */
2168/* File: arm/op_aget.S */
2169 /*
2170 * Array get, 32 bits or less. vAA <- vBB[vCC].
2171 *
2172 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2173 * instructions. We use a pair of FETCH_Bs instead.
2174 *
buzbee76833da2016-01-13 13:06:22 -08002175 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002176 *
2177 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2178 * If this changes, specialize.
2179 */
2180 /* op vAA, vBB, vCC */
2181 FETCH_B r2, 1, 0 @ r2<- BB
2182 mov r9, rINST, lsr #8 @ r9<- AA
2183 FETCH_B r3, 1, 1 @ r3<- CC
2184 GET_VREG r0, r2 @ r0<- vBB (array object)
2185 GET_VREG r1, r3 @ r1<- vCC (requested index)
2186 cmp r0, #0 @ null array object?
2187 beq common_errNullObject @ yes, bail
2188 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2189 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2190 cmp r1, r3 @ compare unsigned index, length
2191 bcs common_errArrayIndex @ index >= length, bail
2192 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2193 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2194 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002195 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002196 GOTO_OPCODE ip @ jump to next instruction
2197
2198
2199/* ------------------------------ */
2200 .balign 128
2201.L_op_aget_short: /* 0x4a */
2202/* File: arm/op_aget_short.S */
2203/* File: arm/op_aget.S */
2204 /*
2205 * Array get, 32 bits or less. vAA <- vBB[vCC].
2206 *
2207 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2208 * instructions. We use a pair of FETCH_Bs instead.
2209 *
buzbee76833da2016-01-13 13:06:22 -08002210 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002211 *
2212 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2213 * If this changes, specialize.
2214 */
2215 /* op vAA, vBB, vCC */
2216 FETCH_B r2, 1, 0 @ r2<- BB
2217 mov r9, rINST, lsr #8 @ r9<- AA
2218 FETCH_B r3, 1, 1 @ r3<- CC
2219 GET_VREG r0, r2 @ r0<- vBB (array object)
2220 GET_VREG r1, r3 @ r1<- vCC (requested index)
2221 cmp r0, #0 @ null array object?
2222 beq common_errNullObject @ yes, bail
2223 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2224 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2225 cmp r1, r3 @ compare unsigned index, length
2226 bcs common_errArrayIndex @ index >= length, bail
2227 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2228 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2229 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002230 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002231 GOTO_OPCODE ip @ jump to next instruction
2232
2233
2234/* ------------------------------ */
2235 .balign 128
2236.L_op_aput: /* 0x4b */
2237/* File: arm/op_aput.S */
2238 /*
2239 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2240 *
2241 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2242 * instructions. We use a pair of FETCH_Bs instead.
2243 *
2244 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2245 *
2246 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2247 * If this changes, specialize.
2248 */
2249 /* op vAA, vBB, vCC */
2250 FETCH_B r2, 1, 0 @ r2<- BB
2251 mov r9, rINST, lsr #8 @ r9<- AA
2252 FETCH_B r3, 1, 1 @ r3<- CC
2253 GET_VREG r0, r2 @ r0<- vBB (array object)
2254 GET_VREG r1, r3 @ r1<- vCC (requested index)
2255 cmp r0, #0 @ null array object?
2256 beq common_errNullObject @ yes, bail
2257 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2258 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2259 cmp r1, r3 @ compare unsigned index, length
2260 bcs common_errArrayIndex @ index >= length, bail
2261 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2262 GET_VREG r2, r9 @ r2<- vAA
2263 GET_INST_OPCODE ip @ extract opcode from rINST
2264 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2265 GOTO_OPCODE ip @ jump to next instruction
2266
2267/* ------------------------------ */
2268 .balign 128
2269.L_op_aput_wide: /* 0x4c */
2270/* File: arm/op_aput_wide.S */
2271 /*
2272 * Array put, 64 bits. vBB[vCC] <- vAA.
2273 *
2274 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2275 */
2276 /* aput-wide vAA, vBB, vCC */
2277 FETCH r0, 1 @ r0<- CCBB
2278 mov r9, rINST, lsr #8 @ r9<- AA
2279 and r2, r0, #255 @ r2<- BB
2280 mov r3, r0, lsr #8 @ r3<- CC
2281 GET_VREG r0, r2 @ r0<- vBB (array object)
2282 GET_VREG r1, r3 @ r1<- vCC (requested index)
2283 cmp r0, #0 @ null array object?
2284 beq common_errNullObject @ yes, bail
2285 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2286 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2287 cmp r1, r3 @ compare unsigned index, length
2288 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2289 bcs common_errArrayIndex @ index >= length, bail
2290 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2291 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1
2292 GET_INST_OPCODE ip @ extract opcode from rINST
2293 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2294 GOTO_OPCODE ip @ jump to next instruction
2295
2296/* ------------------------------ */
2297 .balign 128
2298.L_op_aput_object: /* 0x4d */
2299/* File: arm/op_aput_object.S */
2300 /*
2301 * Store an object into an array. vBB[vCC] <- vAA.
2302 */
2303 /* op vAA, vBB, vCC */
2304 EXPORT_PC
2305 add r0, rFP, #OFF_FP_SHADOWFRAME
2306 mov r1, rPC
2307 mov r2, rINST
2308 bl MterpAputObject
2309 cmp r0, #0
2310 beq MterpPossibleException
2311 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2312 GET_INST_OPCODE ip @ extract opcode from rINST
2313 GOTO_OPCODE ip @ jump to next instruction
2314
2315/* ------------------------------ */
2316 .balign 128
2317.L_op_aput_boolean: /* 0x4e */
2318/* File: arm/op_aput_boolean.S */
2319/* File: arm/op_aput.S */
2320 /*
2321 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2322 *
2323 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2324 * instructions. We use a pair of FETCH_Bs instead.
2325 *
2326 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2327 *
2328 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2329 * If this changes, specialize.
2330 */
2331 /* op vAA, vBB, vCC */
2332 FETCH_B r2, 1, 0 @ r2<- BB
2333 mov r9, rINST, lsr #8 @ r9<- AA
2334 FETCH_B r3, 1, 1 @ r3<- CC
2335 GET_VREG r0, r2 @ r0<- vBB (array object)
2336 GET_VREG r1, r3 @ r1<- vCC (requested index)
2337 cmp r0, #0 @ null array object?
2338 beq common_errNullObject @ yes, bail
2339 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2340 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2341 cmp r1, r3 @ compare unsigned index, length
2342 bcs common_errArrayIndex @ index >= length, bail
2343 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2344 GET_VREG r2, r9 @ r2<- vAA
2345 GET_INST_OPCODE ip @ extract opcode from rINST
2346 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2347 GOTO_OPCODE ip @ jump to next instruction
2348
2349
2350/* ------------------------------ */
2351 .balign 128
2352.L_op_aput_byte: /* 0x4f */
2353/* File: arm/op_aput_byte.S */
2354/* File: arm/op_aput.S */
2355 /*
2356 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2357 *
2358 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2359 * instructions. We use a pair of FETCH_Bs instead.
2360 *
2361 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2362 *
2363 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2364 * If this changes, specialize.
2365 */
2366 /* op vAA, vBB, vCC */
2367 FETCH_B r2, 1, 0 @ r2<- BB
2368 mov r9, rINST, lsr #8 @ r9<- AA
2369 FETCH_B r3, 1, 1 @ r3<- CC
2370 GET_VREG r0, r2 @ r0<- vBB (array object)
2371 GET_VREG r1, r3 @ r1<- vCC (requested index)
2372 cmp r0, #0 @ null array object?
2373 beq common_errNullObject @ yes, bail
2374 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2375 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2376 cmp r1, r3 @ compare unsigned index, length
2377 bcs common_errArrayIndex @ index >= length, bail
2378 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2379 GET_VREG r2, r9 @ r2<- vAA
2380 GET_INST_OPCODE ip @ extract opcode from rINST
2381 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2382 GOTO_OPCODE ip @ jump to next instruction
2383
2384
2385/* ------------------------------ */
2386 .balign 128
2387.L_op_aput_char: /* 0x50 */
2388/* File: arm/op_aput_char.S */
2389/* File: arm/op_aput.S */
2390 /*
2391 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2392 *
2393 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2394 * instructions. We use a pair of FETCH_Bs instead.
2395 *
2396 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2397 *
2398 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2399 * If this changes, specialize.
2400 */
2401 /* op vAA, vBB, vCC */
2402 FETCH_B r2, 1, 0 @ r2<- BB
2403 mov r9, rINST, lsr #8 @ r9<- AA
2404 FETCH_B r3, 1, 1 @ r3<- CC
2405 GET_VREG r0, r2 @ r0<- vBB (array object)
2406 GET_VREG r1, r3 @ r1<- vCC (requested index)
2407 cmp r0, #0 @ null array object?
2408 beq common_errNullObject @ yes, bail
2409 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2410 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2411 cmp r1, r3 @ compare unsigned index, length
2412 bcs common_errArrayIndex @ index >= length, bail
2413 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2414 GET_VREG r2, r9 @ r2<- vAA
2415 GET_INST_OPCODE ip @ extract opcode from rINST
2416 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2417 GOTO_OPCODE ip @ jump to next instruction
2418
2419
2420/* ------------------------------ */
2421 .balign 128
2422.L_op_aput_short: /* 0x51 */
2423/* File: arm/op_aput_short.S */
2424/* File: arm/op_aput.S */
2425 /*
2426 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2427 *
2428 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2429 * instructions. We use a pair of FETCH_Bs instead.
2430 *
2431 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2432 *
2433 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2434 * If this changes, specialize.
2435 */
2436 /* op vAA, vBB, vCC */
2437 FETCH_B r2, 1, 0 @ r2<- BB
2438 mov r9, rINST, lsr #8 @ r9<- AA
2439 FETCH_B r3, 1, 1 @ r3<- CC
2440 GET_VREG r0, r2 @ r0<- vBB (array object)
2441 GET_VREG r1, r3 @ r1<- vCC (requested index)
2442 cmp r0, #0 @ null array object?
2443 beq common_errNullObject @ yes, bail
2444 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2445 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2446 cmp r1, r3 @ compare unsigned index, length
2447 bcs common_errArrayIndex @ index >= length, bail
2448 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2449 GET_VREG r2, r9 @ r2<- vAA
2450 GET_INST_OPCODE ip @ extract opcode from rINST
2451 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2452 GOTO_OPCODE ip @ jump to next instruction
2453
2454
2455/* ------------------------------ */
2456 .balign 128
2457.L_op_iget: /* 0x52 */
2458/* File: arm/op_iget.S */
2459 /*
2460 * General instance field get.
2461 *
2462 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2463 */
2464 EXPORT_PC
2465 FETCH r0, 1 @ r0<- field ref CCCC
2466 mov r1, rINST, lsr #12 @ r1<- B
2467 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2468 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2469 mov r3, rSELF @ r3<- self
2470 bl artGet32InstanceFromCode
2471 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2472 ubfx r2, rINST, #8, #4 @ r2<- A
2473 PREFETCH_INST 2
2474 cmp r3, #0
2475 bne MterpPossibleException @ bail out
2476 .if 0
2477 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2478 .else
2479 SET_VREG r0, r2 @ fp[A]<- r0
2480 .endif
2481 ADVANCE 2
2482 GET_INST_OPCODE ip @ extract opcode from rINST
2483 GOTO_OPCODE ip @ jump to next instruction
2484
2485/* ------------------------------ */
2486 .balign 128
2487.L_op_iget_wide: /* 0x53 */
2488/* File: arm/op_iget_wide.S */
2489 /*
2490 * 64-bit instance field get.
2491 *
2492 * for: iget-wide
2493 */
2494 EXPORT_PC
2495 FETCH r0, 1 @ r0<- field ref CCCC
2496 mov r1, rINST, lsr #12 @ r1<- B
2497 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2498 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2499 mov r3, rSELF @ r3<- self
2500 bl artGet64InstanceFromCode
2501 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2502 ubfx r2, rINST, #8, #4 @ r2<- A
2503 PREFETCH_INST 2
2504 cmp r3, #0
2505 bne MterpException @ bail out
2506 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
2507 stmia r3, {r0-r1} @ fp[A]<- r0/r1
2508 ADVANCE 2
2509 GET_INST_OPCODE ip @ extract opcode from rINST
2510 GOTO_OPCODE ip @ jump to next instruction
2511
2512/* ------------------------------ */
2513 .balign 128
2514.L_op_iget_object: /* 0x54 */
2515/* File: arm/op_iget_object.S */
2516/* File: arm/op_iget.S */
2517 /*
2518 * General instance field get.
2519 *
2520 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2521 */
2522 EXPORT_PC
2523 FETCH r0, 1 @ r0<- field ref CCCC
2524 mov r1, rINST, lsr #12 @ r1<- B
2525 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2526 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2527 mov r3, rSELF @ r3<- self
2528 bl artGetObjInstanceFromCode
2529 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2530 ubfx r2, rINST, #8, #4 @ r2<- A
2531 PREFETCH_INST 2
2532 cmp r3, #0
2533 bne MterpPossibleException @ bail out
2534 .if 1
2535 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2536 .else
2537 SET_VREG r0, r2 @ fp[A]<- r0
2538 .endif
2539 ADVANCE 2
2540 GET_INST_OPCODE ip @ extract opcode from rINST
2541 GOTO_OPCODE ip @ jump to next instruction
2542
2543
2544/* ------------------------------ */
2545 .balign 128
2546.L_op_iget_boolean: /* 0x55 */
2547/* File: arm/op_iget_boolean.S */
2548/* File: arm/op_iget.S */
2549 /*
2550 * General instance field get.
2551 *
2552 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2553 */
2554 EXPORT_PC
2555 FETCH r0, 1 @ r0<- field ref CCCC
2556 mov r1, rINST, lsr #12 @ r1<- B
2557 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2558 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2559 mov r3, rSELF @ r3<- self
2560 bl artGetBooleanInstanceFromCode
2561 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2562 ubfx r2, rINST, #8, #4 @ r2<- A
2563 PREFETCH_INST 2
2564 cmp r3, #0
2565 bne MterpPossibleException @ bail out
2566 .if 0
2567 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2568 .else
2569 SET_VREG r0, r2 @ fp[A]<- r0
2570 .endif
2571 ADVANCE 2
2572 GET_INST_OPCODE ip @ extract opcode from rINST
2573 GOTO_OPCODE ip @ jump to next instruction
2574
2575
2576/* ------------------------------ */
2577 .balign 128
2578.L_op_iget_byte: /* 0x56 */
2579/* File: arm/op_iget_byte.S */
2580/* File: arm/op_iget.S */
2581 /*
2582 * General instance field get.
2583 *
2584 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2585 */
2586 EXPORT_PC
2587 FETCH r0, 1 @ r0<- field ref CCCC
2588 mov r1, rINST, lsr #12 @ r1<- B
2589 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2590 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2591 mov r3, rSELF @ r3<- self
2592 bl artGetByteInstanceFromCode
2593 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2594 ubfx r2, rINST, #8, #4 @ r2<- A
2595 PREFETCH_INST 2
2596 cmp r3, #0
2597 bne MterpPossibleException @ bail out
2598 .if 0
2599 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2600 .else
2601 SET_VREG r0, r2 @ fp[A]<- r0
2602 .endif
2603 ADVANCE 2
2604 GET_INST_OPCODE ip @ extract opcode from rINST
2605 GOTO_OPCODE ip @ jump to next instruction
2606
2607
2608/* ------------------------------ */
2609 .balign 128
2610.L_op_iget_char: /* 0x57 */
2611/* File: arm/op_iget_char.S */
2612/* File: arm/op_iget.S */
2613 /*
2614 * General instance field get.
2615 *
2616 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2617 */
2618 EXPORT_PC
2619 FETCH r0, 1 @ r0<- field ref CCCC
2620 mov r1, rINST, lsr #12 @ r1<- B
2621 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2622 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2623 mov r3, rSELF @ r3<- self
2624 bl artGetCharInstanceFromCode
2625 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2626 ubfx r2, rINST, #8, #4 @ r2<- A
2627 PREFETCH_INST 2
2628 cmp r3, #0
2629 bne MterpPossibleException @ bail out
2630 .if 0
2631 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2632 .else
2633 SET_VREG r0, r2 @ fp[A]<- r0
2634 .endif
2635 ADVANCE 2
2636 GET_INST_OPCODE ip @ extract opcode from rINST
2637 GOTO_OPCODE ip @ jump to next instruction
2638
2639
2640/* ------------------------------ */
2641 .balign 128
2642.L_op_iget_short: /* 0x58 */
2643/* File: arm/op_iget_short.S */
2644/* File: arm/op_iget.S */
2645 /*
2646 * General instance field get.
2647 *
2648 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2649 */
2650 EXPORT_PC
2651 FETCH r0, 1 @ r0<- field ref CCCC
2652 mov r1, rINST, lsr #12 @ r1<- B
2653 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2654 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2655 mov r3, rSELF @ r3<- self
2656 bl artGetShortInstanceFromCode
2657 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2658 ubfx r2, rINST, #8, #4 @ r2<- A
2659 PREFETCH_INST 2
2660 cmp r3, #0
2661 bne MterpPossibleException @ bail out
2662 .if 0
2663 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2664 .else
2665 SET_VREG r0, r2 @ fp[A]<- r0
2666 .endif
2667 ADVANCE 2
2668 GET_INST_OPCODE ip @ extract opcode from rINST
2669 GOTO_OPCODE ip @ jump to next instruction
2670
2671
2672/* ------------------------------ */
2673 .balign 128
2674.L_op_iput: /* 0x59 */
2675/* File: arm/op_iput.S */
2676 /*
2677 * General 32-bit instance field put.
2678 *
2679 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2680 */
2681 /* op vA, vB, field@CCCC */
2682 .extern artSet32InstanceFromMterp
2683 EXPORT_PC
2684 FETCH r0, 1 @ r0<- field ref CCCC
2685 mov r1, rINST, lsr #12 @ r1<- B
2686 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2687 ubfx r2, rINST, #8, #4 @ r2<- A
2688 GET_VREG r2, r2 @ r2<- fp[A]
2689 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2690 PREFETCH_INST 2
2691 bl artSet32InstanceFromMterp
2692 cmp r0, #0
2693 bne MterpPossibleException
2694 ADVANCE 2 @ advance rPC
2695 GET_INST_OPCODE ip @ extract opcode from rINST
2696 GOTO_OPCODE ip @ jump to next instruction
2697
2698/* ------------------------------ */
2699 .balign 128
2700.L_op_iput_wide: /* 0x5a */
2701/* File: arm/op_iput_wide.S */
2702 /* iput-wide vA, vB, field@CCCC */
2703 .extern artSet64InstanceFromMterp
2704 EXPORT_PC
2705 FETCH r0, 1 @ r0<- field ref CCCC
2706 mov r1, rINST, lsr #12 @ r1<- B
2707 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2708 ubfx r2, rINST, #8, #4 @ r2<- A
2709 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
2710 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2711 PREFETCH_INST 2
2712 bl artSet64InstanceFromMterp
2713 cmp r0, #0
2714 bne MterpPossibleException
2715 ADVANCE 2 @ advance rPC
2716 GET_INST_OPCODE ip @ extract opcode from rINST
2717 GOTO_OPCODE ip @ jump to next instruction
2718
2719/* ------------------------------ */
2720 .balign 128
2721.L_op_iput_object: /* 0x5b */
2722/* File: arm/op_iput_object.S */
2723 EXPORT_PC
2724 add r0, rFP, #OFF_FP_SHADOWFRAME
2725 mov r1, rPC
2726 mov r2, rINST
2727 mov r3, rSELF
2728 bl MterpIputObject
2729 cmp r0, #0
2730 beq MterpException
2731 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2732 GET_INST_OPCODE ip @ extract opcode from rINST
2733 GOTO_OPCODE ip @ jump to next instruction
2734
2735/* ------------------------------ */
2736 .balign 128
2737.L_op_iput_boolean: /* 0x5c */
2738/* File: arm/op_iput_boolean.S */
2739/* File: arm/op_iput.S */
2740 /*
2741 * General 32-bit instance field put.
2742 *
2743 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2744 */
2745 /* op vA, vB, field@CCCC */
2746 .extern artSet8InstanceFromMterp
2747 EXPORT_PC
2748 FETCH r0, 1 @ r0<- field ref CCCC
2749 mov r1, rINST, lsr #12 @ r1<- B
2750 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2751 ubfx r2, rINST, #8, #4 @ r2<- A
2752 GET_VREG r2, r2 @ r2<- fp[A]
2753 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2754 PREFETCH_INST 2
2755 bl artSet8InstanceFromMterp
2756 cmp r0, #0
2757 bne MterpPossibleException
2758 ADVANCE 2 @ advance rPC
2759 GET_INST_OPCODE ip @ extract opcode from rINST
2760 GOTO_OPCODE ip @ jump to next instruction
2761
2762
2763/* ------------------------------ */
2764 .balign 128
2765.L_op_iput_byte: /* 0x5d */
2766/* File: arm/op_iput_byte.S */
2767/* File: arm/op_iput.S */
2768 /*
2769 * General 32-bit instance field put.
2770 *
2771 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2772 */
2773 /* op vA, vB, field@CCCC */
2774 .extern artSet8InstanceFromMterp
2775 EXPORT_PC
2776 FETCH r0, 1 @ r0<- field ref CCCC
2777 mov r1, rINST, lsr #12 @ r1<- B
2778 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2779 ubfx r2, rINST, #8, #4 @ r2<- A
2780 GET_VREG r2, r2 @ r2<- fp[A]
2781 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2782 PREFETCH_INST 2
2783 bl artSet8InstanceFromMterp
2784 cmp r0, #0
2785 bne MterpPossibleException
2786 ADVANCE 2 @ advance rPC
2787 GET_INST_OPCODE ip @ extract opcode from rINST
2788 GOTO_OPCODE ip @ jump to next instruction
2789
2790
2791/* ------------------------------ */
2792 .balign 128
2793.L_op_iput_char: /* 0x5e */
2794/* File: arm/op_iput_char.S */
2795/* File: arm/op_iput.S */
2796 /*
2797 * General 32-bit instance field put.
2798 *
2799 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2800 */
2801 /* op vA, vB, field@CCCC */
2802 .extern artSet16InstanceFromMterp
2803 EXPORT_PC
2804 FETCH r0, 1 @ r0<- field ref CCCC
2805 mov r1, rINST, lsr #12 @ r1<- B
2806 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2807 ubfx r2, rINST, #8, #4 @ r2<- A
2808 GET_VREG r2, r2 @ r2<- fp[A]
2809 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2810 PREFETCH_INST 2
2811 bl artSet16InstanceFromMterp
2812 cmp r0, #0
2813 bne MterpPossibleException
2814 ADVANCE 2 @ advance rPC
2815 GET_INST_OPCODE ip @ extract opcode from rINST
2816 GOTO_OPCODE ip @ jump to next instruction
2817
2818
2819/* ------------------------------ */
2820 .balign 128
2821.L_op_iput_short: /* 0x5f */
2822/* File: arm/op_iput_short.S */
2823/* File: arm/op_iput.S */
2824 /*
2825 * General 32-bit instance field put.
2826 *
2827 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2828 */
2829 /* op vA, vB, field@CCCC */
2830 .extern artSet16InstanceFromMterp
2831 EXPORT_PC
2832 FETCH r0, 1 @ r0<- field ref CCCC
2833 mov r1, rINST, lsr #12 @ r1<- B
2834 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2835 ubfx r2, rINST, #8, #4 @ r2<- A
2836 GET_VREG r2, r2 @ r2<- fp[A]
2837 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2838 PREFETCH_INST 2
2839 bl artSet16InstanceFromMterp
2840 cmp r0, #0
2841 bne MterpPossibleException
2842 ADVANCE 2 @ advance rPC
2843 GET_INST_OPCODE ip @ extract opcode from rINST
2844 GOTO_OPCODE ip @ jump to next instruction
2845
2846
2847/* ------------------------------ */
2848 .balign 128
2849.L_op_sget: /* 0x60 */
2850/* File: arm/op_sget.S */
2851 /*
2852 * General SGET handler wrapper.
2853 *
2854 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2855 */
2856 /* op vAA, field@BBBB */
2857
2858 .extern artGet32StaticFromCode
2859 EXPORT_PC
2860 FETCH r0, 1 @ r0<- field ref BBBB
2861 ldr r1, [rFP, #OFF_FP_METHOD]
2862 mov r2, rSELF
2863 bl artGet32StaticFromCode
2864 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2865 mov r2, rINST, lsr #8 @ r2<- AA
2866 PREFETCH_INST 2
2867 cmp r3, #0 @ Fail to resolve?
2868 bne MterpException @ bail out
2869.if 0
2870 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2871.else
2872 SET_VREG r0, r2 @ fp[AA]<- r0
2873.endif
2874 ADVANCE 2
2875 GET_INST_OPCODE ip @ extract opcode from rINST
2876 GOTO_OPCODE ip
2877
2878/* ------------------------------ */
2879 .balign 128
2880.L_op_sget_wide: /* 0x61 */
2881/* File: arm/op_sget_wide.S */
2882 /*
2883 * SGET_WIDE handler wrapper.
2884 *
2885 */
2886 /* sget-wide vAA, field@BBBB */
2887
2888 .extern artGet64StaticFromCode
2889 EXPORT_PC
2890 FETCH r0, 1 @ r0<- field ref BBBB
2891 ldr r1, [rFP, #OFF_FP_METHOD]
2892 mov r2, rSELF
2893 bl artGet64StaticFromCode
2894 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2895 mov r9, rINST, lsr #8 @ r9<- AA
2896 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2897 cmp r3, #0 @ Fail to resolve?
2898 bne MterpException @ bail out
2899 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2900 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
2901 GET_INST_OPCODE ip @ extract opcode from rINST
2902 GOTO_OPCODE ip @ jump to next instruction
2903
2904/* ------------------------------ */
2905 .balign 128
2906.L_op_sget_object: /* 0x62 */
2907/* File: arm/op_sget_object.S */
2908/* File: arm/op_sget.S */
2909 /*
2910 * General SGET handler wrapper.
2911 *
2912 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2913 */
2914 /* op vAA, field@BBBB */
2915
2916 .extern artGetObjStaticFromCode
2917 EXPORT_PC
2918 FETCH r0, 1 @ r0<- field ref BBBB
2919 ldr r1, [rFP, #OFF_FP_METHOD]
2920 mov r2, rSELF
2921 bl artGetObjStaticFromCode
2922 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2923 mov r2, rINST, lsr #8 @ r2<- AA
2924 PREFETCH_INST 2
2925 cmp r3, #0 @ Fail to resolve?
2926 bne MterpException @ bail out
2927.if 1
2928 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2929.else
2930 SET_VREG r0, r2 @ fp[AA]<- r0
2931.endif
2932 ADVANCE 2
2933 GET_INST_OPCODE ip @ extract opcode from rINST
2934 GOTO_OPCODE ip
2935
2936
2937/* ------------------------------ */
2938 .balign 128
2939.L_op_sget_boolean: /* 0x63 */
2940/* File: arm/op_sget_boolean.S */
2941/* File: arm/op_sget.S */
2942 /*
2943 * General SGET handler wrapper.
2944 *
2945 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2946 */
2947 /* op vAA, field@BBBB */
2948
2949 .extern artGetBooleanStaticFromCode
2950 EXPORT_PC
2951 FETCH r0, 1 @ r0<- field ref BBBB
2952 ldr r1, [rFP, #OFF_FP_METHOD]
2953 mov r2, rSELF
2954 bl artGetBooleanStaticFromCode
2955 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2956 mov r2, rINST, lsr #8 @ r2<- AA
2957 PREFETCH_INST 2
2958 cmp r3, #0 @ Fail to resolve?
2959 bne MterpException @ bail out
2960.if 0
2961 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2962.else
2963 SET_VREG r0, r2 @ fp[AA]<- r0
2964.endif
2965 ADVANCE 2
2966 GET_INST_OPCODE ip @ extract opcode from rINST
2967 GOTO_OPCODE ip
2968
2969
2970/* ------------------------------ */
2971 .balign 128
2972.L_op_sget_byte: /* 0x64 */
2973/* File: arm/op_sget_byte.S */
2974/* File: arm/op_sget.S */
2975 /*
2976 * General SGET handler wrapper.
2977 *
2978 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2979 */
2980 /* op vAA, field@BBBB */
2981
2982 .extern artGetByteStaticFromCode
2983 EXPORT_PC
2984 FETCH r0, 1 @ r0<- field ref BBBB
2985 ldr r1, [rFP, #OFF_FP_METHOD]
2986 mov r2, rSELF
2987 bl artGetByteStaticFromCode
2988 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2989 mov r2, rINST, lsr #8 @ r2<- AA
2990 PREFETCH_INST 2
2991 cmp r3, #0 @ Fail to resolve?
2992 bne MterpException @ bail out
2993.if 0
2994 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2995.else
2996 SET_VREG r0, r2 @ fp[AA]<- r0
2997.endif
2998 ADVANCE 2
2999 GET_INST_OPCODE ip @ extract opcode from rINST
3000 GOTO_OPCODE ip
3001
3002
3003/* ------------------------------ */
3004 .balign 128
3005.L_op_sget_char: /* 0x65 */
3006/* File: arm/op_sget_char.S */
3007/* File: arm/op_sget.S */
3008 /*
3009 * General SGET handler wrapper.
3010 *
3011 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3012 */
3013 /* op vAA, field@BBBB */
3014
3015 .extern artGetCharStaticFromCode
3016 EXPORT_PC
3017 FETCH r0, 1 @ r0<- field ref BBBB
3018 ldr r1, [rFP, #OFF_FP_METHOD]
3019 mov r2, rSELF
3020 bl artGetCharStaticFromCode
3021 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3022 mov r2, rINST, lsr #8 @ r2<- AA
3023 PREFETCH_INST 2
3024 cmp r3, #0 @ Fail to resolve?
3025 bne MterpException @ bail out
3026.if 0
3027 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3028.else
3029 SET_VREG r0, r2 @ fp[AA]<- r0
3030.endif
3031 ADVANCE 2
3032 GET_INST_OPCODE ip @ extract opcode from rINST
3033 GOTO_OPCODE ip
3034
3035
3036/* ------------------------------ */
3037 .balign 128
3038.L_op_sget_short: /* 0x66 */
3039/* File: arm/op_sget_short.S */
3040/* File: arm/op_sget.S */
3041 /*
3042 * General SGET handler wrapper.
3043 *
3044 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3045 */
3046 /* op vAA, field@BBBB */
3047
3048 .extern artGetShortStaticFromCode
3049 EXPORT_PC
3050 FETCH r0, 1 @ r0<- field ref BBBB
3051 ldr r1, [rFP, #OFF_FP_METHOD]
3052 mov r2, rSELF
3053 bl artGetShortStaticFromCode
3054 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3055 mov r2, rINST, lsr #8 @ r2<- AA
3056 PREFETCH_INST 2
3057 cmp r3, #0 @ Fail to resolve?
3058 bne MterpException @ bail out
3059.if 0
3060 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3061.else
3062 SET_VREG r0, r2 @ fp[AA]<- r0
3063.endif
3064 ADVANCE 2
3065 GET_INST_OPCODE ip @ extract opcode from rINST
3066 GOTO_OPCODE ip
3067
3068
3069/* ------------------------------ */
3070 .balign 128
3071.L_op_sput: /* 0x67 */
3072/* File: arm/op_sput.S */
3073 /*
3074 * General SPUT handler wrapper.
3075 *
3076 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3077 */
3078 /* op vAA, field@BBBB */
3079 EXPORT_PC
3080 FETCH r0, 1 @ r0<- field ref BBBB
3081 mov r3, rINST, lsr #8 @ r3<- AA
3082 GET_VREG r1, r3 @ r1<= fp[AA]
3083 ldr r2, [rFP, #OFF_FP_METHOD]
3084 mov r3, rSELF
3085 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3086 bl artSet32StaticFromCode
3087 cmp r0, #0 @ 0 on success, -1 on failure
3088 bne MterpException
3089 ADVANCE 2 @ Past exception point - now advance rPC
3090 GET_INST_OPCODE ip @ extract opcode from rINST
3091 GOTO_OPCODE ip @ jump to next instruction
3092
3093/* ------------------------------ */
3094 .balign 128
3095.L_op_sput_wide: /* 0x68 */
3096/* File: arm/op_sput_wide.S */
3097 /*
3098 * SPUT_WIDE handler wrapper.
3099 *
3100 */
3101 /* sput-wide vAA, field@BBBB */
3102 .extern artSet64IndirectStaticFromMterp
3103 EXPORT_PC
3104 FETCH r0, 1 @ r0<- field ref BBBB
3105 ldr r1, [rFP, #OFF_FP_METHOD]
3106 mov r2, rINST, lsr #8 @ r3<- AA
3107 add r2, rFP, r2, lsl #2
3108 mov r3, rSELF
3109 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3110 bl artSet64IndirectStaticFromMterp
3111 cmp r0, #0 @ 0 on success, -1 on failure
3112 bne MterpException
3113 ADVANCE 2 @ Past exception point - now advance rPC
3114 GET_INST_OPCODE ip @ extract opcode from rINST
3115 GOTO_OPCODE ip @ jump to next instruction
3116
3117/* ------------------------------ */
3118 .balign 128
3119.L_op_sput_object: /* 0x69 */
3120/* File: arm/op_sput_object.S */
3121 EXPORT_PC
3122 add r0, rFP, #OFF_FP_SHADOWFRAME
3123 mov r1, rPC
3124 mov r2, rINST
3125 mov r3, rSELF
3126 bl MterpSputObject
3127 cmp r0, #0
3128 beq MterpException
3129 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3130 GET_INST_OPCODE ip @ extract opcode from rINST
3131 GOTO_OPCODE ip @ jump to next instruction
3132
3133/* ------------------------------ */
3134 .balign 128
3135.L_op_sput_boolean: /* 0x6a */
3136/* File: arm/op_sput_boolean.S */
3137/* File: arm/op_sput.S */
3138 /*
3139 * General SPUT handler wrapper.
3140 *
3141 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3142 */
3143 /* op vAA, field@BBBB */
3144 EXPORT_PC
3145 FETCH r0, 1 @ r0<- field ref BBBB
3146 mov r3, rINST, lsr #8 @ r3<- AA
3147 GET_VREG r1, r3 @ r1<= fp[AA]
3148 ldr r2, [rFP, #OFF_FP_METHOD]
3149 mov r3, rSELF
3150 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3151 bl artSet8StaticFromCode
3152 cmp r0, #0 @ 0 on success, -1 on failure
3153 bne MterpException
3154 ADVANCE 2 @ Past exception point - now advance rPC
3155 GET_INST_OPCODE ip @ extract opcode from rINST
3156 GOTO_OPCODE ip @ jump to next instruction
3157
3158
3159/* ------------------------------ */
3160 .balign 128
3161.L_op_sput_byte: /* 0x6b */
3162/* File: arm/op_sput_byte.S */
3163/* File: arm/op_sput.S */
3164 /*
3165 * General SPUT handler wrapper.
3166 *
3167 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3168 */
3169 /* op vAA, field@BBBB */
3170 EXPORT_PC
3171 FETCH r0, 1 @ r0<- field ref BBBB
3172 mov r3, rINST, lsr #8 @ r3<- AA
3173 GET_VREG r1, r3 @ r1<= fp[AA]
3174 ldr r2, [rFP, #OFF_FP_METHOD]
3175 mov r3, rSELF
3176 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3177 bl artSet8StaticFromCode
3178 cmp r0, #0 @ 0 on success, -1 on failure
3179 bne MterpException
3180 ADVANCE 2 @ Past exception point - now advance rPC
3181 GET_INST_OPCODE ip @ extract opcode from rINST
3182 GOTO_OPCODE ip @ jump to next instruction
3183
3184
3185/* ------------------------------ */
3186 .balign 128
3187.L_op_sput_char: /* 0x6c */
3188/* File: arm/op_sput_char.S */
3189/* File: arm/op_sput.S */
3190 /*
3191 * General SPUT handler wrapper.
3192 *
3193 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3194 */
3195 /* op vAA, field@BBBB */
3196 EXPORT_PC
3197 FETCH r0, 1 @ r0<- field ref BBBB
3198 mov r3, rINST, lsr #8 @ r3<- AA
3199 GET_VREG r1, r3 @ r1<= fp[AA]
3200 ldr r2, [rFP, #OFF_FP_METHOD]
3201 mov r3, rSELF
3202 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3203 bl artSet16StaticFromCode
3204 cmp r0, #0 @ 0 on success, -1 on failure
3205 bne MterpException
3206 ADVANCE 2 @ Past exception point - now advance rPC
3207 GET_INST_OPCODE ip @ extract opcode from rINST
3208 GOTO_OPCODE ip @ jump to next instruction
3209
3210
3211/* ------------------------------ */
3212 .balign 128
3213.L_op_sput_short: /* 0x6d */
3214/* File: arm/op_sput_short.S */
3215/* File: arm/op_sput.S */
3216 /*
3217 * General SPUT handler wrapper.
3218 *
3219 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3220 */
3221 /* op vAA, field@BBBB */
3222 EXPORT_PC
3223 FETCH r0, 1 @ r0<- field ref BBBB
3224 mov r3, rINST, lsr #8 @ r3<- AA
3225 GET_VREG r1, r3 @ r1<= fp[AA]
3226 ldr r2, [rFP, #OFF_FP_METHOD]
3227 mov r3, rSELF
3228 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3229 bl artSet16StaticFromCode
3230 cmp r0, #0 @ 0 on success, -1 on failure
3231 bne MterpException
3232 ADVANCE 2 @ Past exception point - now advance rPC
3233 GET_INST_OPCODE ip @ extract opcode from rINST
3234 GOTO_OPCODE ip @ jump to next instruction
3235
3236
3237/* ------------------------------ */
3238 .balign 128
3239.L_op_invoke_virtual: /* 0x6e */
3240/* File: arm/op_invoke_virtual.S */
3241/* File: arm/invoke.S */
3242 /*
3243 * Generic invoke handler wrapper.
3244 */
3245 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3246 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3247 .extern MterpInvokeVirtual
3248 EXPORT_PC
3249 mov r0, rSELF
3250 add r1, rFP, #OFF_FP_SHADOWFRAME
3251 mov r2, rPC
3252 mov r3, rINST
3253 bl MterpInvokeVirtual
3254 cmp r0, #0
3255 beq MterpException
3256 FETCH_ADVANCE_INST 3
3257 GET_INST_OPCODE ip
3258 GOTO_OPCODE ip
3259
3260
3261 /*
3262 * Handle a virtual method call.
3263 *
3264 * for: invoke-virtual, invoke-virtual/range
3265 */
3266 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3267 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3268
3269/* ------------------------------ */
3270 .balign 128
3271.L_op_invoke_super: /* 0x6f */
3272/* File: arm/op_invoke_super.S */
3273/* File: arm/invoke.S */
3274 /*
3275 * Generic invoke handler wrapper.
3276 */
3277 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3278 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3279 .extern MterpInvokeSuper
3280 EXPORT_PC
3281 mov r0, rSELF
3282 add r1, rFP, #OFF_FP_SHADOWFRAME
3283 mov r2, rPC
3284 mov r3, rINST
3285 bl MterpInvokeSuper
3286 cmp r0, #0
3287 beq MterpException
3288 FETCH_ADVANCE_INST 3
3289 GET_INST_OPCODE ip
3290 GOTO_OPCODE ip
3291
3292
3293 /*
3294 * Handle a "super" method call.
3295 *
3296 * for: invoke-super, invoke-super/range
3297 */
3298 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3299 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3300
3301/* ------------------------------ */
3302 .balign 128
3303.L_op_invoke_direct: /* 0x70 */
3304/* File: arm/op_invoke_direct.S */
3305/* File: arm/invoke.S */
3306 /*
3307 * Generic invoke handler wrapper.
3308 */
3309 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3310 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3311 .extern MterpInvokeDirect
3312 EXPORT_PC
3313 mov r0, rSELF
3314 add r1, rFP, #OFF_FP_SHADOWFRAME
3315 mov r2, rPC
3316 mov r3, rINST
3317 bl MterpInvokeDirect
3318 cmp r0, #0
3319 beq MterpException
3320 FETCH_ADVANCE_INST 3
3321 GET_INST_OPCODE ip
3322 GOTO_OPCODE ip
3323
3324
3325
3326/* ------------------------------ */
3327 .balign 128
3328.L_op_invoke_static: /* 0x71 */
3329/* File: arm/op_invoke_static.S */
3330/* File: arm/invoke.S */
3331 /*
3332 * Generic invoke handler wrapper.
3333 */
3334 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3335 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3336 .extern MterpInvokeStatic
3337 EXPORT_PC
3338 mov r0, rSELF
3339 add r1, rFP, #OFF_FP_SHADOWFRAME
3340 mov r2, rPC
3341 mov r3, rINST
3342 bl MterpInvokeStatic
3343 cmp r0, #0
3344 beq MterpException
3345 FETCH_ADVANCE_INST 3
3346 GET_INST_OPCODE ip
3347 GOTO_OPCODE ip
3348
3349
3350
3351
3352/* ------------------------------ */
3353 .balign 128
3354.L_op_invoke_interface: /* 0x72 */
3355/* File: arm/op_invoke_interface.S */
3356/* File: arm/invoke.S */
3357 /*
3358 * Generic invoke handler wrapper.
3359 */
3360 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3361 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3362 .extern MterpInvokeInterface
3363 EXPORT_PC
3364 mov r0, rSELF
3365 add r1, rFP, #OFF_FP_SHADOWFRAME
3366 mov r2, rPC
3367 mov r3, rINST
3368 bl MterpInvokeInterface
3369 cmp r0, #0
3370 beq MterpException
3371 FETCH_ADVANCE_INST 3
3372 GET_INST_OPCODE ip
3373 GOTO_OPCODE ip
3374
3375
3376 /*
3377 * Handle an interface method call.
3378 *
3379 * for: invoke-interface, invoke-interface/range
3380 */
3381 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3382 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3383
3384/* ------------------------------ */
3385 .balign 128
3386.L_op_return_void_no_barrier: /* 0x73 */
3387/* File: arm/op_return_void_no_barrier.S */
3388 mov r0, #0
3389 mov r1, #0
3390 b MterpReturn
3391
3392/* ------------------------------ */
3393 .balign 128
3394.L_op_invoke_virtual_range: /* 0x74 */
3395/* File: arm/op_invoke_virtual_range.S */
3396/* File: arm/invoke.S */
3397 /*
3398 * Generic invoke handler wrapper.
3399 */
3400 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3401 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3402 .extern MterpInvokeVirtualRange
3403 EXPORT_PC
3404 mov r0, rSELF
3405 add r1, rFP, #OFF_FP_SHADOWFRAME
3406 mov r2, rPC
3407 mov r3, rINST
3408 bl MterpInvokeVirtualRange
3409 cmp r0, #0
3410 beq MterpException
3411 FETCH_ADVANCE_INST 3
3412 GET_INST_OPCODE ip
3413 GOTO_OPCODE ip
3414
3415
3416
3417/* ------------------------------ */
3418 .balign 128
3419.L_op_invoke_super_range: /* 0x75 */
3420/* File: arm/op_invoke_super_range.S */
3421/* File: arm/invoke.S */
3422 /*
3423 * Generic invoke handler wrapper.
3424 */
3425 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3426 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3427 .extern MterpInvokeSuperRange
3428 EXPORT_PC
3429 mov r0, rSELF
3430 add r1, rFP, #OFF_FP_SHADOWFRAME
3431 mov r2, rPC
3432 mov r3, rINST
3433 bl MterpInvokeSuperRange
3434 cmp r0, #0
3435 beq MterpException
3436 FETCH_ADVANCE_INST 3
3437 GET_INST_OPCODE ip
3438 GOTO_OPCODE ip
3439
3440
3441
3442/* ------------------------------ */
3443 .balign 128
3444.L_op_invoke_direct_range: /* 0x76 */
3445/* File: arm/op_invoke_direct_range.S */
3446/* File: arm/invoke.S */
3447 /*
3448 * Generic invoke handler wrapper.
3449 */
3450 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3451 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3452 .extern MterpInvokeDirectRange
3453 EXPORT_PC
3454 mov r0, rSELF
3455 add r1, rFP, #OFF_FP_SHADOWFRAME
3456 mov r2, rPC
3457 mov r3, rINST
3458 bl MterpInvokeDirectRange
3459 cmp r0, #0
3460 beq MterpException
3461 FETCH_ADVANCE_INST 3
3462 GET_INST_OPCODE ip
3463 GOTO_OPCODE ip
3464
3465
3466
3467/* ------------------------------ */
3468 .balign 128
3469.L_op_invoke_static_range: /* 0x77 */
3470/* File: arm/op_invoke_static_range.S */
3471/* File: arm/invoke.S */
3472 /*
3473 * Generic invoke handler wrapper.
3474 */
3475 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3476 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3477 .extern MterpInvokeStaticRange
3478 EXPORT_PC
3479 mov r0, rSELF
3480 add r1, rFP, #OFF_FP_SHADOWFRAME
3481 mov r2, rPC
3482 mov r3, rINST
3483 bl MterpInvokeStaticRange
3484 cmp r0, #0
3485 beq MterpException
3486 FETCH_ADVANCE_INST 3
3487 GET_INST_OPCODE ip
3488 GOTO_OPCODE ip
3489
3490
3491
3492/* ------------------------------ */
3493 .balign 128
3494.L_op_invoke_interface_range: /* 0x78 */
3495/* File: arm/op_invoke_interface_range.S */
3496/* File: arm/invoke.S */
3497 /*
3498 * Generic invoke handler wrapper.
3499 */
3500 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3501 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3502 .extern MterpInvokeInterfaceRange
3503 EXPORT_PC
3504 mov r0, rSELF
3505 add r1, rFP, #OFF_FP_SHADOWFRAME
3506 mov r2, rPC
3507 mov r3, rINST
3508 bl MterpInvokeInterfaceRange
3509 cmp r0, #0
3510 beq MterpException
3511 FETCH_ADVANCE_INST 3
3512 GET_INST_OPCODE ip
3513 GOTO_OPCODE ip
3514
3515
3516
3517/* ------------------------------ */
3518 .balign 128
3519.L_op_unused_79: /* 0x79 */
3520/* File: arm/op_unused_79.S */
3521/* File: arm/unused.S */
3522/*
3523 * Bail to reference interpreter to throw.
3524 */
3525 b MterpFallback
3526
3527
3528/* ------------------------------ */
3529 .balign 128
3530.L_op_unused_7a: /* 0x7a */
3531/* File: arm/op_unused_7a.S */
3532/* File: arm/unused.S */
3533/*
3534 * Bail to reference interpreter to throw.
3535 */
3536 b MterpFallback
3537
3538
3539/* ------------------------------ */
3540 .balign 128
3541.L_op_neg_int: /* 0x7b */
3542/* File: arm/op_neg_int.S */
3543/* File: arm/unop.S */
3544 /*
3545 * Generic 32-bit unary operation. Provide an "instr" line that
3546 * specifies an instruction that performs "result = op r0".
3547 * This could be an ARM instruction or a function call.
3548 *
3549 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3550 * int-to-byte, int-to-char, int-to-short
3551 */
3552 /* unop vA, vB */
3553 mov r3, rINST, lsr #12 @ r3<- B
3554 ubfx r9, rINST, #8, #4 @ r9<- A
3555 GET_VREG r0, r3 @ r0<- vB
3556 @ optional op; may set condition codes
3557 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3558 rsb r0, r0, #0 @ r0<- op, r0-r3 changed
3559 GET_INST_OPCODE ip @ extract opcode from rINST
3560 SET_VREG r0, r9 @ vAA<- r0
3561 GOTO_OPCODE ip @ jump to next instruction
3562 /* 8-9 instructions */
3563
3564
3565/* ------------------------------ */
3566 .balign 128
3567.L_op_not_int: /* 0x7c */
3568/* File: arm/op_not_int.S */
3569/* File: arm/unop.S */
3570 /*
3571 * Generic 32-bit unary operation. Provide an "instr" line that
3572 * specifies an instruction that performs "result = op r0".
3573 * This could be an ARM instruction or a function call.
3574 *
3575 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3576 * int-to-byte, int-to-char, int-to-short
3577 */
3578 /* unop vA, vB */
3579 mov r3, rINST, lsr #12 @ r3<- B
3580 ubfx r9, rINST, #8, #4 @ r9<- A
3581 GET_VREG r0, r3 @ r0<- vB
3582 @ optional op; may set condition codes
3583 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3584 mvn r0, r0 @ r0<- op, r0-r3 changed
3585 GET_INST_OPCODE ip @ extract opcode from rINST
3586 SET_VREG r0, r9 @ vAA<- r0
3587 GOTO_OPCODE ip @ jump to next instruction
3588 /* 8-9 instructions */
3589
3590
3591/* ------------------------------ */
3592 .balign 128
3593.L_op_neg_long: /* 0x7d */
3594/* File: arm/op_neg_long.S */
3595/* File: arm/unopWide.S */
3596 /*
3597 * Generic 64-bit unary operation. Provide an "instr" line that
3598 * specifies an instruction that performs "result = op r0/r1".
3599 * This could be an ARM instruction or a function call.
3600 *
3601 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3602 */
3603 /* unop vA, vB */
3604 mov r3, rINST, lsr #12 @ r3<- B
3605 ubfx r9, rINST, #8, #4 @ r9<- A
3606 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3607 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3608 ldmia r3, {r0-r1} @ r0/r1<- vAA
3609 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3610 rsbs r0, r0, #0 @ optional op; may set condition codes
3611 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed
3612 GET_INST_OPCODE ip @ extract opcode from rINST
3613 stmia r9, {r0-r1} @ vAA<- r0/r1
3614 GOTO_OPCODE ip @ jump to next instruction
3615 /* 10-11 instructions */
3616
3617
3618/* ------------------------------ */
3619 .balign 128
3620.L_op_not_long: /* 0x7e */
3621/* File: arm/op_not_long.S */
3622/* File: arm/unopWide.S */
3623 /*
3624 * Generic 64-bit unary operation. Provide an "instr" line that
3625 * specifies an instruction that performs "result = op r0/r1".
3626 * This could be an ARM instruction or a function call.
3627 *
3628 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3629 */
3630 /* unop vA, vB */
3631 mov r3, rINST, lsr #12 @ r3<- B
3632 ubfx r9, rINST, #8, #4 @ r9<- A
3633 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3634 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3635 ldmia r3, {r0-r1} @ r0/r1<- vAA
3636 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3637 mvn r0, r0 @ optional op; may set condition codes
3638 mvn r1, r1 @ r0/r1<- op, r2-r3 changed
3639 GET_INST_OPCODE ip @ extract opcode from rINST
3640 stmia r9, {r0-r1} @ vAA<- r0/r1
3641 GOTO_OPCODE ip @ jump to next instruction
3642 /* 10-11 instructions */
3643
3644
3645/* ------------------------------ */
3646 .balign 128
3647.L_op_neg_float: /* 0x7f */
3648/* File: arm/op_neg_float.S */
3649/* File: arm/unop.S */
3650 /*
3651 * Generic 32-bit unary operation. Provide an "instr" line that
3652 * specifies an instruction that performs "result = op r0".
3653 * This could be an ARM instruction or a function call.
3654 *
3655 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3656 * int-to-byte, int-to-char, int-to-short
3657 */
3658 /* unop vA, vB */
3659 mov r3, rINST, lsr #12 @ r3<- B
3660 ubfx r9, rINST, #8, #4 @ r9<- A
3661 GET_VREG r0, r3 @ r0<- vB
3662 @ optional op; may set condition codes
3663 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3664 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed
3665 GET_INST_OPCODE ip @ extract opcode from rINST
3666 SET_VREG r0, r9 @ vAA<- r0
3667 GOTO_OPCODE ip @ jump to next instruction
3668 /* 8-9 instructions */
3669
3670
3671/* ------------------------------ */
3672 .balign 128
3673.L_op_neg_double: /* 0x80 */
3674/* File: arm/op_neg_double.S */
3675/* File: arm/unopWide.S */
3676 /*
3677 * Generic 64-bit unary operation. Provide an "instr" line that
3678 * specifies an instruction that performs "result = op r0/r1".
3679 * This could be an ARM instruction or a function call.
3680 *
3681 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3682 */
3683 /* unop vA, vB */
3684 mov r3, rINST, lsr #12 @ r3<- B
3685 ubfx r9, rINST, #8, #4 @ r9<- A
3686 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3687 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3688 ldmia r3, {r0-r1} @ r0/r1<- vAA
3689 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3690 @ optional op; may set condition codes
3691 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed
3692 GET_INST_OPCODE ip @ extract opcode from rINST
3693 stmia r9, {r0-r1} @ vAA<- r0/r1
3694 GOTO_OPCODE ip @ jump to next instruction
3695 /* 10-11 instructions */
3696
3697
3698/* ------------------------------ */
3699 .balign 128
3700.L_op_int_to_long: /* 0x81 */
3701/* File: arm/op_int_to_long.S */
3702/* File: arm/unopWider.S */
3703 /*
3704 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3705 * that specifies an instruction that performs "result = op r0", where
3706 * "result" is a 64-bit quantity in r0/r1.
3707 *
3708 * For: int-to-long, int-to-double, float-to-long, float-to-double
3709 */
3710 /* unop vA, vB */
3711 mov r3, rINST, lsr #12 @ r3<- B
3712 ubfx r9, rINST, #8, #4 @ r9<- A
3713 GET_VREG r0, r3 @ r0<- vB
3714 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3715 @ optional op; may set condition codes
3716 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3717 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed
3718 GET_INST_OPCODE ip @ extract opcode from rINST
3719 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3720 GOTO_OPCODE ip @ jump to next instruction
3721 /* 9-10 instructions */
3722
3723
3724/* ------------------------------ */
3725 .balign 128
3726.L_op_int_to_float: /* 0x82 */
3727/* File: arm/op_int_to_float.S */
3728/* File: arm/funop.S */
3729 /*
3730 * Generic 32-bit unary floating-point operation. Provide an "instr"
3731 * line that specifies an instruction that performs "s1 = op s0".
3732 *
3733 * for: int-to-float, float-to-int
3734 */
3735 /* unop vA, vB */
3736 mov r3, rINST, lsr #12 @ r3<- B
3737 mov r9, rINST, lsr #8 @ r9<- A+
3738 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3739 flds s0, [r3] @ s0<- vB
3740 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3741 and r9, r9, #15 @ r9<- A
3742 fsitos s1, s0 @ s1<- op
3743 GET_INST_OPCODE ip @ extract opcode from rINST
3744 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3745 fsts s1, [r9] @ vA<- s1
3746 GOTO_OPCODE ip @ jump to next instruction
3747
3748
3749/* ------------------------------ */
3750 .balign 128
3751.L_op_int_to_double: /* 0x83 */
3752/* File: arm/op_int_to_double.S */
3753/* File: arm/funopWider.S */
3754 /*
3755 * Generic 32bit-to-64bit floating point unary operation. Provide an
3756 * "instr" line that specifies an instruction that performs "d0 = op s0".
3757 *
3758 * For: int-to-double, float-to-double
3759 */
3760 /* unop vA, vB */
3761 mov r3, rINST, lsr #12 @ r3<- B
3762 mov r9, rINST, lsr #8 @ r9<- A+
3763 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3764 flds s0, [r3] @ s0<- vB
3765 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3766 and r9, r9, #15 @ r9<- A
3767 fsitod d0, s0 @ d0<- op
3768 GET_INST_OPCODE ip @ extract opcode from rINST
3769 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3770 fstd d0, [r9] @ vA<- d0
3771 GOTO_OPCODE ip @ jump to next instruction
3772
3773
3774/* ------------------------------ */
3775 .balign 128
3776.L_op_long_to_int: /* 0x84 */
3777/* File: arm/op_long_to_int.S */
3778/* we ignore the high word, making this equivalent to a 32-bit reg move */
3779/* File: arm/op_move.S */
3780 /* for move, move-object, long-to-int */
3781 /* op vA, vB */
3782 mov r1, rINST, lsr #12 @ r1<- B from 15:12
3783 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
3784 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3785 GET_VREG r2, r1 @ r2<- fp[B]
3786 GET_INST_OPCODE ip @ ip<- opcode from rINST
3787 .if 0
3788 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
3789 .else
3790 SET_VREG r2, r0 @ fp[A]<- r2
3791 .endif
3792 GOTO_OPCODE ip @ execute next instruction
3793
3794
3795/* ------------------------------ */
3796 .balign 128
3797.L_op_long_to_float: /* 0x85 */
3798/* File: arm/op_long_to_float.S */
3799/* File: arm/unopNarrower.S */
3800 /*
3801 * Generic 64bit-to-32bit unary operation. Provide an "instr" line
3802 * that specifies an instruction that performs "result = op r0/r1", where
3803 * "result" is a 32-bit quantity in r0.
3804 *
3805 * For: long-to-float, double-to-int, double-to-float
3806 *
3807 * (This would work for long-to-int, but that instruction is actually
3808 * an exact match for op_move.)
3809 */
3810 /* unop vA, vB */
3811 mov r3, rINST, lsr #12 @ r3<- B
3812 ubfx r9, rINST, #8, #4 @ r9<- A
3813 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3814 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1
3815 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3816 @ optional op; may set condition codes
3817 bl __aeabi_l2f @ r0<- op, r0-r3 changed
3818 GET_INST_OPCODE ip @ extract opcode from rINST
3819 SET_VREG r0, r9 @ vA<- r0
3820 GOTO_OPCODE ip @ jump to next instruction
3821 /* 9-10 instructions */
3822
3823
3824/* ------------------------------ */
3825 .balign 128
3826.L_op_long_to_double: /* 0x86 */
3827/* File: arm/op_long_to_double.S */
3828 /*
3829 * Specialised 64-bit floating point operation.
3830 *
3831 * Note: The result will be returned in d2.
3832 *
3833 * For: long-to-double
3834 */
3835 mov r3, rINST, lsr #12 @ r3<- B
3836 ubfx r9, rINST, #8, #4 @ r9<- A
3837 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3838 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3839 vldr d0, [r3] @ d0<- vAA
3840 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3841
3842 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh)
3843 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl)
3844 vldr d3, constvalop_long_to_double
3845 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl
3846
3847 GET_INST_OPCODE ip @ extract opcode from rINST
3848 vstr.64 d2, [r9] @ vAA<- d2
3849 GOTO_OPCODE ip @ jump to next instruction
3850
3851 /* literal pool helper */
3852constvalop_long_to_double:
3853 .8byte 0x41f0000000000000
3854
3855/* ------------------------------ */
3856 .balign 128
3857.L_op_float_to_int: /* 0x87 */
3858/* File: arm/op_float_to_int.S */
3859/* File: arm/funop.S */
3860 /*
3861 * Generic 32-bit unary floating-point operation. Provide an "instr"
3862 * line that specifies an instruction that performs "s1 = op s0".
3863 *
3864 * for: int-to-float, float-to-int
3865 */
3866 /* unop vA, vB */
3867 mov r3, rINST, lsr #12 @ r3<- B
3868 mov r9, rINST, lsr #8 @ r9<- A+
3869 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3870 flds s0, [r3] @ s0<- vB
3871 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3872 and r9, r9, #15 @ r9<- A
3873 ftosizs s1, s0 @ s1<- op
3874 GET_INST_OPCODE ip @ extract opcode from rINST
3875 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3876 fsts s1, [r9] @ vA<- s1
3877 GOTO_OPCODE ip @ jump to next instruction
3878
3879
3880/* ------------------------------ */
3881 .balign 128
3882.L_op_float_to_long: /* 0x88 */
3883/* File: arm/op_float_to_long.S */
3884@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"}
3885/* File: arm/unopWider.S */
3886 /*
3887 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3888 * that specifies an instruction that performs "result = op r0", where
3889 * "result" is a 64-bit quantity in r0/r1.
3890 *
3891 * For: int-to-long, int-to-double, float-to-long, float-to-double
3892 */
3893 /* unop vA, vB */
3894 mov r3, rINST, lsr #12 @ r3<- B
3895 ubfx r9, rINST, #8, #4 @ r9<- A
3896 GET_VREG r0, r3 @ r0<- vB
3897 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3898 @ optional op; may set condition codes
3899 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3900 bl f2l_doconv @ r0<- op, r0-r3 changed
3901 GET_INST_OPCODE ip @ extract opcode from rINST
3902 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3903 GOTO_OPCODE ip @ jump to next instruction
3904 /* 9-10 instructions */
3905
3906
3907
3908/* ------------------------------ */
3909 .balign 128
3910.L_op_float_to_double: /* 0x89 */
3911/* File: arm/op_float_to_double.S */
3912/* File: arm/funopWider.S */
3913 /*
3914 * Generic 32bit-to-64bit floating point unary operation. Provide an
3915 * "instr" line that specifies an instruction that performs "d0 = op s0".
3916 *
3917 * For: int-to-double, float-to-double
3918 */
3919 /* unop vA, vB */
3920 mov r3, rINST, lsr #12 @ r3<- B
3921 mov r9, rINST, lsr #8 @ r9<- A+
3922 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3923 flds s0, [r3] @ s0<- vB
3924 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3925 and r9, r9, #15 @ r9<- A
3926 fcvtds d0, s0 @ d0<- op
3927 GET_INST_OPCODE ip @ extract opcode from rINST
3928 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3929 fstd d0, [r9] @ vA<- d0
3930 GOTO_OPCODE ip @ jump to next instruction
3931
3932
3933/* ------------------------------ */
3934 .balign 128
3935.L_op_double_to_int: /* 0x8a */
3936/* File: arm/op_double_to_int.S */
3937/* File: arm/funopNarrower.S */
3938 /*
3939 * Generic 64bit-to-32bit unary floating point operation. Provide an
3940 * "instr" line that specifies an instruction that performs "s0 = op d0".
3941 *
3942 * For: double-to-int, double-to-float
3943 */
3944 /* unop vA, vB */
3945 mov r3, rINST, lsr #12 @ r3<- B
3946 mov r9, rINST, lsr #8 @ r9<- A+
3947 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3948 fldd d0, [r3] @ d0<- vB
3949 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3950 and r9, r9, #15 @ r9<- A
3951 ftosizd s0, d0 @ s0<- op
3952 GET_INST_OPCODE ip @ extract opcode from rINST
3953 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3954 fsts s0, [r9] @ vA<- s0
3955 GOTO_OPCODE ip @ jump to next instruction
3956
3957
3958/* ------------------------------ */
3959 .balign 128
3960.L_op_double_to_long: /* 0x8b */
3961/* File: arm/op_double_to_long.S */
3962@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"}
3963/* File: arm/unopWide.S */
3964 /*
3965 * Generic 64-bit unary operation. Provide an "instr" line that
3966 * specifies an instruction that performs "result = op r0/r1".
3967 * This could be an ARM instruction or a function call.
3968 *
3969 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3970 */
3971 /* unop vA, vB */
3972 mov r3, rINST, lsr #12 @ r3<- B
3973 ubfx r9, rINST, #8, #4 @ r9<- A
3974 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3975 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3976 ldmia r3, {r0-r1} @ r0/r1<- vAA
3977 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3978 @ optional op; may set condition codes
3979 bl d2l_doconv @ r0/r1<- op, r2-r3 changed
3980 GET_INST_OPCODE ip @ extract opcode from rINST
3981 stmia r9, {r0-r1} @ vAA<- r0/r1
3982 GOTO_OPCODE ip @ jump to next instruction
3983 /* 10-11 instructions */
3984
3985
3986
3987/* ------------------------------ */
3988 .balign 128
3989.L_op_double_to_float: /* 0x8c */
3990/* File: arm/op_double_to_float.S */
3991/* File: arm/funopNarrower.S */
3992 /*
3993 * Generic 64bit-to-32bit unary floating point operation. Provide an
3994 * "instr" line that specifies an instruction that performs "s0 = op d0".
3995 *
3996 * For: double-to-int, double-to-float
3997 */
3998 /* unop vA, vB */
3999 mov r3, rINST, lsr #12 @ r3<- B
4000 mov r9, rINST, lsr #8 @ r9<- A+
4001 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4002 fldd d0, [r3] @ d0<- vB
4003 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4004 and r9, r9, #15 @ r9<- A
4005 fcvtsd s0, d0 @ s0<- op
4006 GET_INST_OPCODE ip @ extract opcode from rINST
4007 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4008 fsts s0, [r9] @ vA<- s0
4009 GOTO_OPCODE ip @ jump to next instruction
4010
4011
4012/* ------------------------------ */
4013 .balign 128
4014.L_op_int_to_byte: /* 0x8d */
4015/* File: arm/op_int_to_byte.S */
4016/* File: arm/unop.S */
4017 /*
4018 * Generic 32-bit unary operation. Provide an "instr" line that
4019 * specifies an instruction that performs "result = op r0".
4020 * This could be an ARM instruction or a function call.
4021 *
4022 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4023 * int-to-byte, int-to-char, int-to-short
4024 */
4025 /* unop vA, vB */
4026 mov r3, rINST, lsr #12 @ r3<- B
4027 ubfx r9, rINST, #8, #4 @ r9<- A
4028 GET_VREG r0, r3 @ r0<- vB
4029 @ optional op; may set condition codes
4030 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4031 sxtb r0, r0 @ r0<- op, r0-r3 changed
4032 GET_INST_OPCODE ip @ extract opcode from rINST
4033 SET_VREG r0, r9 @ vAA<- r0
4034 GOTO_OPCODE ip @ jump to next instruction
4035 /* 8-9 instructions */
4036
4037
4038/* ------------------------------ */
4039 .balign 128
4040.L_op_int_to_char: /* 0x8e */
4041/* File: arm/op_int_to_char.S */
4042/* File: arm/unop.S */
4043 /*
4044 * Generic 32-bit unary operation. Provide an "instr" line that
4045 * specifies an instruction that performs "result = op r0".
4046 * This could be an ARM instruction or a function call.
4047 *
4048 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4049 * int-to-byte, int-to-char, int-to-short
4050 */
4051 /* unop vA, vB */
4052 mov r3, rINST, lsr #12 @ r3<- B
4053 ubfx r9, rINST, #8, #4 @ r9<- A
4054 GET_VREG r0, r3 @ r0<- vB
4055 @ optional op; may set condition codes
4056 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4057 uxth r0, r0 @ r0<- op, r0-r3 changed
4058 GET_INST_OPCODE ip @ extract opcode from rINST
4059 SET_VREG r0, r9 @ vAA<- r0
4060 GOTO_OPCODE ip @ jump to next instruction
4061 /* 8-9 instructions */
4062
4063
4064/* ------------------------------ */
4065 .balign 128
4066.L_op_int_to_short: /* 0x8f */
4067/* File: arm/op_int_to_short.S */
4068/* File: arm/unop.S */
4069 /*
4070 * Generic 32-bit unary operation. Provide an "instr" line that
4071 * specifies an instruction that performs "result = op r0".
4072 * This could be an ARM instruction or a function call.
4073 *
4074 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4075 * int-to-byte, int-to-char, int-to-short
4076 */
4077 /* unop vA, vB */
4078 mov r3, rINST, lsr #12 @ r3<- B
4079 ubfx r9, rINST, #8, #4 @ r9<- A
4080 GET_VREG r0, r3 @ r0<- vB
4081 @ optional op; may set condition codes
4082 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4083 sxth r0, r0 @ r0<- op, r0-r3 changed
4084 GET_INST_OPCODE ip @ extract opcode from rINST
4085 SET_VREG r0, r9 @ vAA<- r0
4086 GOTO_OPCODE ip @ jump to next instruction
4087 /* 8-9 instructions */
4088
4089
4090/* ------------------------------ */
4091 .balign 128
4092.L_op_add_int: /* 0x90 */
4093/* File: arm/op_add_int.S */
4094/* File: arm/binop.S */
4095 /*
4096 * Generic 32-bit binary operation. Provide an "instr" line that
4097 * specifies an instruction that performs "result = r0 op r1".
4098 * This could be an ARM instruction or a function call. (If the result
4099 * comes back in a register other than r0, you can override "result".)
4100 *
4101 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4102 * vCC (r1). Useful for integer division and modulus. Note that we
4103 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4104 * handles it correctly.
4105 *
4106 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4107 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4108 * mul-float, div-float, rem-float
4109 */
4110 /* binop vAA, vBB, vCC */
4111 FETCH r0, 1 @ r0<- CCBB
4112 mov r9, rINST, lsr #8 @ r9<- AA
4113 mov r3, r0, lsr #8 @ r3<- CC
4114 and r2, r0, #255 @ r2<- BB
4115 GET_VREG r1, r3 @ r1<- vCC
4116 GET_VREG r0, r2 @ r0<- vBB
4117 .if 0
4118 cmp r1, #0 @ is second operand zero?
4119 beq common_errDivideByZero
4120 .endif
4121
4122 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4123 @ optional op; may set condition codes
4124 add r0, r0, r1 @ r0<- op, r0-r3 changed
4125 GET_INST_OPCODE ip @ extract opcode from rINST
4126 SET_VREG r0, r9 @ vAA<- r0
4127 GOTO_OPCODE ip @ jump to next instruction
4128 /* 11-14 instructions */
4129
4130
4131/* ------------------------------ */
4132 .balign 128
4133.L_op_sub_int: /* 0x91 */
4134/* File: arm/op_sub_int.S */
4135/* File: arm/binop.S */
4136 /*
4137 * Generic 32-bit binary operation. Provide an "instr" line that
4138 * specifies an instruction that performs "result = r0 op r1".
4139 * This could be an ARM instruction or a function call. (If the result
4140 * comes back in a register other than r0, you can override "result".)
4141 *
4142 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4143 * vCC (r1). Useful for integer division and modulus. Note that we
4144 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4145 * handles it correctly.
4146 *
4147 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4148 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4149 * mul-float, div-float, rem-float
4150 */
4151 /* binop vAA, vBB, vCC */
4152 FETCH r0, 1 @ r0<- CCBB
4153 mov r9, rINST, lsr #8 @ r9<- AA
4154 mov r3, r0, lsr #8 @ r3<- CC
4155 and r2, r0, #255 @ r2<- BB
4156 GET_VREG r1, r3 @ r1<- vCC
4157 GET_VREG r0, r2 @ r0<- vBB
4158 .if 0
4159 cmp r1, #0 @ is second operand zero?
4160 beq common_errDivideByZero
4161 .endif
4162
4163 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4164 @ optional op; may set condition codes
4165 sub r0, r0, r1 @ r0<- op, r0-r3 changed
4166 GET_INST_OPCODE ip @ extract opcode from rINST
4167 SET_VREG r0, r9 @ vAA<- r0
4168 GOTO_OPCODE ip @ jump to next instruction
4169 /* 11-14 instructions */
4170
4171
4172/* ------------------------------ */
4173 .balign 128
4174.L_op_mul_int: /* 0x92 */
4175/* File: arm/op_mul_int.S */
4176/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4177/* File: arm/binop.S */
4178 /*
4179 * Generic 32-bit binary operation. Provide an "instr" line that
4180 * specifies an instruction that performs "result = r0 op r1".
4181 * This could be an ARM instruction or a function call. (If the result
4182 * comes back in a register other than r0, you can override "result".)
4183 *
4184 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4185 * vCC (r1). Useful for integer division and modulus. Note that we
4186 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4187 * handles it correctly.
4188 *
4189 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4190 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4191 * mul-float, div-float, rem-float
4192 */
4193 /* binop vAA, vBB, vCC */
4194 FETCH r0, 1 @ r0<- CCBB
4195 mov r9, rINST, lsr #8 @ r9<- AA
4196 mov r3, r0, lsr #8 @ r3<- CC
4197 and r2, r0, #255 @ r2<- BB
4198 GET_VREG r1, r3 @ r1<- vCC
4199 GET_VREG r0, r2 @ r0<- vBB
4200 .if 0
4201 cmp r1, #0 @ is second operand zero?
4202 beq common_errDivideByZero
4203 .endif
4204
4205 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4206 @ optional op; may set condition codes
4207 mul r0, r1, r0 @ r0<- op, r0-r3 changed
4208 GET_INST_OPCODE ip @ extract opcode from rINST
4209 SET_VREG r0, r9 @ vAA<- r0
4210 GOTO_OPCODE ip @ jump to next instruction
4211 /* 11-14 instructions */
4212
4213
4214/* ------------------------------ */
4215 .balign 128
4216.L_op_div_int: /* 0x93 */
4217/* File: arm/op_div_int.S */
4218 /*
4219 * Specialized 32-bit binary operation
4220 *
4221 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4222 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4223 * ARMv7 CPUs that have hardware division support).
4224 *
4225 * div-int
4226 *
4227 */
4228 FETCH r0, 1 @ r0<- CCBB
4229 mov r9, rINST, lsr #8 @ r9<- AA
4230 mov r3, r0, lsr #8 @ r3<- CC
4231 and r2, r0, #255 @ r2<- BB
4232 GET_VREG r1, r3 @ r1<- vCC
4233 GET_VREG r0, r2 @ r0<- vBB
4234 cmp r1, #0 @ is second operand zero?
4235 beq common_errDivideByZero
4236
4237 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4238#ifdef __ARM_ARCH_EXT_IDIV__
4239 sdiv r0, r0, r1 @ r0<- op
4240#else
4241 bl __aeabi_idiv @ r0<- op, r0-r3 changed
4242#endif
4243 GET_INST_OPCODE ip @ extract opcode from rINST
4244 SET_VREG r0, r9 @ vAA<- r0
4245 GOTO_OPCODE ip @ jump to next instruction
4246 /* 11-14 instructions */
4247
4248/* ------------------------------ */
4249 .balign 128
4250.L_op_rem_int: /* 0x94 */
4251/* File: arm/op_rem_int.S */
4252 /*
4253 * Specialized 32-bit binary operation
4254 *
4255 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4256 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4257 * ARMv7 CPUs that have hardware division support).
4258 *
4259 * NOTE: idivmod returns quotient in r0 and remainder in r1
4260 *
4261 * rem-int
4262 *
4263 */
4264 FETCH r0, 1 @ r0<- CCBB
4265 mov r9, rINST, lsr #8 @ r9<- AA
4266 mov r3, r0, lsr #8 @ r3<- CC
4267 and r2, r0, #255 @ r2<- BB
4268 GET_VREG r1, r3 @ r1<- vCC
4269 GET_VREG r0, r2 @ r0<- vBB
4270 cmp r1, #0 @ is second operand zero?
4271 beq common_errDivideByZero
4272
4273 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4274#ifdef __ARM_ARCH_EXT_IDIV__
4275 sdiv r2, r0, r1
4276 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed
4277#else
4278 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
4279#endif
4280 GET_INST_OPCODE ip @ extract opcode from rINST
4281 SET_VREG r1, r9 @ vAA<- r1
4282 GOTO_OPCODE ip @ jump to next instruction
4283 /* 11-14 instructions */
4284
4285/* ------------------------------ */
4286 .balign 128
4287.L_op_and_int: /* 0x95 */
4288/* File: arm/op_and_int.S */
4289/* File: arm/binop.S */
4290 /*
4291 * Generic 32-bit binary operation. Provide an "instr" line that
4292 * specifies an instruction that performs "result = r0 op r1".
4293 * This could be an ARM instruction or a function call. (If the result
4294 * comes back in a register other than r0, you can override "result".)
4295 *
4296 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4297 * vCC (r1). Useful for integer division and modulus. Note that we
4298 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4299 * handles it correctly.
4300 *
4301 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4302 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4303 * mul-float, div-float, rem-float
4304 */
4305 /* binop vAA, vBB, vCC */
4306 FETCH r0, 1 @ r0<- CCBB
4307 mov r9, rINST, lsr #8 @ r9<- AA
4308 mov r3, r0, lsr #8 @ r3<- CC
4309 and r2, r0, #255 @ r2<- BB
4310 GET_VREG r1, r3 @ r1<- vCC
4311 GET_VREG r0, r2 @ r0<- vBB
4312 .if 0
4313 cmp r1, #0 @ is second operand zero?
4314 beq common_errDivideByZero
4315 .endif
4316
4317 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4318 @ optional op; may set condition codes
4319 and r0, r0, r1 @ r0<- op, r0-r3 changed
4320 GET_INST_OPCODE ip @ extract opcode from rINST
4321 SET_VREG r0, r9 @ vAA<- r0
4322 GOTO_OPCODE ip @ jump to next instruction
4323 /* 11-14 instructions */
4324
4325
4326/* ------------------------------ */
4327 .balign 128
4328.L_op_or_int: /* 0x96 */
4329/* File: arm/op_or_int.S */
4330/* File: arm/binop.S */
4331 /*
4332 * Generic 32-bit binary operation. Provide an "instr" line that
4333 * specifies an instruction that performs "result = r0 op r1".
4334 * This could be an ARM instruction or a function call. (If the result
4335 * comes back in a register other than r0, you can override "result".)
4336 *
4337 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4338 * vCC (r1). Useful for integer division and modulus. Note that we
4339 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4340 * handles it correctly.
4341 *
4342 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4343 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4344 * mul-float, div-float, rem-float
4345 */
4346 /* binop vAA, vBB, vCC */
4347 FETCH r0, 1 @ r0<- CCBB
4348 mov r9, rINST, lsr #8 @ r9<- AA
4349 mov r3, r0, lsr #8 @ r3<- CC
4350 and r2, r0, #255 @ r2<- BB
4351 GET_VREG r1, r3 @ r1<- vCC
4352 GET_VREG r0, r2 @ r0<- vBB
4353 .if 0
4354 cmp r1, #0 @ is second operand zero?
4355 beq common_errDivideByZero
4356 .endif
4357
4358 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4359 @ optional op; may set condition codes
4360 orr r0, r0, r1 @ r0<- op, r0-r3 changed
4361 GET_INST_OPCODE ip @ extract opcode from rINST
4362 SET_VREG r0, r9 @ vAA<- r0
4363 GOTO_OPCODE ip @ jump to next instruction
4364 /* 11-14 instructions */
4365
4366
4367/* ------------------------------ */
4368 .balign 128
4369.L_op_xor_int: /* 0x97 */
4370/* File: arm/op_xor_int.S */
4371/* File: arm/binop.S */
4372 /*
4373 * Generic 32-bit binary operation. Provide an "instr" line that
4374 * specifies an instruction that performs "result = r0 op r1".
4375 * This could be an ARM instruction or a function call. (If the result
4376 * comes back in a register other than r0, you can override "result".)
4377 *
4378 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4379 * vCC (r1). Useful for integer division and modulus. Note that we
4380 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4381 * handles it correctly.
4382 *
4383 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4384 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4385 * mul-float, div-float, rem-float
4386 */
4387 /* binop vAA, vBB, vCC */
4388 FETCH r0, 1 @ r0<- CCBB
4389 mov r9, rINST, lsr #8 @ r9<- AA
4390 mov r3, r0, lsr #8 @ r3<- CC
4391 and r2, r0, #255 @ r2<- BB
4392 GET_VREG r1, r3 @ r1<- vCC
4393 GET_VREG r0, r2 @ r0<- vBB
4394 .if 0
4395 cmp r1, #0 @ is second operand zero?
4396 beq common_errDivideByZero
4397 .endif
4398
4399 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4400 @ optional op; may set condition codes
4401 eor r0, r0, r1 @ r0<- op, r0-r3 changed
4402 GET_INST_OPCODE ip @ extract opcode from rINST
4403 SET_VREG r0, r9 @ vAA<- r0
4404 GOTO_OPCODE ip @ jump to next instruction
4405 /* 11-14 instructions */
4406
4407
4408/* ------------------------------ */
4409 .balign 128
4410.L_op_shl_int: /* 0x98 */
4411/* File: arm/op_shl_int.S */
4412/* File: arm/binop.S */
4413 /*
4414 * Generic 32-bit binary operation. Provide an "instr" line that
4415 * specifies an instruction that performs "result = r0 op r1".
4416 * This could be an ARM instruction or a function call. (If the result
4417 * comes back in a register other than r0, you can override "result".)
4418 *
4419 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4420 * vCC (r1). Useful for integer division and modulus. Note that we
4421 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4422 * handles it correctly.
4423 *
4424 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4425 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4426 * mul-float, div-float, rem-float
4427 */
4428 /* binop vAA, vBB, vCC */
4429 FETCH r0, 1 @ r0<- CCBB
4430 mov r9, rINST, lsr #8 @ r9<- AA
4431 mov r3, r0, lsr #8 @ r3<- CC
4432 and r2, r0, #255 @ r2<- BB
4433 GET_VREG r1, r3 @ r1<- vCC
4434 GET_VREG r0, r2 @ r0<- vBB
4435 .if 0
4436 cmp r1, #0 @ is second operand zero?
4437 beq common_errDivideByZero
4438 .endif
4439
4440 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4441 and r1, r1, #31 @ optional op; may set condition codes
4442 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
4443 GET_INST_OPCODE ip @ extract opcode from rINST
4444 SET_VREG r0, r9 @ vAA<- r0
4445 GOTO_OPCODE ip @ jump to next instruction
4446 /* 11-14 instructions */
4447
4448
4449/* ------------------------------ */
4450 .balign 128
4451.L_op_shr_int: /* 0x99 */
4452/* File: arm/op_shr_int.S */
4453/* File: arm/binop.S */
4454 /*
4455 * Generic 32-bit binary operation. Provide an "instr" line that
4456 * specifies an instruction that performs "result = r0 op r1".
4457 * This could be an ARM instruction or a function call. (If the result
4458 * comes back in a register other than r0, you can override "result".)
4459 *
4460 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4461 * vCC (r1). Useful for integer division and modulus. Note that we
4462 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4463 * handles it correctly.
4464 *
4465 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4466 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4467 * mul-float, div-float, rem-float
4468 */
4469 /* binop vAA, vBB, vCC */
4470 FETCH r0, 1 @ r0<- CCBB
4471 mov r9, rINST, lsr #8 @ r9<- AA
4472 mov r3, r0, lsr #8 @ r3<- CC
4473 and r2, r0, #255 @ r2<- BB
4474 GET_VREG r1, r3 @ r1<- vCC
4475 GET_VREG r0, r2 @ r0<- vBB
4476 .if 0
4477 cmp r1, #0 @ is second operand zero?
4478 beq common_errDivideByZero
4479 .endif
4480
4481 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4482 and r1, r1, #31 @ optional op; may set condition codes
4483 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
4484 GET_INST_OPCODE ip @ extract opcode from rINST
4485 SET_VREG r0, r9 @ vAA<- r0
4486 GOTO_OPCODE ip @ jump to next instruction
4487 /* 11-14 instructions */
4488
4489
4490/* ------------------------------ */
4491 .balign 128
4492.L_op_ushr_int: /* 0x9a */
4493/* File: arm/op_ushr_int.S */
4494/* File: arm/binop.S */
4495 /*
4496 * Generic 32-bit binary operation. Provide an "instr" line that
4497 * specifies an instruction that performs "result = r0 op r1".
4498 * This could be an ARM instruction or a function call. (If the result
4499 * comes back in a register other than r0, you can override "result".)
4500 *
4501 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4502 * vCC (r1). Useful for integer division and modulus. Note that we
4503 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4504 * handles it correctly.
4505 *
4506 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4507 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4508 * mul-float, div-float, rem-float
4509 */
4510 /* binop vAA, vBB, vCC */
4511 FETCH r0, 1 @ r0<- CCBB
4512 mov r9, rINST, lsr #8 @ r9<- AA
4513 mov r3, r0, lsr #8 @ r3<- CC
4514 and r2, r0, #255 @ r2<- BB
4515 GET_VREG r1, r3 @ r1<- vCC
4516 GET_VREG r0, r2 @ r0<- vBB
4517 .if 0
4518 cmp r1, #0 @ is second operand zero?
4519 beq common_errDivideByZero
4520 .endif
4521
4522 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4523 and r1, r1, #31 @ optional op; may set condition codes
4524 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
4525 GET_INST_OPCODE ip @ extract opcode from rINST
4526 SET_VREG r0, r9 @ vAA<- r0
4527 GOTO_OPCODE ip @ jump to next instruction
4528 /* 11-14 instructions */
4529
4530
4531/* ------------------------------ */
4532 .balign 128
4533.L_op_add_long: /* 0x9b */
4534/* File: arm/op_add_long.S */
4535/* File: arm/binopWide.S */
4536 /*
4537 * Generic 64-bit binary operation. Provide an "instr" line that
4538 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4539 * This could be an ARM instruction or a function call. (If the result
4540 * comes back in a register other than r0, you can override "result".)
4541 *
4542 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4543 * vCC (r1). Useful for integer division and modulus.
4544 *
4545 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4546 * xor-long, add-double, sub-double, mul-double, div-double,
4547 * rem-double
4548 *
4549 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4550 */
4551 /* binop vAA, vBB, vCC */
4552 FETCH r0, 1 @ r0<- CCBB
4553 mov r9, rINST, lsr #8 @ r9<- AA
4554 and r2, r0, #255 @ r2<- BB
4555 mov r3, r0, lsr #8 @ r3<- CC
4556 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4557 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4558 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4559 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4560 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4561 .if 0
4562 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4563 beq common_errDivideByZero
4564 .endif
4565 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4566
4567 adds r0, r0, r2 @ optional op; may set condition codes
4568 adc r1, r1, r3 @ result<- op, r0-r3 changed
4569 GET_INST_OPCODE ip @ extract opcode from rINST
4570 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4571 GOTO_OPCODE ip @ jump to next instruction
4572 /* 14-17 instructions */
4573
4574
4575/* ------------------------------ */
4576 .balign 128
4577.L_op_sub_long: /* 0x9c */
4578/* File: arm/op_sub_long.S */
4579/* File: arm/binopWide.S */
4580 /*
4581 * Generic 64-bit binary operation. Provide an "instr" line that
4582 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4583 * This could be an ARM instruction or a function call. (If the result
4584 * comes back in a register other than r0, you can override "result".)
4585 *
4586 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4587 * vCC (r1). Useful for integer division and modulus.
4588 *
4589 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4590 * xor-long, add-double, sub-double, mul-double, div-double,
4591 * rem-double
4592 *
4593 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4594 */
4595 /* binop vAA, vBB, vCC */
4596 FETCH r0, 1 @ r0<- CCBB
4597 mov r9, rINST, lsr #8 @ r9<- AA
4598 and r2, r0, #255 @ r2<- BB
4599 mov r3, r0, lsr #8 @ r3<- CC
4600 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4601 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4602 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4603 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4604 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4605 .if 0
4606 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4607 beq common_errDivideByZero
4608 .endif
4609 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4610
4611 subs r0, r0, r2 @ optional op; may set condition codes
4612 sbc r1, r1, r3 @ result<- op, r0-r3 changed
4613 GET_INST_OPCODE ip @ extract opcode from rINST
4614 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4615 GOTO_OPCODE ip @ jump to next instruction
4616 /* 14-17 instructions */
4617
4618
4619/* ------------------------------ */
4620 .balign 128
4621.L_op_mul_long: /* 0x9d */
4622/* File: arm/op_mul_long.S */
4623 /*
4624 * Signed 64-bit integer multiply.
4625 *
4626 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4627 * WX
4628 * x YZ
4629 * --------
4630 * ZW ZX
4631 * YW YX
4632 *
4633 * The low word of the result holds ZX, the high word holds
4634 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
4635 * it doesn't fit in the low 64 bits.
4636 *
4637 * Unlike most ARM math operations, multiply instructions have
4638 * restrictions on using the same register more than once (Rd and Rm
4639 * cannot be the same).
4640 */
4641 /* mul-long vAA, vBB, vCC */
4642 FETCH r0, 1 @ r0<- CCBB
4643 and r2, r0, #255 @ r2<- BB
4644 mov r3, r0, lsr #8 @ r3<- CC
4645 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4646 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4647 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4648 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4649 mul ip, r2, r1 @ ip<- ZxW
4650 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
4651 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
4652 mov r0, rINST, lsr #8 @ r0<- AA
4653 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
4654 add r0, rFP, r0, lsl #2 @ r0<- &fp[AA]
4655 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4656 GET_INST_OPCODE ip @ extract opcode from rINST
4657 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
4658 GOTO_OPCODE ip @ jump to next instruction
4659
4660/* ------------------------------ */
4661 .balign 128
4662.L_op_div_long: /* 0x9e */
4663/* File: arm/op_div_long.S */
4664/* File: arm/binopWide.S */
4665 /*
4666 * Generic 64-bit binary operation. Provide an "instr" line that
4667 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4668 * This could be an ARM instruction or a function call. (If the result
4669 * comes back in a register other than r0, you can override "result".)
4670 *
4671 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4672 * vCC (r1). Useful for integer division and modulus.
4673 *
4674 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4675 * xor-long, add-double, sub-double, mul-double, div-double,
4676 * rem-double
4677 *
4678 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4679 */
4680 /* binop vAA, vBB, vCC */
4681 FETCH r0, 1 @ r0<- CCBB
4682 mov r9, rINST, lsr #8 @ r9<- AA
4683 and r2, r0, #255 @ r2<- BB
4684 mov r3, r0, lsr #8 @ r3<- CC
4685 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4686 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4687 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4688 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4689 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4690 .if 1
4691 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4692 beq common_errDivideByZero
4693 .endif
4694 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4695
4696 @ optional op; may set condition codes
4697 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4698 GET_INST_OPCODE ip @ extract opcode from rINST
4699 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4700 GOTO_OPCODE ip @ jump to next instruction
4701 /* 14-17 instructions */
4702
4703
4704/* ------------------------------ */
4705 .balign 128
4706.L_op_rem_long: /* 0x9f */
4707/* File: arm/op_rem_long.S */
4708/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4709/* File: arm/binopWide.S */
4710 /*
4711 * Generic 64-bit binary operation. Provide an "instr" line that
4712 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4713 * This could be an ARM instruction or a function call. (If the result
4714 * comes back in a register other than r0, you can override "result".)
4715 *
4716 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4717 * vCC (r1). Useful for integer division and modulus.
4718 *
4719 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4720 * xor-long, add-double, sub-double, mul-double, div-double,
4721 * rem-double
4722 *
4723 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4724 */
4725 /* binop vAA, vBB, vCC */
4726 FETCH r0, 1 @ r0<- CCBB
4727 mov r9, rINST, lsr #8 @ r9<- AA
4728 and r2, r0, #255 @ r2<- BB
4729 mov r3, r0, lsr #8 @ r3<- CC
4730 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4731 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4732 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4733 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4734 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4735 .if 1
4736 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4737 beq common_errDivideByZero
4738 .endif
4739 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4740
4741 @ optional op; may set condition codes
4742 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4743 GET_INST_OPCODE ip @ extract opcode from rINST
4744 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
4745 GOTO_OPCODE ip @ jump to next instruction
4746 /* 14-17 instructions */
4747
4748
4749/* ------------------------------ */
4750 .balign 128
4751.L_op_and_long: /* 0xa0 */
4752/* File: arm/op_and_long.S */
4753/* File: arm/binopWide.S */
4754 /*
4755 * Generic 64-bit binary operation. Provide an "instr" line that
4756 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4757 * This could be an ARM instruction or a function call. (If the result
4758 * comes back in a register other than r0, you can override "result".)
4759 *
4760 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4761 * vCC (r1). Useful for integer division and modulus.
4762 *
4763 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4764 * xor-long, add-double, sub-double, mul-double, div-double,
4765 * rem-double
4766 *
4767 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4768 */
4769 /* binop vAA, vBB, vCC */
4770 FETCH r0, 1 @ r0<- CCBB
4771 mov r9, rINST, lsr #8 @ r9<- AA
4772 and r2, r0, #255 @ r2<- BB
4773 mov r3, r0, lsr #8 @ r3<- CC
4774 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4775 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4776 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4777 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4778 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4779 .if 0
4780 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4781 beq common_errDivideByZero
4782 .endif
4783 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4784
4785 and r0, r0, r2 @ optional op; may set condition codes
4786 and r1, r1, r3 @ result<- op, r0-r3 changed
4787 GET_INST_OPCODE ip @ extract opcode from rINST
4788 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4789 GOTO_OPCODE ip @ jump to next instruction
4790 /* 14-17 instructions */
4791
4792
4793/* ------------------------------ */
4794 .balign 128
4795.L_op_or_long: /* 0xa1 */
4796/* File: arm/op_or_long.S */
4797/* File: arm/binopWide.S */
4798 /*
4799 * Generic 64-bit binary operation. Provide an "instr" line that
4800 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4801 * This could be an ARM instruction or a function call. (If the result
4802 * comes back in a register other than r0, you can override "result".)
4803 *
4804 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4805 * vCC (r1). Useful for integer division and modulus.
4806 *
4807 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4808 * xor-long, add-double, sub-double, mul-double, div-double,
4809 * rem-double
4810 *
4811 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4812 */
4813 /* binop vAA, vBB, vCC */
4814 FETCH r0, 1 @ r0<- CCBB
4815 mov r9, rINST, lsr #8 @ r9<- AA
4816 and r2, r0, #255 @ r2<- BB
4817 mov r3, r0, lsr #8 @ r3<- CC
4818 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4819 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4820 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4821 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4822 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4823 .if 0
4824 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4825 beq common_errDivideByZero
4826 .endif
4827 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4828
4829 orr r0, r0, r2 @ optional op; may set condition codes
4830 orr r1, r1, r3 @ result<- op, r0-r3 changed
4831 GET_INST_OPCODE ip @ extract opcode from rINST
4832 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4833 GOTO_OPCODE ip @ jump to next instruction
4834 /* 14-17 instructions */
4835
4836
4837/* ------------------------------ */
4838 .balign 128
4839.L_op_xor_long: /* 0xa2 */
4840/* File: arm/op_xor_long.S */
4841/* File: arm/binopWide.S */
4842 /*
4843 * Generic 64-bit binary operation. Provide an "instr" line that
4844 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4845 * This could be an ARM instruction or a function call. (If the result
4846 * comes back in a register other than r0, you can override "result".)
4847 *
4848 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4849 * vCC (r1). Useful for integer division and modulus.
4850 *
4851 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4852 * xor-long, add-double, sub-double, mul-double, div-double,
4853 * rem-double
4854 *
4855 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4856 */
4857 /* binop vAA, vBB, vCC */
4858 FETCH r0, 1 @ r0<- CCBB
4859 mov r9, rINST, lsr #8 @ r9<- AA
4860 and r2, r0, #255 @ r2<- BB
4861 mov r3, r0, lsr #8 @ r3<- CC
4862 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4863 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4864 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4865 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4866 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4867 .if 0
4868 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4869 beq common_errDivideByZero
4870 .endif
4871 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4872
4873 eor r0, r0, r2 @ optional op; may set condition codes
4874 eor r1, r1, r3 @ result<- op, r0-r3 changed
4875 GET_INST_OPCODE ip @ extract opcode from rINST
4876 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4877 GOTO_OPCODE ip @ jump to next instruction
4878 /* 14-17 instructions */
4879
4880
4881/* ------------------------------ */
4882 .balign 128
4883.L_op_shl_long: /* 0xa3 */
4884/* File: arm/op_shl_long.S */
4885 /*
4886 * Long integer shift. This is different from the generic 32/64-bit
4887 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4888 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4889 * 6 bits of the shift distance.
4890 */
4891 /* shl-long vAA, vBB, vCC */
4892 FETCH r0, 1 @ r0<- CCBB
4893 mov r9, rINST, lsr #8 @ r9<- AA
4894 and r3, r0, #255 @ r3<- BB
4895 mov r0, r0, lsr #8 @ r0<- CC
4896 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4897 GET_VREG r2, r0 @ r2<- vCC
4898 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4899 and r2, r2, #63 @ r2<- r2 & 0x3f
4900 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4901
4902 mov r1, r1, asl r2 @ r1<- r1 << r2
4903 rsb r3, r2, #32 @ r3<- 32 - r2
4904 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
4905 subs ip, r2, #32 @ ip<- r2 - 32
4906 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
4907 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4908 mov r0, r0, asl r2 @ r0<- r0 << r2
4909 GET_INST_OPCODE ip @ extract opcode from rINST
4910 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4911 GOTO_OPCODE ip @ jump to next instruction
4912
4913/* ------------------------------ */
4914 .balign 128
4915.L_op_shr_long: /* 0xa4 */
4916/* File: arm/op_shr_long.S */
4917 /*
4918 * Long integer shift. This is different from the generic 32/64-bit
4919 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4920 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4921 * 6 bits of the shift distance.
4922 */
4923 /* shr-long vAA, vBB, vCC */
4924 FETCH r0, 1 @ r0<- CCBB
4925 mov r9, rINST, lsr #8 @ r9<- AA
4926 and r3, r0, #255 @ r3<- BB
4927 mov r0, r0, lsr #8 @ r0<- CC
4928 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4929 GET_VREG r2, r0 @ r2<- vCC
4930 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4931 and r2, r2, #63 @ r0<- r0 & 0x3f
4932 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4933
4934 mov r0, r0, lsr r2 @ r0<- r2 >> r2
4935 rsb r3, r2, #32 @ r3<- 32 - r2
4936 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
4937 subs ip, r2, #32 @ ip<- r2 - 32
4938 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
4939 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4940 mov r1, r1, asr r2 @ r1<- r1 >> r2
4941 GET_INST_OPCODE ip @ extract opcode from rINST
4942 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4943 GOTO_OPCODE ip @ jump to next instruction
4944
4945/* ------------------------------ */
4946 .balign 128
4947.L_op_ushr_long: /* 0xa5 */
4948/* File: arm/op_ushr_long.S */
4949 /*
4950 * Long integer shift. This is different from the generic 32/64-bit
4951 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4952 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4953 * 6 bits of the shift distance.
4954 */
4955 /* ushr-long vAA, vBB, vCC */
4956 FETCH r0, 1 @ r0<- CCBB
4957 mov r9, rINST, lsr #8 @ r9<- AA
4958 and r3, r0, #255 @ r3<- BB
4959 mov r0, r0, lsr #8 @ r0<- CC
4960 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4961 GET_VREG r2, r0 @ r2<- vCC
4962 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4963 and r2, r2, #63 @ r0<- r0 & 0x3f
4964 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4965
4966 mov r0, r0, lsr r2 @ r0<- r2 >> r2
4967 rsb r3, r2, #32 @ r3<- 32 - r2
4968 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
4969 subs ip, r2, #32 @ ip<- r2 - 32
4970 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
4971 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4972 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
4973 GET_INST_OPCODE ip @ extract opcode from rINST
4974 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4975 GOTO_OPCODE ip @ jump to next instruction
4976
4977/* ------------------------------ */
4978 .balign 128
4979.L_op_add_float: /* 0xa6 */
4980/* File: arm/op_add_float.S */
4981/* File: arm/fbinop.S */
4982 /*
4983 * Generic 32-bit floating-point operation. Provide an "instr" line that
4984 * specifies an instruction that performs "s2 = s0 op s1". Because we
4985 * use the "softfp" ABI, this must be an instruction, not a function call.
4986 *
4987 * For: add-float, sub-float, mul-float, div-float
4988 */
4989 /* floatop vAA, vBB, vCC */
4990 FETCH r0, 1 @ r0<- CCBB
4991 mov r9, rINST, lsr #8 @ r9<- AA
4992 mov r3, r0, lsr #8 @ r3<- CC
4993 and r2, r0, #255 @ r2<- BB
4994 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
4995 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
4996 flds s1, [r3] @ s1<- vCC
4997 flds s0, [r2] @ s0<- vBB
4998
4999 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5000 fadds s2, s0, s1 @ s2<- op
5001 GET_INST_OPCODE ip @ extract opcode from rINST
5002 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5003 fsts s2, [r9] @ vAA<- s2
5004 GOTO_OPCODE ip @ jump to next instruction
5005
5006
5007/* ------------------------------ */
5008 .balign 128
5009.L_op_sub_float: /* 0xa7 */
5010/* File: arm/op_sub_float.S */
5011/* File: arm/fbinop.S */
5012 /*
5013 * Generic 32-bit floating-point operation. Provide an "instr" line that
5014 * specifies an instruction that performs "s2 = s0 op s1". Because we
5015 * use the "softfp" ABI, this must be an instruction, not a function call.
5016 *
5017 * For: add-float, sub-float, mul-float, div-float
5018 */
5019 /* floatop vAA, vBB, vCC */
5020 FETCH r0, 1 @ r0<- CCBB
5021 mov r9, rINST, lsr #8 @ r9<- AA
5022 mov r3, r0, lsr #8 @ r3<- CC
5023 and r2, r0, #255 @ r2<- BB
5024 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5025 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5026 flds s1, [r3] @ s1<- vCC
5027 flds s0, [r2] @ s0<- vBB
5028
5029 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5030 fsubs s2, s0, s1 @ s2<- op
5031 GET_INST_OPCODE ip @ extract opcode from rINST
5032 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5033 fsts s2, [r9] @ vAA<- s2
5034 GOTO_OPCODE ip @ jump to next instruction
5035
5036
5037/* ------------------------------ */
5038 .balign 128
5039.L_op_mul_float: /* 0xa8 */
5040/* File: arm/op_mul_float.S */
5041/* File: arm/fbinop.S */
5042 /*
5043 * Generic 32-bit floating-point operation. Provide an "instr" line that
5044 * specifies an instruction that performs "s2 = s0 op s1". Because we
5045 * use the "softfp" ABI, this must be an instruction, not a function call.
5046 *
5047 * For: add-float, sub-float, mul-float, div-float
5048 */
5049 /* floatop vAA, vBB, vCC */
5050 FETCH r0, 1 @ r0<- CCBB
5051 mov r9, rINST, lsr #8 @ r9<- AA
5052 mov r3, r0, lsr #8 @ r3<- CC
5053 and r2, r0, #255 @ r2<- BB
5054 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5055 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5056 flds s1, [r3] @ s1<- vCC
5057 flds s0, [r2] @ s0<- vBB
5058
5059 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5060 fmuls s2, s0, s1 @ s2<- op
5061 GET_INST_OPCODE ip @ extract opcode from rINST
5062 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5063 fsts s2, [r9] @ vAA<- s2
5064 GOTO_OPCODE ip @ jump to next instruction
5065
5066
5067/* ------------------------------ */
5068 .balign 128
5069.L_op_div_float: /* 0xa9 */
5070/* File: arm/op_div_float.S */
5071/* File: arm/fbinop.S */
5072 /*
5073 * Generic 32-bit floating-point operation. Provide an "instr" line that
5074 * specifies an instruction that performs "s2 = s0 op s1". Because we
5075 * use the "softfp" ABI, this must be an instruction, not a function call.
5076 *
5077 * For: add-float, sub-float, mul-float, div-float
5078 */
5079 /* floatop vAA, vBB, vCC */
5080 FETCH r0, 1 @ r0<- CCBB
5081 mov r9, rINST, lsr #8 @ r9<- AA
5082 mov r3, r0, lsr #8 @ r3<- CC
5083 and r2, r0, #255 @ r2<- BB
5084 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5085 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5086 flds s1, [r3] @ s1<- vCC
5087 flds s0, [r2] @ s0<- vBB
5088
5089 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5090 fdivs s2, s0, s1 @ s2<- op
5091 GET_INST_OPCODE ip @ extract opcode from rINST
5092 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5093 fsts s2, [r9] @ vAA<- s2
5094 GOTO_OPCODE ip @ jump to next instruction
5095
5096
5097/* ------------------------------ */
5098 .balign 128
5099.L_op_rem_float: /* 0xaa */
5100/* File: arm/op_rem_float.S */
5101/* EABI doesn't define a float remainder function, but libm does */
5102/* File: arm/binop.S */
5103 /*
5104 * Generic 32-bit binary operation. Provide an "instr" line that
5105 * specifies an instruction that performs "result = r0 op r1".
5106 * This could be an ARM instruction or a function call. (If the result
5107 * comes back in a register other than r0, you can override "result".)
5108 *
5109 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5110 * vCC (r1). Useful for integer division and modulus. Note that we
5111 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5112 * handles it correctly.
5113 *
5114 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5115 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5116 * mul-float, div-float, rem-float
5117 */
5118 /* binop vAA, vBB, vCC */
5119 FETCH r0, 1 @ r0<- CCBB
5120 mov r9, rINST, lsr #8 @ r9<- AA
5121 mov r3, r0, lsr #8 @ r3<- CC
5122 and r2, r0, #255 @ r2<- BB
5123 GET_VREG r1, r3 @ r1<- vCC
5124 GET_VREG r0, r2 @ r0<- vBB
5125 .if 0
5126 cmp r1, #0 @ is second operand zero?
5127 beq common_errDivideByZero
5128 .endif
5129
5130 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5131 @ optional op; may set condition codes
5132 bl fmodf @ r0<- op, r0-r3 changed
5133 GET_INST_OPCODE ip @ extract opcode from rINST
5134 SET_VREG r0, r9 @ vAA<- r0
5135 GOTO_OPCODE ip @ jump to next instruction
5136 /* 11-14 instructions */
5137
5138
5139/* ------------------------------ */
5140 .balign 128
5141.L_op_add_double: /* 0xab */
5142/* File: arm/op_add_double.S */
5143/* File: arm/fbinopWide.S */
5144 /*
5145 * Generic 64-bit double-precision floating point binary operation.
5146 * Provide an "instr" line that specifies an instruction that performs
5147 * "d2 = d0 op d1".
5148 *
5149 * for: add-double, sub-double, mul-double, div-double
5150 */
5151 /* doubleop vAA, vBB, vCC */
5152 FETCH r0, 1 @ r0<- CCBB
5153 mov r9, rINST, lsr #8 @ r9<- AA
5154 mov r3, r0, lsr #8 @ r3<- CC
5155 and r2, r0, #255 @ r2<- BB
5156 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5157 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5158 fldd d1, [r3] @ d1<- vCC
5159 fldd d0, [r2] @ d0<- vBB
5160
5161 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5162 faddd d2, d0, d1 @ s2<- op
5163 GET_INST_OPCODE ip @ extract opcode from rINST
5164 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5165 fstd d2, [r9] @ vAA<- d2
5166 GOTO_OPCODE ip @ jump to next instruction
5167
5168
5169/* ------------------------------ */
5170 .balign 128
5171.L_op_sub_double: /* 0xac */
5172/* File: arm/op_sub_double.S */
5173/* File: arm/fbinopWide.S */
5174 /*
5175 * Generic 64-bit double-precision floating point binary operation.
5176 * Provide an "instr" line that specifies an instruction that performs
5177 * "d2 = d0 op d1".
5178 *
5179 * for: add-double, sub-double, mul-double, div-double
5180 */
5181 /* doubleop vAA, vBB, vCC */
5182 FETCH r0, 1 @ r0<- CCBB
5183 mov r9, rINST, lsr #8 @ r9<- AA
5184 mov r3, r0, lsr #8 @ r3<- CC
5185 and r2, r0, #255 @ r2<- BB
5186 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5187 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5188 fldd d1, [r3] @ d1<- vCC
5189 fldd d0, [r2] @ d0<- vBB
5190
5191 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5192 fsubd d2, d0, d1 @ s2<- op
5193 GET_INST_OPCODE ip @ extract opcode from rINST
5194 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5195 fstd d2, [r9] @ vAA<- d2
5196 GOTO_OPCODE ip @ jump to next instruction
5197
5198
5199/* ------------------------------ */
5200 .balign 128
5201.L_op_mul_double: /* 0xad */
5202/* File: arm/op_mul_double.S */
5203/* File: arm/fbinopWide.S */
5204 /*
5205 * Generic 64-bit double-precision floating point binary operation.
5206 * Provide an "instr" line that specifies an instruction that performs
5207 * "d2 = d0 op d1".
5208 *
5209 * for: add-double, sub-double, mul-double, div-double
5210 */
5211 /* doubleop vAA, vBB, vCC */
5212 FETCH r0, 1 @ r0<- CCBB
5213 mov r9, rINST, lsr #8 @ r9<- AA
5214 mov r3, r0, lsr #8 @ r3<- CC
5215 and r2, r0, #255 @ r2<- BB
5216 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5217 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5218 fldd d1, [r3] @ d1<- vCC
5219 fldd d0, [r2] @ d0<- vBB
5220
5221 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5222 fmuld d2, d0, d1 @ s2<- op
5223 GET_INST_OPCODE ip @ extract opcode from rINST
5224 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5225 fstd d2, [r9] @ vAA<- d2
5226 GOTO_OPCODE ip @ jump to next instruction
5227
5228
5229/* ------------------------------ */
5230 .balign 128
5231.L_op_div_double: /* 0xae */
5232/* File: arm/op_div_double.S */
5233/* File: arm/fbinopWide.S */
5234 /*
5235 * Generic 64-bit double-precision floating point binary operation.
5236 * Provide an "instr" line that specifies an instruction that performs
5237 * "d2 = d0 op d1".
5238 *
5239 * for: add-double, sub-double, mul-double, div-double
5240 */
5241 /* doubleop vAA, vBB, vCC */
5242 FETCH r0, 1 @ r0<- CCBB
5243 mov r9, rINST, lsr #8 @ r9<- AA
5244 mov r3, r0, lsr #8 @ r3<- CC
5245 and r2, r0, #255 @ r2<- BB
5246 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5247 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5248 fldd d1, [r3] @ d1<- vCC
5249 fldd d0, [r2] @ d0<- vBB
5250
5251 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5252 fdivd d2, d0, d1 @ s2<- op
5253 GET_INST_OPCODE ip @ extract opcode from rINST
5254 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5255 fstd d2, [r9] @ vAA<- d2
5256 GOTO_OPCODE ip @ jump to next instruction
5257
5258
5259/* ------------------------------ */
5260 .balign 128
5261.L_op_rem_double: /* 0xaf */
5262/* File: arm/op_rem_double.S */
5263/* EABI doesn't define a double remainder function, but libm does */
5264/* File: arm/binopWide.S */
5265 /*
5266 * Generic 64-bit binary operation. Provide an "instr" line that
5267 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5268 * This could be an ARM instruction or a function call. (If the result
5269 * comes back in a register other than r0, you can override "result".)
5270 *
5271 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5272 * vCC (r1). Useful for integer division and modulus.
5273 *
5274 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5275 * xor-long, add-double, sub-double, mul-double, div-double,
5276 * rem-double
5277 *
5278 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5279 */
5280 /* binop vAA, vBB, vCC */
5281 FETCH r0, 1 @ r0<- CCBB
5282 mov r9, rINST, lsr #8 @ r9<- AA
5283 and r2, r0, #255 @ r2<- BB
5284 mov r3, r0, lsr #8 @ r3<- CC
5285 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5286 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5287 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5288 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5289 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5290 .if 0
5291 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5292 beq common_errDivideByZero
5293 .endif
5294 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5295
5296 @ optional op; may set condition codes
5297 bl fmod @ result<- op, r0-r3 changed
5298 GET_INST_OPCODE ip @ extract opcode from rINST
5299 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5300 GOTO_OPCODE ip @ jump to next instruction
5301 /* 14-17 instructions */
5302
5303
5304/* ------------------------------ */
5305 .balign 128
5306.L_op_add_int_2addr: /* 0xb0 */
5307/* File: arm/op_add_int_2addr.S */
5308/* File: arm/binop2addr.S */
5309 /*
5310 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5311 * that specifies an instruction that performs "result = r0 op r1".
5312 * This could be an ARM instruction or a function call. (If the result
5313 * comes back in a register other than r0, you can override "result".)
5314 *
5315 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5316 * vCC (r1). Useful for integer division and modulus.
5317 *
5318 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5319 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5320 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5321 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5322 */
5323 /* binop/2addr vA, vB */
5324 mov r3, rINST, lsr #12 @ r3<- B
5325 ubfx r9, rINST, #8, #4 @ r9<- A
5326 GET_VREG r1, r3 @ r1<- vB
5327 GET_VREG r0, r9 @ r0<- vA
5328 .if 0
5329 cmp r1, #0 @ is second operand zero?
5330 beq common_errDivideByZero
5331 .endif
5332 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5333
5334 @ optional op; may set condition codes
5335 add r0, r0, r1 @ r0<- op, r0-r3 changed
5336 GET_INST_OPCODE ip @ extract opcode from rINST
5337 SET_VREG r0, r9 @ vAA<- r0
5338 GOTO_OPCODE ip @ jump to next instruction
5339 /* 10-13 instructions */
5340
5341
5342/* ------------------------------ */
5343 .balign 128
5344.L_op_sub_int_2addr: /* 0xb1 */
5345/* File: arm/op_sub_int_2addr.S */
5346/* File: arm/binop2addr.S */
5347 /*
5348 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5349 * that specifies an instruction that performs "result = r0 op r1".
5350 * This could be an ARM instruction or a function call. (If the result
5351 * comes back in a register other than r0, you can override "result".)
5352 *
5353 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5354 * vCC (r1). Useful for integer division and modulus.
5355 *
5356 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5357 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5358 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5359 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5360 */
5361 /* binop/2addr vA, vB */
5362 mov r3, rINST, lsr #12 @ r3<- B
5363 ubfx r9, rINST, #8, #4 @ r9<- A
5364 GET_VREG r1, r3 @ r1<- vB
5365 GET_VREG r0, r9 @ r0<- vA
5366 .if 0
5367 cmp r1, #0 @ is second operand zero?
5368 beq common_errDivideByZero
5369 .endif
5370 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5371
5372 @ optional op; may set condition codes
5373 sub r0, r0, r1 @ r0<- op, r0-r3 changed
5374 GET_INST_OPCODE ip @ extract opcode from rINST
5375 SET_VREG r0, r9 @ vAA<- r0
5376 GOTO_OPCODE ip @ jump to next instruction
5377 /* 10-13 instructions */
5378
5379
5380/* ------------------------------ */
5381 .balign 128
5382.L_op_mul_int_2addr: /* 0xb2 */
5383/* File: arm/op_mul_int_2addr.S */
5384/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5385/* File: arm/binop2addr.S */
5386 /*
5387 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5388 * that specifies an instruction that performs "result = r0 op r1".
5389 * This could be an ARM instruction or a function call. (If the result
5390 * comes back in a register other than r0, you can override "result".)
5391 *
5392 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5393 * vCC (r1). Useful for integer division and modulus.
5394 *
5395 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5396 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5397 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5398 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5399 */
5400 /* binop/2addr vA, vB */
5401 mov r3, rINST, lsr #12 @ r3<- B
5402 ubfx r9, rINST, #8, #4 @ r9<- A
5403 GET_VREG r1, r3 @ r1<- vB
5404 GET_VREG r0, r9 @ r0<- vA
5405 .if 0
5406 cmp r1, #0 @ is second operand zero?
5407 beq common_errDivideByZero
5408 .endif
5409 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5410
5411 @ optional op; may set condition codes
5412 mul r0, r1, r0 @ r0<- op, r0-r3 changed
5413 GET_INST_OPCODE ip @ extract opcode from rINST
5414 SET_VREG r0, r9 @ vAA<- r0
5415 GOTO_OPCODE ip @ jump to next instruction
5416 /* 10-13 instructions */
5417
5418
5419/* ------------------------------ */
5420 .balign 128
5421.L_op_div_int_2addr: /* 0xb3 */
5422/* File: arm/op_div_int_2addr.S */
5423 /*
5424 * Specialized 32-bit binary operation
5425 *
5426 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5427 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5428 * ARMv7 CPUs that have hardware division support).
5429 *
5430 * div-int/2addr
5431 *
5432 */
5433 mov r3, rINST, lsr #12 @ r3<- B
5434 ubfx r9, rINST, #8, #4 @ r9<- A
5435 GET_VREG r1, r3 @ r1<- vB
5436 GET_VREG r0, r9 @ r0<- vA
5437 cmp r1, #0 @ is second operand zero?
5438 beq common_errDivideByZero
5439 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5440
5441#ifdef __ARM_ARCH_EXT_IDIV__
5442 sdiv r0, r0, r1 @ r0<- op
5443#else
5444 bl __aeabi_idiv @ r0<- op, r0-r3 changed
5445#endif
5446 GET_INST_OPCODE ip @ extract opcode from rINST
5447 SET_VREG r0, r9 @ vAA<- r0
5448 GOTO_OPCODE ip @ jump to next instruction
5449 /* 10-13 instructions */
5450
5451
5452/* ------------------------------ */
5453 .balign 128
5454.L_op_rem_int_2addr: /* 0xb4 */
5455/* File: arm/op_rem_int_2addr.S */
5456 /*
5457 * Specialized 32-bit binary operation
5458 *
5459 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5460 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5461 * ARMv7 CPUs that have hardware division support).
5462 *
5463 * NOTE: idivmod returns quotient in r0 and remainder in r1
5464 *
5465 * rem-int/2addr
5466 *
5467 */
5468 mov r3, rINST, lsr #12 @ r3<- B
5469 ubfx r9, rINST, #8, #4 @ r9<- A
5470 GET_VREG r1, r3 @ r1<- vB
5471 GET_VREG r0, r9 @ r0<- vA
5472 cmp r1, #0 @ is second operand zero?
5473 beq common_errDivideByZero
5474 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5475
5476#ifdef __ARM_ARCH_EXT_IDIV__
5477 sdiv r2, r0, r1
5478 mls r1, r1, r2, r0 @ r1<- op
5479#else
5480 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
5481#endif
5482 GET_INST_OPCODE ip @ extract opcode from rINST
5483 SET_VREG r1, r9 @ vAA<- r1
5484 GOTO_OPCODE ip @ jump to next instruction
5485 /* 10-13 instructions */
5486
5487
5488/* ------------------------------ */
5489 .balign 128
5490.L_op_and_int_2addr: /* 0xb5 */
5491/* File: arm/op_and_int_2addr.S */
5492/* File: arm/binop2addr.S */
5493 /*
5494 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5495 * that specifies an instruction that performs "result = r0 op r1".
5496 * This could be an ARM instruction or a function call. (If the result
5497 * comes back in a register other than r0, you can override "result".)
5498 *
5499 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5500 * vCC (r1). Useful for integer division and modulus.
5501 *
5502 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5503 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5504 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5505 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5506 */
5507 /* binop/2addr vA, vB */
5508 mov r3, rINST, lsr #12 @ r3<- B
5509 ubfx r9, rINST, #8, #4 @ r9<- A
5510 GET_VREG r1, r3 @ r1<- vB
5511 GET_VREG r0, r9 @ r0<- vA
5512 .if 0
5513 cmp r1, #0 @ is second operand zero?
5514 beq common_errDivideByZero
5515 .endif
5516 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5517
5518 @ optional op; may set condition codes
5519 and r0, r0, r1 @ r0<- op, r0-r3 changed
5520 GET_INST_OPCODE ip @ extract opcode from rINST
5521 SET_VREG r0, r9 @ vAA<- r0
5522 GOTO_OPCODE ip @ jump to next instruction
5523 /* 10-13 instructions */
5524
5525
5526/* ------------------------------ */
5527 .balign 128
5528.L_op_or_int_2addr: /* 0xb6 */
5529/* File: arm/op_or_int_2addr.S */
5530/* File: arm/binop2addr.S */
5531 /*
5532 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5533 * that specifies an instruction that performs "result = r0 op r1".
5534 * This could be an ARM instruction or a function call. (If the result
5535 * comes back in a register other than r0, you can override "result".)
5536 *
5537 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5538 * vCC (r1). Useful for integer division and modulus.
5539 *
5540 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5541 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5542 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5543 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5544 */
5545 /* binop/2addr vA, vB */
5546 mov r3, rINST, lsr #12 @ r3<- B
5547 ubfx r9, rINST, #8, #4 @ r9<- A
5548 GET_VREG r1, r3 @ r1<- vB
5549 GET_VREG r0, r9 @ r0<- vA
5550 .if 0
5551 cmp r1, #0 @ is second operand zero?
5552 beq common_errDivideByZero
5553 .endif
5554 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5555
5556 @ optional op; may set condition codes
5557 orr r0, r0, r1 @ r0<- op, r0-r3 changed
5558 GET_INST_OPCODE ip @ extract opcode from rINST
5559 SET_VREG r0, r9 @ vAA<- r0
5560 GOTO_OPCODE ip @ jump to next instruction
5561 /* 10-13 instructions */
5562
5563
5564/* ------------------------------ */
5565 .balign 128
5566.L_op_xor_int_2addr: /* 0xb7 */
5567/* File: arm/op_xor_int_2addr.S */
5568/* File: arm/binop2addr.S */
5569 /*
5570 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5571 * that specifies an instruction that performs "result = r0 op r1".
5572 * This could be an ARM instruction or a function call. (If the result
5573 * comes back in a register other than r0, you can override "result".)
5574 *
5575 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5576 * vCC (r1). Useful for integer division and modulus.
5577 *
5578 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5579 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5580 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5581 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5582 */
5583 /* binop/2addr vA, vB */
5584 mov r3, rINST, lsr #12 @ r3<- B
5585 ubfx r9, rINST, #8, #4 @ r9<- A
5586 GET_VREG r1, r3 @ r1<- vB
5587 GET_VREG r0, r9 @ r0<- vA
5588 .if 0
5589 cmp r1, #0 @ is second operand zero?
5590 beq common_errDivideByZero
5591 .endif
5592 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5593
5594 @ optional op; may set condition codes
5595 eor r0, r0, r1 @ r0<- op, r0-r3 changed
5596 GET_INST_OPCODE ip @ extract opcode from rINST
5597 SET_VREG r0, r9 @ vAA<- r0
5598 GOTO_OPCODE ip @ jump to next instruction
5599 /* 10-13 instructions */
5600
5601
5602/* ------------------------------ */
5603 .balign 128
5604.L_op_shl_int_2addr: /* 0xb8 */
5605/* File: arm/op_shl_int_2addr.S */
5606/* File: arm/binop2addr.S */
5607 /*
5608 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5609 * that specifies an instruction that performs "result = r0 op r1".
5610 * This could be an ARM instruction or a function call. (If the result
5611 * comes back in a register other than r0, you can override "result".)
5612 *
5613 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5614 * vCC (r1). Useful for integer division and modulus.
5615 *
5616 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5617 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5618 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5619 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5620 */
5621 /* binop/2addr vA, vB */
5622 mov r3, rINST, lsr #12 @ r3<- B
5623 ubfx r9, rINST, #8, #4 @ r9<- A
5624 GET_VREG r1, r3 @ r1<- vB
5625 GET_VREG r0, r9 @ r0<- vA
5626 .if 0
5627 cmp r1, #0 @ is second operand zero?
5628 beq common_errDivideByZero
5629 .endif
5630 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5631
5632 and r1, r1, #31 @ optional op; may set condition codes
5633 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
5634 GET_INST_OPCODE ip @ extract opcode from rINST
5635 SET_VREG r0, r9 @ vAA<- r0
5636 GOTO_OPCODE ip @ jump to next instruction
5637 /* 10-13 instructions */
5638
5639
5640/* ------------------------------ */
5641 .balign 128
5642.L_op_shr_int_2addr: /* 0xb9 */
5643/* File: arm/op_shr_int_2addr.S */
5644/* File: arm/binop2addr.S */
5645 /*
5646 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5647 * that specifies an instruction that performs "result = r0 op r1".
5648 * This could be an ARM instruction or a function call. (If the result
5649 * comes back in a register other than r0, you can override "result".)
5650 *
5651 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5652 * vCC (r1). Useful for integer division and modulus.
5653 *
5654 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5655 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5656 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5657 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5658 */
5659 /* binop/2addr vA, vB */
5660 mov r3, rINST, lsr #12 @ r3<- B
5661 ubfx r9, rINST, #8, #4 @ r9<- A
5662 GET_VREG r1, r3 @ r1<- vB
5663 GET_VREG r0, r9 @ r0<- vA
5664 .if 0
5665 cmp r1, #0 @ is second operand zero?
5666 beq common_errDivideByZero
5667 .endif
5668 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5669
5670 and r1, r1, #31 @ optional op; may set condition codes
5671 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
5672 GET_INST_OPCODE ip @ extract opcode from rINST
5673 SET_VREG r0, r9 @ vAA<- r0
5674 GOTO_OPCODE ip @ jump to next instruction
5675 /* 10-13 instructions */
5676
5677
5678/* ------------------------------ */
5679 .balign 128
5680.L_op_ushr_int_2addr: /* 0xba */
5681/* File: arm/op_ushr_int_2addr.S */
5682/* File: arm/binop2addr.S */
5683 /*
5684 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5685 * that specifies an instruction that performs "result = r0 op r1".
5686 * This could be an ARM instruction or a function call. (If the result
5687 * comes back in a register other than r0, you can override "result".)
5688 *
5689 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5690 * vCC (r1). Useful for integer division and modulus.
5691 *
5692 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5693 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5694 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5695 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5696 */
5697 /* binop/2addr vA, vB */
5698 mov r3, rINST, lsr #12 @ r3<- B
5699 ubfx r9, rINST, #8, #4 @ r9<- A
5700 GET_VREG r1, r3 @ r1<- vB
5701 GET_VREG r0, r9 @ r0<- vA
5702 .if 0
5703 cmp r1, #0 @ is second operand zero?
5704 beq common_errDivideByZero
5705 .endif
5706 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5707
5708 and r1, r1, #31 @ optional op; may set condition codes
5709 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
5710 GET_INST_OPCODE ip @ extract opcode from rINST
5711 SET_VREG r0, r9 @ vAA<- r0
5712 GOTO_OPCODE ip @ jump to next instruction
5713 /* 10-13 instructions */
5714
5715
5716/* ------------------------------ */
5717 .balign 128
5718.L_op_add_long_2addr: /* 0xbb */
5719/* File: arm/op_add_long_2addr.S */
5720/* File: arm/binopWide2addr.S */
5721 /*
5722 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5723 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5724 * This could be an ARM instruction or a function call. (If the result
5725 * comes back in a register other than r0, you can override "result".)
5726 *
5727 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5728 * vCC (r1). Useful for integer division and modulus.
5729 *
5730 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5731 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5732 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5733 * rem-double/2addr
5734 */
5735 /* binop/2addr vA, vB */
5736 mov r1, rINST, lsr #12 @ r1<- B
5737 ubfx r9, rINST, #8, #4 @ r9<- A
5738 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5739 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5740 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5741 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5742 .if 0
5743 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5744 beq common_errDivideByZero
5745 .endif
5746 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5747
5748 adds r0, r0, r2 @ optional op; may set condition codes
5749 adc r1, r1, r3 @ result<- op, r0-r3 changed
5750 GET_INST_OPCODE ip @ extract opcode from rINST
5751 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5752 GOTO_OPCODE ip @ jump to next instruction
5753 /* 12-15 instructions */
5754
5755
5756/* ------------------------------ */
5757 .balign 128
5758.L_op_sub_long_2addr: /* 0xbc */
5759/* File: arm/op_sub_long_2addr.S */
5760/* File: arm/binopWide2addr.S */
5761 /*
5762 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5763 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5764 * This could be an ARM instruction or a function call. (If the result
5765 * comes back in a register other than r0, you can override "result".)
5766 *
5767 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5768 * vCC (r1). Useful for integer division and modulus.
5769 *
5770 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5771 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5772 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5773 * rem-double/2addr
5774 */
5775 /* binop/2addr vA, vB */
5776 mov r1, rINST, lsr #12 @ r1<- B
5777 ubfx r9, rINST, #8, #4 @ r9<- A
5778 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5779 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5780 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5781 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5782 .if 0
5783 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5784 beq common_errDivideByZero
5785 .endif
5786 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5787
5788 subs r0, r0, r2 @ optional op; may set condition codes
5789 sbc r1, r1, r3 @ result<- op, r0-r3 changed
5790 GET_INST_OPCODE ip @ extract opcode from rINST
5791 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5792 GOTO_OPCODE ip @ jump to next instruction
5793 /* 12-15 instructions */
5794
5795
5796/* ------------------------------ */
5797 .balign 128
5798.L_op_mul_long_2addr: /* 0xbd */
5799/* File: arm/op_mul_long_2addr.S */
5800 /*
5801 * Signed 64-bit integer multiply, "/2addr" version.
5802 *
5803 * See op_mul_long for an explanation.
5804 *
5805 * We get a little tight on registers, so to avoid looking up &fp[A]
5806 * again we stuff it into rINST.
5807 */
5808 /* mul-long/2addr vA, vB */
5809 mov r1, rINST, lsr #12 @ r1<- B
5810 ubfx r9, rINST, #8, #4 @ r9<- A
5811 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5812 add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A]
5813 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5814 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1
5815 mul ip, r2, r1 @ ip<- ZxW
5816 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
5817 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
5818 mov r0, rINST @ r0<- &fp[A] (free up rINST)
5819 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5820 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
5821 GET_INST_OPCODE ip @ extract opcode from rINST
5822 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
5823 GOTO_OPCODE ip @ jump to next instruction
5824
5825/* ------------------------------ */
5826 .balign 128
5827.L_op_div_long_2addr: /* 0xbe */
5828/* File: arm/op_div_long_2addr.S */
5829/* File: arm/binopWide2addr.S */
5830 /*
5831 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5832 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5833 * This could be an ARM instruction or a function call. (If the result
5834 * comes back in a register other than r0, you can override "result".)
5835 *
5836 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5837 * vCC (r1). Useful for integer division and modulus.
5838 *
5839 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5840 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5841 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5842 * rem-double/2addr
5843 */
5844 /* binop/2addr vA, vB */
5845 mov r1, rINST, lsr #12 @ r1<- B
5846 ubfx r9, rINST, #8, #4 @ r9<- A
5847 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5848 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5849 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5850 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5851 .if 1
5852 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5853 beq common_errDivideByZero
5854 .endif
5855 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5856
5857 @ optional op; may set condition codes
5858 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5859 GET_INST_OPCODE ip @ extract opcode from rINST
5860 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5861 GOTO_OPCODE ip @ jump to next instruction
5862 /* 12-15 instructions */
5863
5864
5865/* ------------------------------ */
5866 .balign 128
5867.L_op_rem_long_2addr: /* 0xbf */
5868/* File: arm/op_rem_long_2addr.S */
5869/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5870/* File: arm/binopWide2addr.S */
5871 /*
5872 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5873 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5874 * This could be an ARM instruction or a function call. (If the result
5875 * comes back in a register other than r0, you can override "result".)
5876 *
5877 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5878 * vCC (r1). Useful for integer division and modulus.
5879 *
5880 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5881 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5882 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5883 * rem-double/2addr
5884 */
5885 /* binop/2addr vA, vB */
5886 mov r1, rINST, lsr #12 @ r1<- B
5887 ubfx r9, rINST, #8, #4 @ r9<- A
5888 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5889 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5890 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5891 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5892 .if 1
5893 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5894 beq common_errDivideByZero
5895 .endif
5896 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5897
5898 @ optional op; may set condition codes
5899 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5900 GET_INST_OPCODE ip @ extract opcode from rINST
5901 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
5902 GOTO_OPCODE ip @ jump to next instruction
5903 /* 12-15 instructions */
5904
5905
5906/* ------------------------------ */
5907 .balign 128
5908.L_op_and_long_2addr: /* 0xc0 */
5909/* File: arm/op_and_long_2addr.S */
5910/* File: arm/binopWide2addr.S */
5911 /*
5912 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5913 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5914 * This could be an ARM instruction or a function call. (If the result
5915 * comes back in a register other than r0, you can override "result".)
5916 *
5917 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5918 * vCC (r1). Useful for integer division and modulus.
5919 *
5920 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5921 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5922 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5923 * rem-double/2addr
5924 */
5925 /* binop/2addr vA, vB */
5926 mov r1, rINST, lsr #12 @ r1<- B
5927 ubfx r9, rINST, #8, #4 @ r9<- A
5928 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5929 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5930 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5931 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5932 .if 0
5933 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5934 beq common_errDivideByZero
5935 .endif
5936 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5937
5938 and r0, r0, r2 @ optional op; may set condition codes
5939 and r1, r1, r3 @ result<- op, r0-r3 changed
5940 GET_INST_OPCODE ip @ extract opcode from rINST
5941 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5942 GOTO_OPCODE ip @ jump to next instruction
5943 /* 12-15 instructions */
5944
5945
5946/* ------------------------------ */
5947 .balign 128
5948.L_op_or_long_2addr: /* 0xc1 */
5949/* File: arm/op_or_long_2addr.S */
5950/* File: arm/binopWide2addr.S */
5951 /*
5952 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5953 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5954 * This could be an ARM instruction or a function call. (If the result
5955 * comes back in a register other than r0, you can override "result".)
5956 *
5957 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5958 * vCC (r1). Useful for integer division and modulus.
5959 *
5960 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5961 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5962 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5963 * rem-double/2addr
5964 */
5965 /* binop/2addr vA, vB */
5966 mov r1, rINST, lsr #12 @ r1<- B
5967 ubfx r9, rINST, #8, #4 @ r9<- A
5968 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5969 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5970 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5971 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5972 .if 0
5973 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5974 beq common_errDivideByZero
5975 .endif
5976 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5977
5978 orr r0, r0, r2 @ optional op; may set condition codes
5979 orr r1, r1, r3 @ result<- op, r0-r3 changed
5980 GET_INST_OPCODE ip @ extract opcode from rINST
5981 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5982 GOTO_OPCODE ip @ jump to next instruction
5983 /* 12-15 instructions */
5984
5985
5986/* ------------------------------ */
5987 .balign 128
5988.L_op_xor_long_2addr: /* 0xc2 */
5989/* File: arm/op_xor_long_2addr.S */
5990/* File: arm/binopWide2addr.S */
5991 /*
5992 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5993 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5994 * This could be an ARM instruction or a function call. (If the result
5995 * comes back in a register other than r0, you can override "result".)
5996 *
5997 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5998 * vCC (r1). Useful for integer division and modulus.
5999 *
6000 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6001 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6002 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6003 * rem-double/2addr
6004 */
6005 /* binop/2addr vA, vB */
6006 mov r1, rINST, lsr #12 @ r1<- B
6007 ubfx r9, rINST, #8, #4 @ r9<- A
6008 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6009 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6010 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6011 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6012 .if 0
6013 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6014 beq common_errDivideByZero
6015 .endif
6016 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6017
6018 eor r0, r0, r2 @ optional op; may set condition codes
6019 eor r1, r1, r3 @ result<- op, r0-r3 changed
6020 GET_INST_OPCODE ip @ extract opcode from rINST
6021 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6022 GOTO_OPCODE ip @ jump to next instruction
6023 /* 12-15 instructions */
6024
6025
6026/* ------------------------------ */
6027 .balign 128
6028.L_op_shl_long_2addr: /* 0xc3 */
6029/* File: arm/op_shl_long_2addr.S */
6030 /*
6031 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6032 * 32-bit shift distance.
6033 */
6034 /* shl-long/2addr vA, vB */
6035 mov r3, rINST, lsr #12 @ r3<- B
6036 ubfx r9, rINST, #8, #4 @ r9<- A
6037 GET_VREG r2, r3 @ r2<- vB
6038 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6039 and r2, r2, #63 @ r2<- r2 & 0x3f
6040 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6041
6042 mov r1, r1, asl r2 @ r1<- r1 << r2
6043 rsb r3, r2, #32 @ r3<- 32 - r2
6044 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
6045 subs ip, r2, #32 @ ip<- r2 - 32
6046 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6047 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
6048 mov r0, r0, asl r2 @ r0<- r0 << r2
6049 GET_INST_OPCODE ip @ extract opcode from rINST
6050 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6051 GOTO_OPCODE ip @ jump to next instruction
6052
6053/* ------------------------------ */
6054 .balign 128
6055.L_op_shr_long_2addr: /* 0xc4 */
6056/* File: arm/op_shr_long_2addr.S */
6057 /*
6058 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6059 * 32-bit shift distance.
6060 */
6061 /* shr-long/2addr vA, vB */
6062 mov r3, rINST, lsr #12 @ r3<- B
6063 ubfx r9, rINST, #8, #4 @ r9<- A
6064 GET_VREG r2, r3 @ r2<- vB
6065 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6066 and r2, r2, #63 @ r2<- r2 & 0x3f
6067 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6068
6069 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6070 rsb r3, r2, #32 @ r3<- 32 - r2
6071 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6072 subs ip, r2, #32 @ ip<- r2 - 32
6073 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6074 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
6075 mov r1, r1, asr r2 @ r1<- r1 >> r2
6076 GET_INST_OPCODE ip @ extract opcode from rINST
6077 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6078 GOTO_OPCODE ip @ jump to next instruction
6079
6080/* ------------------------------ */
6081 .balign 128
6082.L_op_ushr_long_2addr: /* 0xc5 */
6083/* File: arm/op_ushr_long_2addr.S */
6084 /*
6085 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6086 * 32-bit shift distance.
6087 */
6088 /* ushr-long/2addr vA, vB */
6089 mov r3, rINST, lsr #12 @ r3<- B
6090 ubfx r9, rINST, #8, #4 @ r9<- A
6091 GET_VREG r2, r3 @ r2<- vB
6092 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6093 and r2, r2, #63 @ r2<- r2 & 0x3f
6094 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6095
6096 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6097 rsb r3, r2, #32 @ r3<- 32 - r2
6098 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6099 subs ip, r2, #32 @ ip<- r2 - 32
6100 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6101 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
6102 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
6103 GET_INST_OPCODE ip @ extract opcode from rINST
6104 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6105 GOTO_OPCODE ip @ jump to next instruction
6106
6107/* ------------------------------ */
6108 .balign 128
6109.L_op_add_float_2addr: /* 0xc6 */
6110/* File: arm/op_add_float_2addr.S */
6111/* File: arm/fbinop2addr.S */
6112 /*
6113 * Generic 32-bit floating point "/2addr" binary operation. Provide
6114 * an "instr" line that specifies an instruction that performs
6115 * "s2 = s0 op s1".
6116 *
6117 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6118 */
6119 /* binop/2addr vA, vB */
6120 mov r3, rINST, lsr #12 @ r3<- B
6121 mov r9, rINST, lsr #8 @ r9<- A+
6122 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6123 and r9, r9, #15 @ r9<- A
6124 flds s1, [r3] @ s1<- vB
6125 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6126 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6127 flds s0, [r9] @ s0<- vA
6128
6129 fadds s2, s0, s1 @ s2<- op
6130 GET_INST_OPCODE ip @ extract opcode from rINST
6131 fsts s2, [r9] @ vAA<- s2
6132 GOTO_OPCODE ip @ jump to next instruction
6133
6134
6135/* ------------------------------ */
6136 .balign 128
6137.L_op_sub_float_2addr: /* 0xc7 */
6138/* File: arm/op_sub_float_2addr.S */
6139/* File: arm/fbinop2addr.S */
6140 /*
6141 * Generic 32-bit floating point "/2addr" binary operation. Provide
6142 * an "instr" line that specifies an instruction that performs
6143 * "s2 = s0 op s1".
6144 *
6145 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6146 */
6147 /* binop/2addr vA, vB */
6148 mov r3, rINST, lsr #12 @ r3<- B
6149 mov r9, rINST, lsr #8 @ r9<- A+
6150 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6151 and r9, r9, #15 @ r9<- A
6152 flds s1, [r3] @ s1<- vB
6153 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6154 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6155 flds s0, [r9] @ s0<- vA
6156
6157 fsubs s2, s0, s1 @ s2<- op
6158 GET_INST_OPCODE ip @ extract opcode from rINST
6159 fsts s2, [r9] @ vAA<- s2
6160 GOTO_OPCODE ip @ jump to next instruction
6161
6162
6163/* ------------------------------ */
6164 .balign 128
6165.L_op_mul_float_2addr: /* 0xc8 */
6166/* File: arm/op_mul_float_2addr.S */
6167/* File: arm/fbinop2addr.S */
6168 /*
6169 * Generic 32-bit floating point "/2addr" binary operation. Provide
6170 * an "instr" line that specifies an instruction that performs
6171 * "s2 = s0 op s1".
6172 *
6173 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6174 */
6175 /* binop/2addr vA, vB */
6176 mov r3, rINST, lsr #12 @ r3<- B
6177 mov r9, rINST, lsr #8 @ r9<- A+
6178 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6179 and r9, r9, #15 @ r9<- A
6180 flds s1, [r3] @ s1<- vB
6181 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6182 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6183 flds s0, [r9] @ s0<- vA
6184
6185 fmuls s2, s0, s1 @ s2<- op
6186 GET_INST_OPCODE ip @ extract opcode from rINST
6187 fsts s2, [r9] @ vAA<- s2
6188 GOTO_OPCODE ip @ jump to next instruction
6189
6190
6191/* ------------------------------ */
6192 .balign 128
6193.L_op_div_float_2addr: /* 0xc9 */
6194/* File: arm/op_div_float_2addr.S */
6195/* File: arm/fbinop2addr.S */
6196 /*
6197 * Generic 32-bit floating point "/2addr" binary operation. Provide
6198 * an "instr" line that specifies an instruction that performs
6199 * "s2 = s0 op s1".
6200 *
6201 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6202 */
6203 /* binop/2addr vA, vB */
6204 mov r3, rINST, lsr #12 @ r3<- B
6205 mov r9, rINST, lsr #8 @ r9<- A+
6206 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6207 and r9, r9, #15 @ r9<- A
6208 flds s1, [r3] @ s1<- vB
6209 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6210 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6211 flds s0, [r9] @ s0<- vA
6212
6213 fdivs s2, s0, s1 @ s2<- op
6214 GET_INST_OPCODE ip @ extract opcode from rINST
6215 fsts s2, [r9] @ vAA<- s2
6216 GOTO_OPCODE ip @ jump to next instruction
6217
6218
6219/* ------------------------------ */
6220 .balign 128
6221.L_op_rem_float_2addr: /* 0xca */
6222/* File: arm/op_rem_float_2addr.S */
6223/* EABI doesn't define a float remainder function, but libm does */
6224/* File: arm/binop2addr.S */
6225 /*
6226 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
6227 * that specifies an instruction that performs "result = r0 op r1".
6228 * This could be an ARM instruction or a function call. (If the result
6229 * comes back in a register other than r0, you can override "result".)
6230 *
6231 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6232 * vCC (r1). Useful for integer division and modulus.
6233 *
6234 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6235 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6236 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6237 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6238 */
6239 /* binop/2addr vA, vB */
6240 mov r3, rINST, lsr #12 @ r3<- B
6241 ubfx r9, rINST, #8, #4 @ r9<- A
6242 GET_VREG r1, r3 @ r1<- vB
6243 GET_VREG r0, r9 @ r0<- vA
6244 .if 0
6245 cmp r1, #0 @ is second operand zero?
6246 beq common_errDivideByZero
6247 .endif
6248 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6249
6250 @ optional op; may set condition codes
6251 bl fmodf @ r0<- op, r0-r3 changed
6252 GET_INST_OPCODE ip @ extract opcode from rINST
6253 SET_VREG r0, r9 @ vAA<- r0
6254 GOTO_OPCODE ip @ jump to next instruction
6255 /* 10-13 instructions */
6256
6257
6258/* ------------------------------ */
6259 .balign 128
6260.L_op_add_double_2addr: /* 0xcb */
6261/* File: arm/op_add_double_2addr.S */
6262/* File: arm/fbinopWide2addr.S */
6263 /*
6264 * Generic 64-bit floating point "/2addr" binary operation. Provide
6265 * an "instr" line that specifies an instruction that performs
6266 * "d2 = d0 op d1".
6267 *
6268 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6269 * div-double/2addr
6270 */
6271 /* binop/2addr vA, vB */
6272 mov r3, rINST, lsr #12 @ r3<- B
6273 mov r9, rINST, lsr #8 @ r9<- A+
6274 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6275 and r9, r9, #15 @ r9<- A
6276 fldd d1, [r3] @ d1<- vB
6277 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6278 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6279 fldd d0, [r9] @ d0<- vA
6280
6281 faddd d2, d0, d1 @ d2<- op
6282 GET_INST_OPCODE ip @ extract opcode from rINST
6283 fstd d2, [r9] @ vAA<- d2
6284 GOTO_OPCODE ip @ jump to next instruction
6285
6286
6287/* ------------------------------ */
6288 .balign 128
6289.L_op_sub_double_2addr: /* 0xcc */
6290/* File: arm/op_sub_double_2addr.S */
6291/* File: arm/fbinopWide2addr.S */
6292 /*
6293 * Generic 64-bit floating point "/2addr" binary operation. Provide
6294 * an "instr" line that specifies an instruction that performs
6295 * "d2 = d0 op d1".
6296 *
6297 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6298 * div-double/2addr
6299 */
6300 /* binop/2addr vA, vB */
6301 mov r3, rINST, lsr #12 @ r3<- B
6302 mov r9, rINST, lsr #8 @ r9<- A+
6303 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6304 and r9, r9, #15 @ r9<- A
6305 fldd d1, [r3] @ d1<- vB
6306 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6307 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6308 fldd d0, [r9] @ d0<- vA
6309
6310 fsubd d2, d0, d1 @ d2<- op
6311 GET_INST_OPCODE ip @ extract opcode from rINST
6312 fstd d2, [r9] @ vAA<- d2
6313 GOTO_OPCODE ip @ jump to next instruction
6314
6315
6316/* ------------------------------ */
6317 .balign 128
6318.L_op_mul_double_2addr: /* 0xcd */
6319/* File: arm/op_mul_double_2addr.S */
6320/* File: arm/fbinopWide2addr.S */
6321 /*
6322 * Generic 64-bit floating point "/2addr" binary operation. Provide
6323 * an "instr" line that specifies an instruction that performs
6324 * "d2 = d0 op d1".
6325 *
6326 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6327 * div-double/2addr
6328 */
6329 /* binop/2addr vA, vB */
6330 mov r3, rINST, lsr #12 @ r3<- B
6331 mov r9, rINST, lsr #8 @ r9<- A+
6332 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6333 and r9, r9, #15 @ r9<- A
6334 fldd d1, [r3] @ d1<- vB
6335 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6336 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6337 fldd d0, [r9] @ d0<- vA
6338
6339 fmuld d2, d0, d1 @ d2<- op
6340 GET_INST_OPCODE ip @ extract opcode from rINST
6341 fstd d2, [r9] @ vAA<- d2
6342 GOTO_OPCODE ip @ jump to next instruction
6343
6344
6345/* ------------------------------ */
6346 .balign 128
6347.L_op_div_double_2addr: /* 0xce */
6348/* File: arm/op_div_double_2addr.S */
6349/* File: arm/fbinopWide2addr.S */
6350 /*
6351 * Generic 64-bit floating point "/2addr" binary operation. Provide
6352 * an "instr" line that specifies an instruction that performs
6353 * "d2 = d0 op d1".
6354 *
6355 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6356 * div-double/2addr
6357 */
6358 /* binop/2addr vA, vB */
6359 mov r3, rINST, lsr #12 @ r3<- B
6360 mov r9, rINST, lsr #8 @ r9<- A+
6361 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6362 and r9, r9, #15 @ r9<- A
6363 fldd d1, [r3] @ d1<- vB
6364 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6365 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6366 fldd d0, [r9] @ d0<- vA
6367
6368 fdivd d2, d0, d1 @ d2<- op
6369 GET_INST_OPCODE ip @ extract opcode from rINST
6370 fstd d2, [r9] @ vAA<- d2
6371 GOTO_OPCODE ip @ jump to next instruction
6372
6373
6374/* ------------------------------ */
6375 .balign 128
6376.L_op_rem_double_2addr: /* 0xcf */
6377/* File: arm/op_rem_double_2addr.S */
6378/* EABI doesn't define a double remainder function, but libm does */
6379/* File: arm/binopWide2addr.S */
6380 /*
6381 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6382 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6383 * This could be an ARM instruction or a function call. (If the result
6384 * comes back in a register other than r0, you can override "result".)
6385 *
6386 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6387 * vCC (r1). Useful for integer division and modulus.
6388 *
6389 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6390 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6391 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6392 * rem-double/2addr
6393 */
6394 /* binop/2addr vA, vB */
6395 mov r1, rINST, lsr #12 @ r1<- B
6396 ubfx r9, rINST, #8, #4 @ r9<- A
6397 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6398 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6399 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6400 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6401 .if 0
6402 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6403 beq common_errDivideByZero
6404 .endif
6405 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6406
6407 @ optional op; may set condition codes
6408 bl fmod @ result<- op, r0-r3 changed
6409 GET_INST_OPCODE ip @ extract opcode from rINST
6410 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6411 GOTO_OPCODE ip @ jump to next instruction
6412 /* 12-15 instructions */
6413
6414
6415/* ------------------------------ */
6416 .balign 128
6417.L_op_add_int_lit16: /* 0xd0 */
6418/* File: arm/op_add_int_lit16.S */
6419/* File: arm/binopLit16.S */
6420 /*
6421 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6422 * that specifies an instruction that performs "result = r0 op r1".
6423 * This could be an ARM instruction or a function call. (If the result
6424 * comes back in a register other than r0, you can override "result".)
6425 *
6426 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6427 * vCC (r1). Useful for integer division and modulus.
6428 *
6429 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6430 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6431 */
6432 /* binop/lit16 vA, vB, #+CCCC */
6433 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6434 mov r2, rINST, lsr #12 @ r2<- B
6435 ubfx r9, rINST, #8, #4 @ r9<- A
6436 GET_VREG r0, r2 @ r0<- vB
6437 .if 0
6438 cmp r1, #0 @ is second operand zero?
6439 beq common_errDivideByZero
6440 .endif
6441 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6442
6443 add r0, r0, r1 @ r0<- op, r0-r3 changed
6444 GET_INST_OPCODE ip @ extract opcode from rINST
6445 SET_VREG r0, r9 @ vAA<- r0
6446 GOTO_OPCODE ip @ jump to next instruction
6447 /* 10-13 instructions */
6448
6449
6450/* ------------------------------ */
6451 .balign 128
6452.L_op_rsub_int: /* 0xd1 */
6453/* File: arm/op_rsub_int.S */
6454/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6455/* File: arm/binopLit16.S */
6456 /*
6457 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6458 * that specifies an instruction that performs "result = r0 op r1".
6459 * This could be an ARM instruction or a function call. (If the result
6460 * comes back in a register other than r0, you can override "result".)
6461 *
6462 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6463 * vCC (r1). Useful for integer division and modulus.
6464 *
6465 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6466 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6467 */
6468 /* binop/lit16 vA, vB, #+CCCC */
6469 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6470 mov r2, rINST, lsr #12 @ r2<- B
6471 ubfx r9, rINST, #8, #4 @ r9<- A
6472 GET_VREG r0, r2 @ r0<- vB
6473 .if 0
6474 cmp r1, #0 @ is second operand zero?
6475 beq common_errDivideByZero
6476 .endif
6477 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6478
6479 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6480 GET_INST_OPCODE ip @ extract opcode from rINST
6481 SET_VREG r0, r9 @ vAA<- r0
6482 GOTO_OPCODE ip @ jump to next instruction
6483 /* 10-13 instructions */
6484
6485
6486/* ------------------------------ */
6487 .balign 128
6488.L_op_mul_int_lit16: /* 0xd2 */
6489/* File: arm/op_mul_int_lit16.S */
6490/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6491/* File: arm/binopLit16.S */
6492 /*
6493 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6494 * that specifies an instruction that performs "result = r0 op r1".
6495 * This could be an ARM instruction or a function call. (If the result
6496 * comes back in a register other than r0, you can override "result".)
6497 *
6498 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6499 * vCC (r1). Useful for integer division and modulus.
6500 *
6501 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6502 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6503 */
6504 /* binop/lit16 vA, vB, #+CCCC */
6505 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6506 mov r2, rINST, lsr #12 @ r2<- B
6507 ubfx r9, rINST, #8, #4 @ r9<- A
6508 GET_VREG r0, r2 @ r0<- vB
6509 .if 0
6510 cmp r1, #0 @ is second operand zero?
6511 beq common_errDivideByZero
6512 .endif
6513 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6514
6515 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6516 GET_INST_OPCODE ip @ extract opcode from rINST
6517 SET_VREG r0, r9 @ vAA<- r0
6518 GOTO_OPCODE ip @ jump to next instruction
6519 /* 10-13 instructions */
6520
6521
6522/* ------------------------------ */
6523 .balign 128
6524.L_op_div_int_lit16: /* 0xd3 */
6525/* File: arm/op_div_int_lit16.S */
6526 /*
6527 * Specialized 32-bit binary operation
6528 *
6529 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6530 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6531 * ARMv7 CPUs that have hardware division support).
6532 *
6533 * div-int/lit16
6534 *
6535 */
6536 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6537 mov r2, rINST, lsr #12 @ r2<- B
6538 ubfx r9, rINST, #8, #4 @ r9<- A
6539 GET_VREG r0, r2 @ r0<- vB
6540 cmp r1, #0 @ is second operand zero?
6541 beq common_errDivideByZero
6542 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6543
6544#ifdef __ARM_ARCH_EXT_IDIV__
6545 sdiv r0, r0, r1 @ r0<- op
6546#else
6547 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6548#endif
6549 GET_INST_OPCODE ip @ extract opcode from rINST
6550 SET_VREG r0, r9 @ vAA<- r0
6551 GOTO_OPCODE ip @ jump to next instruction
6552 /* 10-13 instructions */
6553
6554/* ------------------------------ */
6555 .balign 128
6556.L_op_rem_int_lit16: /* 0xd4 */
6557/* File: arm/op_rem_int_lit16.S */
6558 /*
6559 * Specialized 32-bit binary operation
6560 *
6561 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6562 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6563 * ARMv7 CPUs that have hardware division support).
6564 *
6565 * NOTE: idivmod returns quotient in r0 and remainder in r1
6566 *
6567 * rem-int/lit16
6568 *
6569 */
6570 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6571 mov r2, rINST, lsr #12 @ r2<- B
6572 ubfx r9, rINST, #8, #4 @ r9<- A
6573 GET_VREG r0, r2 @ r0<- vB
6574 cmp r1, #0 @ is second operand zero?
6575 beq common_errDivideByZero
6576 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6577
6578#ifdef __ARM_ARCH_EXT_IDIV__
6579 sdiv r2, r0, r1
6580 mls r1, r1, r2, r0 @ r1<- op
6581#else
6582 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6583#endif
6584 GET_INST_OPCODE ip @ extract opcode from rINST
6585 SET_VREG r1, r9 @ vAA<- r1
6586 GOTO_OPCODE ip @ jump to next instruction
6587 /* 10-13 instructions */
6588
6589/* ------------------------------ */
6590 .balign 128
6591.L_op_and_int_lit16: /* 0xd5 */
6592/* File: arm/op_and_int_lit16.S */
6593/* File: arm/binopLit16.S */
6594 /*
6595 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6596 * that specifies an instruction that performs "result = r0 op r1".
6597 * This could be an ARM instruction or a function call. (If the result
6598 * comes back in a register other than r0, you can override "result".)
6599 *
6600 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6601 * vCC (r1). Useful for integer division and modulus.
6602 *
6603 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6604 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6605 */
6606 /* binop/lit16 vA, vB, #+CCCC */
6607 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6608 mov r2, rINST, lsr #12 @ r2<- B
6609 ubfx r9, rINST, #8, #4 @ r9<- A
6610 GET_VREG r0, r2 @ r0<- vB
6611 .if 0
6612 cmp r1, #0 @ is second operand zero?
6613 beq common_errDivideByZero
6614 .endif
6615 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6616
6617 and r0, r0, r1 @ r0<- op, r0-r3 changed
6618 GET_INST_OPCODE ip @ extract opcode from rINST
6619 SET_VREG r0, r9 @ vAA<- r0
6620 GOTO_OPCODE ip @ jump to next instruction
6621 /* 10-13 instructions */
6622
6623
6624/* ------------------------------ */
6625 .balign 128
6626.L_op_or_int_lit16: /* 0xd6 */
6627/* File: arm/op_or_int_lit16.S */
6628/* File: arm/binopLit16.S */
6629 /*
6630 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6631 * that specifies an instruction that performs "result = r0 op r1".
6632 * This could be an ARM instruction or a function call. (If the result
6633 * comes back in a register other than r0, you can override "result".)
6634 *
6635 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6636 * vCC (r1). Useful for integer division and modulus.
6637 *
6638 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6639 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6640 */
6641 /* binop/lit16 vA, vB, #+CCCC */
6642 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6643 mov r2, rINST, lsr #12 @ r2<- B
6644 ubfx r9, rINST, #8, #4 @ r9<- A
6645 GET_VREG r0, r2 @ r0<- vB
6646 .if 0
6647 cmp r1, #0 @ is second operand zero?
6648 beq common_errDivideByZero
6649 .endif
6650 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6651
6652 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6653 GET_INST_OPCODE ip @ extract opcode from rINST
6654 SET_VREG r0, r9 @ vAA<- r0
6655 GOTO_OPCODE ip @ jump to next instruction
6656 /* 10-13 instructions */
6657
6658
6659/* ------------------------------ */
6660 .balign 128
6661.L_op_xor_int_lit16: /* 0xd7 */
6662/* File: arm/op_xor_int_lit16.S */
6663/* File: arm/binopLit16.S */
6664 /*
6665 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6666 * that specifies an instruction that performs "result = r0 op r1".
6667 * This could be an ARM instruction or a function call. (If the result
6668 * comes back in a register other than r0, you can override "result".)
6669 *
6670 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6671 * vCC (r1). Useful for integer division and modulus.
6672 *
6673 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6674 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6675 */
6676 /* binop/lit16 vA, vB, #+CCCC */
6677 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6678 mov r2, rINST, lsr #12 @ r2<- B
6679 ubfx r9, rINST, #8, #4 @ r9<- A
6680 GET_VREG r0, r2 @ r0<- vB
6681 .if 0
6682 cmp r1, #0 @ is second operand zero?
6683 beq common_errDivideByZero
6684 .endif
6685 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6686
6687 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6688 GET_INST_OPCODE ip @ extract opcode from rINST
6689 SET_VREG r0, r9 @ vAA<- r0
6690 GOTO_OPCODE ip @ jump to next instruction
6691 /* 10-13 instructions */
6692
6693
6694/* ------------------------------ */
6695 .balign 128
6696.L_op_add_int_lit8: /* 0xd8 */
6697/* File: arm/op_add_int_lit8.S */
6698/* File: arm/binopLit8.S */
6699 /*
6700 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6701 * that specifies an instruction that performs "result = r0 op r1".
6702 * This could be an ARM instruction or a function call. (If the result
6703 * comes back in a register other than r0, you can override "result".)
6704 *
6705 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6706 * vCC (r1). Useful for integer division and modulus.
6707 *
6708 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6709 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6710 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6711 */
6712 /* binop/lit8 vAA, vBB, #+CC */
6713 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6714 mov r9, rINST, lsr #8 @ r9<- AA
6715 and r2, r3, #255 @ r2<- BB
6716 GET_VREG r0, r2 @ r0<- vBB
6717 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6718 .if 0
6719 @cmp r1, #0 @ is second operand zero?
6720 beq common_errDivideByZero
6721 .endif
6722 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6723
6724 @ optional op; may set condition codes
6725 add r0, r0, r1 @ r0<- op, r0-r3 changed
6726 GET_INST_OPCODE ip @ extract opcode from rINST
6727 SET_VREG r0, r9 @ vAA<- r0
6728 GOTO_OPCODE ip @ jump to next instruction
6729 /* 10-12 instructions */
6730
6731
6732/* ------------------------------ */
6733 .balign 128
6734.L_op_rsub_int_lit8: /* 0xd9 */
6735/* File: arm/op_rsub_int_lit8.S */
6736/* File: arm/binopLit8.S */
6737 /*
6738 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6739 * that specifies an instruction that performs "result = r0 op r1".
6740 * This could be an ARM instruction or a function call. (If the result
6741 * comes back in a register other than r0, you can override "result".)
6742 *
6743 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6744 * vCC (r1). Useful for integer division and modulus.
6745 *
6746 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6747 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6748 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6749 */
6750 /* binop/lit8 vAA, vBB, #+CC */
6751 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6752 mov r9, rINST, lsr #8 @ r9<- AA
6753 and r2, r3, #255 @ r2<- BB
6754 GET_VREG r0, r2 @ r0<- vBB
6755 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6756 .if 0
6757 @cmp r1, #0 @ is second operand zero?
6758 beq common_errDivideByZero
6759 .endif
6760 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6761
6762 @ optional op; may set condition codes
6763 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6764 GET_INST_OPCODE ip @ extract opcode from rINST
6765 SET_VREG r0, r9 @ vAA<- r0
6766 GOTO_OPCODE ip @ jump to next instruction
6767 /* 10-12 instructions */
6768
6769
6770/* ------------------------------ */
6771 .balign 128
6772.L_op_mul_int_lit8: /* 0xda */
6773/* File: arm/op_mul_int_lit8.S */
6774/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6775/* File: arm/binopLit8.S */
6776 /*
6777 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6778 * that specifies an instruction that performs "result = r0 op r1".
6779 * This could be an ARM instruction or a function call. (If the result
6780 * comes back in a register other than r0, you can override "result".)
6781 *
6782 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6783 * vCC (r1). Useful for integer division and modulus.
6784 *
6785 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6786 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6787 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6788 */
6789 /* binop/lit8 vAA, vBB, #+CC */
6790 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6791 mov r9, rINST, lsr #8 @ r9<- AA
6792 and r2, r3, #255 @ r2<- BB
6793 GET_VREG r0, r2 @ r0<- vBB
6794 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6795 .if 0
6796 @cmp r1, #0 @ is second operand zero?
6797 beq common_errDivideByZero
6798 .endif
6799 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6800
6801 @ optional op; may set condition codes
6802 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6803 GET_INST_OPCODE ip @ extract opcode from rINST
6804 SET_VREG r0, r9 @ vAA<- r0
6805 GOTO_OPCODE ip @ jump to next instruction
6806 /* 10-12 instructions */
6807
6808
6809/* ------------------------------ */
6810 .balign 128
6811.L_op_div_int_lit8: /* 0xdb */
6812/* File: arm/op_div_int_lit8.S */
6813 /*
6814 * Specialized 32-bit binary operation
6815 *
6816 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6817 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6818 * ARMv7 CPUs that have hardware division support).
6819 *
6820 * div-int/lit8
6821 *
6822 */
6823 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6824 mov r9, rINST, lsr #8 @ r9<- AA
6825 and r2, r3, #255 @ r2<- BB
6826 GET_VREG r0, r2 @ r0<- vBB
6827 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6828 @cmp r1, #0 @ is second operand zero?
6829 beq common_errDivideByZero
6830 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6831
6832#ifdef __ARM_ARCH_EXT_IDIV__
6833 sdiv r0, r0, r1 @ r0<- op
6834#else
6835 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6836#endif
6837 GET_INST_OPCODE ip @ extract opcode from rINST
6838 SET_VREG r0, r9 @ vAA<- r0
6839 GOTO_OPCODE ip @ jump to next instruction
6840 /* 10-12 instructions */
6841
6842/* ------------------------------ */
6843 .balign 128
6844.L_op_rem_int_lit8: /* 0xdc */
6845/* File: arm/op_rem_int_lit8.S */
6846 /*
6847 * Specialized 32-bit binary operation
6848 *
6849 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6850 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6851 * ARMv7 CPUs that have hardware division support).
6852 *
6853 * NOTE: idivmod returns quotient in r0 and remainder in r1
6854 *
6855 * rem-int/lit8
6856 *
6857 */
6858 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
6859 mov r9, rINST, lsr #8 @ r9<- AA
6860 and r2, r3, #255 @ r2<- BB
6861 GET_VREG r0, r2 @ r0<- vBB
6862 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6863 @cmp r1, #0 @ is second operand zero?
6864 beq common_errDivideByZero
6865 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6866
6867#ifdef __ARM_ARCH_EXT_IDIV__
6868 sdiv r2, r0, r1
6869 mls r1, r1, r2, r0 @ r1<- op
6870#else
6871 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6872#endif
6873 GET_INST_OPCODE ip @ extract opcode from rINST
6874 SET_VREG r1, r9 @ vAA<- r1
6875 GOTO_OPCODE ip @ jump to next instruction
6876 /* 10-12 instructions */
6877
6878/* ------------------------------ */
6879 .balign 128
6880.L_op_and_int_lit8: /* 0xdd */
6881/* File: arm/op_and_int_lit8.S */
6882/* File: arm/binopLit8.S */
6883 /*
6884 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6885 * that specifies an instruction that performs "result = r0 op r1".
6886 * This could be an ARM instruction or a function call. (If the result
6887 * comes back in a register other than r0, you can override "result".)
6888 *
6889 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6890 * vCC (r1). Useful for integer division and modulus.
6891 *
6892 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6893 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6894 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6895 */
6896 /* binop/lit8 vAA, vBB, #+CC */
6897 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6898 mov r9, rINST, lsr #8 @ r9<- AA
6899 and r2, r3, #255 @ r2<- BB
6900 GET_VREG r0, r2 @ r0<- vBB
6901 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6902 .if 0
6903 @cmp r1, #0 @ is second operand zero?
6904 beq common_errDivideByZero
6905 .endif
6906 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6907
6908 @ optional op; may set condition codes
6909 and r0, r0, r1 @ r0<- op, r0-r3 changed
6910 GET_INST_OPCODE ip @ extract opcode from rINST
6911 SET_VREG r0, r9 @ vAA<- r0
6912 GOTO_OPCODE ip @ jump to next instruction
6913 /* 10-12 instructions */
6914
6915
6916/* ------------------------------ */
6917 .balign 128
6918.L_op_or_int_lit8: /* 0xde */
6919/* File: arm/op_or_int_lit8.S */
6920/* File: arm/binopLit8.S */
6921 /*
6922 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6923 * that specifies an instruction that performs "result = r0 op r1".
6924 * This could be an ARM instruction or a function call. (If the result
6925 * comes back in a register other than r0, you can override "result".)
6926 *
6927 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6928 * vCC (r1). Useful for integer division and modulus.
6929 *
6930 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6931 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6932 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6933 */
6934 /* binop/lit8 vAA, vBB, #+CC */
6935 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6936 mov r9, rINST, lsr #8 @ r9<- AA
6937 and r2, r3, #255 @ r2<- BB
6938 GET_VREG r0, r2 @ r0<- vBB
6939 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6940 .if 0
6941 @cmp r1, #0 @ is second operand zero?
6942 beq common_errDivideByZero
6943 .endif
6944 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6945
6946 @ optional op; may set condition codes
6947 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6948 GET_INST_OPCODE ip @ extract opcode from rINST
6949 SET_VREG r0, r9 @ vAA<- r0
6950 GOTO_OPCODE ip @ jump to next instruction
6951 /* 10-12 instructions */
6952
6953
6954/* ------------------------------ */
6955 .balign 128
6956.L_op_xor_int_lit8: /* 0xdf */
6957/* File: arm/op_xor_int_lit8.S */
6958/* File: arm/binopLit8.S */
6959 /*
6960 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6961 * that specifies an instruction that performs "result = r0 op r1".
6962 * This could be an ARM instruction or a function call. (If the result
6963 * comes back in a register other than r0, you can override "result".)
6964 *
6965 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6966 * vCC (r1). Useful for integer division and modulus.
6967 *
6968 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6969 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6970 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6971 */
6972 /* binop/lit8 vAA, vBB, #+CC */
6973 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6974 mov r9, rINST, lsr #8 @ r9<- AA
6975 and r2, r3, #255 @ r2<- BB
6976 GET_VREG r0, r2 @ r0<- vBB
6977 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6978 .if 0
6979 @cmp r1, #0 @ is second operand zero?
6980 beq common_errDivideByZero
6981 .endif
6982 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6983
6984 @ optional op; may set condition codes
6985 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6986 GET_INST_OPCODE ip @ extract opcode from rINST
6987 SET_VREG r0, r9 @ vAA<- r0
6988 GOTO_OPCODE ip @ jump to next instruction
6989 /* 10-12 instructions */
6990
6991
6992/* ------------------------------ */
6993 .balign 128
6994.L_op_shl_int_lit8: /* 0xe0 */
6995/* File: arm/op_shl_int_lit8.S */
6996/* File: arm/binopLit8.S */
6997 /*
6998 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6999 * that specifies an instruction that performs "result = r0 op r1".
7000 * This could be an ARM instruction or a function call. (If the result
7001 * comes back in a register other than r0, you can override "result".)
7002 *
7003 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7004 * vCC (r1). Useful for integer division and modulus.
7005 *
7006 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7007 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7008 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7009 */
7010 /* binop/lit8 vAA, vBB, #+CC */
7011 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7012 mov r9, rINST, lsr #8 @ r9<- AA
7013 and r2, r3, #255 @ r2<- BB
7014 GET_VREG r0, r2 @ r0<- vBB
7015 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7016 .if 0
7017 @cmp r1, #0 @ is second operand zero?
7018 beq common_errDivideByZero
7019 .endif
7020 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7021
7022 and r1, r1, #31 @ optional op; may set condition codes
7023 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
7024 GET_INST_OPCODE ip @ extract opcode from rINST
7025 SET_VREG r0, r9 @ vAA<- r0
7026 GOTO_OPCODE ip @ jump to next instruction
7027 /* 10-12 instructions */
7028
7029
7030/* ------------------------------ */
7031 .balign 128
7032.L_op_shr_int_lit8: /* 0xe1 */
7033/* File: arm/op_shr_int_lit8.S */
7034/* File: arm/binopLit8.S */
7035 /*
7036 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7037 * that specifies an instruction that performs "result = r0 op r1".
7038 * This could be an ARM instruction or a function call. (If the result
7039 * comes back in a register other than r0, you can override "result".)
7040 *
7041 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7042 * vCC (r1). Useful for integer division and modulus.
7043 *
7044 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7045 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7046 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7047 */
7048 /* binop/lit8 vAA, vBB, #+CC */
7049 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7050 mov r9, rINST, lsr #8 @ r9<- AA
7051 and r2, r3, #255 @ r2<- BB
7052 GET_VREG r0, r2 @ r0<- vBB
7053 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7054 .if 0
7055 @cmp r1, #0 @ is second operand zero?
7056 beq common_errDivideByZero
7057 .endif
7058 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7059
7060 and r1, r1, #31 @ optional op; may set condition codes
7061 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
7062 GET_INST_OPCODE ip @ extract opcode from rINST
7063 SET_VREG r0, r9 @ vAA<- r0
7064 GOTO_OPCODE ip @ jump to next instruction
7065 /* 10-12 instructions */
7066
7067
7068/* ------------------------------ */
7069 .balign 128
7070.L_op_ushr_int_lit8: /* 0xe2 */
7071/* File: arm/op_ushr_int_lit8.S */
7072/* File: arm/binopLit8.S */
7073 /*
7074 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7075 * that specifies an instruction that performs "result = r0 op r1".
7076 * This could be an ARM instruction or a function call. (If the result
7077 * comes back in a register other than r0, you can override "result".)
7078 *
7079 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7080 * vCC (r1). Useful for integer division and modulus.
7081 *
7082 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7083 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7084 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7085 */
7086 /* binop/lit8 vAA, vBB, #+CC */
7087 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7088 mov r9, rINST, lsr #8 @ r9<- AA
7089 and r2, r3, #255 @ r2<- BB
7090 GET_VREG r0, r2 @ r0<- vBB
7091 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7092 .if 0
7093 @cmp r1, #0 @ is second operand zero?
7094 beq common_errDivideByZero
7095 .endif
7096 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7097
7098 and r1, r1, #31 @ optional op; may set condition codes
7099 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
7100 GET_INST_OPCODE ip @ extract opcode from rINST
7101 SET_VREG r0, r9 @ vAA<- r0
7102 GOTO_OPCODE ip @ jump to next instruction
7103 /* 10-12 instructions */
7104
7105
7106/* ------------------------------ */
7107 .balign 128
7108.L_op_iget_quick: /* 0xe3 */
7109/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007110 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007111 /* op vA, vB, offset@CCCC */
7112 mov r2, rINST, lsr #12 @ r2<- B
7113 FETCH r1, 1 @ r1<- field byte offset
7114 GET_VREG r3, r2 @ r3<- object we're operating on
7115 ubfx r2, rINST, #8, #4 @ r2<- A
7116 cmp r3, #0 @ check object for null
7117 beq common_errNullObject @ object was null
7118 ldr r0, [r3, r1] @ r0<- obj.field
7119 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007120 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007121 GET_INST_OPCODE ip @ extract opcode from rINST
7122 GOTO_OPCODE ip @ jump to next instruction
7123
7124/* ------------------------------ */
7125 .balign 128
7126.L_op_iget_wide_quick: /* 0xe4 */
7127/* File: arm/op_iget_wide_quick.S */
7128 /* iget-wide-quick vA, vB, offset@CCCC */
7129 mov r2, rINST, lsr #12 @ r2<- B
7130 FETCH ip, 1 @ ip<- field byte offset
7131 GET_VREG r3, r2 @ r3<- object we're operating on
7132 ubfx r2, rINST, #8, #4 @ r2<- A
7133 cmp r3, #0 @ check object for null
7134 beq common_errNullObject @ object was null
7135 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
7136 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7137 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
7138 GET_INST_OPCODE ip @ extract opcode from rINST
7139 stmia r3, {r0-r1} @ fp[A]<- r0/r1
7140 GOTO_OPCODE ip @ jump to next instruction
7141
7142/* ------------------------------ */
7143 .balign 128
7144.L_op_iget_object_quick: /* 0xe5 */
7145/* File: arm/op_iget_object_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007146 /* For: iget-object-quick */
buzbee1452bee2015-03-06 14:43:04 -08007147 /* op vA, vB, offset@CCCC */
7148 mov r2, rINST, lsr #12 @ r2<- B
7149 FETCH r1, 1 @ r1<- field byte offset
buzbee76833da2016-01-13 13:06:22 -08007150 GET_VREG r0, r2 @ r0<- object we're operating on
7151 cmp r0, #0 @ check object for null
buzbee1452bee2015-03-06 14:43:04 -08007152 beq common_errNullObject @ object was null
buzbee76833da2016-01-13 13:06:22 -08007153 bl artIGetObjectFromMterp @ (obj, offset)
7154 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
7155 ubfx r2, rINST, #8, #4 @ r2<- A
7156 PREFETCH_INST 2
7157 cmp r3, #0
7158 bne MterpPossibleException @ bail out
buzbee1452bee2015-03-06 14:43:04 -08007159 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
buzbee76833da2016-01-13 13:06:22 -08007160 ADVANCE 2 @ advance rPC
buzbee1452bee2015-03-06 14:43:04 -08007161 GET_INST_OPCODE ip @ extract opcode from rINST
7162 GOTO_OPCODE ip @ jump to next instruction
7163
buzbee1452bee2015-03-06 14:43:04 -08007164/* ------------------------------ */
7165 .balign 128
7166.L_op_iput_quick: /* 0xe6 */
7167/* File: arm/op_iput_quick.S */
7168 /* For: iput-quick, iput-object-quick */
7169 /* op vA, vB, offset@CCCC */
7170 mov r2, rINST, lsr #12 @ r2<- B
7171 FETCH r1, 1 @ r1<- field byte offset
7172 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7173 ubfx r2, rINST, #8, #4 @ r2<- A
7174 cmp r3, #0 @ check object for null
7175 beq common_errNullObject @ object was null
7176 GET_VREG r0, r2 @ r0<- fp[A]
7177 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7178 str r0, [r3, r1] @ obj.field<- r0
7179 GET_INST_OPCODE ip @ extract opcode from rINST
7180 GOTO_OPCODE ip @ jump to next instruction
7181
7182/* ------------------------------ */
7183 .balign 128
7184.L_op_iput_wide_quick: /* 0xe7 */
7185/* File: arm/op_iput_wide_quick.S */
7186 /* iput-wide-quick vA, vB, offset@CCCC */
7187 mov r2, rINST, lsr #12 @ r2<- B
7188 FETCH r3, 1 @ r3<- field byte offset
7189 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7190 ubfx r0, rINST, #8, #4 @ r0<- A
7191 cmp r2, #0 @ check object for null
7192 beq common_errNullObject @ object was null
7193 add r0, rFP, r0, lsl #2 @ r0<- &fp[A]
7194 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7195 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7196 strd r0, [r2, r3] @ obj.field<- r0/r1
7197 GET_INST_OPCODE ip @ extract opcode from rINST
7198 GOTO_OPCODE ip @ jump to next instruction
7199
7200/* ------------------------------ */
7201 .balign 128
7202.L_op_iput_object_quick: /* 0xe8 */
7203/* File: arm/op_iput_object_quick.S */
7204 EXPORT_PC
7205 add r0, rFP, #OFF_FP_SHADOWFRAME
7206 mov r1, rPC
7207 mov r2, rINST
7208 bl MterpIputObjectQuick
7209 cmp r0, #0
7210 beq MterpException
7211 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7212 GET_INST_OPCODE ip @ extract opcode from rINST
7213 GOTO_OPCODE ip @ jump to next instruction
7214
7215/* ------------------------------ */
7216 .balign 128
7217.L_op_invoke_virtual_quick: /* 0xe9 */
7218/* File: arm/op_invoke_virtual_quick.S */
7219/* File: arm/invoke.S */
7220 /*
7221 * Generic invoke handler wrapper.
7222 */
7223 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7224 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7225 .extern MterpInvokeVirtualQuick
7226 EXPORT_PC
7227 mov r0, rSELF
7228 add r1, rFP, #OFF_FP_SHADOWFRAME
7229 mov r2, rPC
7230 mov r3, rINST
7231 bl MterpInvokeVirtualQuick
7232 cmp r0, #0
7233 beq MterpException
7234 FETCH_ADVANCE_INST 3
7235 GET_INST_OPCODE ip
7236 GOTO_OPCODE ip
7237
7238
7239
7240/* ------------------------------ */
7241 .balign 128
7242.L_op_invoke_virtual_range_quick: /* 0xea */
7243/* File: arm/op_invoke_virtual_range_quick.S */
7244/* File: arm/invoke.S */
7245 /*
7246 * Generic invoke handler wrapper.
7247 */
7248 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7249 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7250 .extern MterpInvokeVirtualQuickRange
7251 EXPORT_PC
7252 mov r0, rSELF
7253 add r1, rFP, #OFF_FP_SHADOWFRAME
7254 mov r2, rPC
7255 mov r3, rINST
7256 bl MterpInvokeVirtualQuickRange
7257 cmp r0, #0
7258 beq MterpException
7259 FETCH_ADVANCE_INST 3
7260 GET_INST_OPCODE ip
7261 GOTO_OPCODE ip
7262
7263
7264
7265/* ------------------------------ */
7266 .balign 128
7267.L_op_iput_boolean_quick: /* 0xeb */
7268/* File: arm/op_iput_boolean_quick.S */
7269/* File: arm/op_iput_quick.S */
7270 /* For: iput-quick, iput-object-quick */
7271 /* op vA, vB, offset@CCCC */
7272 mov r2, rINST, lsr #12 @ r2<- B
7273 FETCH r1, 1 @ r1<- field byte offset
7274 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7275 ubfx r2, rINST, #8, #4 @ r2<- A
7276 cmp r3, #0 @ check object for null
7277 beq common_errNullObject @ object was null
7278 GET_VREG r0, r2 @ r0<- fp[A]
7279 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7280 strb r0, [r3, r1] @ obj.field<- r0
7281 GET_INST_OPCODE ip @ extract opcode from rINST
7282 GOTO_OPCODE ip @ jump to next instruction
7283
7284
7285/* ------------------------------ */
7286 .balign 128
7287.L_op_iput_byte_quick: /* 0xec */
7288/* File: arm/op_iput_byte_quick.S */
7289/* File: arm/op_iput_quick.S */
7290 /* For: iput-quick, iput-object-quick */
7291 /* op vA, vB, offset@CCCC */
7292 mov r2, rINST, lsr #12 @ r2<- B
7293 FETCH r1, 1 @ r1<- field byte offset
7294 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7295 ubfx r2, rINST, #8, #4 @ r2<- A
7296 cmp r3, #0 @ check object for null
7297 beq common_errNullObject @ object was null
7298 GET_VREG r0, r2 @ r0<- fp[A]
7299 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7300 strb r0, [r3, r1] @ obj.field<- r0
7301 GET_INST_OPCODE ip @ extract opcode from rINST
7302 GOTO_OPCODE ip @ jump to next instruction
7303
7304
7305/* ------------------------------ */
7306 .balign 128
7307.L_op_iput_char_quick: /* 0xed */
7308/* File: arm/op_iput_char_quick.S */
7309/* File: arm/op_iput_quick.S */
7310 /* For: iput-quick, iput-object-quick */
7311 /* op vA, vB, offset@CCCC */
7312 mov r2, rINST, lsr #12 @ r2<- B
7313 FETCH r1, 1 @ r1<- field byte offset
7314 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7315 ubfx r2, rINST, #8, #4 @ r2<- A
7316 cmp r3, #0 @ check object for null
7317 beq common_errNullObject @ object was null
7318 GET_VREG r0, r2 @ r0<- fp[A]
7319 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7320 strh r0, [r3, r1] @ obj.field<- r0
7321 GET_INST_OPCODE ip @ extract opcode from rINST
7322 GOTO_OPCODE ip @ jump to next instruction
7323
7324
7325/* ------------------------------ */
7326 .balign 128
7327.L_op_iput_short_quick: /* 0xee */
7328/* File: arm/op_iput_short_quick.S */
7329/* File: arm/op_iput_quick.S */
7330 /* For: iput-quick, iput-object-quick */
7331 /* op vA, vB, offset@CCCC */
7332 mov r2, rINST, lsr #12 @ r2<- B
7333 FETCH r1, 1 @ r1<- field byte offset
7334 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7335 ubfx r2, rINST, #8, #4 @ r2<- A
7336 cmp r3, #0 @ check object for null
7337 beq common_errNullObject @ object was null
7338 GET_VREG r0, r2 @ r0<- fp[A]
7339 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7340 strh r0, [r3, r1] @ obj.field<- r0
7341 GET_INST_OPCODE ip @ extract opcode from rINST
7342 GOTO_OPCODE ip @ jump to next instruction
7343
7344
7345/* ------------------------------ */
7346 .balign 128
7347.L_op_iget_boolean_quick: /* 0xef */
7348/* File: arm/op_iget_boolean_quick.S */
7349/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007350 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007351 /* op vA, vB, offset@CCCC */
7352 mov r2, rINST, lsr #12 @ r2<- B
7353 FETCH r1, 1 @ r1<- field byte offset
7354 GET_VREG r3, r2 @ r3<- object we're operating on
7355 ubfx r2, rINST, #8, #4 @ r2<- A
7356 cmp r3, #0 @ check object for null
7357 beq common_errNullObject @ object was null
7358 ldrb r0, [r3, r1] @ r0<- obj.field
7359 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007360 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007361 GET_INST_OPCODE ip @ extract opcode from rINST
7362 GOTO_OPCODE ip @ jump to next instruction
7363
7364
7365/* ------------------------------ */
7366 .balign 128
7367.L_op_iget_byte_quick: /* 0xf0 */
7368/* File: arm/op_iget_byte_quick.S */
7369/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007370 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007371 /* op vA, vB, offset@CCCC */
7372 mov r2, rINST, lsr #12 @ r2<- B
7373 FETCH r1, 1 @ r1<- field byte offset
7374 GET_VREG r3, r2 @ r3<- object we're operating on
7375 ubfx r2, rINST, #8, #4 @ r2<- A
7376 cmp r3, #0 @ check object for null
7377 beq common_errNullObject @ object was null
7378 ldrsb r0, [r3, r1] @ r0<- obj.field
7379 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007380 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007381 GET_INST_OPCODE ip @ extract opcode from rINST
7382 GOTO_OPCODE ip @ jump to next instruction
7383
7384
7385/* ------------------------------ */
7386 .balign 128
7387.L_op_iget_char_quick: /* 0xf1 */
7388/* File: arm/op_iget_char_quick.S */
7389/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007390 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007391 /* op vA, vB, offset@CCCC */
7392 mov r2, rINST, lsr #12 @ r2<- B
7393 FETCH r1, 1 @ r1<- field byte offset
7394 GET_VREG r3, r2 @ r3<- object we're operating on
7395 ubfx r2, rINST, #8, #4 @ r2<- A
7396 cmp r3, #0 @ check object for null
7397 beq common_errNullObject @ object was null
7398 ldrh r0, [r3, r1] @ r0<- obj.field
7399 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007400 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007401 GET_INST_OPCODE ip @ extract opcode from rINST
7402 GOTO_OPCODE ip @ jump to next instruction
7403
7404
7405/* ------------------------------ */
7406 .balign 128
7407.L_op_iget_short_quick: /* 0xf2 */
7408/* File: arm/op_iget_short_quick.S */
7409/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007410 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007411 /* op vA, vB, offset@CCCC */
7412 mov r2, rINST, lsr #12 @ r2<- B
7413 FETCH r1, 1 @ r1<- field byte offset
7414 GET_VREG r3, r2 @ r3<- object we're operating on
7415 ubfx r2, rINST, #8, #4 @ r2<- A
7416 cmp r3, #0 @ check object for null
7417 beq common_errNullObject @ object was null
7418 ldrsh r0, [r3, r1] @ r0<- obj.field
7419 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007420 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007421 GET_INST_OPCODE ip @ extract opcode from rINST
7422 GOTO_OPCODE ip @ jump to next instruction
7423
7424
7425/* ------------------------------ */
7426 .balign 128
7427.L_op_invoke_lambda: /* 0xf3 */
7428/* Transfer stub to alternate interpreter */
7429 b MterpFallback
7430
7431
7432/* ------------------------------ */
7433 .balign 128
7434.L_op_unused_f4: /* 0xf4 */
7435/* File: arm/op_unused_f4.S */
7436/* File: arm/unused.S */
7437/*
7438 * Bail to reference interpreter to throw.
7439 */
7440 b MterpFallback
7441
7442
7443/* ------------------------------ */
7444 .balign 128
7445.L_op_capture_variable: /* 0xf5 */
7446/* Transfer stub to alternate interpreter */
7447 b MterpFallback
7448
7449
7450/* ------------------------------ */
7451 .balign 128
7452.L_op_create_lambda: /* 0xf6 */
7453/* Transfer stub to alternate interpreter */
7454 b MterpFallback
7455
7456
7457/* ------------------------------ */
7458 .balign 128
7459.L_op_liberate_variable: /* 0xf7 */
7460/* Transfer stub to alternate interpreter */
7461 b MterpFallback
7462
7463
7464/* ------------------------------ */
7465 .balign 128
7466.L_op_box_lambda: /* 0xf8 */
7467/* Transfer stub to alternate interpreter */
7468 b MterpFallback
7469
7470
7471/* ------------------------------ */
7472 .balign 128
7473.L_op_unbox_lambda: /* 0xf9 */
7474/* Transfer stub to alternate interpreter */
7475 b MterpFallback
7476
7477
7478/* ------------------------------ */
7479 .balign 128
7480.L_op_unused_fa: /* 0xfa */
7481/* File: arm/op_unused_fa.S */
7482/* File: arm/unused.S */
7483/*
7484 * Bail to reference interpreter to throw.
7485 */
7486 b MterpFallback
7487
7488
7489/* ------------------------------ */
7490 .balign 128
7491.L_op_unused_fb: /* 0xfb */
7492/* File: arm/op_unused_fb.S */
7493/* File: arm/unused.S */
7494/*
7495 * Bail to reference interpreter to throw.
7496 */
7497 b MterpFallback
7498
7499
7500/* ------------------------------ */
7501 .balign 128
7502.L_op_unused_fc: /* 0xfc */
7503/* File: arm/op_unused_fc.S */
7504/* File: arm/unused.S */
7505/*
7506 * Bail to reference interpreter to throw.
7507 */
7508 b MterpFallback
7509
7510
7511/* ------------------------------ */
7512 .balign 128
7513.L_op_unused_fd: /* 0xfd */
7514/* File: arm/op_unused_fd.S */
7515/* File: arm/unused.S */
7516/*
7517 * Bail to reference interpreter to throw.
7518 */
7519 b MterpFallback
7520
7521
7522/* ------------------------------ */
7523 .balign 128
7524.L_op_unused_fe: /* 0xfe */
7525/* File: arm/op_unused_fe.S */
7526/* File: arm/unused.S */
7527/*
7528 * Bail to reference interpreter to throw.
7529 */
7530 b MterpFallback
7531
7532
7533/* ------------------------------ */
7534 .balign 128
7535.L_op_unused_ff: /* 0xff */
7536/* File: arm/op_unused_ff.S */
7537/* File: arm/unused.S */
7538/*
7539 * Bail to reference interpreter to throw.
7540 */
7541 b MterpFallback
7542
7543
7544 .balign 128
7545 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7546 .global artMterpAsmInstructionEnd
7547artMterpAsmInstructionEnd:
7548
7549/*
7550 * ===========================================================================
7551 * Sister implementations
7552 * ===========================================================================
7553 */
7554 .global artMterpAsmSisterStart
7555 .type artMterpAsmSisterStart, %function
7556 .text
7557 .balign 4
7558artMterpAsmSisterStart:
7559
7560/* continuation for op_cmp_long */
7561
7562.Lop_cmp_long_less:
7563 mvn r1, #0 @ r1<- -1
7564 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7565 @ instead, we just replicate the tail end.
7566 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7567 SET_VREG r1, r9 @ vAA<- r1
7568 GET_INST_OPCODE ip @ extract opcode from rINST
7569 GOTO_OPCODE ip @ jump to next instruction
7570
7571.Lop_cmp_long_greater:
7572 mov r1, #1 @ r1<- 1
7573 @ fall through to _finish
7574
7575.Lop_cmp_long_finish:
7576 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7577 SET_VREG r1, r9 @ vAA<- r1
7578 GET_INST_OPCODE ip @ extract opcode from rINST
7579 GOTO_OPCODE ip @ jump to next instruction
7580
7581/* continuation for op_float_to_long */
7582/*
7583 * Convert the float in r0 to a long in r0/r1.
7584 *
7585 * We have to clip values to long min/max per the specification. The
7586 * expected common case is a "reasonable" value that converts directly
7587 * to modest integer. The EABI convert function isn't doing this for us.
7588 */
7589f2l_doconv:
7590 stmfd sp!, {r4, lr}
7591 mov r1, #0x5f000000 @ (float)maxlong
7592 mov r4, r0
7593 bl __aeabi_fcmpge @ is arg >= maxlong?
7594 cmp r0, #0 @ nonzero == yes
7595 mvnne r0, #0 @ return maxlong (7fffffff)
7596 mvnne r1, #0x80000000
7597 ldmnefd sp!, {r4, pc}
7598
7599 mov r0, r4 @ recover arg
7600 mov r1, #0xdf000000 @ (float)minlong
7601 bl __aeabi_fcmple @ is arg <= minlong?
7602 cmp r0, #0 @ nonzero == yes
7603 movne r0, #0 @ return minlong (80000000)
7604 movne r1, #0x80000000
7605 ldmnefd sp!, {r4, pc}
7606
7607 mov r0, r4 @ recover arg
7608 mov r1, r4
7609 bl __aeabi_fcmpeq @ is arg == self?
7610 cmp r0, #0 @ zero == no
7611 moveq r1, #0 @ return zero for NaN
7612 ldmeqfd sp!, {r4, pc}
7613
7614 mov r0, r4 @ recover arg
7615 bl __aeabi_f2lz @ convert float to long
7616 ldmfd sp!, {r4, pc}
7617
7618/* continuation for op_double_to_long */
7619/*
7620 * Convert the double in r0/r1 to a long in r0/r1.
7621 *
7622 * We have to clip values to long min/max per the specification. The
7623 * expected common case is a "reasonable" value that converts directly
7624 * to modest integer. The EABI convert function isn't doing this for us.
7625 */
7626d2l_doconv:
7627 stmfd sp!, {r4, r5, lr} @ save regs
7628 mov r3, #0x43000000 @ maxlong, as a double (high word)
7629 add r3, #0x00e00000 @ 0x43e00000
7630 mov r2, #0 @ maxlong, as a double (low word)
7631 sub sp, sp, #4 @ align for EABI
7632 mov r4, r0 @ save a copy of r0
7633 mov r5, r1 @ and r1
7634 bl __aeabi_dcmpge @ is arg >= maxlong?
7635 cmp r0, #0 @ nonzero == yes
7636 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7637 mvnne r1, #0x80000000
7638 bne 1f
7639
7640 mov r0, r4 @ recover arg
7641 mov r1, r5
7642 mov r3, #0xc3000000 @ minlong, as a double (high word)
7643 add r3, #0x00e00000 @ 0xc3e00000
7644 mov r2, #0 @ minlong, as a double (low word)
7645 bl __aeabi_dcmple @ is arg <= minlong?
7646 cmp r0, #0 @ nonzero == yes
7647 movne r0, #0 @ return minlong (8000000000000000)
7648 movne r1, #0x80000000
7649 bne 1f
7650
7651 mov r0, r4 @ recover arg
7652 mov r1, r5
7653 mov r2, r4 @ compare against self
7654 mov r3, r5
7655 bl __aeabi_dcmpeq @ is arg == self?
7656 cmp r0, #0 @ zero == no
7657 moveq r1, #0 @ return zero for NaN
7658 beq 1f
7659
7660 mov r0, r4 @ recover arg
7661 mov r1, r5
7662 bl __aeabi_d2lz @ convert double to long
7663
76641:
7665 add sp, sp, #4
7666 ldmfd sp!, {r4, r5, pc}
7667
7668 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7669 .global artMterpAsmSisterEnd
7670artMterpAsmSisterEnd:
7671
7672
7673 .global artMterpAsmAltInstructionStart
7674 .type artMterpAsmAltInstructionStart, %function
7675 .text
7676
7677artMterpAsmAltInstructionStart = .L_ALT_op_nop
7678/* ------------------------------ */
7679 .balign 128
7680.L_ALT_op_nop: /* 0x00 */
7681/* File: arm/alt_stub.S */
7682/*
7683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7684 * any interesting requests and then jump to the real instruction
7685 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7686 */
7687 .extern MterpCheckBefore
7688 EXPORT_PC
7689 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7690 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7691 mov r0, rSELF
7692 add r1, rFP, #OFF_FP_SHADOWFRAME
7693 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7694
7695/* ------------------------------ */
7696 .balign 128
7697.L_ALT_op_move: /* 0x01 */
7698/* File: arm/alt_stub.S */
7699/*
7700 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7701 * any interesting requests and then jump to the real instruction
7702 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7703 */
7704 .extern MterpCheckBefore
7705 EXPORT_PC
7706 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7707 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7708 mov r0, rSELF
7709 add r1, rFP, #OFF_FP_SHADOWFRAME
7710 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7711
7712/* ------------------------------ */
7713 .balign 128
7714.L_ALT_op_move_from16: /* 0x02 */
7715/* File: arm/alt_stub.S */
7716/*
7717 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7718 * any interesting requests and then jump to the real instruction
7719 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7720 */
7721 .extern MterpCheckBefore
7722 EXPORT_PC
7723 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7724 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7725 mov r0, rSELF
7726 add r1, rFP, #OFF_FP_SHADOWFRAME
7727 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7728
7729/* ------------------------------ */
7730 .balign 128
7731.L_ALT_op_move_16: /* 0x03 */
7732/* File: arm/alt_stub.S */
7733/*
7734 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7735 * any interesting requests and then jump to the real instruction
7736 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7737 */
7738 .extern MterpCheckBefore
7739 EXPORT_PC
7740 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7741 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
7742 mov r0, rSELF
7743 add r1, rFP, #OFF_FP_SHADOWFRAME
7744 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7745
7746/* ------------------------------ */
7747 .balign 128
7748.L_ALT_op_move_wide: /* 0x04 */
7749/* File: arm/alt_stub.S */
7750/*
7751 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7752 * any interesting requests and then jump to the real instruction
7753 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7754 */
7755 .extern MterpCheckBefore
7756 EXPORT_PC
7757 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7758 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
7759 mov r0, rSELF
7760 add r1, rFP, #OFF_FP_SHADOWFRAME
7761 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7762
7763/* ------------------------------ */
7764 .balign 128
7765.L_ALT_op_move_wide_from16: /* 0x05 */
7766/* File: arm/alt_stub.S */
7767/*
7768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7769 * any interesting requests and then jump to the real instruction
7770 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7771 */
7772 .extern MterpCheckBefore
7773 EXPORT_PC
7774 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7775 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
7776 mov r0, rSELF
7777 add r1, rFP, #OFF_FP_SHADOWFRAME
7778 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7779
7780/* ------------------------------ */
7781 .balign 128
7782.L_ALT_op_move_wide_16: /* 0x06 */
7783/* File: arm/alt_stub.S */
7784/*
7785 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7786 * any interesting requests and then jump to the real instruction
7787 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7788 */
7789 .extern MterpCheckBefore
7790 EXPORT_PC
7791 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7792 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
7793 mov r0, rSELF
7794 add r1, rFP, #OFF_FP_SHADOWFRAME
7795 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7796
7797/* ------------------------------ */
7798 .balign 128
7799.L_ALT_op_move_object: /* 0x07 */
7800/* File: arm/alt_stub.S */
7801/*
7802 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7803 * any interesting requests and then jump to the real instruction
7804 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7805 */
7806 .extern MterpCheckBefore
7807 EXPORT_PC
7808 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7809 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
7810 mov r0, rSELF
7811 add r1, rFP, #OFF_FP_SHADOWFRAME
7812 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7813
7814/* ------------------------------ */
7815 .balign 128
7816.L_ALT_op_move_object_from16: /* 0x08 */
7817/* File: arm/alt_stub.S */
7818/*
7819 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7820 * any interesting requests and then jump to the real instruction
7821 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7822 */
7823 .extern MterpCheckBefore
7824 EXPORT_PC
7825 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7826 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
7827 mov r0, rSELF
7828 add r1, rFP, #OFF_FP_SHADOWFRAME
7829 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7830
7831/* ------------------------------ */
7832 .balign 128
7833.L_ALT_op_move_object_16: /* 0x09 */
7834/* File: arm/alt_stub.S */
7835/*
7836 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7837 * any interesting requests and then jump to the real instruction
7838 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7839 */
7840 .extern MterpCheckBefore
7841 EXPORT_PC
7842 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7843 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
7844 mov r0, rSELF
7845 add r1, rFP, #OFF_FP_SHADOWFRAME
7846 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7847
7848/* ------------------------------ */
7849 .balign 128
7850.L_ALT_op_move_result: /* 0x0a */
7851/* File: arm/alt_stub.S */
7852/*
7853 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7854 * any interesting requests and then jump to the real instruction
7855 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7856 */
7857 .extern MterpCheckBefore
7858 EXPORT_PC
7859 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7860 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
7861 mov r0, rSELF
7862 add r1, rFP, #OFF_FP_SHADOWFRAME
7863 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7864
7865/* ------------------------------ */
7866 .balign 128
7867.L_ALT_op_move_result_wide: /* 0x0b */
7868/* File: arm/alt_stub.S */
7869/*
7870 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7871 * any interesting requests and then jump to the real instruction
7872 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7873 */
7874 .extern MterpCheckBefore
7875 EXPORT_PC
7876 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7877 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
7878 mov r0, rSELF
7879 add r1, rFP, #OFF_FP_SHADOWFRAME
7880 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7881
7882/* ------------------------------ */
7883 .balign 128
7884.L_ALT_op_move_result_object: /* 0x0c */
7885/* File: arm/alt_stub.S */
7886/*
7887 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7888 * any interesting requests and then jump to the real instruction
7889 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7890 */
7891 .extern MterpCheckBefore
7892 EXPORT_PC
7893 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7894 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
7895 mov r0, rSELF
7896 add r1, rFP, #OFF_FP_SHADOWFRAME
7897 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7898
7899/* ------------------------------ */
7900 .balign 128
7901.L_ALT_op_move_exception: /* 0x0d */
7902/* File: arm/alt_stub.S */
7903/*
7904 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7905 * any interesting requests and then jump to the real instruction
7906 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7907 */
7908 .extern MterpCheckBefore
7909 EXPORT_PC
7910 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7911 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
7912 mov r0, rSELF
7913 add r1, rFP, #OFF_FP_SHADOWFRAME
7914 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7915
7916/* ------------------------------ */
7917 .balign 128
7918.L_ALT_op_return_void: /* 0x0e */
7919/* File: arm/alt_stub.S */
7920/*
7921 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7922 * any interesting requests and then jump to the real instruction
7923 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7924 */
7925 .extern MterpCheckBefore
7926 EXPORT_PC
7927 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7928 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
7929 mov r0, rSELF
7930 add r1, rFP, #OFF_FP_SHADOWFRAME
7931 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7932
7933/* ------------------------------ */
7934 .balign 128
7935.L_ALT_op_return: /* 0x0f */
7936/* File: arm/alt_stub.S */
7937/*
7938 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7939 * any interesting requests and then jump to the real instruction
7940 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7941 */
7942 .extern MterpCheckBefore
7943 EXPORT_PC
7944 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7945 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
7946 mov r0, rSELF
7947 add r1, rFP, #OFF_FP_SHADOWFRAME
7948 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7949
7950/* ------------------------------ */
7951 .balign 128
7952.L_ALT_op_return_wide: /* 0x10 */
7953/* File: arm/alt_stub.S */
7954/*
7955 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7956 * any interesting requests and then jump to the real instruction
7957 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7958 */
7959 .extern MterpCheckBefore
7960 EXPORT_PC
7961 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7962 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
7963 mov r0, rSELF
7964 add r1, rFP, #OFF_FP_SHADOWFRAME
7965 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7966
7967/* ------------------------------ */
7968 .balign 128
7969.L_ALT_op_return_object: /* 0x11 */
7970/* File: arm/alt_stub.S */
7971/*
7972 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7973 * any interesting requests and then jump to the real instruction
7974 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7975 */
7976 .extern MterpCheckBefore
7977 EXPORT_PC
7978 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7979 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
7980 mov r0, rSELF
7981 add r1, rFP, #OFF_FP_SHADOWFRAME
7982 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7983
7984/* ------------------------------ */
7985 .balign 128
7986.L_ALT_op_const_4: /* 0x12 */
7987/* File: arm/alt_stub.S */
7988/*
7989 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7990 * any interesting requests and then jump to the real instruction
7991 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7992 */
7993 .extern MterpCheckBefore
7994 EXPORT_PC
7995 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7996 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
7997 mov r0, rSELF
7998 add r1, rFP, #OFF_FP_SHADOWFRAME
7999 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8000
8001/* ------------------------------ */
8002 .balign 128
8003.L_ALT_op_const_16: /* 0x13 */
8004/* File: arm/alt_stub.S */
8005/*
8006 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8007 * any interesting requests and then jump to the real instruction
8008 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8009 */
8010 .extern MterpCheckBefore
8011 EXPORT_PC
8012 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8013 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8014 mov r0, rSELF
8015 add r1, rFP, #OFF_FP_SHADOWFRAME
8016 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8017
8018/* ------------------------------ */
8019 .balign 128
8020.L_ALT_op_const: /* 0x14 */
8021/* File: arm/alt_stub.S */
8022/*
8023 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8024 * any interesting requests and then jump to the real instruction
8025 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8026 */
8027 .extern MterpCheckBefore
8028 EXPORT_PC
8029 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8030 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8031 mov r0, rSELF
8032 add r1, rFP, #OFF_FP_SHADOWFRAME
8033 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8034
8035/* ------------------------------ */
8036 .balign 128
8037.L_ALT_op_const_high16: /* 0x15 */
8038/* File: arm/alt_stub.S */
8039/*
8040 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8041 * any interesting requests and then jump to the real instruction
8042 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8043 */
8044 .extern MterpCheckBefore
8045 EXPORT_PC
8046 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8047 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8048 mov r0, rSELF
8049 add r1, rFP, #OFF_FP_SHADOWFRAME
8050 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8051
8052/* ------------------------------ */
8053 .balign 128
8054.L_ALT_op_const_wide_16: /* 0x16 */
8055/* File: arm/alt_stub.S */
8056/*
8057 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8058 * any interesting requests and then jump to the real instruction
8059 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8060 */
8061 .extern MterpCheckBefore
8062 EXPORT_PC
8063 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8064 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8065 mov r0, rSELF
8066 add r1, rFP, #OFF_FP_SHADOWFRAME
8067 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8068
8069/* ------------------------------ */
8070 .balign 128
8071.L_ALT_op_const_wide_32: /* 0x17 */
8072/* File: arm/alt_stub.S */
8073/*
8074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8075 * any interesting requests and then jump to the real instruction
8076 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8077 */
8078 .extern MterpCheckBefore
8079 EXPORT_PC
8080 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8081 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8082 mov r0, rSELF
8083 add r1, rFP, #OFF_FP_SHADOWFRAME
8084 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8085
8086/* ------------------------------ */
8087 .balign 128
8088.L_ALT_op_const_wide: /* 0x18 */
8089/* File: arm/alt_stub.S */
8090/*
8091 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8092 * any interesting requests and then jump to the real instruction
8093 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8094 */
8095 .extern MterpCheckBefore
8096 EXPORT_PC
8097 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8098 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8099 mov r0, rSELF
8100 add r1, rFP, #OFF_FP_SHADOWFRAME
8101 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8102
8103/* ------------------------------ */
8104 .balign 128
8105.L_ALT_op_const_wide_high16: /* 0x19 */
8106/* File: arm/alt_stub.S */
8107/*
8108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8109 * any interesting requests and then jump to the real instruction
8110 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8111 */
8112 .extern MterpCheckBefore
8113 EXPORT_PC
8114 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8115 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8116 mov r0, rSELF
8117 add r1, rFP, #OFF_FP_SHADOWFRAME
8118 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8119
8120/* ------------------------------ */
8121 .balign 128
8122.L_ALT_op_const_string: /* 0x1a */
8123/* File: arm/alt_stub.S */
8124/*
8125 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8126 * any interesting requests and then jump to the real instruction
8127 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8128 */
8129 .extern MterpCheckBefore
8130 EXPORT_PC
8131 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8132 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8133 mov r0, rSELF
8134 add r1, rFP, #OFF_FP_SHADOWFRAME
8135 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8136
8137/* ------------------------------ */
8138 .balign 128
8139.L_ALT_op_const_string_jumbo: /* 0x1b */
8140/* File: arm/alt_stub.S */
8141/*
8142 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8143 * any interesting requests and then jump to the real instruction
8144 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8145 */
8146 .extern MterpCheckBefore
8147 EXPORT_PC
8148 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8149 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8150 mov r0, rSELF
8151 add r1, rFP, #OFF_FP_SHADOWFRAME
8152 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8153
8154/* ------------------------------ */
8155 .balign 128
8156.L_ALT_op_const_class: /* 0x1c */
8157/* File: arm/alt_stub.S */
8158/*
8159 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8160 * any interesting requests and then jump to the real instruction
8161 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8162 */
8163 .extern MterpCheckBefore
8164 EXPORT_PC
8165 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8166 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8167 mov r0, rSELF
8168 add r1, rFP, #OFF_FP_SHADOWFRAME
8169 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8170
8171/* ------------------------------ */
8172 .balign 128
8173.L_ALT_op_monitor_enter: /* 0x1d */
8174/* File: arm/alt_stub.S */
8175/*
8176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8177 * any interesting requests and then jump to the real instruction
8178 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8179 */
8180 .extern MterpCheckBefore
8181 EXPORT_PC
8182 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8183 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8184 mov r0, rSELF
8185 add r1, rFP, #OFF_FP_SHADOWFRAME
8186 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8187
8188/* ------------------------------ */
8189 .balign 128
8190.L_ALT_op_monitor_exit: /* 0x1e */
8191/* File: arm/alt_stub.S */
8192/*
8193 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8194 * any interesting requests and then jump to the real instruction
8195 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8196 */
8197 .extern MterpCheckBefore
8198 EXPORT_PC
8199 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8200 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8201 mov r0, rSELF
8202 add r1, rFP, #OFF_FP_SHADOWFRAME
8203 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8204
8205/* ------------------------------ */
8206 .balign 128
8207.L_ALT_op_check_cast: /* 0x1f */
8208/* File: arm/alt_stub.S */
8209/*
8210 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8211 * any interesting requests and then jump to the real instruction
8212 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8213 */
8214 .extern MterpCheckBefore
8215 EXPORT_PC
8216 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8217 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8218 mov r0, rSELF
8219 add r1, rFP, #OFF_FP_SHADOWFRAME
8220 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8221
8222/* ------------------------------ */
8223 .balign 128
8224.L_ALT_op_instance_of: /* 0x20 */
8225/* File: arm/alt_stub.S */
8226/*
8227 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8228 * any interesting requests and then jump to the real instruction
8229 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8230 */
8231 .extern MterpCheckBefore
8232 EXPORT_PC
8233 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8234 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8235 mov r0, rSELF
8236 add r1, rFP, #OFF_FP_SHADOWFRAME
8237 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8238
8239/* ------------------------------ */
8240 .balign 128
8241.L_ALT_op_array_length: /* 0x21 */
8242/* File: arm/alt_stub.S */
8243/*
8244 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8245 * any interesting requests and then jump to the real instruction
8246 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8247 */
8248 .extern MterpCheckBefore
8249 EXPORT_PC
8250 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8251 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8252 mov r0, rSELF
8253 add r1, rFP, #OFF_FP_SHADOWFRAME
8254 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8255
8256/* ------------------------------ */
8257 .balign 128
8258.L_ALT_op_new_instance: /* 0x22 */
8259/* File: arm/alt_stub.S */
8260/*
8261 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8262 * any interesting requests and then jump to the real instruction
8263 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8264 */
8265 .extern MterpCheckBefore
8266 EXPORT_PC
8267 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8268 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8269 mov r0, rSELF
8270 add r1, rFP, #OFF_FP_SHADOWFRAME
8271 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8272
8273/* ------------------------------ */
8274 .balign 128
8275.L_ALT_op_new_array: /* 0x23 */
8276/* File: arm/alt_stub.S */
8277/*
8278 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8279 * any interesting requests and then jump to the real instruction
8280 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8281 */
8282 .extern MterpCheckBefore
8283 EXPORT_PC
8284 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8285 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8286 mov r0, rSELF
8287 add r1, rFP, #OFF_FP_SHADOWFRAME
8288 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8289
8290/* ------------------------------ */
8291 .balign 128
8292.L_ALT_op_filled_new_array: /* 0x24 */
8293/* File: arm/alt_stub.S */
8294/*
8295 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8296 * any interesting requests and then jump to the real instruction
8297 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8298 */
8299 .extern MterpCheckBefore
8300 EXPORT_PC
8301 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8302 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8303 mov r0, rSELF
8304 add r1, rFP, #OFF_FP_SHADOWFRAME
8305 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8306
8307/* ------------------------------ */
8308 .balign 128
8309.L_ALT_op_filled_new_array_range: /* 0x25 */
8310/* File: arm/alt_stub.S */
8311/*
8312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8313 * any interesting requests and then jump to the real instruction
8314 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8315 */
8316 .extern MterpCheckBefore
8317 EXPORT_PC
8318 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8319 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8320 mov r0, rSELF
8321 add r1, rFP, #OFF_FP_SHADOWFRAME
8322 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8323
8324/* ------------------------------ */
8325 .balign 128
8326.L_ALT_op_fill_array_data: /* 0x26 */
8327/* File: arm/alt_stub.S */
8328/*
8329 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8330 * any interesting requests and then jump to the real instruction
8331 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8332 */
8333 .extern MterpCheckBefore
8334 EXPORT_PC
8335 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8336 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8337 mov r0, rSELF
8338 add r1, rFP, #OFF_FP_SHADOWFRAME
8339 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8340
8341/* ------------------------------ */
8342 .balign 128
8343.L_ALT_op_throw: /* 0x27 */
8344/* File: arm/alt_stub.S */
8345/*
8346 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8347 * any interesting requests and then jump to the real instruction
8348 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8349 */
8350 .extern MterpCheckBefore
8351 EXPORT_PC
8352 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8353 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8354 mov r0, rSELF
8355 add r1, rFP, #OFF_FP_SHADOWFRAME
8356 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8357
8358/* ------------------------------ */
8359 .balign 128
8360.L_ALT_op_goto: /* 0x28 */
8361/* File: arm/alt_stub.S */
8362/*
8363 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8364 * any interesting requests and then jump to the real instruction
8365 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8366 */
8367 .extern MterpCheckBefore
8368 EXPORT_PC
8369 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8370 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8371 mov r0, rSELF
8372 add r1, rFP, #OFF_FP_SHADOWFRAME
8373 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8374
8375/* ------------------------------ */
8376 .balign 128
8377.L_ALT_op_goto_16: /* 0x29 */
8378/* File: arm/alt_stub.S */
8379/*
8380 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8381 * any interesting requests and then jump to the real instruction
8382 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8383 */
8384 .extern MterpCheckBefore
8385 EXPORT_PC
8386 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8387 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8388 mov r0, rSELF
8389 add r1, rFP, #OFF_FP_SHADOWFRAME
8390 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8391
8392/* ------------------------------ */
8393 .balign 128
8394.L_ALT_op_goto_32: /* 0x2a */
8395/* File: arm/alt_stub.S */
8396/*
8397 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8398 * any interesting requests and then jump to the real instruction
8399 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8400 */
8401 .extern MterpCheckBefore
8402 EXPORT_PC
8403 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8404 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8405 mov r0, rSELF
8406 add r1, rFP, #OFF_FP_SHADOWFRAME
8407 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8408
8409/* ------------------------------ */
8410 .balign 128
8411.L_ALT_op_packed_switch: /* 0x2b */
8412/* File: arm/alt_stub.S */
8413/*
8414 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8415 * any interesting requests and then jump to the real instruction
8416 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8417 */
8418 .extern MterpCheckBefore
8419 EXPORT_PC
8420 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8421 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8422 mov r0, rSELF
8423 add r1, rFP, #OFF_FP_SHADOWFRAME
8424 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8425
8426/* ------------------------------ */
8427 .balign 128
8428.L_ALT_op_sparse_switch: /* 0x2c */
8429/* File: arm/alt_stub.S */
8430/*
8431 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8432 * any interesting requests and then jump to the real instruction
8433 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8434 */
8435 .extern MterpCheckBefore
8436 EXPORT_PC
8437 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8438 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8439 mov r0, rSELF
8440 add r1, rFP, #OFF_FP_SHADOWFRAME
8441 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8442
8443/* ------------------------------ */
8444 .balign 128
8445.L_ALT_op_cmpl_float: /* 0x2d */
8446/* File: arm/alt_stub.S */
8447/*
8448 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8449 * any interesting requests and then jump to the real instruction
8450 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8451 */
8452 .extern MterpCheckBefore
8453 EXPORT_PC
8454 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8455 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8456 mov r0, rSELF
8457 add r1, rFP, #OFF_FP_SHADOWFRAME
8458 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8459
8460/* ------------------------------ */
8461 .balign 128
8462.L_ALT_op_cmpg_float: /* 0x2e */
8463/* File: arm/alt_stub.S */
8464/*
8465 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8466 * any interesting requests and then jump to the real instruction
8467 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8468 */
8469 .extern MterpCheckBefore
8470 EXPORT_PC
8471 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8472 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8473 mov r0, rSELF
8474 add r1, rFP, #OFF_FP_SHADOWFRAME
8475 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8476
8477/* ------------------------------ */
8478 .balign 128
8479.L_ALT_op_cmpl_double: /* 0x2f */
8480/* File: arm/alt_stub.S */
8481/*
8482 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8483 * any interesting requests and then jump to the real instruction
8484 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8485 */
8486 .extern MterpCheckBefore
8487 EXPORT_PC
8488 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8489 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8490 mov r0, rSELF
8491 add r1, rFP, #OFF_FP_SHADOWFRAME
8492 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8493
8494/* ------------------------------ */
8495 .balign 128
8496.L_ALT_op_cmpg_double: /* 0x30 */
8497/* File: arm/alt_stub.S */
8498/*
8499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8500 * any interesting requests and then jump to the real instruction
8501 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8502 */
8503 .extern MterpCheckBefore
8504 EXPORT_PC
8505 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8506 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8507 mov r0, rSELF
8508 add r1, rFP, #OFF_FP_SHADOWFRAME
8509 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8510
8511/* ------------------------------ */
8512 .balign 128
8513.L_ALT_op_cmp_long: /* 0x31 */
8514/* File: arm/alt_stub.S */
8515/*
8516 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8517 * any interesting requests and then jump to the real instruction
8518 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8519 */
8520 .extern MterpCheckBefore
8521 EXPORT_PC
8522 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8523 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8524 mov r0, rSELF
8525 add r1, rFP, #OFF_FP_SHADOWFRAME
8526 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8527
8528/* ------------------------------ */
8529 .balign 128
8530.L_ALT_op_if_eq: /* 0x32 */
8531/* File: arm/alt_stub.S */
8532/*
8533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8534 * any interesting requests and then jump to the real instruction
8535 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8536 */
8537 .extern MterpCheckBefore
8538 EXPORT_PC
8539 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8540 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8541 mov r0, rSELF
8542 add r1, rFP, #OFF_FP_SHADOWFRAME
8543 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8544
8545/* ------------------------------ */
8546 .balign 128
8547.L_ALT_op_if_ne: /* 0x33 */
8548/* File: arm/alt_stub.S */
8549/*
8550 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8551 * any interesting requests and then jump to the real instruction
8552 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8553 */
8554 .extern MterpCheckBefore
8555 EXPORT_PC
8556 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8557 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8558 mov r0, rSELF
8559 add r1, rFP, #OFF_FP_SHADOWFRAME
8560 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8561
8562/* ------------------------------ */
8563 .balign 128
8564.L_ALT_op_if_lt: /* 0x34 */
8565/* File: arm/alt_stub.S */
8566/*
8567 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8568 * any interesting requests and then jump to the real instruction
8569 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8570 */
8571 .extern MterpCheckBefore
8572 EXPORT_PC
8573 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8574 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8575 mov r0, rSELF
8576 add r1, rFP, #OFF_FP_SHADOWFRAME
8577 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8578
8579/* ------------------------------ */
8580 .balign 128
8581.L_ALT_op_if_ge: /* 0x35 */
8582/* File: arm/alt_stub.S */
8583/*
8584 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8585 * any interesting requests and then jump to the real instruction
8586 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8587 */
8588 .extern MterpCheckBefore
8589 EXPORT_PC
8590 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8591 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8592 mov r0, rSELF
8593 add r1, rFP, #OFF_FP_SHADOWFRAME
8594 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8595
8596/* ------------------------------ */
8597 .balign 128
8598.L_ALT_op_if_gt: /* 0x36 */
8599/* File: arm/alt_stub.S */
8600/*
8601 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8602 * any interesting requests and then jump to the real instruction
8603 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8604 */
8605 .extern MterpCheckBefore
8606 EXPORT_PC
8607 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8608 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8609 mov r0, rSELF
8610 add r1, rFP, #OFF_FP_SHADOWFRAME
8611 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8612
8613/* ------------------------------ */
8614 .balign 128
8615.L_ALT_op_if_le: /* 0x37 */
8616/* File: arm/alt_stub.S */
8617/*
8618 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8619 * any interesting requests and then jump to the real instruction
8620 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8621 */
8622 .extern MterpCheckBefore
8623 EXPORT_PC
8624 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8625 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8626 mov r0, rSELF
8627 add r1, rFP, #OFF_FP_SHADOWFRAME
8628 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8629
8630/* ------------------------------ */
8631 .balign 128
8632.L_ALT_op_if_eqz: /* 0x38 */
8633/* File: arm/alt_stub.S */
8634/*
8635 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8636 * any interesting requests and then jump to the real instruction
8637 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8638 */
8639 .extern MterpCheckBefore
8640 EXPORT_PC
8641 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8642 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8643 mov r0, rSELF
8644 add r1, rFP, #OFF_FP_SHADOWFRAME
8645 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8646
8647/* ------------------------------ */
8648 .balign 128
8649.L_ALT_op_if_nez: /* 0x39 */
8650/* File: arm/alt_stub.S */
8651/*
8652 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8653 * any interesting requests and then jump to the real instruction
8654 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8655 */
8656 .extern MterpCheckBefore
8657 EXPORT_PC
8658 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8659 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8660 mov r0, rSELF
8661 add r1, rFP, #OFF_FP_SHADOWFRAME
8662 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8663
8664/* ------------------------------ */
8665 .balign 128
8666.L_ALT_op_if_ltz: /* 0x3a */
8667/* File: arm/alt_stub.S */
8668/*
8669 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8670 * any interesting requests and then jump to the real instruction
8671 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8672 */
8673 .extern MterpCheckBefore
8674 EXPORT_PC
8675 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8676 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8677 mov r0, rSELF
8678 add r1, rFP, #OFF_FP_SHADOWFRAME
8679 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8680
8681/* ------------------------------ */
8682 .balign 128
8683.L_ALT_op_if_gez: /* 0x3b */
8684/* File: arm/alt_stub.S */
8685/*
8686 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8687 * any interesting requests and then jump to the real instruction
8688 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8689 */
8690 .extern MterpCheckBefore
8691 EXPORT_PC
8692 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8693 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8694 mov r0, rSELF
8695 add r1, rFP, #OFF_FP_SHADOWFRAME
8696 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8697
8698/* ------------------------------ */
8699 .balign 128
8700.L_ALT_op_if_gtz: /* 0x3c */
8701/* File: arm/alt_stub.S */
8702/*
8703 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8704 * any interesting requests and then jump to the real instruction
8705 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8706 */
8707 .extern MterpCheckBefore
8708 EXPORT_PC
8709 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8710 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8711 mov r0, rSELF
8712 add r1, rFP, #OFF_FP_SHADOWFRAME
8713 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8714
8715/* ------------------------------ */
8716 .balign 128
8717.L_ALT_op_if_lez: /* 0x3d */
8718/* File: arm/alt_stub.S */
8719/*
8720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8721 * any interesting requests and then jump to the real instruction
8722 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8723 */
8724 .extern MterpCheckBefore
8725 EXPORT_PC
8726 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8727 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8728 mov r0, rSELF
8729 add r1, rFP, #OFF_FP_SHADOWFRAME
8730 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8731
8732/* ------------------------------ */
8733 .balign 128
8734.L_ALT_op_unused_3e: /* 0x3e */
8735/* File: arm/alt_stub.S */
8736/*
8737 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8738 * any interesting requests and then jump to the real instruction
8739 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8740 */
8741 .extern MterpCheckBefore
8742 EXPORT_PC
8743 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8744 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
8745 mov r0, rSELF
8746 add r1, rFP, #OFF_FP_SHADOWFRAME
8747 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8748
8749/* ------------------------------ */
8750 .balign 128
8751.L_ALT_op_unused_3f: /* 0x3f */
8752/* File: arm/alt_stub.S */
8753/*
8754 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8755 * any interesting requests and then jump to the real instruction
8756 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8757 */
8758 .extern MterpCheckBefore
8759 EXPORT_PC
8760 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8761 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
8762 mov r0, rSELF
8763 add r1, rFP, #OFF_FP_SHADOWFRAME
8764 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8765
8766/* ------------------------------ */
8767 .balign 128
8768.L_ALT_op_unused_40: /* 0x40 */
8769/* File: arm/alt_stub.S */
8770/*
8771 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8772 * any interesting requests and then jump to the real instruction
8773 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8774 */
8775 .extern MterpCheckBefore
8776 EXPORT_PC
8777 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8778 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
8779 mov r0, rSELF
8780 add r1, rFP, #OFF_FP_SHADOWFRAME
8781 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8782
8783/* ------------------------------ */
8784 .balign 128
8785.L_ALT_op_unused_41: /* 0x41 */
8786/* File: arm/alt_stub.S */
8787/*
8788 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8789 * any interesting requests and then jump to the real instruction
8790 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8791 */
8792 .extern MterpCheckBefore
8793 EXPORT_PC
8794 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8795 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
8796 mov r0, rSELF
8797 add r1, rFP, #OFF_FP_SHADOWFRAME
8798 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8799
8800/* ------------------------------ */
8801 .balign 128
8802.L_ALT_op_unused_42: /* 0x42 */
8803/* File: arm/alt_stub.S */
8804/*
8805 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8806 * any interesting requests and then jump to the real instruction
8807 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8808 */
8809 .extern MterpCheckBefore
8810 EXPORT_PC
8811 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8812 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
8813 mov r0, rSELF
8814 add r1, rFP, #OFF_FP_SHADOWFRAME
8815 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8816
8817/* ------------------------------ */
8818 .balign 128
8819.L_ALT_op_unused_43: /* 0x43 */
8820/* File: arm/alt_stub.S */
8821/*
8822 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8823 * any interesting requests and then jump to the real instruction
8824 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8825 */
8826 .extern MterpCheckBefore
8827 EXPORT_PC
8828 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8829 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
8830 mov r0, rSELF
8831 add r1, rFP, #OFF_FP_SHADOWFRAME
8832 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8833
8834/* ------------------------------ */
8835 .balign 128
8836.L_ALT_op_aget: /* 0x44 */
8837/* File: arm/alt_stub.S */
8838/*
8839 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8840 * any interesting requests and then jump to the real instruction
8841 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8842 */
8843 .extern MterpCheckBefore
8844 EXPORT_PC
8845 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8846 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
8847 mov r0, rSELF
8848 add r1, rFP, #OFF_FP_SHADOWFRAME
8849 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8850
8851/* ------------------------------ */
8852 .balign 128
8853.L_ALT_op_aget_wide: /* 0x45 */
8854/* File: arm/alt_stub.S */
8855/*
8856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8857 * any interesting requests and then jump to the real instruction
8858 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8859 */
8860 .extern MterpCheckBefore
8861 EXPORT_PC
8862 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8863 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
8864 mov r0, rSELF
8865 add r1, rFP, #OFF_FP_SHADOWFRAME
8866 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8867
8868/* ------------------------------ */
8869 .balign 128
8870.L_ALT_op_aget_object: /* 0x46 */
8871/* File: arm/alt_stub.S */
8872/*
8873 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8874 * any interesting requests and then jump to the real instruction
8875 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8876 */
8877 .extern MterpCheckBefore
8878 EXPORT_PC
8879 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8880 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
8881 mov r0, rSELF
8882 add r1, rFP, #OFF_FP_SHADOWFRAME
8883 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8884
8885/* ------------------------------ */
8886 .balign 128
8887.L_ALT_op_aget_boolean: /* 0x47 */
8888/* File: arm/alt_stub.S */
8889/*
8890 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8891 * any interesting requests and then jump to the real instruction
8892 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8893 */
8894 .extern MterpCheckBefore
8895 EXPORT_PC
8896 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8897 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
8898 mov r0, rSELF
8899 add r1, rFP, #OFF_FP_SHADOWFRAME
8900 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8901
8902/* ------------------------------ */
8903 .balign 128
8904.L_ALT_op_aget_byte: /* 0x48 */
8905/* File: arm/alt_stub.S */
8906/*
8907 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8908 * any interesting requests and then jump to the real instruction
8909 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8910 */
8911 .extern MterpCheckBefore
8912 EXPORT_PC
8913 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8914 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
8915 mov r0, rSELF
8916 add r1, rFP, #OFF_FP_SHADOWFRAME
8917 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8918
8919/* ------------------------------ */
8920 .balign 128
8921.L_ALT_op_aget_char: /* 0x49 */
8922/* File: arm/alt_stub.S */
8923/*
8924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8925 * any interesting requests and then jump to the real instruction
8926 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8927 */
8928 .extern MterpCheckBefore
8929 EXPORT_PC
8930 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8931 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
8932 mov r0, rSELF
8933 add r1, rFP, #OFF_FP_SHADOWFRAME
8934 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8935
8936/* ------------------------------ */
8937 .balign 128
8938.L_ALT_op_aget_short: /* 0x4a */
8939/* File: arm/alt_stub.S */
8940/*
8941 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8942 * any interesting requests and then jump to the real instruction
8943 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8944 */
8945 .extern MterpCheckBefore
8946 EXPORT_PC
8947 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8948 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
8949 mov r0, rSELF
8950 add r1, rFP, #OFF_FP_SHADOWFRAME
8951 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8952
8953/* ------------------------------ */
8954 .balign 128
8955.L_ALT_op_aput: /* 0x4b */
8956/* File: arm/alt_stub.S */
8957/*
8958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8959 * any interesting requests and then jump to the real instruction
8960 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8961 */
8962 .extern MterpCheckBefore
8963 EXPORT_PC
8964 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8965 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
8966 mov r0, rSELF
8967 add r1, rFP, #OFF_FP_SHADOWFRAME
8968 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8969
8970/* ------------------------------ */
8971 .balign 128
8972.L_ALT_op_aput_wide: /* 0x4c */
8973/* File: arm/alt_stub.S */
8974/*
8975 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8976 * any interesting requests and then jump to the real instruction
8977 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8978 */
8979 .extern MterpCheckBefore
8980 EXPORT_PC
8981 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8982 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
8983 mov r0, rSELF
8984 add r1, rFP, #OFF_FP_SHADOWFRAME
8985 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8986
8987/* ------------------------------ */
8988 .balign 128
8989.L_ALT_op_aput_object: /* 0x4d */
8990/* File: arm/alt_stub.S */
8991/*
8992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8993 * any interesting requests and then jump to the real instruction
8994 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8995 */
8996 .extern MterpCheckBefore
8997 EXPORT_PC
8998 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8999 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
9000 mov r0, rSELF
9001 add r1, rFP, #OFF_FP_SHADOWFRAME
9002 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9003
9004/* ------------------------------ */
9005 .balign 128
9006.L_ALT_op_aput_boolean: /* 0x4e */
9007/* File: arm/alt_stub.S */
9008/*
9009 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9010 * any interesting requests and then jump to the real instruction
9011 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9012 */
9013 .extern MterpCheckBefore
9014 EXPORT_PC
9015 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9016 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9017 mov r0, rSELF
9018 add r1, rFP, #OFF_FP_SHADOWFRAME
9019 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9020
9021/* ------------------------------ */
9022 .balign 128
9023.L_ALT_op_aput_byte: /* 0x4f */
9024/* File: arm/alt_stub.S */
9025/*
9026 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9027 * any interesting requests and then jump to the real instruction
9028 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9029 */
9030 .extern MterpCheckBefore
9031 EXPORT_PC
9032 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9033 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9034 mov r0, rSELF
9035 add r1, rFP, #OFF_FP_SHADOWFRAME
9036 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9037
9038/* ------------------------------ */
9039 .balign 128
9040.L_ALT_op_aput_char: /* 0x50 */
9041/* File: arm/alt_stub.S */
9042/*
9043 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9044 * any interesting requests and then jump to the real instruction
9045 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9046 */
9047 .extern MterpCheckBefore
9048 EXPORT_PC
9049 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9050 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9051 mov r0, rSELF
9052 add r1, rFP, #OFF_FP_SHADOWFRAME
9053 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9054
9055/* ------------------------------ */
9056 .balign 128
9057.L_ALT_op_aput_short: /* 0x51 */
9058/* File: arm/alt_stub.S */
9059/*
9060 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9061 * any interesting requests and then jump to the real instruction
9062 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9063 */
9064 .extern MterpCheckBefore
9065 EXPORT_PC
9066 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9067 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9068 mov r0, rSELF
9069 add r1, rFP, #OFF_FP_SHADOWFRAME
9070 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9071
9072/* ------------------------------ */
9073 .balign 128
9074.L_ALT_op_iget: /* 0x52 */
9075/* File: arm/alt_stub.S */
9076/*
9077 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9078 * any interesting requests and then jump to the real instruction
9079 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9080 */
9081 .extern MterpCheckBefore
9082 EXPORT_PC
9083 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9084 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9085 mov r0, rSELF
9086 add r1, rFP, #OFF_FP_SHADOWFRAME
9087 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9088
9089/* ------------------------------ */
9090 .balign 128
9091.L_ALT_op_iget_wide: /* 0x53 */
9092/* File: arm/alt_stub.S */
9093/*
9094 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9095 * any interesting requests and then jump to the real instruction
9096 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9097 */
9098 .extern MterpCheckBefore
9099 EXPORT_PC
9100 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9101 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9102 mov r0, rSELF
9103 add r1, rFP, #OFF_FP_SHADOWFRAME
9104 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9105
9106/* ------------------------------ */
9107 .balign 128
9108.L_ALT_op_iget_object: /* 0x54 */
9109/* File: arm/alt_stub.S */
9110/*
9111 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9112 * any interesting requests and then jump to the real instruction
9113 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9114 */
9115 .extern MterpCheckBefore
9116 EXPORT_PC
9117 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9118 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9119 mov r0, rSELF
9120 add r1, rFP, #OFF_FP_SHADOWFRAME
9121 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9122
9123/* ------------------------------ */
9124 .balign 128
9125.L_ALT_op_iget_boolean: /* 0x55 */
9126/* File: arm/alt_stub.S */
9127/*
9128 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9129 * any interesting requests and then jump to the real instruction
9130 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9131 */
9132 .extern MterpCheckBefore
9133 EXPORT_PC
9134 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9135 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9136 mov r0, rSELF
9137 add r1, rFP, #OFF_FP_SHADOWFRAME
9138 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9139
9140/* ------------------------------ */
9141 .balign 128
9142.L_ALT_op_iget_byte: /* 0x56 */
9143/* File: arm/alt_stub.S */
9144/*
9145 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9146 * any interesting requests and then jump to the real instruction
9147 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9148 */
9149 .extern MterpCheckBefore
9150 EXPORT_PC
9151 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9152 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9153 mov r0, rSELF
9154 add r1, rFP, #OFF_FP_SHADOWFRAME
9155 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9156
9157/* ------------------------------ */
9158 .balign 128
9159.L_ALT_op_iget_char: /* 0x57 */
9160/* File: arm/alt_stub.S */
9161/*
9162 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9163 * any interesting requests and then jump to the real instruction
9164 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9165 */
9166 .extern MterpCheckBefore
9167 EXPORT_PC
9168 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9169 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9170 mov r0, rSELF
9171 add r1, rFP, #OFF_FP_SHADOWFRAME
9172 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9173
9174/* ------------------------------ */
9175 .balign 128
9176.L_ALT_op_iget_short: /* 0x58 */
9177/* File: arm/alt_stub.S */
9178/*
9179 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9180 * any interesting requests and then jump to the real instruction
9181 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9182 */
9183 .extern MterpCheckBefore
9184 EXPORT_PC
9185 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9186 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9187 mov r0, rSELF
9188 add r1, rFP, #OFF_FP_SHADOWFRAME
9189 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9190
9191/* ------------------------------ */
9192 .balign 128
9193.L_ALT_op_iput: /* 0x59 */
9194/* File: arm/alt_stub.S */
9195/*
9196 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9197 * any interesting requests and then jump to the real instruction
9198 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9199 */
9200 .extern MterpCheckBefore
9201 EXPORT_PC
9202 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9203 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9204 mov r0, rSELF
9205 add r1, rFP, #OFF_FP_SHADOWFRAME
9206 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9207
9208/* ------------------------------ */
9209 .balign 128
9210.L_ALT_op_iput_wide: /* 0x5a */
9211/* File: arm/alt_stub.S */
9212/*
9213 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9214 * any interesting requests and then jump to the real instruction
9215 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9216 */
9217 .extern MterpCheckBefore
9218 EXPORT_PC
9219 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9220 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9221 mov r0, rSELF
9222 add r1, rFP, #OFF_FP_SHADOWFRAME
9223 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9224
9225/* ------------------------------ */
9226 .balign 128
9227.L_ALT_op_iput_object: /* 0x5b */
9228/* File: arm/alt_stub.S */
9229/*
9230 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9231 * any interesting requests and then jump to the real instruction
9232 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9233 */
9234 .extern MterpCheckBefore
9235 EXPORT_PC
9236 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9237 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9238 mov r0, rSELF
9239 add r1, rFP, #OFF_FP_SHADOWFRAME
9240 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9241
9242/* ------------------------------ */
9243 .balign 128
9244.L_ALT_op_iput_boolean: /* 0x5c */
9245/* File: arm/alt_stub.S */
9246/*
9247 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9248 * any interesting requests and then jump to the real instruction
9249 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9250 */
9251 .extern MterpCheckBefore
9252 EXPORT_PC
9253 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9254 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9255 mov r0, rSELF
9256 add r1, rFP, #OFF_FP_SHADOWFRAME
9257 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9258
9259/* ------------------------------ */
9260 .balign 128
9261.L_ALT_op_iput_byte: /* 0x5d */
9262/* File: arm/alt_stub.S */
9263/*
9264 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9265 * any interesting requests and then jump to the real instruction
9266 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9267 */
9268 .extern MterpCheckBefore
9269 EXPORT_PC
9270 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9271 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9272 mov r0, rSELF
9273 add r1, rFP, #OFF_FP_SHADOWFRAME
9274 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9275
9276/* ------------------------------ */
9277 .balign 128
9278.L_ALT_op_iput_char: /* 0x5e */
9279/* File: arm/alt_stub.S */
9280/*
9281 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9282 * any interesting requests and then jump to the real instruction
9283 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9284 */
9285 .extern MterpCheckBefore
9286 EXPORT_PC
9287 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9288 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9289 mov r0, rSELF
9290 add r1, rFP, #OFF_FP_SHADOWFRAME
9291 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9292
9293/* ------------------------------ */
9294 .balign 128
9295.L_ALT_op_iput_short: /* 0x5f */
9296/* File: arm/alt_stub.S */
9297/*
9298 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9299 * any interesting requests and then jump to the real instruction
9300 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9301 */
9302 .extern MterpCheckBefore
9303 EXPORT_PC
9304 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9305 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9306 mov r0, rSELF
9307 add r1, rFP, #OFF_FP_SHADOWFRAME
9308 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9309
9310/* ------------------------------ */
9311 .balign 128
9312.L_ALT_op_sget: /* 0x60 */
9313/* File: arm/alt_stub.S */
9314/*
9315 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9316 * any interesting requests and then jump to the real instruction
9317 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9318 */
9319 .extern MterpCheckBefore
9320 EXPORT_PC
9321 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9322 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9323 mov r0, rSELF
9324 add r1, rFP, #OFF_FP_SHADOWFRAME
9325 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9326
9327/* ------------------------------ */
9328 .balign 128
9329.L_ALT_op_sget_wide: /* 0x61 */
9330/* File: arm/alt_stub.S */
9331/*
9332 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9333 * any interesting requests and then jump to the real instruction
9334 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9335 */
9336 .extern MterpCheckBefore
9337 EXPORT_PC
9338 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9339 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9340 mov r0, rSELF
9341 add r1, rFP, #OFF_FP_SHADOWFRAME
9342 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9343
9344/* ------------------------------ */
9345 .balign 128
9346.L_ALT_op_sget_object: /* 0x62 */
9347/* File: arm/alt_stub.S */
9348/*
9349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9350 * any interesting requests and then jump to the real instruction
9351 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9352 */
9353 .extern MterpCheckBefore
9354 EXPORT_PC
9355 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9356 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9357 mov r0, rSELF
9358 add r1, rFP, #OFF_FP_SHADOWFRAME
9359 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9360
9361/* ------------------------------ */
9362 .balign 128
9363.L_ALT_op_sget_boolean: /* 0x63 */
9364/* File: arm/alt_stub.S */
9365/*
9366 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9367 * any interesting requests and then jump to the real instruction
9368 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9369 */
9370 .extern MterpCheckBefore
9371 EXPORT_PC
9372 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9373 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9374 mov r0, rSELF
9375 add r1, rFP, #OFF_FP_SHADOWFRAME
9376 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9377
9378/* ------------------------------ */
9379 .balign 128
9380.L_ALT_op_sget_byte: /* 0x64 */
9381/* File: arm/alt_stub.S */
9382/*
9383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9384 * any interesting requests and then jump to the real instruction
9385 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9386 */
9387 .extern MterpCheckBefore
9388 EXPORT_PC
9389 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9390 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9391 mov r0, rSELF
9392 add r1, rFP, #OFF_FP_SHADOWFRAME
9393 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9394
9395/* ------------------------------ */
9396 .balign 128
9397.L_ALT_op_sget_char: /* 0x65 */
9398/* File: arm/alt_stub.S */
9399/*
9400 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9401 * any interesting requests and then jump to the real instruction
9402 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9403 */
9404 .extern MterpCheckBefore
9405 EXPORT_PC
9406 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9407 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9408 mov r0, rSELF
9409 add r1, rFP, #OFF_FP_SHADOWFRAME
9410 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9411
9412/* ------------------------------ */
9413 .balign 128
9414.L_ALT_op_sget_short: /* 0x66 */
9415/* File: arm/alt_stub.S */
9416/*
9417 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9418 * any interesting requests and then jump to the real instruction
9419 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9420 */
9421 .extern MterpCheckBefore
9422 EXPORT_PC
9423 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9424 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9425 mov r0, rSELF
9426 add r1, rFP, #OFF_FP_SHADOWFRAME
9427 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9428
9429/* ------------------------------ */
9430 .balign 128
9431.L_ALT_op_sput: /* 0x67 */
9432/* File: arm/alt_stub.S */
9433/*
9434 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9435 * any interesting requests and then jump to the real instruction
9436 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9437 */
9438 .extern MterpCheckBefore
9439 EXPORT_PC
9440 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9441 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9442 mov r0, rSELF
9443 add r1, rFP, #OFF_FP_SHADOWFRAME
9444 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9445
9446/* ------------------------------ */
9447 .balign 128
9448.L_ALT_op_sput_wide: /* 0x68 */
9449/* File: arm/alt_stub.S */
9450/*
9451 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9452 * any interesting requests and then jump to the real instruction
9453 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9454 */
9455 .extern MterpCheckBefore
9456 EXPORT_PC
9457 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9458 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9459 mov r0, rSELF
9460 add r1, rFP, #OFF_FP_SHADOWFRAME
9461 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9462
9463/* ------------------------------ */
9464 .balign 128
9465.L_ALT_op_sput_object: /* 0x69 */
9466/* File: arm/alt_stub.S */
9467/*
9468 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9469 * any interesting requests and then jump to the real instruction
9470 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9471 */
9472 .extern MterpCheckBefore
9473 EXPORT_PC
9474 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9475 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9476 mov r0, rSELF
9477 add r1, rFP, #OFF_FP_SHADOWFRAME
9478 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9479
9480/* ------------------------------ */
9481 .balign 128
9482.L_ALT_op_sput_boolean: /* 0x6a */
9483/* File: arm/alt_stub.S */
9484/*
9485 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9486 * any interesting requests and then jump to the real instruction
9487 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9488 */
9489 .extern MterpCheckBefore
9490 EXPORT_PC
9491 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9492 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9493 mov r0, rSELF
9494 add r1, rFP, #OFF_FP_SHADOWFRAME
9495 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9496
9497/* ------------------------------ */
9498 .balign 128
9499.L_ALT_op_sput_byte: /* 0x6b */
9500/* File: arm/alt_stub.S */
9501/*
9502 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9503 * any interesting requests and then jump to the real instruction
9504 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9505 */
9506 .extern MterpCheckBefore
9507 EXPORT_PC
9508 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9509 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9510 mov r0, rSELF
9511 add r1, rFP, #OFF_FP_SHADOWFRAME
9512 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9513
9514/* ------------------------------ */
9515 .balign 128
9516.L_ALT_op_sput_char: /* 0x6c */
9517/* File: arm/alt_stub.S */
9518/*
9519 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9520 * any interesting requests and then jump to the real instruction
9521 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9522 */
9523 .extern MterpCheckBefore
9524 EXPORT_PC
9525 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9526 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9527 mov r0, rSELF
9528 add r1, rFP, #OFF_FP_SHADOWFRAME
9529 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9530
9531/* ------------------------------ */
9532 .balign 128
9533.L_ALT_op_sput_short: /* 0x6d */
9534/* File: arm/alt_stub.S */
9535/*
9536 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9537 * any interesting requests and then jump to the real instruction
9538 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9539 */
9540 .extern MterpCheckBefore
9541 EXPORT_PC
9542 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9543 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9544 mov r0, rSELF
9545 add r1, rFP, #OFF_FP_SHADOWFRAME
9546 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9547
9548/* ------------------------------ */
9549 .balign 128
9550.L_ALT_op_invoke_virtual: /* 0x6e */
9551/* File: arm/alt_stub.S */
9552/*
9553 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9554 * any interesting requests and then jump to the real instruction
9555 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9556 */
9557 .extern MterpCheckBefore
9558 EXPORT_PC
9559 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9560 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9561 mov r0, rSELF
9562 add r1, rFP, #OFF_FP_SHADOWFRAME
9563 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9564
9565/* ------------------------------ */
9566 .balign 128
9567.L_ALT_op_invoke_super: /* 0x6f */
9568/* File: arm/alt_stub.S */
9569/*
9570 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9571 * any interesting requests and then jump to the real instruction
9572 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9573 */
9574 .extern MterpCheckBefore
9575 EXPORT_PC
9576 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9577 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9578 mov r0, rSELF
9579 add r1, rFP, #OFF_FP_SHADOWFRAME
9580 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9581
9582/* ------------------------------ */
9583 .balign 128
9584.L_ALT_op_invoke_direct: /* 0x70 */
9585/* File: arm/alt_stub.S */
9586/*
9587 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9588 * any interesting requests and then jump to the real instruction
9589 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9590 */
9591 .extern MterpCheckBefore
9592 EXPORT_PC
9593 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9594 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9595 mov r0, rSELF
9596 add r1, rFP, #OFF_FP_SHADOWFRAME
9597 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9598
9599/* ------------------------------ */
9600 .balign 128
9601.L_ALT_op_invoke_static: /* 0x71 */
9602/* File: arm/alt_stub.S */
9603/*
9604 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9605 * any interesting requests and then jump to the real instruction
9606 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9607 */
9608 .extern MterpCheckBefore
9609 EXPORT_PC
9610 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9611 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9612 mov r0, rSELF
9613 add r1, rFP, #OFF_FP_SHADOWFRAME
9614 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9615
9616/* ------------------------------ */
9617 .balign 128
9618.L_ALT_op_invoke_interface: /* 0x72 */
9619/* File: arm/alt_stub.S */
9620/*
9621 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9622 * any interesting requests and then jump to the real instruction
9623 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9624 */
9625 .extern MterpCheckBefore
9626 EXPORT_PC
9627 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9628 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9629 mov r0, rSELF
9630 add r1, rFP, #OFF_FP_SHADOWFRAME
9631 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9632
9633/* ------------------------------ */
9634 .balign 128
9635.L_ALT_op_return_void_no_barrier: /* 0x73 */
9636/* File: arm/alt_stub.S */
9637/*
9638 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9639 * any interesting requests and then jump to the real instruction
9640 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9641 */
9642 .extern MterpCheckBefore
9643 EXPORT_PC
9644 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9645 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9646 mov r0, rSELF
9647 add r1, rFP, #OFF_FP_SHADOWFRAME
9648 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9649
9650/* ------------------------------ */
9651 .balign 128
9652.L_ALT_op_invoke_virtual_range: /* 0x74 */
9653/* File: arm/alt_stub.S */
9654/*
9655 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9656 * any interesting requests and then jump to the real instruction
9657 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9658 */
9659 .extern MterpCheckBefore
9660 EXPORT_PC
9661 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9662 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9663 mov r0, rSELF
9664 add r1, rFP, #OFF_FP_SHADOWFRAME
9665 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9666
9667/* ------------------------------ */
9668 .balign 128
9669.L_ALT_op_invoke_super_range: /* 0x75 */
9670/* File: arm/alt_stub.S */
9671/*
9672 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9673 * any interesting requests and then jump to the real instruction
9674 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9675 */
9676 .extern MterpCheckBefore
9677 EXPORT_PC
9678 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9679 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9680 mov r0, rSELF
9681 add r1, rFP, #OFF_FP_SHADOWFRAME
9682 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9683
9684/* ------------------------------ */
9685 .balign 128
9686.L_ALT_op_invoke_direct_range: /* 0x76 */
9687/* File: arm/alt_stub.S */
9688/*
9689 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9690 * any interesting requests and then jump to the real instruction
9691 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9692 */
9693 .extern MterpCheckBefore
9694 EXPORT_PC
9695 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9696 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9697 mov r0, rSELF
9698 add r1, rFP, #OFF_FP_SHADOWFRAME
9699 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9700
9701/* ------------------------------ */
9702 .balign 128
9703.L_ALT_op_invoke_static_range: /* 0x77 */
9704/* File: arm/alt_stub.S */
9705/*
9706 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9707 * any interesting requests and then jump to the real instruction
9708 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9709 */
9710 .extern MterpCheckBefore
9711 EXPORT_PC
9712 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9713 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9714 mov r0, rSELF
9715 add r1, rFP, #OFF_FP_SHADOWFRAME
9716 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9717
9718/* ------------------------------ */
9719 .balign 128
9720.L_ALT_op_invoke_interface_range: /* 0x78 */
9721/* File: arm/alt_stub.S */
9722/*
9723 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9724 * any interesting requests and then jump to the real instruction
9725 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9726 */
9727 .extern MterpCheckBefore
9728 EXPORT_PC
9729 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9730 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
9731 mov r0, rSELF
9732 add r1, rFP, #OFF_FP_SHADOWFRAME
9733 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9734
9735/* ------------------------------ */
9736 .balign 128
9737.L_ALT_op_unused_79: /* 0x79 */
9738/* File: arm/alt_stub.S */
9739/*
9740 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9741 * any interesting requests and then jump to the real instruction
9742 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9743 */
9744 .extern MterpCheckBefore
9745 EXPORT_PC
9746 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9747 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
9748 mov r0, rSELF
9749 add r1, rFP, #OFF_FP_SHADOWFRAME
9750 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9751
9752/* ------------------------------ */
9753 .balign 128
9754.L_ALT_op_unused_7a: /* 0x7a */
9755/* File: arm/alt_stub.S */
9756/*
9757 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9758 * any interesting requests and then jump to the real instruction
9759 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9760 */
9761 .extern MterpCheckBefore
9762 EXPORT_PC
9763 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9764 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
9765 mov r0, rSELF
9766 add r1, rFP, #OFF_FP_SHADOWFRAME
9767 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9768
9769/* ------------------------------ */
9770 .balign 128
9771.L_ALT_op_neg_int: /* 0x7b */
9772/* File: arm/alt_stub.S */
9773/*
9774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9775 * any interesting requests and then jump to the real instruction
9776 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9777 */
9778 .extern MterpCheckBefore
9779 EXPORT_PC
9780 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9781 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
9782 mov r0, rSELF
9783 add r1, rFP, #OFF_FP_SHADOWFRAME
9784 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9785
9786/* ------------------------------ */
9787 .balign 128
9788.L_ALT_op_not_int: /* 0x7c */
9789/* File: arm/alt_stub.S */
9790/*
9791 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9792 * any interesting requests and then jump to the real instruction
9793 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9794 */
9795 .extern MterpCheckBefore
9796 EXPORT_PC
9797 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9798 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
9799 mov r0, rSELF
9800 add r1, rFP, #OFF_FP_SHADOWFRAME
9801 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9802
9803/* ------------------------------ */
9804 .balign 128
9805.L_ALT_op_neg_long: /* 0x7d */
9806/* File: arm/alt_stub.S */
9807/*
9808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9809 * any interesting requests and then jump to the real instruction
9810 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9811 */
9812 .extern MterpCheckBefore
9813 EXPORT_PC
9814 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9815 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
9816 mov r0, rSELF
9817 add r1, rFP, #OFF_FP_SHADOWFRAME
9818 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9819
9820/* ------------------------------ */
9821 .balign 128
9822.L_ALT_op_not_long: /* 0x7e */
9823/* File: arm/alt_stub.S */
9824/*
9825 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9826 * any interesting requests and then jump to the real instruction
9827 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9828 */
9829 .extern MterpCheckBefore
9830 EXPORT_PC
9831 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9832 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
9833 mov r0, rSELF
9834 add r1, rFP, #OFF_FP_SHADOWFRAME
9835 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9836
9837/* ------------------------------ */
9838 .balign 128
9839.L_ALT_op_neg_float: /* 0x7f */
9840/* File: arm/alt_stub.S */
9841/*
9842 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9843 * any interesting requests and then jump to the real instruction
9844 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9845 */
9846 .extern MterpCheckBefore
9847 EXPORT_PC
9848 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9849 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
9850 mov r0, rSELF
9851 add r1, rFP, #OFF_FP_SHADOWFRAME
9852 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9853
9854/* ------------------------------ */
9855 .balign 128
9856.L_ALT_op_neg_double: /* 0x80 */
9857/* File: arm/alt_stub.S */
9858/*
9859 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9860 * any interesting requests and then jump to the real instruction
9861 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9862 */
9863 .extern MterpCheckBefore
9864 EXPORT_PC
9865 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9866 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
9867 mov r0, rSELF
9868 add r1, rFP, #OFF_FP_SHADOWFRAME
9869 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9870
9871/* ------------------------------ */
9872 .balign 128
9873.L_ALT_op_int_to_long: /* 0x81 */
9874/* File: arm/alt_stub.S */
9875/*
9876 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9877 * any interesting requests and then jump to the real instruction
9878 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9879 */
9880 .extern MterpCheckBefore
9881 EXPORT_PC
9882 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9883 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
9884 mov r0, rSELF
9885 add r1, rFP, #OFF_FP_SHADOWFRAME
9886 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9887
9888/* ------------------------------ */
9889 .balign 128
9890.L_ALT_op_int_to_float: /* 0x82 */
9891/* File: arm/alt_stub.S */
9892/*
9893 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9894 * any interesting requests and then jump to the real instruction
9895 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9896 */
9897 .extern MterpCheckBefore
9898 EXPORT_PC
9899 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9900 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
9901 mov r0, rSELF
9902 add r1, rFP, #OFF_FP_SHADOWFRAME
9903 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9904
9905/* ------------------------------ */
9906 .balign 128
9907.L_ALT_op_int_to_double: /* 0x83 */
9908/* File: arm/alt_stub.S */
9909/*
9910 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9911 * any interesting requests and then jump to the real instruction
9912 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9913 */
9914 .extern MterpCheckBefore
9915 EXPORT_PC
9916 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9917 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
9918 mov r0, rSELF
9919 add r1, rFP, #OFF_FP_SHADOWFRAME
9920 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9921
9922/* ------------------------------ */
9923 .balign 128
9924.L_ALT_op_long_to_int: /* 0x84 */
9925/* File: arm/alt_stub.S */
9926/*
9927 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9928 * any interesting requests and then jump to the real instruction
9929 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9930 */
9931 .extern MterpCheckBefore
9932 EXPORT_PC
9933 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9934 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
9935 mov r0, rSELF
9936 add r1, rFP, #OFF_FP_SHADOWFRAME
9937 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9938
9939/* ------------------------------ */
9940 .balign 128
9941.L_ALT_op_long_to_float: /* 0x85 */
9942/* File: arm/alt_stub.S */
9943/*
9944 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9945 * any interesting requests and then jump to the real instruction
9946 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9947 */
9948 .extern MterpCheckBefore
9949 EXPORT_PC
9950 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9951 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
9952 mov r0, rSELF
9953 add r1, rFP, #OFF_FP_SHADOWFRAME
9954 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9955
9956/* ------------------------------ */
9957 .balign 128
9958.L_ALT_op_long_to_double: /* 0x86 */
9959/* File: arm/alt_stub.S */
9960/*
9961 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9962 * any interesting requests and then jump to the real instruction
9963 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9964 */
9965 .extern MterpCheckBefore
9966 EXPORT_PC
9967 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9968 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
9969 mov r0, rSELF
9970 add r1, rFP, #OFF_FP_SHADOWFRAME
9971 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9972
9973/* ------------------------------ */
9974 .balign 128
9975.L_ALT_op_float_to_int: /* 0x87 */
9976/* File: arm/alt_stub.S */
9977/*
9978 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9979 * any interesting requests and then jump to the real instruction
9980 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9981 */
9982 .extern MterpCheckBefore
9983 EXPORT_PC
9984 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9985 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
9986 mov r0, rSELF
9987 add r1, rFP, #OFF_FP_SHADOWFRAME
9988 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9989
9990/* ------------------------------ */
9991 .balign 128
9992.L_ALT_op_float_to_long: /* 0x88 */
9993/* File: arm/alt_stub.S */
9994/*
9995 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9996 * any interesting requests and then jump to the real instruction
9997 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9998 */
9999 .extern MterpCheckBefore
10000 EXPORT_PC
10001 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10002 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10003 mov r0, rSELF
10004 add r1, rFP, #OFF_FP_SHADOWFRAME
10005 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10006
10007/* ------------------------------ */
10008 .balign 128
10009.L_ALT_op_float_to_double: /* 0x89 */
10010/* File: arm/alt_stub.S */
10011/*
10012 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10013 * any interesting requests and then jump to the real instruction
10014 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10015 */
10016 .extern MterpCheckBefore
10017 EXPORT_PC
10018 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10019 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10020 mov r0, rSELF
10021 add r1, rFP, #OFF_FP_SHADOWFRAME
10022 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10023
10024/* ------------------------------ */
10025 .balign 128
10026.L_ALT_op_double_to_int: /* 0x8a */
10027/* File: arm/alt_stub.S */
10028/*
10029 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10030 * any interesting requests and then jump to the real instruction
10031 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10032 */
10033 .extern MterpCheckBefore
10034 EXPORT_PC
10035 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10036 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10037 mov r0, rSELF
10038 add r1, rFP, #OFF_FP_SHADOWFRAME
10039 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10040
10041/* ------------------------------ */
10042 .balign 128
10043.L_ALT_op_double_to_long: /* 0x8b */
10044/* File: arm/alt_stub.S */
10045/*
10046 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10047 * any interesting requests and then jump to the real instruction
10048 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10049 */
10050 .extern MterpCheckBefore
10051 EXPORT_PC
10052 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10053 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10054 mov r0, rSELF
10055 add r1, rFP, #OFF_FP_SHADOWFRAME
10056 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10057
10058/* ------------------------------ */
10059 .balign 128
10060.L_ALT_op_double_to_float: /* 0x8c */
10061/* File: arm/alt_stub.S */
10062/*
10063 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10064 * any interesting requests and then jump to the real instruction
10065 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10066 */
10067 .extern MterpCheckBefore
10068 EXPORT_PC
10069 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10070 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10071 mov r0, rSELF
10072 add r1, rFP, #OFF_FP_SHADOWFRAME
10073 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10074
10075/* ------------------------------ */
10076 .balign 128
10077.L_ALT_op_int_to_byte: /* 0x8d */
10078/* File: arm/alt_stub.S */
10079/*
10080 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10081 * any interesting requests and then jump to the real instruction
10082 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10083 */
10084 .extern MterpCheckBefore
10085 EXPORT_PC
10086 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10087 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10088 mov r0, rSELF
10089 add r1, rFP, #OFF_FP_SHADOWFRAME
10090 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10091
10092/* ------------------------------ */
10093 .balign 128
10094.L_ALT_op_int_to_char: /* 0x8e */
10095/* File: arm/alt_stub.S */
10096/*
10097 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10098 * any interesting requests and then jump to the real instruction
10099 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10100 */
10101 .extern MterpCheckBefore
10102 EXPORT_PC
10103 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10104 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10105 mov r0, rSELF
10106 add r1, rFP, #OFF_FP_SHADOWFRAME
10107 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10108
10109/* ------------------------------ */
10110 .balign 128
10111.L_ALT_op_int_to_short: /* 0x8f */
10112/* File: arm/alt_stub.S */
10113/*
10114 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10115 * any interesting requests and then jump to the real instruction
10116 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10117 */
10118 .extern MterpCheckBefore
10119 EXPORT_PC
10120 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10121 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10122 mov r0, rSELF
10123 add r1, rFP, #OFF_FP_SHADOWFRAME
10124 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10125
10126/* ------------------------------ */
10127 .balign 128
10128.L_ALT_op_add_int: /* 0x90 */
10129/* File: arm/alt_stub.S */
10130/*
10131 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10132 * any interesting requests and then jump to the real instruction
10133 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10134 */
10135 .extern MterpCheckBefore
10136 EXPORT_PC
10137 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10138 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10139 mov r0, rSELF
10140 add r1, rFP, #OFF_FP_SHADOWFRAME
10141 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10142
10143/* ------------------------------ */
10144 .balign 128
10145.L_ALT_op_sub_int: /* 0x91 */
10146/* File: arm/alt_stub.S */
10147/*
10148 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10149 * any interesting requests and then jump to the real instruction
10150 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10151 */
10152 .extern MterpCheckBefore
10153 EXPORT_PC
10154 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10155 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10156 mov r0, rSELF
10157 add r1, rFP, #OFF_FP_SHADOWFRAME
10158 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10159
10160/* ------------------------------ */
10161 .balign 128
10162.L_ALT_op_mul_int: /* 0x92 */
10163/* File: arm/alt_stub.S */
10164/*
10165 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10166 * any interesting requests and then jump to the real instruction
10167 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10168 */
10169 .extern MterpCheckBefore
10170 EXPORT_PC
10171 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10172 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10173 mov r0, rSELF
10174 add r1, rFP, #OFF_FP_SHADOWFRAME
10175 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10176
10177/* ------------------------------ */
10178 .balign 128
10179.L_ALT_op_div_int: /* 0x93 */
10180/* File: arm/alt_stub.S */
10181/*
10182 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10183 * any interesting requests and then jump to the real instruction
10184 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10185 */
10186 .extern MterpCheckBefore
10187 EXPORT_PC
10188 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10189 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10190 mov r0, rSELF
10191 add r1, rFP, #OFF_FP_SHADOWFRAME
10192 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10193
10194/* ------------------------------ */
10195 .balign 128
10196.L_ALT_op_rem_int: /* 0x94 */
10197/* File: arm/alt_stub.S */
10198/*
10199 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10200 * any interesting requests and then jump to the real instruction
10201 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10202 */
10203 .extern MterpCheckBefore
10204 EXPORT_PC
10205 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10206 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10207 mov r0, rSELF
10208 add r1, rFP, #OFF_FP_SHADOWFRAME
10209 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10210
10211/* ------------------------------ */
10212 .balign 128
10213.L_ALT_op_and_int: /* 0x95 */
10214/* File: arm/alt_stub.S */
10215/*
10216 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10217 * any interesting requests and then jump to the real instruction
10218 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10219 */
10220 .extern MterpCheckBefore
10221 EXPORT_PC
10222 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10223 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10224 mov r0, rSELF
10225 add r1, rFP, #OFF_FP_SHADOWFRAME
10226 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10227
10228/* ------------------------------ */
10229 .balign 128
10230.L_ALT_op_or_int: /* 0x96 */
10231/* File: arm/alt_stub.S */
10232/*
10233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10234 * any interesting requests and then jump to the real instruction
10235 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10236 */
10237 .extern MterpCheckBefore
10238 EXPORT_PC
10239 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10240 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10241 mov r0, rSELF
10242 add r1, rFP, #OFF_FP_SHADOWFRAME
10243 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10244
10245/* ------------------------------ */
10246 .balign 128
10247.L_ALT_op_xor_int: /* 0x97 */
10248/* File: arm/alt_stub.S */
10249/*
10250 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10251 * any interesting requests and then jump to the real instruction
10252 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10253 */
10254 .extern MterpCheckBefore
10255 EXPORT_PC
10256 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10257 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10258 mov r0, rSELF
10259 add r1, rFP, #OFF_FP_SHADOWFRAME
10260 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10261
10262/* ------------------------------ */
10263 .balign 128
10264.L_ALT_op_shl_int: /* 0x98 */
10265/* File: arm/alt_stub.S */
10266/*
10267 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10268 * any interesting requests and then jump to the real instruction
10269 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10270 */
10271 .extern MterpCheckBefore
10272 EXPORT_PC
10273 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10274 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10275 mov r0, rSELF
10276 add r1, rFP, #OFF_FP_SHADOWFRAME
10277 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10278
10279/* ------------------------------ */
10280 .balign 128
10281.L_ALT_op_shr_int: /* 0x99 */
10282/* File: arm/alt_stub.S */
10283/*
10284 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10285 * any interesting requests and then jump to the real instruction
10286 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10287 */
10288 .extern MterpCheckBefore
10289 EXPORT_PC
10290 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10291 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10292 mov r0, rSELF
10293 add r1, rFP, #OFF_FP_SHADOWFRAME
10294 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10295
10296/* ------------------------------ */
10297 .balign 128
10298.L_ALT_op_ushr_int: /* 0x9a */
10299/* File: arm/alt_stub.S */
10300/*
10301 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10302 * any interesting requests and then jump to the real instruction
10303 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10304 */
10305 .extern MterpCheckBefore
10306 EXPORT_PC
10307 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10308 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10309 mov r0, rSELF
10310 add r1, rFP, #OFF_FP_SHADOWFRAME
10311 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10312
10313/* ------------------------------ */
10314 .balign 128
10315.L_ALT_op_add_long: /* 0x9b */
10316/* File: arm/alt_stub.S */
10317/*
10318 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10319 * any interesting requests and then jump to the real instruction
10320 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10321 */
10322 .extern MterpCheckBefore
10323 EXPORT_PC
10324 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10325 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10326 mov r0, rSELF
10327 add r1, rFP, #OFF_FP_SHADOWFRAME
10328 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10329
10330/* ------------------------------ */
10331 .balign 128
10332.L_ALT_op_sub_long: /* 0x9c */
10333/* File: arm/alt_stub.S */
10334/*
10335 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10336 * any interesting requests and then jump to the real instruction
10337 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10338 */
10339 .extern MterpCheckBefore
10340 EXPORT_PC
10341 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10342 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10343 mov r0, rSELF
10344 add r1, rFP, #OFF_FP_SHADOWFRAME
10345 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10346
10347/* ------------------------------ */
10348 .balign 128
10349.L_ALT_op_mul_long: /* 0x9d */
10350/* File: arm/alt_stub.S */
10351/*
10352 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10353 * any interesting requests and then jump to the real instruction
10354 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10355 */
10356 .extern MterpCheckBefore
10357 EXPORT_PC
10358 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10359 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10360 mov r0, rSELF
10361 add r1, rFP, #OFF_FP_SHADOWFRAME
10362 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10363
10364/* ------------------------------ */
10365 .balign 128
10366.L_ALT_op_div_long: /* 0x9e */
10367/* File: arm/alt_stub.S */
10368/*
10369 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10370 * any interesting requests and then jump to the real instruction
10371 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10372 */
10373 .extern MterpCheckBefore
10374 EXPORT_PC
10375 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10376 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10377 mov r0, rSELF
10378 add r1, rFP, #OFF_FP_SHADOWFRAME
10379 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10380
10381/* ------------------------------ */
10382 .balign 128
10383.L_ALT_op_rem_long: /* 0x9f */
10384/* File: arm/alt_stub.S */
10385/*
10386 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10387 * any interesting requests and then jump to the real instruction
10388 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10389 */
10390 .extern MterpCheckBefore
10391 EXPORT_PC
10392 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10393 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10394 mov r0, rSELF
10395 add r1, rFP, #OFF_FP_SHADOWFRAME
10396 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10397
10398/* ------------------------------ */
10399 .balign 128
10400.L_ALT_op_and_long: /* 0xa0 */
10401/* File: arm/alt_stub.S */
10402/*
10403 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10404 * any interesting requests and then jump to the real instruction
10405 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10406 */
10407 .extern MterpCheckBefore
10408 EXPORT_PC
10409 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10410 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10411 mov r0, rSELF
10412 add r1, rFP, #OFF_FP_SHADOWFRAME
10413 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10414
10415/* ------------------------------ */
10416 .balign 128
10417.L_ALT_op_or_long: /* 0xa1 */
10418/* File: arm/alt_stub.S */
10419/*
10420 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10421 * any interesting requests and then jump to the real instruction
10422 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10423 */
10424 .extern MterpCheckBefore
10425 EXPORT_PC
10426 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10427 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10428 mov r0, rSELF
10429 add r1, rFP, #OFF_FP_SHADOWFRAME
10430 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10431
10432/* ------------------------------ */
10433 .balign 128
10434.L_ALT_op_xor_long: /* 0xa2 */
10435/* File: arm/alt_stub.S */
10436/*
10437 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10438 * any interesting requests and then jump to the real instruction
10439 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10440 */
10441 .extern MterpCheckBefore
10442 EXPORT_PC
10443 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10444 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10445 mov r0, rSELF
10446 add r1, rFP, #OFF_FP_SHADOWFRAME
10447 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10448
10449/* ------------------------------ */
10450 .balign 128
10451.L_ALT_op_shl_long: /* 0xa3 */
10452/* File: arm/alt_stub.S */
10453/*
10454 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10455 * any interesting requests and then jump to the real instruction
10456 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10457 */
10458 .extern MterpCheckBefore
10459 EXPORT_PC
10460 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10461 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10462 mov r0, rSELF
10463 add r1, rFP, #OFF_FP_SHADOWFRAME
10464 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10465
10466/* ------------------------------ */
10467 .balign 128
10468.L_ALT_op_shr_long: /* 0xa4 */
10469/* File: arm/alt_stub.S */
10470/*
10471 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10472 * any interesting requests and then jump to the real instruction
10473 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10474 */
10475 .extern MterpCheckBefore
10476 EXPORT_PC
10477 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10478 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10479 mov r0, rSELF
10480 add r1, rFP, #OFF_FP_SHADOWFRAME
10481 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10482
10483/* ------------------------------ */
10484 .balign 128
10485.L_ALT_op_ushr_long: /* 0xa5 */
10486/* File: arm/alt_stub.S */
10487/*
10488 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10489 * any interesting requests and then jump to the real instruction
10490 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10491 */
10492 .extern MterpCheckBefore
10493 EXPORT_PC
10494 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10495 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10496 mov r0, rSELF
10497 add r1, rFP, #OFF_FP_SHADOWFRAME
10498 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10499
10500/* ------------------------------ */
10501 .balign 128
10502.L_ALT_op_add_float: /* 0xa6 */
10503/* File: arm/alt_stub.S */
10504/*
10505 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10506 * any interesting requests and then jump to the real instruction
10507 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10508 */
10509 .extern MterpCheckBefore
10510 EXPORT_PC
10511 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10512 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10513 mov r0, rSELF
10514 add r1, rFP, #OFF_FP_SHADOWFRAME
10515 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10516
10517/* ------------------------------ */
10518 .balign 128
10519.L_ALT_op_sub_float: /* 0xa7 */
10520/* File: arm/alt_stub.S */
10521/*
10522 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10523 * any interesting requests and then jump to the real instruction
10524 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10525 */
10526 .extern MterpCheckBefore
10527 EXPORT_PC
10528 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10529 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10530 mov r0, rSELF
10531 add r1, rFP, #OFF_FP_SHADOWFRAME
10532 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10533
10534/* ------------------------------ */
10535 .balign 128
10536.L_ALT_op_mul_float: /* 0xa8 */
10537/* File: arm/alt_stub.S */
10538/*
10539 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10540 * any interesting requests and then jump to the real instruction
10541 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10542 */
10543 .extern MterpCheckBefore
10544 EXPORT_PC
10545 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10546 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10547 mov r0, rSELF
10548 add r1, rFP, #OFF_FP_SHADOWFRAME
10549 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10550
10551/* ------------------------------ */
10552 .balign 128
10553.L_ALT_op_div_float: /* 0xa9 */
10554/* File: arm/alt_stub.S */
10555/*
10556 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10557 * any interesting requests and then jump to the real instruction
10558 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10559 */
10560 .extern MterpCheckBefore
10561 EXPORT_PC
10562 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10563 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10564 mov r0, rSELF
10565 add r1, rFP, #OFF_FP_SHADOWFRAME
10566 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10567
10568/* ------------------------------ */
10569 .balign 128
10570.L_ALT_op_rem_float: /* 0xaa */
10571/* File: arm/alt_stub.S */
10572/*
10573 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10574 * any interesting requests and then jump to the real instruction
10575 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10576 */
10577 .extern MterpCheckBefore
10578 EXPORT_PC
10579 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10580 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10581 mov r0, rSELF
10582 add r1, rFP, #OFF_FP_SHADOWFRAME
10583 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10584
10585/* ------------------------------ */
10586 .balign 128
10587.L_ALT_op_add_double: /* 0xab */
10588/* File: arm/alt_stub.S */
10589/*
10590 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10591 * any interesting requests and then jump to the real instruction
10592 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10593 */
10594 .extern MterpCheckBefore
10595 EXPORT_PC
10596 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10597 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10598 mov r0, rSELF
10599 add r1, rFP, #OFF_FP_SHADOWFRAME
10600 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10601
10602/* ------------------------------ */
10603 .balign 128
10604.L_ALT_op_sub_double: /* 0xac */
10605/* File: arm/alt_stub.S */
10606/*
10607 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10608 * any interesting requests and then jump to the real instruction
10609 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10610 */
10611 .extern MterpCheckBefore
10612 EXPORT_PC
10613 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10614 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10615 mov r0, rSELF
10616 add r1, rFP, #OFF_FP_SHADOWFRAME
10617 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10618
10619/* ------------------------------ */
10620 .balign 128
10621.L_ALT_op_mul_double: /* 0xad */
10622/* File: arm/alt_stub.S */
10623/*
10624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10625 * any interesting requests and then jump to the real instruction
10626 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10627 */
10628 .extern MterpCheckBefore
10629 EXPORT_PC
10630 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10631 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10632 mov r0, rSELF
10633 add r1, rFP, #OFF_FP_SHADOWFRAME
10634 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10635
10636/* ------------------------------ */
10637 .balign 128
10638.L_ALT_op_div_double: /* 0xae */
10639/* File: arm/alt_stub.S */
10640/*
10641 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10642 * any interesting requests and then jump to the real instruction
10643 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10644 */
10645 .extern MterpCheckBefore
10646 EXPORT_PC
10647 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10648 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10649 mov r0, rSELF
10650 add r1, rFP, #OFF_FP_SHADOWFRAME
10651 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10652
10653/* ------------------------------ */
10654 .balign 128
10655.L_ALT_op_rem_double: /* 0xaf */
10656/* File: arm/alt_stub.S */
10657/*
10658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10659 * any interesting requests and then jump to the real instruction
10660 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10661 */
10662 .extern MterpCheckBefore
10663 EXPORT_PC
10664 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10665 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10666 mov r0, rSELF
10667 add r1, rFP, #OFF_FP_SHADOWFRAME
10668 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10669
10670/* ------------------------------ */
10671 .balign 128
10672.L_ALT_op_add_int_2addr: /* 0xb0 */
10673/* File: arm/alt_stub.S */
10674/*
10675 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10676 * any interesting requests and then jump to the real instruction
10677 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10678 */
10679 .extern MterpCheckBefore
10680 EXPORT_PC
10681 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10682 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10683 mov r0, rSELF
10684 add r1, rFP, #OFF_FP_SHADOWFRAME
10685 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10686
10687/* ------------------------------ */
10688 .balign 128
10689.L_ALT_op_sub_int_2addr: /* 0xb1 */
10690/* File: arm/alt_stub.S */
10691/*
10692 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10693 * any interesting requests and then jump to the real instruction
10694 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10695 */
10696 .extern MterpCheckBefore
10697 EXPORT_PC
10698 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10699 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10700 mov r0, rSELF
10701 add r1, rFP, #OFF_FP_SHADOWFRAME
10702 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10703
10704/* ------------------------------ */
10705 .balign 128
10706.L_ALT_op_mul_int_2addr: /* 0xb2 */
10707/* File: arm/alt_stub.S */
10708/*
10709 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10710 * any interesting requests and then jump to the real instruction
10711 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10712 */
10713 .extern MterpCheckBefore
10714 EXPORT_PC
10715 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10716 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10717 mov r0, rSELF
10718 add r1, rFP, #OFF_FP_SHADOWFRAME
10719 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10720
10721/* ------------------------------ */
10722 .balign 128
10723.L_ALT_op_div_int_2addr: /* 0xb3 */
10724/* File: arm/alt_stub.S */
10725/*
10726 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10727 * any interesting requests and then jump to the real instruction
10728 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10729 */
10730 .extern MterpCheckBefore
10731 EXPORT_PC
10732 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10733 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
10734 mov r0, rSELF
10735 add r1, rFP, #OFF_FP_SHADOWFRAME
10736 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10737
10738/* ------------------------------ */
10739 .balign 128
10740.L_ALT_op_rem_int_2addr: /* 0xb4 */
10741/* File: arm/alt_stub.S */
10742/*
10743 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10744 * any interesting requests and then jump to the real instruction
10745 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10746 */
10747 .extern MterpCheckBefore
10748 EXPORT_PC
10749 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10750 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
10751 mov r0, rSELF
10752 add r1, rFP, #OFF_FP_SHADOWFRAME
10753 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10754
10755/* ------------------------------ */
10756 .balign 128
10757.L_ALT_op_and_int_2addr: /* 0xb5 */
10758/* File: arm/alt_stub.S */
10759/*
10760 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10761 * any interesting requests and then jump to the real instruction
10762 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10763 */
10764 .extern MterpCheckBefore
10765 EXPORT_PC
10766 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10767 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
10768 mov r0, rSELF
10769 add r1, rFP, #OFF_FP_SHADOWFRAME
10770 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10771
10772/* ------------------------------ */
10773 .balign 128
10774.L_ALT_op_or_int_2addr: /* 0xb6 */
10775/* File: arm/alt_stub.S */
10776/*
10777 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10778 * any interesting requests and then jump to the real instruction
10779 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10780 */
10781 .extern MterpCheckBefore
10782 EXPORT_PC
10783 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10784 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
10785 mov r0, rSELF
10786 add r1, rFP, #OFF_FP_SHADOWFRAME
10787 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10788
10789/* ------------------------------ */
10790 .balign 128
10791.L_ALT_op_xor_int_2addr: /* 0xb7 */
10792/* File: arm/alt_stub.S */
10793/*
10794 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10795 * any interesting requests and then jump to the real instruction
10796 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10797 */
10798 .extern MterpCheckBefore
10799 EXPORT_PC
10800 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10801 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
10802 mov r0, rSELF
10803 add r1, rFP, #OFF_FP_SHADOWFRAME
10804 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10805
10806/* ------------------------------ */
10807 .balign 128
10808.L_ALT_op_shl_int_2addr: /* 0xb8 */
10809/* File: arm/alt_stub.S */
10810/*
10811 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10812 * any interesting requests and then jump to the real instruction
10813 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10814 */
10815 .extern MterpCheckBefore
10816 EXPORT_PC
10817 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10818 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
10819 mov r0, rSELF
10820 add r1, rFP, #OFF_FP_SHADOWFRAME
10821 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10822
10823/* ------------------------------ */
10824 .balign 128
10825.L_ALT_op_shr_int_2addr: /* 0xb9 */
10826/* File: arm/alt_stub.S */
10827/*
10828 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10829 * any interesting requests and then jump to the real instruction
10830 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10831 */
10832 .extern MterpCheckBefore
10833 EXPORT_PC
10834 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10835 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
10836 mov r0, rSELF
10837 add r1, rFP, #OFF_FP_SHADOWFRAME
10838 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10839
10840/* ------------------------------ */
10841 .balign 128
10842.L_ALT_op_ushr_int_2addr: /* 0xba */
10843/* File: arm/alt_stub.S */
10844/*
10845 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10846 * any interesting requests and then jump to the real instruction
10847 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10848 */
10849 .extern MterpCheckBefore
10850 EXPORT_PC
10851 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10852 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
10853 mov r0, rSELF
10854 add r1, rFP, #OFF_FP_SHADOWFRAME
10855 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10856
10857/* ------------------------------ */
10858 .balign 128
10859.L_ALT_op_add_long_2addr: /* 0xbb */
10860/* File: arm/alt_stub.S */
10861/*
10862 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10863 * any interesting requests and then jump to the real instruction
10864 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10865 */
10866 .extern MterpCheckBefore
10867 EXPORT_PC
10868 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10869 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
10870 mov r0, rSELF
10871 add r1, rFP, #OFF_FP_SHADOWFRAME
10872 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10873
10874/* ------------------------------ */
10875 .balign 128
10876.L_ALT_op_sub_long_2addr: /* 0xbc */
10877/* File: arm/alt_stub.S */
10878/*
10879 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10880 * any interesting requests and then jump to the real instruction
10881 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10882 */
10883 .extern MterpCheckBefore
10884 EXPORT_PC
10885 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10886 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
10887 mov r0, rSELF
10888 add r1, rFP, #OFF_FP_SHADOWFRAME
10889 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10890
10891/* ------------------------------ */
10892 .balign 128
10893.L_ALT_op_mul_long_2addr: /* 0xbd */
10894/* File: arm/alt_stub.S */
10895/*
10896 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10897 * any interesting requests and then jump to the real instruction
10898 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10899 */
10900 .extern MterpCheckBefore
10901 EXPORT_PC
10902 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10903 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
10904 mov r0, rSELF
10905 add r1, rFP, #OFF_FP_SHADOWFRAME
10906 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10907
10908/* ------------------------------ */
10909 .balign 128
10910.L_ALT_op_div_long_2addr: /* 0xbe */
10911/* File: arm/alt_stub.S */
10912/*
10913 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10914 * any interesting requests and then jump to the real instruction
10915 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10916 */
10917 .extern MterpCheckBefore
10918 EXPORT_PC
10919 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10920 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
10921 mov r0, rSELF
10922 add r1, rFP, #OFF_FP_SHADOWFRAME
10923 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10924
10925/* ------------------------------ */
10926 .balign 128
10927.L_ALT_op_rem_long_2addr: /* 0xbf */
10928/* File: arm/alt_stub.S */
10929/*
10930 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10931 * any interesting requests and then jump to the real instruction
10932 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10933 */
10934 .extern MterpCheckBefore
10935 EXPORT_PC
10936 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10937 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
10938 mov r0, rSELF
10939 add r1, rFP, #OFF_FP_SHADOWFRAME
10940 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10941
10942/* ------------------------------ */
10943 .balign 128
10944.L_ALT_op_and_long_2addr: /* 0xc0 */
10945/* File: arm/alt_stub.S */
10946/*
10947 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10948 * any interesting requests and then jump to the real instruction
10949 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10950 */
10951 .extern MterpCheckBefore
10952 EXPORT_PC
10953 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10954 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
10955 mov r0, rSELF
10956 add r1, rFP, #OFF_FP_SHADOWFRAME
10957 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10958
10959/* ------------------------------ */
10960 .balign 128
10961.L_ALT_op_or_long_2addr: /* 0xc1 */
10962/* File: arm/alt_stub.S */
10963/*
10964 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10965 * any interesting requests and then jump to the real instruction
10966 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10967 */
10968 .extern MterpCheckBefore
10969 EXPORT_PC
10970 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10971 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
10972 mov r0, rSELF
10973 add r1, rFP, #OFF_FP_SHADOWFRAME
10974 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10975
10976/* ------------------------------ */
10977 .balign 128
10978.L_ALT_op_xor_long_2addr: /* 0xc2 */
10979/* File: arm/alt_stub.S */
10980/*
10981 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10982 * any interesting requests and then jump to the real instruction
10983 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10984 */
10985 .extern MterpCheckBefore
10986 EXPORT_PC
10987 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10988 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
10989 mov r0, rSELF
10990 add r1, rFP, #OFF_FP_SHADOWFRAME
10991 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10992
10993/* ------------------------------ */
10994 .balign 128
10995.L_ALT_op_shl_long_2addr: /* 0xc3 */
10996/* File: arm/alt_stub.S */
10997/*
10998 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10999 * any interesting requests and then jump to the real instruction
11000 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11001 */
11002 .extern MterpCheckBefore
11003 EXPORT_PC
11004 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11005 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11006 mov r0, rSELF
11007 add r1, rFP, #OFF_FP_SHADOWFRAME
11008 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11009
11010/* ------------------------------ */
11011 .balign 128
11012.L_ALT_op_shr_long_2addr: /* 0xc4 */
11013/* File: arm/alt_stub.S */
11014/*
11015 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11016 * any interesting requests and then jump to the real instruction
11017 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11018 */
11019 .extern MterpCheckBefore
11020 EXPORT_PC
11021 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11022 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11023 mov r0, rSELF
11024 add r1, rFP, #OFF_FP_SHADOWFRAME
11025 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11026
11027/* ------------------------------ */
11028 .balign 128
11029.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11030/* File: arm/alt_stub.S */
11031/*
11032 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11033 * any interesting requests and then jump to the real instruction
11034 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11035 */
11036 .extern MterpCheckBefore
11037 EXPORT_PC
11038 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11039 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11040 mov r0, rSELF
11041 add r1, rFP, #OFF_FP_SHADOWFRAME
11042 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11043
11044/* ------------------------------ */
11045 .balign 128
11046.L_ALT_op_add_float_2addr: /* 0xc6 */
11047/* File: arm/alt_stub.S */
11048/*
11049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11050 * any interesting requests and then jump to the real instruction
11051 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11052 */
11053 .extern MterpCheckBefore
11054 EXPORT_PC
11055 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11056 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11057 mov r0, rSELF
11058 add r1, rFP, #OFF_FP_SHADOWFRAME
11059 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11060
11061/* ------------------------------ */
11062 .balign 128
11063.L_ALT_op_sub_float_2addr: /* 0xc7 */
11064/* File: arm/alt_stub.S */
11065/*
11066 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11067 * any interesting requests and then jump to the real instruction
11068 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11069 */
11070 .extern MterpCheckBefore
11071 EXPORT_PC
11072 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11073 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11074 mov r0, rSELF
11075 add r1, rFP, #OFF_FP_SHADOWFRAME
11076 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11077
11078/* ------------------------------ */
11079 .balign 128
11080.L_ALT_op_mul_float_2addr: /* 0xc8 */
11081/* File: arm/alt_stub.S */
11082/*
11083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11084 * any interesting requests and then jump to the real instruction
11085 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11086 */
11087 .extern MterpCheckBefore
11088 EXPORT_PC
11089 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11090 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11091 mov r0, rSELF
11092 add r1, rFP, #OFF_FP_SHADOWFRAME
11093 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11094
11095/* ------------------------------ */
11096 .balign 128
11097.L_ALT_op_div_float_2addr: /* 0xc9 */
11098/* File: arm/alt_stub.S */
11099/*
11100 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11101 * any interesting requests and then jump to the real instruction
11102 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11103 */
11104 .extern MterpCheckBefore
11105 EXPORT_PC
11106 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11107 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11108 mov r0, rSELF
11109 add r1, rFP, #OFF_FP_SHADOWFRAME
11110 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11111
11112/* ------------------------------ */
11113 .balign 128
11114.L_ALT_op_rem_float_2addr: /* 0xca */
11115/* File: arm/alt_stub.S */
11116/*
11117 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11118 * any interesting requests and then jump to the real instruction
11119 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11120 */
11121 .extern MterpCheckBefore
11122 EXPORT_PC
11123 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11124 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11125 mov r0, rSELF
11126 add r1, rFP, #OFF_FP_SHADOWFRAME
11127 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11128
11129/* ------------------------------ */
11130 .balign 128
11131.L_ALT_op_add_double_2addr: /* 0xcb */
11132/* File: arm/alt_stub.S */
11133/*
11134 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11135 * any interesting requests and then jump to the real instruction
11136 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11137 */
11138 .extern MterpCheckBefore
11139 EXPORT_PC
11140 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11141 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11142 mov r0, rSELF
11143 add r1, rFP, #OFF_FP_SHADOWFRAME
11144 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11145
11146/* ------------------------------ */
11147 .balign 128
11148.L_ALT_op_sub_double_2addr: /* 0xcc */
11149/* File: arm/alt_stub.S */
11150/*
11151 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11152 * any interesting requests and then jump to the real instruction
11153 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11154 */
11155 .extern MterpCheckBefore
11156 EXPORT_PC
11157 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11158 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11159 mov r0, rSELF
11160 add r1, rFP, #OFF_FP_SHADOWFRAME
11161 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11162
11163/* ------------------------------ */
11164 .balign 128
11165.L_ALT_op_mul_double_2addr: /* 0xcd */
11166/* File: arm/alt_stub.S */
11167/*
11168 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11169 * any interesting requests and then jump to the real instruction
11170 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11171 */
11172 .extern MterpCheckBefore
11173 EXPORT_PC
11174 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11175 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11176 mov r0, rSELF
11177 add r1, rFP, #OFF_FP_SHADOWFRAME
11178 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11179
11180/* ------------------------------ */
11181 .balign 128
11182.L_ALT_op_div_double_2addr: /* 0xce */
11183/* File: arm/alt_stub.S */
11184/*
11185 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11186 * any interesting requests and then jump to the real instruction
11187 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11188 */
11189 .extern MterpCheckBefore
11190 EXPORT_PC
11191 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11192 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11193 mov r0, rSELF
11194 add r1, rFP, #OFF_FP_SHADOWFRAME
11195 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11196
11197/* ------------------------------ */
11198 .balign 128
11199.L_ALT_op_rem_double_2addr: /* 0xcf */
11200/* File: arm/alt_stub.S */
11201/*
11202 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11203 * any interesting requests and then jump to the real instruction
11204 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11205 */
11206 .extern MterpCheckBefore
11207 EXPORT_PC
11208 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11209 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11210 mov r0, rSELF
11211 add r1, rFP, #OFF_FP_SHADOWFRAME
11212 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11213
11214/* ------------------------------ */
11215 .balign 128
11216.L_ALT_op_add_int_lit16: /* 0xd0 */
11217/* File: arm/alt_stub.S */
11218/*
11219 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11220 * any interesting requests and then jump to the real instruction
11221 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11222 */
11223 .extern MterpCheckBefore
11224 EXPORT_PC
11225 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11226 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11227 mov r0, rSELF
11228 add r1, rFP, #OFF_FP_SHADOWFRAME
11229 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11230
11231/* ------------------------------ */
11232 .balign 128
11233.L_ALT_op_rsub_int: /* 0xd1 */
11234/* File: arm/alt_stub.S */
11235/*
11236 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11237 * any interesting requests and then jump to the real instruction
11238 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11239 */
11240 .extern MterpCheckBefore
11241 EXPORT_PC
11242 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11243 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11244 mov r0, rSELF
11245 add r1, rFP, #OFF_FP_SHADOWFRAME
11246 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11247
11248/* ------------------------------ */
11249 .balign 128
11250.L_ALT_op_mul_int_lit16: /* 0xd2 */
11251/* File: arm/alt_stub.S */
11252/*
11253 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11254 * any interesting requests and then jump to the real instruction
11255 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11256 */
11257 .extern MterpCheckBefore
11258 EXPORT_PC
11259 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11260 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11261 mov r0, rSELF
11262 add r1, rFP, #OFF_FP_SHADOWFRAME
11263 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11264
11265/* ------------------------------ */
11266 .balign 128
11267.L_ALT_op_div_int_lit16: /* 0xd3 */
11268/* File: arm/alt_stub.S */
11269/*
11270 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11271 * any interesting requests and then jump to the real instruction
11272 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11273 */
11274 .extern MterpCheckBefore
11275 EXPORT_PC
11276 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11277 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11278 mov r0, rSELF
11279 add r1, rFP, #OFF_FP_SHADOWFRAME
11280 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11281
11282/* ------------------------------ */
11283 .balign 128
11284.L_ALT_op_rem_int_lit16: /* 0xd4 */
11285/* File: arm/alt_stub.S */
11286/*
11287 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11288 * any interesting requests and then jump to the real instruction
11289 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11290 */
11291 .extern MterpCheckBefore
11292 EXPORT_PC
11293 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11294 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11295 mov r0, rSELF
11296 add r1, rFP, #OFF_FP_SHADOWFRAME
11297 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11298
11299/* ------------------------------ */
11300 .balign 128
11301.L_ALT_op_and_int_lit16: /* 0xd5 */
11302/* File: arm/alt_stub.S */
11303/*
11304 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11305 * any interesting requests and then jump to the real instruction
11306 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11307 */
11308 .extern MterpCheckBefore
11309 EXPORT_PC
11310 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11311 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11312 mov r0, rSELF
11313 add r1, rFP, #OFF_FP_SHADOWFRAME
11314 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11315
11316/* ------------------------------ */
11317 .balign 128
11318.L_ALT_op_or_int_lit16: /* 0xd6 */
11319/* File: arm/alt_stub.S */
11320/*
11321 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11322 * any interesting requests and then jump to the real instruction
11323 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11324 */
11325 .extern MterpCheckBefore
11326 EXPORT_PC
11327 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11328 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11329 mov r0, rSELF
11330 add r1, rFP, #OFF_FP_SHADOWFRAME
11331 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11332
11333/* ------------------------------ */
11334 .balign 128
11335.L_ALT_op_xor_int_lit16: /* 0xd7 */
11336/* File: arm/alt_stub.S */
11337/*
11338 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11339 * any interesting requests and then jump to the real instruction
11340 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11341 */
11342 .extern MterpCheckBefore
11343 EXPORT_PC
11344 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11345 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11346 mov r0, rSELF
11347 add r1, rFP, #OFF_FP_SHADOWFRAME
11348 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11349
11350/* ------------------------------ */
11351 .balign 128
11352.L_ALT_op_add_int_lit8: /* 0xd8 */
11353/* File: arm/alt_stub.S */
11354/*
11355 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11356 * any interesting requests and then jump to the real instruction
11357 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11358 */
11359 .extern MterpCheckBefore
11360 EXPORT_PC
11361 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11362 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11363 mov r0, rSELF
11364 add r1, rFP, #OFF_FP_SHADOWFRAME
11365 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11366
11367/* ------------------------------ */
11368 .balign 128
11369.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11370/* File: arm/alt_stub.S */
11371/*
11372 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11373 * any interesting requests and then jump to the real instruction
11374 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11375 */
11376 .extern MterpCheckBefore
11377 EXPORT_PC
11378 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11379 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11380 mov r0, rSELF
11381 add r1, rFP, #OFF_FP_SHADOWFRAME
11382 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11383
11384/* ------------------------------ */
11385 .balign 128
11386.L_ALT_op_mul_int_lit8: /* 0xda */
11387/* File: arm/alt_stub.S */
11388/*
11389 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11390 * any interesting requests and then jump to the real instruction
11391 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11392 */
11393 .extern MterpCheckBefore
11394 EXPORT_PC
11395 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11396 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11397 mov r0, rSELF
11398 add r1, rFP, #OFF_FP_SHADOWFRAME
11399 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11400
11401/* ------------------------------ */
11402 .balign 128
11403.L_ALT_op_div_int_lit8: /* 0xdb */
11404/* File: arm/alt_stub.S */
11405/*
11406 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11407 * any interesting requests and then jump to the real instruction
11408 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11409 */
11410 .extern MterpCheckBefore
11411 EXPORT_PC
11412 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11413 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11414 mov r0, rSELF
11415 add r1, rFP, #OFF_FP_SHADOWFRAME
11416 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11417
11418/* ------------------------------ */
11419 .balign 128
11420.L_ALT_op_rem_int_lit8: /* 0xdc */
11421/* File: arm/alt_stub.S */
11422/*
11423 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11424 * any interesting requests and then jump to the real instruction
11425 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11426 */
11427 .extern MterpCheckBefore
11428 EXPORT_PC
11429 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11430 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11431 mov r0, rSELF
11432 add r1, rFP, #OFF_FP_SHADOWFRAME
11433 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11434
11435/* ------------------------------ */
11436 .balign 128
11437.L_ALT_op_and_int_lit8: /* 0xdd */
11438/* File: arm/alt_stub.S */
11439/*
11440 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11441 * any interesting requests and then jump to the real instruction
11442 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11443 */
11444 .extern MterpCheckBefore
11445 EXPORT_PC
11446 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11447 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11448 mov r0, rSELF
11449 add r1, rFP, #OFF_FP_SHADOWFRAME
11450 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11451
11452/* ------------------------------ */
11453 .balign 128
11454.L_ALT_op_or_int_lit8: /* 0xde */
11455/* File: arm/alt_stub.S */
11456/*
11457 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11458 * any interesting requests and then jump to the real instruction
11459 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11460 */
11461 .extern MterpCheckBefore
11462 EXPORT_PC
11463 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11464 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11465 mov r0, rSELF
11466 add r1, rFP, #OFF_FP_SHADOWFRAME
11467 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11468
11469/* ------------------------------ */
11470 .balign 128
11471.L_ALT_op_xor_int_lit8: /* 0xdf */
11472/* File: arm/alt_stub.S */
11473/*
11474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11475 * any interesting requests and then jump to the real instruction
11476 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11477 */
11478 .extern MterpCheckBefore
11479 EXPORT_PC
11480 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11481 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11482 mov r0, rSELF
11483 add r1, rFP, #OFF_FP_SHADOWFRAME
11484 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11485
11486/* ------------------------------ */
11487 .balign 128
11488.L_ALT_op_shl_int_lit8: /* 0xe0 */
11489/* File: arm/alt_stub.S */
11490/*
11491 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11492 * any interesting requests and then jump to the real instruction
11493 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11494 */
11495 .extern MterpCheckBefore
11496 EXPORT_PC
11497 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11498 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11499 mov r0, rSELF
11500 add r1, rFP, #OFF_FP_SHADOWFRAME
11501 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11502
11503/* ------------------------------ */
11504 .balign 128
11505.L_ALT_op_shr_int_lit8: /* 0xe1 */
11506/* File: arm/alt_stub.S */
11507/*
11508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11509 * any interesting requests and then jump to the real instruction
11510 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11511 */
11512 .extern MterpCheckBefore
11513 EXPORT_PC
11514 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11515 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11516 mov r0, rSELF
11517 add r1, rFP, #OFF_FP_SHADOWFRAME
11518 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11519
11520/* ------------------------------ */
11521 .balign 128
11522.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11523/* File: arm/alt_stub.S */
11524/*
11525 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11526 * any interesting requests and then jump to the real instruction
11527 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11528 */
11529 .extern MterpCheckBefore
11530 EXPORT_PC
11531 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11532 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11533 mov r0, rSELF
11534 add r1, rFP, #OFF_FP_SHADOWFRAME
11535 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11536
11537/* ------------------------------ */
11538 .balign 128
11539.L_ALT_op_iget_quick: /* 0xe3 */
11540/* File: arm/alt_stub.S */
11541/*
11542 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11543 * any interesting requests and then jump to the real instruction
11544 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11545 */
11546 .extern MterpCheckBefore
11547 EXPORT_PC
11548 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11549 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11550 mov r0, rSELF
11551 add r1, rFP, #OFF_FP_SHADOWFRAME
11552 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11553
11554/* ------------------------------ */
11555 .balign 128
11556.L_ALT_op_iget_wide_quick: /* 0xe4 */
11557/* File: arm/alt_stub.S */
11558/*
11559 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11560 * any interesting requests and then jump to the real instruction
11561 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11562 */
11563 .extern MterpCheckBefore
11564 EXPORT_PC
11565 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11566 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11567 mov r0, rSELF
11568 add r1, rFP, #OFF_FP_SHADOWFRAME
11569 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11570
11571/* ------------------------------ */
11572 .balign 128
11573.L_ALT_op_iget_object_quick: /* 0xe5 */
11574/* File: arm/alt_stub.S */
11575/*
11576 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11577 * any interesting requests and then jump to the real instruction
11578 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11579 */
11580 .extern MterpCheckBefore
11581 EXPORT_PC
11582 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11583 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11584 mov r0, rSELF
11585 add r1, rFP, #OFF_FP_SHADOWFRAME
11586 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11587
11588/* ------------------------------ */
11589 .balign 128
11590.L_ALT_op_iput_quick: /* 0xe6 */
11591/* File: arm/alt_stub.S */
11592/*
11593 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11594 * any interesting requests and then jump to the real instruction
11595 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11596 */
11597 .extern MterpCheckBefore
11598 EXPORT_PC
11599 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11600 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11601 mov r0, rSELF
11602 add r1, rFP, #OFF_FP_SHADOWFRAME
11603 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11604
11605/* ------------------------------ */
11606 .balign 128
11607.L_ALT_op_iput_wide_quick: /* 0xe7 */
11608/* File: arm/alt_stub.S */
11609/*
11610 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11611 * any interesting requests and then jump to the real instruction
11612 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11613 */
11614 .extern MterpCheckBefore
11615 EXPORT_PC
11616 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11617 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11618 mov r0, rSELF
11619 add r1, rFP, #OFF_FP_SHADOWFRAME
11620 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11621
11622/* ------------------------------ */
11623 .balign 128
11624.L_ALT_op_iput_object_quick: /* 0xe8 */
11625/* File: arm/alt_stub.S */
11626/*
11627 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11628 * any interesting requests and then jump to the real instruction
11629 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11630 */
11631 .extern MterpCheckBefore
11632 EXPORT_PC
11633 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11634 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11635 mov r0, rSELF
11636 add r1, rFP, #OFF_FP_SHADOWFRAME
11637 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11638
11639/* ------------------------------ */
11640 .balign 128
11641.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11642/* File: arm/alt_stub.S */
11643/*
11644 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11645 * any interesting requests and then jump to the real instruction
11646 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11647 */
11648 .extern MterpCheckBefore
11649 EXPORT_PC
11650 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11651 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11652 mov r0, rSELF
11653 add r1, rFP, #OFF_FP_SHADOWFRAME
11654 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11655
11656/* ------------------------------ */
11657 .balign 128
11658.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11659/* File: arm/alt_stub.S */
11660/*
11661 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11662 * any interesting requests and then jump to the real instruction
11663 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11664 */
11665 .extern MterpCheckBefore
11666 EXPORT_PC
11667 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11668 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11669 mov r0, rSELF
11670 add r1, rFP, #OFF_FP_SHADOWFRAME
11671 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11672
11673/* ------------------------------ */
11674 .balign 128
11675.L_ALT_op_iput_boolean_quick: /* 0xeb */
11676/* File: arm/alt_stub.S */
11677/*
11678 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11679 * any interesting requests and then jump to the real instruction
11680 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11681 */
11682 .extern MterpCheckBefore
11683 EXPORT_PC
11684 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11685 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11686 mov r0, rSELF
11687 add r1, rFP, #OFF_FP_SHADOWFRAME
11688 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11689
11690/* ------------------------------ */
11691 .balign 128
11692.L_ALT_op_iput_byte_quick: /* 0xec */
11693/* File: arm/alt_stub.S */
11694/*
11695 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11696 * any interesting requests and then jump to the real instruction
11697 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11698 */
11699 .extern MterpCheckBefore
11700 EXPORT_PC
11701 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11702 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11703 mov r0, rSELF
11704 add r1, rFP, #OFF_FP_SHADOWFRAME
11705 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11706
11707/* ------------------------------ */
11708 .balign 128
11709.L_ALT_op_iput_char_quick: /* 0xed */
11710/* File: arm/alt_stub.S */
11711/*
11712 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11713 * any interesting requests and then jump to the real instruction
11714 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11715 */
11716 .extern MterpCheckBefore
11717 EXPORT_PC
11718 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11719 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11720 mov r0, rSELF
11721 add r1, rFP, #OFF_FP_SHADOWFRAME
11722 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11723
11724/* ------------------------------ */
11725 .balign 128
11726.L_ALT_op_iput_short_quick: /* 0xee */
11727/* File: arm/alt_stub.S */
11728/*
11729 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11730 * any interesting requests and then jump to the real instruction
11731 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11732 */
11733 .extern MterpCheckBefore
11734 EXPORT_PC
11735 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11736 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
11737 mov r0, rSELF
11738 add r1, rFP, #OFF_FP_SHADOWFRAME
11739 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11740
11741/* ------------------------------ */
11742 .balign 128
11743.L_ALT_op_iget_boolean_quick: /* 0xef */
11744/* File: arm/alt_stub.S */
11745/*
11746 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11747 * any interesting requests and then jump to the real instruction
11748 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11749 */
11750 .extern MterpCheckBefore
11751 EXPORT_PC
11752 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11753 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
11754 mov r0, rSELF
11755 add r1, rFP, #OFF_FP_SHADOWFRAME
11756 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11757
11758/* ------------------------------ */
11759 .balign 128
11760.L_ALT_op_iget_byte_quick: /* 0xf0 */
11761/* File: arm/alt_stub.S */
11762/*
11763 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11764 * any interesting requests and then jump to the real instruction
11765 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11766 */
11767 .extern MterpCheckBefore
11768 EXPORT_PC
11769 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11770 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
11771 mov r0, rSELF
11772 add r1, rFP, #OFF_FP_SHADOWFRAME
11773 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11774
11775/* ------------------------------ */
11776 .balign 128
11777.L_ALT_op_iget_char_quick: /* 0xf1 */
11778/* File: arm/alt_stub.S */
11779/*
11780 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11781 * any interesting requests and then jump to the real instruction
11782 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11783 */
11784 .extern MterpCheckBefore
11785 EXPORT_PC
11786 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11787 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
11788 mov r0, rSELF
11789 add r1, rFP, #OFF_FP_SHADOWFRAME
11790 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11791
11792/* ------------------------------ */
11793 .balign 128
11794.L_ALT_op_iget_short_quick: /* 0xf2 */
11795/* File: arm/alt_stub.S */
11796/*
11797 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11798 * any interesting requests and then jump to the real instruction
11799 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11800 */
11801 .extern MterpCheckBefore
11802 EXPORT_PC
11803 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11804 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
11805 mov r0, rSELF
11806 add r1, rFP, #OFF_FP_SHADOWFRAME
11807 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11808
11809/* ------------------------------ */
11810 .balign 128
11811.L_ALT_op_invoke_lambda: /* 0xf3 */
11812/* File: arm/alt_stub.S */
11813/*
11814 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11815 * any interesting requests and then jump to the real instruction
11816 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11817 */
11818 .extern MterpCheckBefore
11819 EXPORT_PC
11820 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11821 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
11822 mov r0, rSELF
11823 add r1, rFP, #OFF_FP_SHADOWFRAME
11824 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11825
11826/* ------------------------------ */
11827 .balign 128
11828.L_ALT_op_unused_f4: /* 0xf4 */
11829/* File: arm/alt_stub.S */
11830/*
11831 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11832 * any interesting requests and then jump to the real instruction
11833 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11834 */
11835 .extern MterpCheckBefore
11836 EXPORT_PC
11837 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11838 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
11839 mov r0, rSELF
11840 add r1, rFP, #OFF_FP_SHADOWFRAME
11841 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11842
11843/* ------------------------------ */
11844 .balign 128
11845.L_ALT_op_capture_variable: /* 0xf5 */
11846/* File: arm/alt_stub.S */
11847/*
11848 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11849 * any interesting requests and then jump to the real instruction
11850 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11851 */
11852 .extern MterpCheckBefore
11853 EXPORT_PC
11854 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11855 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
11856 mov r0, rSELF
11857 add r1, rFP, #OFF_FP_SHADOWFRAME
11858 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11859
11860/* ------------------------------ */
11861 .balign 128
11862.L_ALT_op_create_lambda: /* 0xf6 */
11863/* File: arm/alt_stub.S */
11864/*
11865 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11866 * any interesting requests and then jump to the real instruction
11867 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11868 */
11869 .extern MterpCheckBefore
11870 EXPORT_PC
11871 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11872 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
11873 mov r0, rSELF
11874 add r1, rFP, #OFF_FP_SHADOWFRAME
11875 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11876
11877/* ------------------------------ */
11878 .balign 128
11879.L_ALT_op_liberate_variable: /* 0xf7 */
11880/* File: arm/alt_stub.S */
11881/*
11882 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11883 * any interesting requests and then jump to the real instruction
11884 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11885 */
11886 .extern MterpCheckBefore
11887 EXPORT_PC
11888 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11889 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
11890 mov r0, rSELF
11891 add r1, rFP, #OFF_FP_SHADOWFRAME
11892 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11893
11894/* ------------------------------ */
11895 .balign 128
11896.L_ALT_op_box_lambda: /* 0xf8 */
11897/* File: arm/alt_stub.S */
11898/*
11899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11900 * any interesting requests and then jump to the real instruction
11901 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11902 */
11903 .extern MterpCheckBefore
11904 EXPORT_PC
11905 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11906 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
11907 mov r0, rSELF
11908 add r1, rFP, #OFF_FP_SHADOWFRAME
11909 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11910
11911/* ------------------------------ */
11912 .balign 128
11913.L_ALT_op_unbox_lambda: /* 0xf9 */
11914/* File: arm/alt_stub.S */
11915/*
11916 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11917 * any interesting requests and then jump to the real instruction
11918 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11919 */
11920 .extern MterpCheckBefore
11921 EXPORT_PC
11922 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11923 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
11924 mov r0, rSELF
11925 add r1, rFP, #OFF_FP_SHADOWFRAME
11926 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11927
11928/* ------------------------------ */
11929 .balign 128
11930.L_ALT_op_unused_fa: /* 0xfa */
11931/* File: arm/alt_stub.S */
11932/*
11933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11934 * any interesting requests and then jump to the real instruction
11935 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11936 */
11937 .extern MterpCheckBefore
11938 EXPORT_PC
11939 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11940 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
11941 mov r0, rSELF
11942 add r1, rFP, #OFF_FP_SHADOWFRAME
11943 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11944
11945/* ------------------------------ */
11946 .balign 128
11947.L_ALT_op_unused_fb: /* 0xfb */
11948/* File: arm/alt_stub.S */
11949/*
11950 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11951 * any interesting requests and then jump to the real instruction
11952 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11953 */
11954 .extern MterpCheckBefore
11955 EXPORT_PC
11956 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11957 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
11958 mov r0, rSELF
11959 add r1, rFP, #OFF_FP_SHADOWFRAME
11960 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11961
11962/* ------------------------------ */
11963 .balign 128
11964.L_ALT_op_unused_fc: /* 0xfc */
11965/* File: arm/alt_stub.S */
11966/*
11967 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11968 * any interesting requests and then jump to the real instruction
11969 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11970 */
11971 .extern MterpCheckBefore
11972 EXPORT_PC
11973 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11974 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
11975 mov r0, rSELF
11976 add r1, rFP, #OFF_FP_SHADOWFRAME
11977 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11978
11979/* ------------------------------ */
11980 .balign 128
11981.L_ALT_op_unused_fd: /* 0xfd */
11982/* File: arm/alt_stub.S */
11983/*
11984 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11985 * any interesting requests and then jump to the real instruction
11986 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11987 */
11988 .extern MterpCheckBefore
11989 EXPORT_PC
11990 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11991 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
11992 mov r0, rSELF
11993 add r1, rFP, #OFF_FP_SHADOWFRAME
11994 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11995
11996/* ------------------------------ */
11997 .balign 128
11998.L_ALT_op_unused_fe: /* 0xfe */
11999/* File: arm/alt_stub.S */
12000/*
12001 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12002 * any interesting requests and then jump to the real instruction
12003 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12004 */
12005 .extern MterpCheckBefore
12006 EXPORT_PC
12007 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12008 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12009 mov r0, rSELF
12010 add r1, rFP, #OFF_FP_SHADOWFRAME
12011 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12012
12013/* ------------------------------ */
12014 .balign 128
12015.L_ALT_op_unused_ff: /* 0xff */
12016/* File: arm/alt_stub.S */
12017/*
12018 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12019 * any interesting requests and then jump to the real instruction
12020 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12021 */
12022 .extern MterpCheckBefore
12023 EXPORT_PC
12024 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12025 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12026 mov r0, rSELF
12027 add r1, rFP, #OFF_FP_SHADOWFRAME
12028 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12029
12030 .balign 128
12031 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12032 .global artMterpAsmAltInstructionEnd
12033artMterpAsmAltInstructionEnd:
12034/* File: arm/footer.S */
12035/*
12036 * ===========================================================================
12037 * Common subroutines and data
12038 * ===========================================================================
12039 */
12040
12041 .text
12042 .align 2
12043
12044/*
12045 * We've detected a condition that will result in an exception, but the exception
12046 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12047 * TUNING: for consistency, we may want to just go ahead and handle these here.
12048 */
12049#define MTERP_LOGGING 0
12050common_errDivideByZero:
12051 EXPORT_PC
12052#if MTERP_LOGGING
12053 mov r0, rSELF
12054 add r1, rFP, #OFF_FP_SHADOWFRAME
12055 bl MterpLogDivideByZeroException
12056#endif
12057 b MterpCommonFallback
12058
12059common_errArrayIndex:
12060 EXPORT_PC
12061#if MTERP_LOGGING
12062 mov r0, rSELF
12063 add r1, rFP, #OFF_FP_SHADOWFRAME
12064 bl MterpLogArrayIndexException
12065#endif
12066 b MterpCommonFallback
12067
12068common_errNegativeArraySize:
12069 EXPORT_PC
12070#if MTERP_LOGGING
12071 mov r0, rSELF
12072 add r1, rFP, #OFF_FP_SHADOWFRAME
12073 bl MterpLogNegativeArraySizeException
12074#endif
12075 b MterpCommonFallback
12076
12077common_errNoSuchMethod:
12078 EXPORT_PC
12079#if MTERP_LOGGING
12080 mov r0, rSELF
12081 add r1, rFP, #OFF_FP_SHADOWFRAME
12082 bl MterpLogNoSuchMethodException
12083#endif
12084 b MterpCommonFallback
12085
12086common_errNullObject:
12087 EXPORT_PC
12088#if MTERP_LOGGING
12089 mov r0, rSELF
12090 add r1, rFP, #OFF_FP_SHADOWFRAME
12091 bl MterpLogNullObjectException
12092#endif
12093 b MterpCommonFallback
12094
12095common_exceptionThrown:
12096 EXPORT_PC
12097#if MTERP_LOGGING
12098 mov r0, rSELF
12099 add r1, rFP, #OFF_FP_SHADOWFRAME
12100 bl MterpLogExceptionThrownException
12101#endif
12102 b MterpCommonFallback
12103
12104MterpSuspendFallback:
12105 EXPORT_PC
12106#if MTERP_LOGGING
12107 mov r0, rSELF
12108 add r1, rFP, #OFF_FP_SHADOWFRAME
12109 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12110 bl MterpLogSuspendFallback
12111#endif
12112 b MterpCommonFallback
12113
12114/*
12115 * If we're here, something is out of the ordinary. If there is a pending
12116 * exception, handle it. Otherwise, roll back and retry with the reference
12117 * interpreter.
12118 */
12119MterpPossibleException:
12120 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12121 cmp r0, #0 @ Exception pending?
12122 beq MterpFallback @ If not, fall back to reference interpreter.
12123 /* intentional fallthrough - handle pending exception. */
12124/*
12125 * On return from a runtime helper routine, we've found a pending exception.
12126 * Can we handle it here - or need to bail out to caller?
12127 *
12128 */
12129MterpException:
12130 mov r0, rSELF
12131 add r1, rFP, #OFF_FP_SHADOWFRAME
12132 bl MterpHandleException @ (self, shadow_frame)
12133 cmp r0, #0
12134 beq MterpExceptionReturn @ no local catch, back to caller.
12135 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12136 ldr r1, [rFP, #OFF_FP_DEX_PC]
12137 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12138 add rPC, r0, #CODEITEM_INSNS_OFFSET
12139 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
12140 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
12141 /* resume execution at catch block */
12142 FETCH_INST
12143 GET_INST_OPCODE ip
12144 GOTO_OPCODE ip
12145 /* NOTE: no fallthrough */
12146
12147/*
12148 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12149 * still needs to get the opcode and branch to it, and flags are in lr.
12150 */
12151MterpCheckSuspendAndContinue:
12152 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
12153 EXPORT_PC
12154 mov r0, rSELF
12155 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12156 blne MterpSuspendCheck @ (self)
12157 GET_INST_OPCODE ip @ extract opcode from rINST
12158 GOTO_OPCODE ip @ jump to next instruction
12159
12160/*
12161 * Bail out to reference interpreter.
12162 */
12163MterpFallback:
12164 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -080012165#if MTERP_LOGGING
buzbee1452bee2015-03-06 14:43:04 -080012166 mov r0, rSELF
12167 add r1, rFP, #OFF_FP_SHADOWFRAME
12168 bl MterpLogFallback
buzbee76833da2016-01-13 13:06:22 -080012169#endif
buzbee1452bee2015-03-06 14:43:04 -080012170MterpCommonFallback:
12171 mov r0, #0 @ signal retry with reference interpreter.
12172 b MterpDone
12173
12174/*
12175 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12176 * SP and LR. Here we restore SP, restore the registers, and then restore
12177 * LR to PC.
12178 *
12179 * On entry:
12180 * uint32_t* rFP (should still be live, pointer to base of vregs)
12181 */
12182MterpExceptionReturn:
buzbee1452bee2015-03-06 14:43:04 -080012183 mov r0, #1 @ signal return to caller.
12184 b MterpDone
12185MterpReturn:
12186 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
12187 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
12188 str r0, [r2]
12189 str r1, [r2, #4]
12190 mov r0, rSELF
12191 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12192 blne MterpSuspendCheck @ (self)
12193 mov r0, #1 @ signal return to caller.
12194MterpDone:
12195 add sp, sp, #4 @ un-align 64
12196 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12197
12198
12199 .fnend
12200 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12201
12202