blob: 9ae98a2bbead63ab6c9f10c11834e52d11ff6f42 [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
buzbeebb6e7262016-01-14 05:34:34 -08007150 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -08007151 GET_VREG r0, r2 @ r0<- object we're operating on
buzbee76833da2016-01-13 13:06:22 -08007152 bl artIGetObjectFromMterp @ (obj, offset)
7153 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
7154 ubfx r2, rINST, #8, #4 @ r2<- A
7155 PREFETCH_INST 2
7156 cmp r3, #0
7157 bne MterpPossibleException @ bail out
buzbee1452bee2015-03-06 14:43:04 -08007158 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
buzbee76833da2016-01-13 13:06:22 -08007159 ADVANCE 2 @ advance rPC
buzbee1452bee2015-03-06 14:43:04 -08007160 GET_INST_OPCODE ip @ extract opcode from rINST
7161 GOTO_OPCODE ip @ jump to next instruction
7162
buzbee1452bee2015-03-06 14:43:04 -08007163/* ------------------------------ */
7164 .balign 128
7165.L_op_iput_quick: /* 0xe6 */
7166/* File: arm/op_iput_quick.S */
7167 /* For: iput-quick, iput-object-quick */
7168 /* op vA, vB, offset@CCCC */
7169 mov r2, rINST, lsr #12 @ r2<- B
7170 FETCH r1, 1 @ r1<- field byte offset
7171 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7172 ubfx r2, rINST, #8, #4 @ r2<- A
7173 cmp r3, #0 @ check object for null
7174 beq common_errNullObject @ object was null
7175 GET_VREG r0, r2 @ r0<- fp[A]
7176 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7177 str r0, [r3, r1] @ obj.field<- r0
7178 GET_INST_OPCODE ip @ extract opcode from rINST
7179 GOTO_OPCODE ip @ jump to next instruction
7180
7181/* ------------------------------ */
7182 .balign 128
7183.L_op_iput_wide_quick: /* 0xe7 */
7184/* File: arm/op_iput_wide_quick.S */
7185 /* iput-wide-quick vA, vB, offset@CCCC */
7186 mov r2, rINST, lsr #12 @ r2<- B
7187 FETCH r3, 1 @ r3<- field byte offset
7188 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7189 ubfx r0, rINST, #8, #4 @ r0<- A
7190 cmp r2, #0 @ check object for null
7191 beq common_errNullObject @ object was null
7192 add r0, rFP, r0, lsl #2 @ r0<- &fp[A]
7193 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7194 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7195 strd r0, [r2, r3] @ obj.field<- r0/r1
7196 GET_INST_OPCODE ip @ extract opcode from rINST
7197 GOTO_OPCODE ip @ jump to next instruction
7198
7199/* ------------------------------ */
7200 .balign 128
7201.L_op_iput_object_quick: /* 0xe8 */
7202/* File: arm/op_iput_object_quick.S */
7203 EXPORT_PC
7204 add r0, rFP, #OFF_FP_SHADOWFRAME
7205 mov r1, rPC
7206 mov r2, rINST
7207 bl MterpIputObjectQuick
7208 cmp r0, #0
7209 beq MterpException
7210 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7211 GET_INST_OPCODE ip @ extract opcode from rINST
7212 GOTO_OPCODE ip @ jump to next instruction
7213
7214/* ------------------------------ */
7215 .balign 128
7216.L_op_invoke_virtual_quick: /* 0xe9 */
7217/* File: arm/op_invoke_virtual_quick.S */
7218/* File: arm/invoke.S */
7219 /*
7220 * Generic invoke handler wrapper.
7221 */
7222 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7223 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7224 .extern MterpInvokeVirtualQuick
7225 EXPORT_PC
7226 mov r0, rSELF
7227 add r1, rFP, #OFF_FP_SHADOWFRAME
7228 mov r2, rPC
7229 mov r3, rINST
7230 bl MterpInvokeVirtualQuick
7231 cmp r0, #0
7232 beq MterpException
7233 FETCH_ADVANCE_INST 3
7234 GET_INST_OPCODE ip
7235 GOTO_OPCODE ip
7236
7237
7238
7239/* ------------------------------ */
7240 .balign 128
7241.L_op_invoke_virtual_range_quick: /* 0xea */
7242/* File: arm/op_invoke_virtual_range_quick.S */
7243/* File: arm/invoke.S */
7244 /*
7245 * Generic invoke handler wrapper.
7246 */
7247 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7248 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7249 .extern MterpInvokeVirtualQuickRange
7250 EXPORT_PC
7251 mov r0, rSELF
7252 add r1, rFP, #OFF_FP_SHADOWFRAME
7253 mov r2, rPC
7254 mov r3, rINST
7255 bl MterpInvokeVirtualQuickRange
7256 cmp r0, #0
7257 beq MterpException
7258 FETCH_ADVANCE_INST 3
7259 GET_INST_OPCODE ip
7260 GOTO_OPCODE ip
7261
7262
7263
7264/* ------------------------------ */
7265 .balign 128
7266.L_op_iput_boolean_quick: /* 0xeb */
7267/* File: arm/op_iput_boolean_quick.S */
7268/* File: arm/op_iput_quick.S */
7269 /* For: iput-quick, iput-object-quick */
7270 /* op vA, vB, offset@CCCC */
7271 mov r2, rINST, lsr #12 @ r2<- B
7272 FETCH r1, 1 @ r1<- field byte offset
7273 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7274 ubfx r2, rINST, #8, #4 @ r2<- A
7275 cmp r3, #0 @ check object for null
7276 beq common_errNullObject @ object was null
7277 GET_VREG r0, r2 @ r0<- fp[A]
7278 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7279 strb r0, [r3, r1] @ obj.field<- r0
7280 GET_INST_OPCODE ip @ extract opcode from rINST
7281 GOTO_OPCODE ip @ jump to next instruction
7282
7283
7284/* ------------------------------ */
7285 .balign 128
7286.L_op_iput_byte_quick: /* 0xec */
7287/* File: arm/op_iput_byte_quick.S */
7288/* File: arm/op_iput_quick.S */
7289 /* For: iput-quick, iput-object-quick */
7290 /* op vA, vB, offset@CCCC */
7291 mov r2, rINST, lsr #12 @ r2<- B
7292 FETCH r1, 1 @ r1<- field byte offset
7293 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7294 ubfx r2, rINST, #8, #4 @ r2<- A
7295 cmp r3, #0 @ check object for null
7296 beq common_errNullObject @ object was null
7297 GET_VREG r0, r2 @ r0<- fp[A]
7298 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7299 strb r0, [r3, r1] @ obj.field<- r0
7300 GET_INST_OPCODE ip @ extract opcode from rINST
7301 GOTO_OPCODE ip @ jump to next instruction
7302
7303
7304/* ------------------------------ */
7305 .balign 128
7306.L_op_iput_char_quick: /* 0xed */
7307/* File: arm/op_iput_char_quick.S */
7308/* File: arm/op_iput_quick.S */
7309 /* For: iput-quick, iput-object-quick */
7310 /* op vA, vB, offset@CCCC */
7311 mov r2, rINST, lsr #12 @ r2<- B
7312 FETCH r1, 1 @ r1<- field byte offset
7313 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7314 ubfx r2, rINST, #8, #4 @ r2<- A
7315 cmp r3, #0 @ check object for null
7316 beq common_errNullObject @ object was null
7317 GET_VREG r0, r2 @ r0<- fp[A]
7318 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7319 strh r0, [r3, r1] @ obj.field<- r0
7320 GET_INST_OPCODE ip @ extract opcode from rINST
7321 GOTO_OPCODE ip @ jump to next instruction
7322
7323
7324/* ------------------------------ */
7325 .balign 128
7326.L_op_iput_short_quick: /* 0xee */
7327/* File: arm/op_iput_short_quick.S */
7328/* File: arm/op_iput_quick.S */
7329 /* For: iput-quick, iput-object-quick */
7330 /* op vA, vB, offset@CCCC */
7331 mov r2, rINST, lsr #12 @ r2<- B
7332 FETCH r1, 1 @ r1<- field byte offset
7333 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7334 ubfx r2, rINST, #8, #4 @ r2<- A
7335 cmp r3, #0 @ check object for null
7336 beq common_errNullObject @ object was null
7337 GET_VREG r0, r2 @ r0<- fp[A]
7338 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7339 strh r0, [r3, r1] @ obj.field<- r0
7340 GET_INST_OPCODE ip @ extract opcode from rINST
7341 GOTO_OPCODE ip @ jump to next instruction
7342
7343
7344/* ------------------------------ */
7345 .balign 128
7346.L_op_iget_boolean_quick: /* 0xef */
7347/* File: arm/op_iget_boolean_quick.S */
7348/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007349 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007350 /* op vA, vB, offset@CCCC */
7351 mov r2, rINST, lsr #12 @ r2<- B
7352 FETCH r1, 1 @ r1<- field byte offset
7353 GET_VREG r3, r2 @ r3<- object we're operating on
7354 ubfx r2, rINST, #8, #4 @ r2<- A
7355 cmp r3, #0 @ check object for null
7356 beq common_errNullObject @ object was null
7357 ldrb r0, [r3, r1] @ r0<- obj.field
7358 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007359 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007360 GET_INST_OPCODE ip @ extract opcode from rINST
7361 GOTO_OPCODE ip @ jump to next instruction
7362
7363
7364/* ------------------------------ */
7365 .balign 128
7366.L_op_iget_byte_quick: /* 0xf0 */
7367/* File: arm/op_iget_byte_quick.S */
7368/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007369 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007370 /* op vA, vB, offset@CCCC */
7371 mov r2, rINST, lsr #12 @ r2<- B
7372 FETCH r1, 1 @ r1<- field byte offset
7373 GET_VREG r3, r2 @ r3<- object we're operating on
7374 ubfx r2, rINST, #8, #4 @ r2<- A
7375 cmp r3, #0 @ check object for null
7376 beq common_errNullObject @ object was null
7377 ldrsb r0, [r3, r1] @ r0<- obj.field
7378 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007379 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007380 GET_INST_OPCODE ip @ extract opcode from rINST
7381 GOTO_OPCODE ip @ jump to next instruction
7382
7383
7384/* ------------------------------ */
7385 .balign 128
7386.L_op_iget_char_quick: /* 0xf1 */
7387/* File: arm/op_iget_char_quick.S */
7388/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007389 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007390 /* op vA, vB, offset@CCCC */
7391 mov r2, rINST, lsr #12 @ r2<- B
7392 FETCH r1, 1 @ r1<- field byte offset
7393 GET_VREG r3, r2 @ r3<- object we're operating on
7394 ubfx r2, rINST, #8, #4 @ r2<- A
7395 cmp r3, #0 @ check object for null
7396 beq common_errNullObject @ object was null
7397 ldrh r0, [r3, r1] @ r0<- obj.field
7398 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007399 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007400 GET_INST_OPCODE ip @ extract opcode from rINST
7401 GOTO_OPCODE ip @ jump to next instruction
7402
7403
7404/* ------------------------------ */
7405 .balign 128
7406.L_op_iget_short_quick: /* 0xf2 */
7407/* File: arm/op_iget_short_quick.S */
7408/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007409 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007410 /* op vA, vB, offset@CCCC */
7411 mov r2, rINST, lsr #12 @ r2<- B
7412 FETCH r1, 1 @ r1<- field byte offset
7413 GET_VREG r3, r2 @ r3<- object we're operating on
7414 ubfx r2, rINST, #8, #4 @ r2<- A
7415 cmp r3, #0 @ check object for null
7416 beq common_errNullObject @ object was null
7417 ldrsh r0, [r3, r1] @ r0<- obj.field
7418 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007419 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007420 GET_INST_OPCODE ip @ extract opcode from rINST
7421 GOTO_OPCODE ip @ jump to next instruction
7422
7423
7424/* ------------------------------ */
7425 .balign 128
7426.L_op_invoke_lambda: /* 0xf3 */
7427/* Transfer stub to alternate interpreter */
7428 b MterpFallback
7429
7430
7431/* ------------------------------ */
7432 .balign 128
7433.L_op_unused_f4: /* 0xf4 */
7434/* File: arm/op_unused_f4.S */
7435/* File: arm/unused.S */
7436/*
7437 * Bail to reference interpreter to throw.
7438 */
7439 b MterpFallback
7440
7441
7442/* ------------------------------ */
7443 .balign 128
7444.L_op_capture_variable: /* 0xf5 */
7445/* Transfer stub to alternate interpreter */
7446 b MterpFallback
7447
7448
7449/* ------------------------------ */
7450 .balign 128
7451.L_op_create_lambda: /* 0xf6 */
7452/* Transfer stub to alternate interpreter */
7453 b MterpFallback
7454
7455
7456/* ------------------------------ */
7457 .balign 128
7458.L_op_liberate_variable: /* 0xf7 */
7459/* Transfer stub to alternate interpreter */
7460 b MterpFallback
7461
7462
7463/* ------------------------------ */
7464 .balign 128
7465.L_op_box_lambda: /* 0xf8 */
7466/* Transfer stub to alternate interpreter */
7467 b MterpFallback
7468
7469
7470/* ------------------------------ */
7471 .balign 128
7472.L_op_unbox_lambda: /* 0xf9 */
7473/* Transfer stub to alternate interpreter */
7474 b MterpFallback
7475
7476
7477/* ------------------------------ */
7478 .balign 128
7479.L_op_unused_fa: /* 0xfa */
7480/* File: arm/op_unused_fa.S */
7481/* File: arm/unused.S */
7482/*
7483 * Bail to reference interpreter to throw.
7484 */
7485 b MterpFallback
7486
7487
7488/* ------------------------------ */
7489 .balign 128
7490.L_op_unused_fb: /* 0xfb */
7491/* File: arm/op_unused_fb.S */
7492/* File: arm/unused.S */
7493/*
7494 * Bail to reference interpreter to throw.
7495 */
7496 b MterpFallback
7497
7498
7499/* ------------------------------ */
7500 .balign 128
7501.L_op_unused_fc: /* 0xfc */
7502/* File: arm/op_unused_fc.S */
7503/* File: arm/unused.S */
7504/*
7505 * Bail to reference interpreter to throw.
7506 */
7507 b MterpFallback
7508
7509
7510/* ------------------------------ */
7511 .balign 128
7512.L_op_unused_fd: /* 0xfd */
7513/* File: arm/op_unused_fd.S */
7514/* File: arm/unused.S */
7515/*
7516 * Bail to reference interpreter to throw.
7517 */
7518 b MterpFallback
7519
7520
7521/* ------------------------------ */
7522 .balign 128
7523.L_op_unused_fe: /* 0xfe */
7524/* File: arm/op_unused_fe.S */
7525/* File: arm/unused.S */
7526/*
7527 * Bail to reference interpreter to throw.
7528 */
7529 b MterpFallback
7530
7531
7532/* ------------------------------ */
7533 .balign 128
7534.L_op_unused_ff: /* 0xff */
7535/* File: arm/op_unused_ff.S */
7536/* File: arm/unused.S */
7537/*
7538 * Bail to reference interpreter to throw.
7539 */
7540 b MterpFallback
7541
7542
7543 .balign 128
7544 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7545 .global artMterpAsmInstructionEnd
7546artMterpAsmInstructionEnd:
7547
7548/*
7549 * ===========================================================================
7550 * Sister implementations
7551 * ===========================================================================
7552 */
7553 .global artMterpAsmSisterStart
7554 .type artMterpAsmSisterStart, %function
7555 .text
7556 .balign 4
7557artMterpAsmSisterStart:
7558
7559/* continuation for op_cmp_long */
7560
7561.Lop_cmp_long_less:
7562 mvn r1, #0 @ r1<- -1
7563 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7564 @ instead, we just replicate the tail end.
7565 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7566 SET_VREG r1, r9 @ vAA<- r1
7567 GET_INST_OPCODE ip @ extract opcode from rINST
7568 GOTO_OPCODE ip @ jump to next instruction
7569
7570.Lop_cmp_long_greater:
7571 mov r1, #1 @ r1<- 1
7572 @ fall through to _finish
7573
7574.Lop_cmp_long_finish:
7575 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7576 SET_VREG r1, r9 @ vAA<- r1
7577 GET_INST_OPCODE ip @ extract opcode from rINST
7578 GOTO_OPCODE ip @ jump to next instruction
7579
7580/* continuation for op_float_to_long */
7581/*
7582 * Convert the float in r0 to a long in r0/r1.
7583 *
7584 * We have to clip values to long min/max per the specification. The
7585 * expected common case is a "reasonable" value that converts directly
7586 * to modest integer. The EABI convert function isn't doing this for us.
7587 */
7588f2l_doconv:
7589 stmfd sp!, {r4, lr}
7590 mov r1, #0x5f000000 @ (float)maxlong
7591 mov r4, r0
7592 bl __aeabi_fcmpge @ is arg >= maxlong?
7593 cmp r0, #0 @ nonzero == yes
7594 mvnne r0, #0 @ return maxlong (7fffffff)
7595 mvnne r1, #0x80000000
7596 ldmnefd sp!, {r4, pc}
7597
7598 mov r0, r4 @ recover arg
7599 mov r1, #0xdf000000 @ (float)minlong
7600 bl __aeabi_fcmple @ is arg <= minlong?
7601 cmp r0, #0 @ nonzero == yes
7602 movne r0, #0 @ return minlong (80000000)
7603 movne r1, #0x80000000
7604 ldmnefd sp!, {r4, pc}
7605
7606 mov r0, r4 @ recover arg
7607 mov r1, r4
7608 bl __aeabi_fcmpeq @ is arg == self?
7609 cmp r0, #0 @ zero == no
7610 moveq r1, #0 @ return zero for NaN
7611 ldmeqfd sp!, {r4, pc}
7612
7613 mov r0, r4 @ recover arg
7614 bl __aeabi_f2lz @ convert float to long
7615 ldmfd sp!, {r4, pc}
7616
7617/* continuation for op_double_to_long */
7618/*
7619 * Convert the double in r0/r1 to a long in r0/r1.
7620 *
7621 * We have to clip values to long min/max per the specification. The
7622 * expected common case is a "reasonable" value that converts directly
7623 * to modest integer. The EABI convert function isn't doing this for us.
7624 */
7625d2l_doconv:
7626 stmfd sp!, {r4, r5, lr} @ save regs
7627 mov r3, #0x43000000 @ maxlong, as a double (high word)
7628 add r3, #0x00e00000 @ 0x43e00000
7629 mov r2, #0 @ maxlong, as a double (low word)
7630 sub sp, sp, #4 @ align for EABI
7631 mov r4, r0 @ save a copy of r0
7632 mov r5, r1 @ and r1
7633 bl __aeabi_dcmpge @ is arg >= maxlong?
7634 cmp r0, #0 @ nonzero == yes
7635 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7636 mvnne r1, #0x80000000
7637 bne 1f
7638
7639 mov r0, r4 @ recover arg
7640 mov r1, r5
7641 mov r3, #0xc3000000 @ minlong, as a double (high word)
7642 add r3, #0x00e00000 @ 0xc3e00000
7643 mov r2, #0 @ minlong, as a double (low word)
7644 bl __aeabi_dcmple @ is arg <= minlong?
7645 cmp r0, #0 @ nonzero == yes
7646 movne r0, #0 @ return minlong (8000000000000000)
7647 movne r1, #0x80000000
7648 bne 1f
7649
7650 mov r0, r4 @ recover arg
7651 mov r1, r5
7652 mov r2, r4 @ compare against self
7653 mov r3, r5
7654 bl __aeabi_dcmpeq @ is arg == self?
7655 cmp r0, #0 @ zero == no
7656 moveq r1, #0 @ return zero for NaN
7657 beq 1f
7658
7659 mov r0, r4 @ recover arg
7660 mov r1, r5
7661 bl __aeabi_d2lz @ convert double to long
7662
76631:
7664 add sp, sp, #4
7665 ldmfd sp!, {r4, r5, pc}
7666
7667 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7668 .global artMterpAsmSisterEnd
7669artMterpAsmSisterEnd:
7670
7671
7672 .global artMterpAsmAltInstructionStart
7673 .type artMterpAsmAltInstructionStart, %function
7674 .text
7675
7676artMterpAsmAltInstructionStart = .L_ALT_op_nop
7677/* ------------------------------ */
7678 .balign 128
7679.L_ALT_op_nop: /* 0x00 */
7680/* File: arm/alt_stub.S */
7681/*
7682 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7683 * any interesting requests and then jump to the real instruction
7684 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7685 */
7686 .extern MterpCheckBefore
7687 EXPORT_PC
7688 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7689 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7690 mov r0, rSELF
7691 add r1, rFP, #OFF_FP_SHADOWFRAME
7692 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7693
7694/* ------------------------------ */
7695 .balign 128
7696.L_ALT_op_move: /* 0x01 */
7697/* File: arm/alt_stub.S */
7698/*
7699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7700 * any interesting requests and then jump to the real instruction
7701 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7702 */
7703 .extern MterpCheckBefore
7704 EXPORT_PC
7705 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7706 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7707 mov r0, rSELF
7708 add r1, rFP, #OFF_FP_SHADOWFRAME
7709 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7710
7711/* ------------------------------ */
7712 .balign 128
7713.L_ALT_op_move_from16: /* 0x02 */
7714/* File: arm/alt_stub.S */
7715/*
7716 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7717 * any interesting requests and then jump to the real instruction
7718 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7719 */
7720 .extern MterpCheckBefore
7721 EXPORT_PC
7722 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7723 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7724 mov r0, rSELF
7725 add r1, rFP, #OFF_FP_SHADOWFRAME
7726 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7727
7728/* ------------------------------ */
7729 .balign 128
7730.L_ALT_op_move_16: /* 0x03 */
7731/* File: arm/alt_stub.S */
7732/*
7733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7734 * any interesting requests and then jump to the real instruction
7735 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7736 */
7737 .extern MterpCheckBefore
7738 EXPORT_PC
7739 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7740 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
7741 mov r0, rSELF
7742 add r1, rFP, #OFF_FP_SHADOWFRAME
7743 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7744
7745/* ------------------------------ */
7746 .balign 128
7747.L_ALT_op_move_wide: /* 0x04 */
7748/* File: arm/alt_stub.S */
7749/*
7750 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7751 * any interesting requests and then jump to the real instruction
7752 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7753 */
7754 .extern MterpCheckBefore
7755 EXPORT_PC
7756 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7757 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
7758 mov r0, rSELF
7759 add r1, rFP, #OFF_FP_SHADOWFRAME
7760 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7761
7762/* ------------------------------ */
7763 .balign 128
7764.L_ALT_op_move_wide_from16: /* 0x05 */
7765/* File: arm/alt_stub.S */
7766/*
7767 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7768 * any interesting requests and then jump to the real instruction
7769 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7770 */
7771 .extern MterpCheckBefore
7772 EXPORT_PC
7773 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7774 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
7775 mov r0, rSELF
7776 add r1, rFP, #OFF_FP_SHADOWFRAME
7777 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7778
7779/* ------------------------------ */
7780 .balign 128
7781.L_ALT_op_move_wide_16: /* 0x06 */
7782/* File: arm/alt_stub.S */
7783/*
7784 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7785 * any interesting requests and then jump to the real instruction
7786 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7787 */
7788 .extern MterpCheckBefore
7789 EXPORT_PC
7790 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7791 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
7792 mov r0, rSELF
7793 add r1, rFP, #OFF_FP_SHADOWFRAME
7794 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7795
7796/* ------------------------------ */
7797 .balign 128
7798.L_ALT_op_move_object: /* 0x07 */
7799/* File: arm/alt_stub.S */
7800/*
7801 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7802 * any interesting requests and then jump to the real instruction
7803 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7804 */
7805 .extern MterpCheckBefore
7806 EXPORT_PC
7807 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7808 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
7809 mov r0, rSELF
7810 add r1, rFP, #OFF_FP_SHADOWFRAME
7811 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7812
7813/* ------------------------------ */
7814 .balign 128
7815.L_ALT_op_move_object_from16: /* 0x08 */
7816/* File: arm/alt_stub.S */
7817/*
7818 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7819 * any interesting requests and then jump to the real instruction
7820 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7821 */
7822 .extern MterpCheckBefore
7823 EXPORT_PC
7824 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7825 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
7826 mov r0, rSELF
7827 add r1, rFP, #OFF_FP_SHADOWFRAME
7828 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7829
7830/* ------------------------------ */
7831 .balign 128
7832.L_ALT_op_move_object_16: /* 0x09 */
7833/* File: arm/alt_stub.S */
7834/*
7835 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7836 * any interesting requests and then jump to the real instruction
7837 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7838 */
7839 .extern MterpCheckBefore
7840 EXPORT_PC
7841 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7842 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
7843 mov r0, rSELF
7844 add r1, rFP, #OFF_FP_SHADOWFRAME
7845 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7846
7847/* ------------------------------ */
7848 .balign 128
7849.L_ALT_op_move_result: /* 0x0a */
7850/* File: arm/alt_stub.S */
7851/*
7852 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7853 * any interesting requests and then jump to the real instruction
7854 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7855 */
7856 .extern MterpCheckBefore
7857 EXPORT_PC
7858 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7859 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
7860 mov r0, rSELF
7861 add r1, rFP, #OFF_FP_SHADOWFRAME
7862 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7863
7864/* ------------------------------ */
7865 .balign 128
7866.L_ALT_op_move_result_wide: /* 0x0b */
7867/* File: arm/alt_stub.S */
7868/*
7869 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7870 * any interesting requests and then jump to the real instruction
7871 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7872 */
7873 .extern MterpCheckBefore
7874 EXPORT_PC
7875 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7876 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
7877 mov r0, rSELF
7878 add r1, rFP, #OFF_FP_SHADOWFRAME
7879 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7880
7881/* ------------------------------ */
7882 .balign 128
7883.L_ALT_op_move_result_object: /* 0x0c */
7884/* File: arm/alt_stub.S */
7885/*
7886 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7887 * any interesting requests and then jump to the real instruction
7888 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7889 */
7890 .extern MterpCheckBefore
7891 EXPORT_PC
7892 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7893 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
7894 mov r0, rSELF
7895 add r1, rFP, #OFF_FP_SHADOWFRAME
7896 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7897
7898/* ------------------------------ */
7899 .balign 128
7900.L_ALT_op_move_exception: /* 0x0d */
7901/* File: arm/alt_stub.S */
7902/*
7903 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7904 * any interesting requests and then jump to the real instruction
7905 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7906 */
7907 .extern MterpCheckBefore
7908 EXPORT_PC
7909 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7910 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
7911 mov r0, rSELF
7912 add r1, rFP, #OFF_FP_SHADOWFRAME
7913 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7914
7915/* ------------------------------ */
7916 .balign 128
7917.L_ALT_op_return_void: /* 0x0e */
7918/* File: arm/alt_stub.S */
7919/*
7920 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7921 * any interesting requests and then jump to the real instruction
7922 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7923 */
7924 .extern MterpCheckBefore
7925 EXPORT_PC
7926 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7927 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
7928 mov r0, rSELF
7929 add r1, rFP, #OFF_FP_SHADOWFRAME
7930 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7931
7932/* ------------------------------ */
7933 .balign 128
7934.L_ALT_op_return: /* 0x0f */
7935/* File: arm/alt_stub.S */
7936/*
7937 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7938 * any interesting requests and then jump to the real instruction
7939 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7940 */
7941 .extern MterpCheckBefore
7942 EXPORT_PC
7943 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7944 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
7945 mov r0, rSELF
7946 add r1, rFP, #OFF_FP_SHADOWFRAME
7947 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7948
7949/* ------------------------------ */
7950 .balign 128
7951.L_ALT_op_return_wide: /* 0x10 */
7952/* File: arm/alt_stub.S */
7953/*
7954 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7955 * any interesting requests and then jump to the real instruction
7956 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7957 */
7958 .extern MterpCheckBefore
7959 EXPORT_PC
7960 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7961 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
7962 mov r0, rSELF
7963 add r1, rFP, #OFF_FP_SHADOWFRAME
7964 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7965
7966/* ------------------------------ */
7967 .balign 128
7968.L_ALT_op_return_object: /* 0x11 */
7969/* File: arm/alt_stub.S */
7970/*
7971 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7972 * any interesting requests and then jump to the real instruction
7973 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7974 */
7975 .extern MterpCheckBefore
7976 EXPORT_PC
7977 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7978 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
7979 mov r0, rSELF
7980 add r1, rFP, #OFF_FP_SHADOWFRAME
7981 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7982
7983/* ------------------------------ */
7984 .balign 128
7985.L_ALT_op_const_4: /* 0x12 */
7986/* File: arm/alt_stub.S */
7987/*
7988 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7989 * any interesting requests and then jump to the real instruction
7990 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7991 */
7992 .extern MterpCheckBefore
7993 EXPORT_PC
7994 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7995 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
7996 mov r0, rSELF
7997 add r1, rFP, #OFF_FP_SHADOWFRAME
7998 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7999
8000/* ------------------------------ */
8001 .balign 128
8002.L_ALT_op_const_16: /* 0x13 */
8003/* File: arm/alt_stub.S */
8004/*
8005 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8006 * any interesting requests and then jump to the real instruction
8007 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8008 */
8009 .extern MterpCheckBefore
8010 EXPORT_PC
8011 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8012 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8013 mov r0, rSELF
8014 add r1, rFP, #OFF_FP_SHADOWFRAME
8015 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8016
8017/* ------------------------------ */
8018 .balign 128
8019.L_ALT_op_const: /* 0x14 */
8020/* File: arm/alt_stub.S */
8021/*
8022 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8023 * any interesting requests and then jump to the real instruction
8024 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8025 */
8026 .extern MterpCheckBefore
8027 EXPORT_PC
8028 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8029 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8030 mov r0, rSELF
8031 add r1, rFP, #OFF_FP_SHADOWFRAME
8032 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8033
8034/* ------------------------------ */
8035 .balign 128
8036.L_ALT_op_const_high16: /* 0x15 */
8037/* File: arm/alt_stub.S */
8038/*
8039 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8040 * any interesting requests and then jump to the real instruction
8041 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8042 */
8043 .extern MterpCheckBefore
8044 EXPORT_PC
8045 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8046 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8047 mov r0, rSELF
8048 add r1, rFP, #OFF_FP_SHADOWFRAME
8049 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8050
8051/* ------------------------------ */
8052 .balign 128
8053.L_ALT_op_const_wide_16: /* 0x16 */
8054/* File: arm/alt_stub.S */
8055/*
8056 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8057 * any interesting requests and then jump to the real instruction
8058 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8059 */
8060 .extern MterpCheckBefore
8061 EXPORT_PC
8062 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8063 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8064 mov r0, rSELF
8065 add r1, rFP, #OFF_FP_SHADOWFRAME
8066 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8067
8068/* ------------------------------ */
8069 .balign 128
8070.L_ALT_op_const_wide_32: /* 0x17 */
8071/* File: arm/alt_stub.S */
8072/*
8073 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8074 * any interesting requests and then jump to the real instruction
8075 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8076 */
8077 .extern MterpCheckBefore
8078 EXPORT_PC
8079 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8080 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8081 mov r0, rSELF
8082 add r1, rFP, #OFF_FP_SHADOWFRAME
8083 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8084
8085/* ------------------------------ */
8086 .balign 128
8087.L_ALT_op_const_wide: /* 0x18 */
8088/* File: arm/alt_stub.S */
8089/*
8090 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8091 * any interesting requests and then jump to the real instruction
8092 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8093 */
8094 .extern MterpCheckBefore
8095 EXPORT_PC
8096 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8097 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8098 mov r0, rSELF
8099 add r1, rFP, #OFF_FP_SHADOWFRAME
8100 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8101
8102/* ------------------------------ */
8103 .balign 128
8104.L_ALT_op_const_wide_high16: /* 0x19 */
8105/* File: arm/alt_stub.S */
8106/*
8107 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8108 * any interesting requests and then jump to the real instruction
8109 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8110 */
8111 .extern MterpCheckBefore
8112 EXPORT_PC
8113 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8114 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8115 mov r0, rSELF
8116 add r1, rFP, #OFF_FP_SHADOWFRAME
8117 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8118
8119/* ------------------------------ */
8120 .balign 128
8121.L_ALT_op_const_string: /* 0x1a */
8122/* File: arm/alt_stub.S */
8123/*
8124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8125 * any interesting requests and then jump to the real instruction
8126 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8127 */
8128 .extern MterpCheckBefore
8129 EXPORT_PC
8130 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8131 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8132 mov r0, rSELF
8133 add r1, rFP, #OFF_FP_SHADOWFRAME
8134 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8135
8136/* ------------------------------ */
8137 .balign 128
8138.L_ALT_op_const_string_jumbo: /* 0x1b */
8139/* File: arm/alt_stub.S */
8140/*
8141 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8142 * any interesting requests and then jump to the real instruction
8143 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8144 */
8145 .extern MterpCheckBefore
8146 EXPORT_PC
8147 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8148 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8149 mov r0, rSELF
8150 add r1, rFP, #OFF_FP_SHADOWFRAME
8151 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8152
8153/* ------------------------------ */
8154 .balign 128
8155.L_ALT_op_const_class: /* 0x1c */
8156/* File: arm/alt_stub.S */
8157/*
8158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8159 * any interesting requests and then jump to the real instruction
8160 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8161 */
8162 .extern MterpCheckBefore
8163 EXPORT_PC
8164 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8165 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8166 mov r0, rSELF
8167 add r1, rFP, #OFF_FP_SHADOWFRAME
8168 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8169
8170/* ------------------------------ */
8171 .balign 128
8172.L_ALT_op_monitor_enter: /* 0x1d */
8173/* File: arm/alt_stub.S */
8174/*
8175 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8176 * any interesting requests and then jump to the real instruction
8177 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8178 */
8179 .extern MterpCheckBefore
8180 EXPORT_PC
8181 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8182 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8183 mov r0, rSELF
8184 add r1, rFP, #OFF_FP_SHADOWFRAME
8185 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8186
8187/* ------------------------------ */
8188 .balign 128
8189.L_ALT_op_monitor_exit: /* 0x1e */
8190/* File: arm/alt_stub.S */
8191/*
8192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8193 * any interesting requests and then jump to the real instruction
8194 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8195 */
8196 .extern MterpCheckBefore
8197 EXPORT_PC
8198 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8199 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8200 mov r0, rSELF
8201 add r1, rFP, #OFF_FP_SHADOWFRAME
8202 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8203
8204/* ------------------------------ */
8205 .balign 128
8206.L_ALT_op_check_cast: /* 0x1f */
8207/* File: arm/alt_stub.S */
8208/*
8209 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8210 * any interesting requests and then jump to the real instruction
8211 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8212 */
8213 .extern MterpCheckBefore
8214 EXPORT_PC
8215 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8216 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8217 mov r0, rSELF
8218 add r1, rFP, #OFF_FP_SHADOWFRAME
8219 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8220
8221/* ------------------------------ */
8222 .balign 128
8223.L_ALT_op_instance_of: /* 0x20 */
8224/* File: arm/alt_stub.S */
8225/*
8226 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8227 * any interesting requests and then jump to the real instruction
8228 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8229 */
8230 .extern MterpCheckBefore
8231 EXPORT_PC
8232 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8233 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8234 mov r0, rSELF
8235 add r1, rFP, #OFF_FP_SHADOWFRAME
8236 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8237
8238/* ------------------------------ */
8239 .balign 128
8240.L_ALT_op_array_length: /* 0x21 */
8241/* File: arm/alt_stub.S */
8242/*
8243 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8244 * any interesting requests and then jump to the real instruction
8245 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8246 */
8247 .extern MterpCheckBefore
8248 EXPORT_PC
8249 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8250 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8251 mov r0, rSELF
8252 add r1, rFP, #OFF_FP_SHADOWFRAME
8253 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8254
8255/* ------------------------------ */
8256 .balign 128
8257.L_ALT_op_new_instance: /* 0x22 */
8258/* File: arm/alt_stub.S */
8259/*
8260 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8261 * any interesting requests and then jump to the real instruction
8262 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8263 */
8264 .extern MterpCheckBefore
8265 EXPORT_PC
8266 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8267 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8268 mov r0, rSELF
8269 add r1, rFP, #OFF_FP_SHADOWFRAME
8270 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8271
8272/* ------------------------------ */
8273 .balign 128
8274.L_ALT_op_new_array: /* 0x23 */
8275/* File: arm/alt_stub.S */
8276/*
8277 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8278 * any interesting requests and then jump to the real instruction
8279 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8280 */
8281 .extern MterpCheckBefore
8282 EXPORT_PC
8283 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8284 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8285 mov r0, rSELF
8286 add r1, rFP, #OFF_FP_SHADOWFRAME
8287 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8288
8289/* ------------------------------ */
8290 .balign 128
8291.L_ALT_op_filled_new_array: /* 0x24 */
8292/* File: arm/alt_stub.S */
8293/*
8294 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8295 * any interesting requests and then jump to the real instruction
8296 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8297 */
8298 .extern MterpCheckBefore
8299 EXPORT_PC
8300 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8301 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8302 mov r0, rSELF
8303 add r1, rFP, #OFF_FP_SHADOWFRAME
8304 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8305
8306/* ------------------------------ */
8307 .balign 128
8308.L_ALT_op_filled_new_array_range: /* 0x25 */
8309/* File: arm/alt_stub.S */
8310/*
8311 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8312 * any interesting requests and then jump to the real instruction
8313 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8314 */
8315 .extern MterpCheckBefore
8316 EXPORT_PC
8317 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8318 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8319 mov r0, rSELF
8320 add r1, rFP, #OFF_FP_SHADOWFRAME
8321 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8322
8323/* ------------------------------ */
8324 .balign 128
8325.L_ALT_op_fill_array_data: /* 0x26 */
8326/* File: arm/alt_stub.S */
8327/*
8328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8329 * any interesting requests and then jump to the real instruction
8330 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8331 */
8332 .extern MterpCheckBefore
8333 EXPORT_PC
8334 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8335 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8336 mov r0, rSELF
8337 add r1, rFP, #OFF_FP_SHADOWFRAME
8338 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8339
8340/* ------------------------------ */
8341 .balign 128
8342.L_ALT_op_throw: /* 0x27 */
8343/* File: arm/alt_stub.S */
8344/*
8345 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8346 * any interesting requests and then jump to the real instruction
8347 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8348 */
8349 .extern MterpCheckBefore
8350 EXPORT_PC
8351 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8352 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8353 mov r0, rSELF
8354 add r1, rFP, #OFF_FP_SHADOWFRAME
8355 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8356
8357/* ------------------------------ */
8358 .balign 128
8359.L_ALT_op_goto: /* 0x28 */
8360/* File: arm/alt_stub.S */
8361/*
8362 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8363 * any interesting requests and then jump to the real instruction
8364 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8365 */
8366 .extern MterpCheckBefore
8367 EXPORT_PC
8368 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8369 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8370 mov r0, rSELF
8371 add r1, rFP, #OFF_FP_SHADOWFRAME
8372 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8373
8374/* ------------------------------ */
8375 .balign 128
8376.L_ALT_op_goto_16: /* 0x29 */
8377/* File: arm/alt_stub.S */
8378/*
8379 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8380 * any interesting requests and then jump to the real instruction
8381 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8382 */
8383 .extern MterpCheckBefore
8384 EXPORT_PC
8385 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8386 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8387 mov r0, rSELF
8388 add r1, rFP, #OFF_FP_SHADOWFRAME
8389 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8390
8391/* ------------------------------ */
8392 .balign 128
8393.L_ALT_op_goto_32: /* 0x2a */
8394/* File: arm/alt_stub.S */
8395/*
8396 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8397 * any interesting requests and then jump to the real instruction
8398 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8399 */
8400 .extern MterpCheckBefore
8401 EXPORT_PC
8402 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8403 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8404 mov r0, rSELF
8405 add r1, rFP, #OFF_FP_SHADOWFRAME
8406 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8407
8408/* ------------------------------ */
8409 .balign 128
8410.L_ALT_op_packed_switch: /* 0x2b */
8411/* File: arm/alt_stub.S */
8412/*
8413 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8414 * any interesting requests and then jump to the real instruction
8415 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8416 */
8417 .extern MterpCheckBefore
8418 EXPORT_PC
8419 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8420 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8421 mov r0, rSELF
8422 add r1, rFP, #OFF_FP_SHADOWFRAME
8423 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8424
8425/* ------------------------------ */
8426 .balign 128
8427.L_ALT_op_sparse_switch: /* 0x2c */
8428/* File: arm/alt_stub.S */
8429/*
8430 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8431 * any interesting requests and then jump to the real instruction
8432 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8433 */
8434 .extern MterpCheckBefore
8435 EXPORT_PC
8436 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8437 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8438 mov r0, rSELF
8439 add r1, rFP, #OFF_FP_SHADOWFRAME
8440 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8441
8442/* ------------------------------ */
8443 .balign 128
8444.L_ALT_op_cmpl_float: /* 0x2d */
8445/* File: arm/alt_stub.S */
8446/*
8447 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8448 * any interesting requests and then jump to the real instruction
8449 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8450 */
8451 .extern MterpCheckBefore
8452 EXPORT_PC
8453 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8454 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8455 mov r0, rSELF
8456 add r1, rFP, #OFF_FP_SHADOWFRAME
8457 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8458
8459/* ------------------------------ */
8460 .balign 128
8461.L_ALT_op_cmpg_float: /* 0x2e */
8462/* File: arm/alt_stub.S */
8463/*
8464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8465 * any interesting requests and then jump to the real instruction
8466 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8467 */
8468 .extern MterpCheckBefore
8469 EXPORT_PC
8470 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8471 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8472 mov r0, rSELF
8473 add r1, rFP, #OFF_FP_SHADOWFRAME
8474 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8475
8476/* ------------------------------ */
8477 .balign 128
8478.L_ALT_op_cmpl_double: /* 0x2f */
8479/* File: arm/alt_stub.S */
8480/*
8481 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8482 * any interesting requests and then jump to the real instruction
8483 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8484 */
8485 .extern MterpCheckBefore
8486 EXPORT_PC
8487 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8488 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8489 mov r0, rSELF
8490 add r1, rFP, #OFF_FP_SHADOWFRAME
8491 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8492
8493/* ------------------------------ */
8494 .balign 128
8495.L_ALT_op_cmpg_double: /* 0x30 */
8496/* File: arm/alt_stub.S */
8497/*
8498 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8499 * any interesting requests and then jump to the real instruction
8500 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8501 */
8502 .extern MterpCheckBefore
8503 EXPORT_PC
8504 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8505 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8506 mov r0, rSELF
8507 add r1, rFP, #OFF_FP_SHADOWFRAME
8508 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8509
8510/* ------------------------------ */
8511 .balign 128
8512.L_ALT_op_cmp_long: /* 0x31 */
8513/* File: arm/alt_stub.S */
8514/*
8515 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8516 * any interesting requests and then jump to the real instruction
8517 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8518 */
8519 .extern MterpCheckBefore
8520 EXPORT_PC
8521 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8522 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8523 mov r0, rSELF
8524 add r1, rFP, #OFF_FP_SHADOWFRAME
8525 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8526
8527/* ------------------------------ */
8528 .balign 128
8529.L_ALT_op_if_eq: /* 0x32 */
8530/* File: arm/alt_stub.S */
8531/*
8532 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8533 * any interesting requests and then jump to the real instruction
8534 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8535 */
8536 .extern MterpCheckBefore
8537 EXPORT_PC
8538 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8539 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8540 mov r0, rSELF
8541 add r1, rFP, #OFF_FP_SHADOWFRAME
8542 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8543
8544/* ------------------------------ */
8545 .balign 128
8546.L_ALT_op_if_ne: /* 0x33 */
8547/* File: arm/alt_stub.S */
8548/*
8549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8550 * any interesting requests and then jump to the real instruction
8551 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8552 */
8553 .extern MterpCheckBefore
8554 EXPORT_PC
8555 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8556 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8557 mov r0, rSELF
8558 add r1, rFP, #OFF_FP_SHADOWFRAME
8559 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8560
8561/* ------------------------------ */
8562 .balign 128
8563.L_ALT_op_if_lt: /* 0x34 */
8564/* File: arm/alt_stub.S */
8565/*
8566 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8567 * any interesting requests and then jump to the real instruction
8568 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8569 */
8570 .extern MterpCheckBefore
8571 EXPORT_PC
8572 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8573 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8574 mov r0, rSELF
8575 add r1, rFP, #OFF_FP_SHADOWFRAME
8576 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8577
8578/* ------------------------------ */
8579 .balign 128
8580.L_ALT_op_if_ge: /* 0x35 */
8581/* File: arm/alt_stub.S */
8582/*
8583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8584 * any interesting requests and then jump to the real instruction
8585 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8586 */
8587 .extern MterpCheckBefore
8588 EXPORT_PC
8589 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8590 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8591 mov r0, rSELF
8592 add r1, rFP, #OFF_FP_SHADOWFRAME
8593 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8594
8595/* ------------------------------ */
8596 .balign 128
8597.L_ALT_op_if_gt: /* 0x36 */
8598/* File: arm/alt_stub.S */
8599/*
8600 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8601 * any interesting requests and then jump to the real instruction
8602 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8603 */
8604 .extern MterpCheckBefore
8605 EXPORT_PC
8606 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8607 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8608 mov r0, rSELF
8609 add r1, rFP, #OFF_FP_SHADOWFRAME
8610 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8611
8612/* ------------------------------ */
8613 .balign 128
8614.L_ALT_op_if_le: /* 0x37 */
8615/* File: arm/alt_stub.S */
8616/*
8617 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8618 * any interesting requests and then jump to the real instruction
8619 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8620 */
8621 .extern MterpCheckBefore
8622 EXPORT_PC
8623 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8624 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8625 mov r0, rSELF
8626 add r1, rFP, #OFF_FP_SHADOWFRAME
8627 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8628
8629/* ------------------------------ */
8630 .balign 128
8631.L_ALT_op_if_eqz: /* 0x38 */
8632/* File: arm/alt_stub.S */
8633/*
8634 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8635 * any interesting requests and then jump to the real instruction
8636 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8637 */
8638 .extern MterpCheckBefore
8639 EXPORT_PC
8640 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8641 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8642 mov r0, rSELF
8643 add r1, rFP, #OFF_FP_SHADOWFRAME
8644 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8645
8646/* ------------------------------ */
8647 .balign 128
8648.L_ALT_op_if_nez: /* 0x39 */
8649/* File: arm/alt_stub.S */
8650/*
8651 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8652 * any interesting requests and then jump to the real instruction
8653 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8654 */
8655 .extern MterpCheckBefore
8656 EXPORT_PC
8657 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8658 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8659 mov r0, rSELF
8660 add r1, rFP, #OFF_FP_SHADOWFRAME
8661 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8662
8663/* ------------------------------ */
8664 .balign 128
8665.L_ALT_op_if_ltz: /* 0x3a */
8666/* File: arm/alt_stub.S */
8667/*
8668 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8669 * any interesting requests and then jump to the real instruction
8670 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8671 */
8672 .extern MterpCheckBefore
8673 EXPORT_PC
8674 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8675 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8676 mov r0, rSELF
8677 add r1, rFP, #OFF_FP_SHADOWFRAME
8678 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8679
8680/* ------------------------------ */
8681 .balign 128
8682.L_ALT_op_if_gez: /* 0x3b */
8683/* File: arm/alt_stub.S */
8684/*
8685 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8686 * any interesting requests and then jump to the real instruction
8687 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8688 */
8689 .extern MterpCheckBefore
8690 EXPORT_PC
8691 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8692 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8693 mov r0, rSELF
8694 add r1, rFP, #OFF_FP_SHADOWFRAME
8695 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8696
8697/* ------------------------------ */
8698 .balign 128
8699.L_ALT_op_if_gtz: /* 0x3c */
8700/* File: arm/alt_stub.S */
8701/*
8702 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8703 * any interesting requests and then jump to the real instruction
8704 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8705 */
8706 .extern MterpCheckBefore
8707 EXPORT_PC
8708 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8709 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8710 mov r0, rSELF
8711 add r1, rFP, #OFF_FP_SHADOWFRAME
8712 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8713
8714/* ------------------------------ */
8715 .balign 128
8716.L_ALT_op_if_lez: /* 0x3d */
8717/* File: arm/alt_stub.S */
8718/*
8719 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8720 * any interesting requests and then jump to the real instruction
8721 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8722 */
8723 .extern MterpCheckBefore
8724 EXPORT_PC
8725 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8726 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8727 mov r0, rSELF
8728 add r1, rFP, #OFF_FP_SHADOWFRAME
8729 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8730
8731/* ------------------------------ */
8732 .balign 128
8733.L_ALT_op_unused_3e: /* 0x3e */
8734/* File: arm/alt_stub.S */
8735/*
8736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8737 * any interesting requests and then jump to the real instruction
8738 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8739 */
8740 .extern MterpCheckBefore
8741 EXPORT_PC
8742 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8743 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
8744 mov r0, rSELF
8745 add r1, rFP, #OFF_FP_SHADOWFRAME
8746 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8747
8748/* ------------------------------ */
8749 .balign 128
8750.L_ALT_op_unused_3f: /* 0x3f */
8751/* File: arm/alt_stub.S */
8752/*
8753 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8754 * any interesting requests and then jump to the real instruction
8755 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8756 */
8757 .extern MterpCheckBefore
8758 EXPORT_PC
8759 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8760 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
8761 mov r0, rSELF
8762 add r1, rFP, #OFF_FP_SHADOWFRAME
8763 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8764
8765/* ------------------------------ */
8766 .balign 128
8767.L_ALT_op_unused_40: /* 0x40 */
8768/* File: arm/alt_stub.S */
8769/*
8770 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8771 * any interesting requests and then jump to the real instruction
8772 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8773 */
8774 .extern MterpCheckBefore
8775 EXPORT_PC
8776 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8777 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
8778 mov r0, rSELF
8779 add r1, rFP, #OFF_FP_SHADOWFRAME
8780 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8781
8782/* ------------------------------ */
8783 .balign 128
8784.L_ALT_op_unused_41: /* 0x41 */
8785/* File: arm/alt_stub.S */
8786/*
8787 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8788 * any interesting requests and then jump to the real instruction
8789 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8790 */
8791 .extern MterpCheckBefore
8792 EXPORT_PC
8793 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8794 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
8795 mov r0, rSELF
8796 add r1, rFP, #OFF_FP_SHADOWFRAME
8797 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8798
8799/* ------------------------------ */
8800 .balign 128
8801.L_ALT_op_unused_42: /* 0x42 */
8802/* File: arm/alt_stub.S */
8803/*
8804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8805 * any interesting requests and then jump to the real instruction
8806 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8807 */
8808 .extern MterpCheckBefore
8809 EXPORT_PC
8810 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8811 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
8812 mov r0, rSELF
8813 add r1, rFP, #OFF_FP_SHADOWFRAME
8814 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8815
8816/* ------------------------------ */
8817 .balign 128
8818.L_ALT_op_unused_43: /* 0x43 */
8819/* File: arm/alt_stub.S */
8820/*
8821 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8822 * any interesting requests and then jump to the real instruction
8823 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8824 */
8825 .extern MterpCheckBefore
8826 EXPORT_PC
8827 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8828 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
8829 mov r0, rSELF
8830 add r1, rFP, #OFF_FP_SHADOWFRAME
8831 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8832
8833/* ------------------------------ */
8834 .balign 128
8835.L_ALT_op_aget: /* 0x44 */
8836/* File: arm/alt_stub.S */
8837/*
8838 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8839 * any interesting requests and then jump to the real instruction
8840 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8841 */
8842 .extern MterpCheckBefore
8843 EXPORT_PC
8844 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8845 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
8846 mov r0, rSELF
8847 add r1, rFP, #OFF_FP_SHADOWFRAME
8848 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8849
8850/* ------------------------------ */
8851 .balign 128
8852.L_ALT_op_aget_wide: /* 0x45 */
8853/* File: arm/alt_stub.S */
8854/*
8855 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8856 * any interesting requests and then jump to the real instruction
8857 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8858 */
8859 .extern MterpCheckBefore
8860 EXPORT_PC
8861 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8862 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
8863 mov r0, rSELF
8864 add r1, rFP, #OFF_FP_SHADOWFRAME
8865 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8866
8867/* ------------------------------ */
8868 .balign 128
8869.L_ALT_op_aget_object: /* 0x46 */
8870/* File: arm/alt_stub.S */
8871/*
8872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8873 * any interesting requests and then jump to the real instruction
8874 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8875 */
8876 .extern MterpCheckBefore
8877 EXPORT_PC
8878 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8879 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
8880 mov r0, rSELF
8881 add r1, rFP, #OFF_FP_SHADOWFRAME
8882 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8883
8884/* ------------------------------ */
8885 .balign 128
8886.L_ALT_op_aget_boolean: /* 0x47 */
8887/* File: arm/alt_stub.S */
8888/*
8889 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8890 * any interesting requests and then jump to the real instruction
8891 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8892 */
8893 .extern MterpCheckBefore
8894 EXPORT_PC
8895 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8896 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
8897 mov r0, rSELF
8898 add r1, rFP, #OFF_FP_SHADOWFRAME
8899 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8900
8901/* ------------------------------ */
8902 .balign 128
8903.L_ALT_op_aget_byte: /* 0x48 */
8904/* File: arm/alt_stub.S */
8905/*
8906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8907 * any interesting requests and then jump to the real instruction
8908 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8909 */
8910 .extern MterpCheckBefore
8911 EXPORT_PC
8912 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8913 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
8914 mov r0, rSELF
8915 add r1, rFP, #OFF_FP_SHADOWFRAME
8916 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8917
8918/* ------------------------------ */
8919 .balign 128
8920.L_ALT_op_aget_char: /* 0x49 */
8921/* File: arm/alt_stub.S */
8922/*
8923 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8924 * any interesting requests and then jump to the real instruction
8925 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8926 */
8927 .extern MterpCheckBefore
8928 EXPORT_PC
8929 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8930 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
8931 mov r0, rSELF
8932 add r1, rFP, #OFF_FP_SHADOWFRAME
8933 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8934
8935/* ------------------------------ */
8936 .balign 128
8937.L_ALT_op_aget_short: /* 0x4a */
8938/* File: arm/alt_stub.S */
8939/*
8940 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8941 * any interesting requests and then jump to the real instruction
8942 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8943 */
8944 .extern MterpCheckBefore
8945 EXPORT_PC
8946 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8947 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
8948 mov r0, rSELF
8949 add r1, rFP, #OFF_FP_SHADOWFRAME
8950 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8951
8952/* ------------------------------ */
8953 .balign 128
8954.L_ALT_op_aput: /* 0x4b */
8955/* File: arm/alt_stub.S */
8956/*
8957 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8958 * any interesting requests and then jump to the real instruction
8959 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8960 */
8961 .extern MterpCheckBefore
8962 EXPORT_PC
8963 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8964 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
8965 mov r0, rSELF
8966 add r1, rFP, #OFF_FP_SHADOWFRAME
8967 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8968
8969/* ------------------------------ */
8970 .balign 128
8971.L_ALT_op_aput_wide: /* 0x4c */
8972/* File: arm/alt_stub.S */
8973/*
8974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8975 * any interesting requests and then jump to the real instruction
8976 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8977 */
8978 .extern MterpCheckBefore
8979 EXPORT_PC
8980 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8981 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
8982 mov r0, rSELF
8983 add r1, rFP, #OFF_FP_SHADOWFRAME
8984 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8985
8986/* ------------------------------ */
8987 .balign 128
8988.L_ALT_op_aput_object: /* 0x4d */
8989/* File: arm/alt_stub.S */
8990/*
8991 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8992 * any interesting requests and then jump to the real instruction
8993 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8994 */
8995 .extern MterpCheckBefore
8996 EXPORT_PC
8997 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8998 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
8999 mov r0, rSELF
9000 add r1, rFP, #OFF_FP_SHADOWFRAME
9001 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9002
9003/* ------------------------------ */
9004 .balign 128
9005.L_ALT_op_aput_boolean: /* 0x4e */
9006/* File: arm/alt_stub.S */
9007/*
9008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9009 * any interesting requests and then jump to the real instruction
9010 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9011 */
9012 .extern MterpCheckBefore
9013 EXPORT_PC
9014 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9015 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9016 mov r0, rSELF
9017 add r1, rFP, #OFF_FP_SHADOWFRAME
9018 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9019
9020/* ------------------------------ */
9021 .balign 128
9022.L_ALT_op_aput_byte: /* 0x4f */
9023/* File: arm/alt_stub.S */
9024/*
9025 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9026 * any interesting requests and then jump to the real instruction
9027 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9028 */
9029 .extern MterpCheckBefore
9030 EXPORT_PC
9031 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9032 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9033 mov r0, rSELF
9034 add r1, rFP, #OFF_FP_SHADOWFRAME
9035 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9036
9037/* ------------------------------ */
9038 .balign 128
9039.L_ALT_op_aput_char: /* 0x50 */
9040/* File: arm/alt_stub.S */
9041/*
9042 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9043 * any interesting requests and then jump to the real instruction
9044 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9045 */
9046 .extern MterpCheckBefore
9047 EXPORT_PC
9048 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9049 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9050 mov r0, rSELF
9051 add r1, rFP, #OFF_FP_SHADOWFRAME
9052 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9053
9054/* ------------------------------ */
9055 .balign 128
9056.L_ALT_op_aput_short: /* 0x51 */
9057/* File: arm/alt_stub.S */
9058/*
9059 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9060 * any interesting requests and then jump to the real instruction
9061 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9062 */
9063 .extern MterpCheckBefore
9064 EXPORT_PC
9065 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9066 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9067 mov r0, rSELF
9068 add r1, rFP, #OFF_FP_SHADOWFRAME
9069 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9070
9071/* ------------------------------ */
9072 .balign 128
9073.L_ALT_op_iget: /* 0x52 */
9074/* File: arm/alt_stub.S */
9075/*
9076 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9077 * any interesting requests and then jump to the real instruction
9078 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9079 */
9080 .extern MterpCheckBefore
9081 EXPORT_PC
9082 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9083 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9084 mov r0, rSELF
9085 add r1, rFP, #OFF_FP_SHADOWFRAME
9086 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9087
9088/* ------------------------------ */
9089 .balign 128
9090.L_ALT_op_iget_wide: /* 0x53 */
9091/* File: arm/alt_stub.S */
9092/*
9093 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9094 * any interesting requests and then jump to the real instruction
9095 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9096 */
9097 .extern MterpCheckBefore
9098 EXPORT_PC
9099 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9100 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9101 mov r0, rSELF
9102 add r1, rFP, #OFF_FP_SHADOWFRAME
9103 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9104
9105/* ------------------------------ */
9106 .balign 128
9107.L_ALT_op_iget_object: /* 0x54 */
9108/* File: arm/alt_stub.S */
9109/*
9110 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9111 * any interesting requests and then jump to the real instruction
9112 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9113 */
9114 .extern MterpCheckBefore
9115 EXPORT_PC
9116 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9117 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9118 mov r0, rSELF
9119 add r1, rFP, #OFF_FP_SHADOWFRAME
9120 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9121
9122/* ------------------------------ */
9123 .balign 128
9124.L_ALT_op_iget_boolean: /* 0x55 */
9125/* File: arm/alt_stub.S */
9126/*
9127 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9128 * any interesting requests and then jump to the real instruction
9129 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9130 */
9131 .extern MterpCheckBefore
9132 EXPORT_PC
9133 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9134 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9135 mov r0, rSELF
9136 add r1, rFP, #OFF_FP_SHADOWFRAME
9137 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9138
9139/* ------------------------------ */
9140 .balign 128
9141.L_ALT_op_iget_byte: /* 0x56 */
9142/* File: arm/alt_stub.S */
9143/*
9144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9145 * any interesting requests and then jump to the real instruction
9146 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9147 */
9148 .extern MterpCheckBefore
9149 EXPORT_PC
9150 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9151 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9152 mov r0, rSELF
9153 add r1, rFP, #OFF_FP_SHADOWFRAME
9154 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9155
9156/* ------------------------------ */
9157 .balign 128
9158.L_ALT_op_iget_char: /* 0x57 */
9159/* File: arm/alt_stub.S */
9160/*
9161 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9162 * any interesting requests and then jump to the real instruction
9163 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9164 */
9165 .extern MterpCheckBefore
9166 EXPORT_PC
9167 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9168 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9169 mov r0, rSELF
9170 add r1, rFP, #OFF_FP_SHADOWFRAME
9171 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9172
9173/* ------------------------------ */
9174 .balign 128
9175.L_ALT_op_iget_short: /* 0x58 */
9176/* File: arm/alt_stub.S */
9177/*
9178 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9179 * any interesting requests and then jump to the real instruction
9180 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9181 */
9182 .extern MterpCheckBefore
9183 EXPORT_PC
9184 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9185 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9186 mov r0, rSELF
9187 add r1, rFP, #OFF_FP_SHADOWFRAME
9188 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9189
9190/* ------------------------------ */
9191 .balign 128
9192.L_ALT_op_iput: /* 0x59 */
9193/* File: arm/alt_stub.S */
9194/*
9195 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9196 * any interesting requests and then jump to the real instruction
9197 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9198 */
9199 .extern MterpCheckBefore
9200 EXPORT_PC
9201 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9202 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9203 mov r0, rSELF
9204 add r1, rFP, #OFF_FP_SHADOWFRAME
9205 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9206
9207/* ------------------------------ */
9208 .balign 128
9209.L_ALT_op_iput_wide: /* 0x5a */
9210/* File: arm/alt_stub.S */
9211/*
9212 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9213 * any interesting requests and then jump to the real instruction
9214 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9215 */
9216 .extern MterpCheckBefore
9217 EXPORT_PC
9218 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9219 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9220 mov r0, rSELF
9221 add r1, rFP, #OFF_FP_SHADOWFRAME
9222 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9223
9224/* ------------------------------ */
9225 .balign 128
9226.L_ALT_op_iput_object: /* 0x5b */
9227/* File: arm/alt_stub.S */
9228/*
9229 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9230 * any interesting requests and then jump to the real instruction
9231 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9232 */
9233 .extern MterpCheckBefore
9234 EXPORT_PC
9235 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9236 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9237 mov r0, rSELF
9238 add r1, rFP, #OFF_FP_SHADOWFRAME
9239 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9240
9241/* ------------------------------ */
9242 .balign 128
9243.L_ALT_op_iput_boolean: /* 0x5c */
9244/* File: arm/alt_stub.S */
9245/*
9246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9247 * any interesting requests and then jump to the real instruction
9248 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9249 */
9250 .extern MterpCheckBefore
9251 EXPORT_PC
9252 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9253 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9254 mov r0, rSELF
9255 add r1, rFP, #OFF_FP_SHADOWFRAME
9256 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9257
9258/* ------------------------------ */
9259 .balign 128
9260.L_ALT_op_iput_byte: /* 0x5d */
9261/* File: arm/alt_stub.S */
9262/*
9263 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9264 * any interesting requests and then jump to the real instruction
9265 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9266 */
9267 .extern MterpCheckBefore
9268 EXPORT_PC
9269 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9270 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9271 mov r0, rSELF
9272 add r1, rFP, #OFF_FP_SHADOWFRAME
9273 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9274
9275/* ------------------------------ */
9276 .balign 128
9277.L_ALT_op_iput_char: /* 0x5e */
9278/* File: arm/alt_stub.S */
9279/*
9280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9281 * any interesting requests and then jump to the real instruction
9282 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9283 */
9284 .extern MterpCheckBefore
9285 EXPORT_PC
9286 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9287 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9288 mov r0, rSELF
9289 add r1, rFP, #OFF_FP_SHADOWFRAME
9290 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9291
9292/* ------------------------------ */
9293 .balign 128
9294.L_ALT_op_iput_short: /* 0x5f */
9295/* File: arm/alt_stub.S */
9296/*
9297 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9298 * any interesting requests and then jump to the real instruction
9299 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9300 */
9301 .extern MterpCheckBefore
9302 EXPORT_PC
9303 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9304 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9305 mov r0, rSELF
9306 add r1, rFP, #OFF_FP_SHADOWFRAME
9307 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9308
9309/* ------------------------------ */
9310 .balign 128
9311.L_ALT_op_sget: /* 0x60 */
9312/* File: arm/alt_stub.S */
9313/*
9314 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9315 * any interesting requests and then jump to the real instruction
9316 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9317 */
9318 .extern MterpCheckBefore
9319 EXPORT_PC
9320 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9321 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9322 mov r0, rSELF
9323 add r1, rFP, #OFF_FP_SHADOWFRAME
9324 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9325
9326/* ------------------------------ */
9327 .balign 128
9328.L_ALT_op_sget_wide: /* 0x61 */
9329/* File: arm/alt_stub.S */
9330/*
9331 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9332 * any interesting requests and then jump to the real instruction
9333 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9334 */
9335 .extern MterpCheckBefore
9336 EXPORT_PC
9337 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9338 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9339 mov r0, rSELF
9340 add r1, rFP, #OFF_FP_SHADOWFRAME
9341 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9342
9343/* ------------------------------ */
9344 .balign 128
9345.L_ALT_op_sget_object: /* 0x62 */
9346/* File: arm/alt_stub.S */
9347/*
9348 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9349 * any interesting requests and then jump to the real instruction
9350 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9351 */
9352 .extern MterpCheckBefore
9353 EXPORT_PC
9354 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9355 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9356 mov r0, rSELF
9357 add r1, rFP, #OFF_FP_SHADOWFRAME
9358 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9359
9360/* ------------------------------ */
9361 .balign 128
9362.L_ALT_op_sget_boolean: /* 0x63 */
9363/* File: arm/alt_stub.S */
9364/*
9365 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9366 * any interesting requests and then jump to the real instruction
9367 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9368 */
9369 .extern MterpCheckBefore
9370 EXPORT_PC
9371 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9372 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9373 mov r0, rSELF
9374 add r1, rFP, #OFF_FP_SHADOWFRAME
9375 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9376
9377/* ------------------------------ */
9378 .balign 128
9379.L_ALT_op_sget_byte: /* 0x64 */
9380/* File: arm/alt_stub.S */
9381/*
9382 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9383 * any interesting requests and then jump to the real instruction
9384 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9385 */
9386 .extern MterpCheckBefore
9387 EXPORT_PC
9388 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9389 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9390 mov r0, rSELF
9391 add r1, rFP, #OFF_FP_SHADOWFRAME
9392 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9393
9394/* ------------------------------ */
9395 .balign 128
9396.L_ALT_op_sget_char: /* 0x65 */
9397/* File: arm/alt_stub.S */
9398/*
9399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9400 * any interesting requests and then jump to the real instruction
9401 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9402 */
9403 .extern MterpCheckBefore
9404 EXPORT_PC
9405 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9406 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9407 mov r0, rSELF
9408 add r1, rFP, #OFF_FP_SHADOWFRAME
9409 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9410
9411/* ------------------------------ */
9412 .balign 128
9413.L_ALT_op_sget_short: /* 0x66 */
9414/* File: arm/alt_stub.S */
9415/*
9416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9417 * any interesting requests and then jump to the real instruction
9418 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9419 */
9420 .extern MterpCheckBefore
9421 EXPORT_PC
9422 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9423 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9424 mov r0, rSELF
9425 add r1, rFP, #OFF_FP_SHADOWFRAME
9426 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9427
9428/* ------------------------------ */
9429 .balign 128
9430.L_ALT_op_sput: /* 0x67 */
9431/* File: arm/alt_stub.S */
9432/*
9433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9434 * any interesting requests and then jump to the real instruction
9435 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9436 */
9437 .extern MterpCheckBefore
9438 EXPORT_PC
9439 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9440 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9441 mov r0, rSELF
9442 add r1, rFP, #OFF_FP_SHADOWFRAME
9443 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9444
9445/* ------------------------------ */
9446 .balign 128
9447.L_ALT_op_sput_wide: /* 0x68 */
9448/* File: arm/alt_stub.S */
9449/*
9450 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9451 * any interesting requests and then jump to the real instruction
9452 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9453 */
9454 .extern MterpCheckBefore
9455 EXPORT_PC
9456 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9457 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9458 mov r0, rSELF
9459 add r1, rFP, #OFF_FP_SHADOWFRAME
9460 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9461
9462/* ------------------------------ */
9463 .balign 128
9464.L_ALT_op_sput_object: /* 0x69 */
9465/* File: arm/alt_stub.S */
9466/*
9467 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9468 * any interesting requests and then jump to the real instruction
9469 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9470 */
9471 .extern MterpCheckBefore
9472 EXPORT_PC
9473 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9474 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9475 mov r0, rSELF
9476 add r1, rFP, #OFF_FP_SHADOWFRAME
9477 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9478
9479/* ------------------------------ */
9480 .balign 128
9481.L_ALT_op_sput_boolean: /* 0x6a */
9482/* File: arm/alt_stub.S */
9483/*
9484 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9485 * any interesting requests and then jump to the real instruction
9486 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9487 */
9488 .extern MterpCheckBefore
9489 EXPORT_PC
9490 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9491 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9492 mov r0, rSELF
9493 add r1, rFP, #OFF_FP_SHADOWFRAME
9494 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9495
9496/* ------------------------------ */
9497 .balign 128
9498.L_ALT_op_sput_byte: /* 0x6b */
9499/* File: arm/alt_stub.S */
9500/*
9501 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9502 * any interesting requests and then jump to the real instruction
9503 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9504 */
9505 .extern MterpCheckBefore
9506 EXPORT_PC
9507 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9508 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9509 mov r0, rSELF
9510 add r1, rFP, #OFF_FP_SHADOWFRAME
9511 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9512
9513/* ------------------------------ */
9514 .balign 128
9515.L_ALT_op_sput_char: /* 0x6c */
9516/* File: arm/alt_stub.S */
9517/*
9518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9519 * any interesting requests and then jump to the real instruction
9520 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9521 */
9522 .extern MterpCheckBefore
9523 EXPORT_PC
9524 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9525 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9526 mov r0, rSELF
9527 add r1, rFP, #OFF_FP_SHADOWFRAME
9528 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9529
9530/* ------------------------------ */
9531 .balign 128
9532.L_ALT_op_sput_short: /* 0x6d */
9533/* File: arm/alt_stub.S */
9534/*
9535 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9536 * any interesting requests and then jump to the real instruction
9537 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9538 */
9539 .extern MterpCheckBefore
9540 EXPORT_PC
9541 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9542 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9543 mov r0, rSELF
9544 add r1, rFP, #OFF_FP_SHADOWFRAME
9545 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9546
9547/* ------------------------------ */
9548 .balign 128
9549.L_ALT_op_invoke_virtual: /* 0x6e */
9550/* File: arm/alt_stub.S */
9551/*
9552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9553 * any interesting requests and then jump to the real instruction
9554 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9555 */
9556 .extern MterpCheckBefore
9557 EXPORT_PC
9558 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9559 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9560 mov r0, rSELF
9561 add r1, rFP, #OFF_FP_SHADOWFRAME
9562 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9563
9564/* ------------------------------ */
9565 .balign 128
9566.L_ALT_op_invoke_super: /* 0x6f */
9567/* File: arm/alt_stub.S */
9568/*
9569 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9570 * any interesting requests and then jump to the real instruction
9571 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9572 */
9573 .extern MterpCheckBefore
9574 EXPORT_PC
9575 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9576 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9577 mov r0, rSELF
9578 add r1, rFP, #OFF_FP_SHADOWFRAME
9579 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9580
9581/* ------------------------------ */
9582 .balign 128
9583.L_ALT_op_invoke_direct: /* 0x70 */
9584/* File: arm/alt_stub.S */
9585/*
9586 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9587 * any interesting requests and then jump to the real instruction
9588 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9589 */
9590 .extern MterpCheckBefore
9591 EXPORT_PC
9592 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9593 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9594 mov r0, rSELF
9595 add r1, rFP, #OFF_FP_SHADOWFRAME
9596 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9597
9598/* ------------------------------ */
9599 .balign 128
9600.L_ALT_op_invoke_static: /* 0x71 */
9601/* File: arm/alt_stub.S */
9602/*
9603 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9604 * any interesting requests and then jump to the real instruction
9605 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9606 */
9607 .extern MterpCheckBefore
9608 EXPORT_PC
9609 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9610 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9611 mov r0, rSELF
9612 add r1, rFP, #OFF_FP_SHADOWFRAME
9613 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9614
9615/* ------------------------------ */
9616 .balign 128
9617.L_ALT_op_invoke_interface: /* 0x72 */
9618/* File: arm/alt_stub.S */
9619/*
9620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9621 * any interesting requests and then jump to the real instruction
9622 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9623 */
9624 .extern MterpCheckBefore
9625 EXPORT_PC
9626 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9627 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9628 mov r0, rSELF
9629 add r1, rFP, #OFF_FP_SHADOWFRAME
9630 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9631
9632/* ------------------------------ */
9633 .balign 128
9634.L_ALT_op_return_void_no_barrier: /* 0x73 */
9635/* File: arm/alt_stub.S */
9636/*
9637 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9638 * any interesting requests and then jump to the real instruction
9639 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9640 */
9641 .extern MterpCheckBefore
9642 EXPORT_PC
9643 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9644 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9645 mov r0, rSELF
9646 add r1, rFP, #OFF_FP_SHADOWFRAME
9647 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9648
9649/* ------------------------------ */
9650 .balign 128
9651.L_ALT_op_invoke_virtual_range: /* 0x74 */
9652/* File: arm/alt_stub.S */
9653/*
9654 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9655 * any interesting requests and then jump to the real instruction
9656 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9657 */
9658 .extern MterpCheckBefore
9659 EXPORT_PC
9660 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9661 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9662 mov r0, rSELF
9663 add r1, rFP, #OFF_FP_SHADOWFRAME
9664 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9665
9666/* ------------------------------ */
9667 .balign 128
9668.L_ALT_op_invoke_super_range: /* 0x75 */
9669/* File: arm/alt_stub.S */
9670/*
9671 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9672 * any interesting requests and then jump to the real instruction
9673 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9674 */
9675 .extern MterpCheckBefore
9676 EXPORT_PC
9677 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9678 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9679 mov r0, rSELF
9680 add r1, rFP, #OFF_FP_SHADOWFRAME
9681 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9682
9683/* ------------------------------ */
9684 .balign 128
9685.L_ALT_op_invoke_direct_range: /* 0x76 */
9686/* File: arm/alt_stub.S */
9687/*
9688 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9689 * any interesting requests and then jump to the real instruction
9690 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9691 */
9692 .extern MterpCheckBefore
9693 EXPORT_PC
9694 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9695 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9696 mov r0, rSELF
9697 add r1, rFP, #OFF_FP_SHADOWFRAME
9698 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9699
9700/* ------------------------------ */
9701 .balign 128
9702.L_ALT_op_invoke_static_range: /* 0x77 */
9703/* File: arm/alt_stub.S */
9704/*
9705 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9706 * any interesting requests and then jump to the real instruction
9707 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9708 */
9709 .extern MterpCheckBefore
9710 EXPORT_PC
9711 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9712 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9713 mov r0, rSELF
9714 add r1, rFP, #OFF_FP_SHADOWFRAME
9715 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9716
9717/* ------------------------------ */
9718 .balign 128
9719.L_ALT_op_invoke_interface_range: /* 0x78 */
9720/* File: arm/alt_stub.S */
9721/*
9722 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9723 * any interesting requests and then jump to the real instruction
9724 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9725 */
9726 .extern MterpCheckBefore
9727 EXPORT_PC
9728 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9729 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
9730 mov r0, rSELF
9731 add r1, rFP, #OFF_FP_SHADOWFRAME
9732 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9733
9734/* ------------------------------ */
9735 .balign 128
9736.L_ALT_op_unused_79: /* 0x79 */
9737/* File: arm/alt_stub.S */
9738/*
9739 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9740 * any interesting requests and then jump to the real instruction
9741 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9742 */
9743 .extern MterpCheckBefore
9744 EXPORT_PC
9745 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9746 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
9747 mov r0, rSELF
9748 add r1, rFP, #OFF_FP_SHADOWFRAME
9749 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9750
9751/* ------------------------------ */
9752 .balign 128
9753.L_ALT_op_unused_7a: /* 0x7a */
9754/* File: arm/alt_stub.S */
9755/*
9756 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9757 * any interesting requests and then jump to the real instruction
9758 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9759 */
9760 .extern MterpCheckBefore
9761 EXPORT_PC
9762 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9763 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
9764 mov r0, rSELF
9765 add r1, rFP, #OFF_FP_SHADOWFRAME
9766 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9767
9768/* ------------------------------ */
9769 .balign 128
9770.L_ALT_op_neg_int: /* 0x7b */
9771/* File: arm/alt_stub.S */
9772/*
9773 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9774 * any interesting requests and then jump to the real instruction
9775 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9776 */
9777 .extern MterpCheckBefore
9778 EXPORT_PC
9779 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9780 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
9781 mov r0, rSELF
9782 add r1, rFP, #OFF_FP_SHADOWFRAME
9783 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9784
9785/* ------------------------------ */
9786 .balign 128
9787.L_ALT_op_not_int: /* 0x7c */
9788/* File: arm/alt_stub.S */
9789/*
9790 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9791 * any interesting requests and then jump to the real instruction
9792 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9793 */
9794 .extern MterpCheckBefore
9795 EXPORT_PC
9796 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9797 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
9798 mov r0, rSELF
9799 add r1, rFP, #OFF_FP_SHADOWFRAME
9800 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9801
9802/* ------------------------------ */
9803 .balign 128
9804.L_ALT_op_neg_long: /* 0x7d */
9805/* File: arm/alt_stub.S */
9806/*
9807 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9808 * any interesting requests and then jump to the real instruction
9809 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9810 */
9811 .extern MterpCheckBefore
9812 EXPORT_PC
9813 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9814 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
9815 mov r0, rSELF
9816 add r1, rFP, #OFF_FP_SHADOWFRAME
9817 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9818
9819/* ------------------------------ */
9820 .balign 128
9821.L_ALT_op_not_long: /* 0x7e */
9822/* File: arm/alt_stub.S */
9823/*
9824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9825 * any interesting requests and then jump to the real instruction
9826 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9827 */
9828 .extern MterpCheckBefore
9829 EXPORT_PC
9830 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9831 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
9832 mov r0, rSELF
9833 add r1, rFP, #OFF_FP_SHADOWFRAME
9834 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9835
9836/* ------------------------------ */
9837 .balign 128
9838.L_ALT_op_neg_float: /* 0x7f */
9839/* File: arm/alt_stub.S */
9840/*
9841 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9842 * any interesting requests and then jump to the real instruction
9843 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9844 */
9845 .extern MterpCheckBefore
9846 EXPORT_PC
9847 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9848 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
9849 mov r0, rSELF
9850 add r1, rFP, #OFF_FP_SHADOWFRAME
9851 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9852
9853/* ------------------------------ */
9854 .balign 128
9855.L_ALT_op_neg_double: /* 0x80 */
9856/* File: arm/alt_stub.S */
9857/*
9858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9859 * any interesting requests and then jump to the real instruction
9860 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9861 */
9862 .extern MterpCheckBefore
9863 EXPORT_PC
9864 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9865 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
9866 mov r0, rSELF
9867 add r1, rFP, #OFF_FP_SHADOWFRAME
9868 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9869
9870/* ------------------------------ */
9871 .balign 128
9872.L_ALT_op_int_to_long: /* 0x81 */
9873/* File: arm/alt_stub.S */
9874/*
9875 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9876 * any interesting requests and then jump to the real instruction
9877 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9878 */
9879 .extern MterpCheckBefore
9880 EXPORT_PC
9881 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9882 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
9883 mov r0, rSELF
9884 add r1, rFP, #OFF_FP_SHADOWFRAME
9885 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9886
9887/* ------------------------------ */
9888 .balign 128
9889.L_ALT_op_int_to_float: /* 0x82 */
9890/* File: arm/alt_stub.S */
9891/*
9892 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9893 * any interesting requests and then jump to the real instruction
9894 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9895 */
9896 .extern MterpCheckBefore
9897 EXPORT_PC
9898 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9899 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
9900 mov r0, rSELF
9901 add r1, rFP, #OFF_FP_SHADOWFRAME
9902 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9903
9904/* ------------------------------ */
9905 .balign 128
9906.L_ALT_op_int_to_double: /* 0x83 */
9907/* File: arm/alt_stub.S */
9908/*
9909 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9910 * any interesting requests and then jump to the real instruction
9911 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9912 */
9913 .extern MterpCheckBefore
9914 EXPORT_PC
9915 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9916 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
9917 mov r0, rSELF
9918 add r1, rFP, #OFF_FP_SHADOWFRAME
9919 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9920
9921/* ------------------------------ */
9922 .balign 128
9923.L_ALT_op_long_to_int: /* 0x84 */
9924/* File: arm/alt_stub.S */
9925/*
9926 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9927 * any interesting requests and then jump to the real instruction
9928 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9929 */
9930 .extern MterpCheckBefore
9931 EXPORT_PC
9932 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9933 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
9934 mov r0, rSELF
9935 add r1, rFP, #OFF_FP_SHADOWFRAME
9936 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9937
9938/* ------------------------------ */
9939 .balign 128
9940.L_ALT_op_long_to_float: /* 0x85 */
9941/* File: arm/alt_stub.S */
9942/*
9943 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9944 * any interesting requests and then jump to the real instruction
9945 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9946 */
9947 .extern MterpCheckBefore
9948 EXPORT_PC
9949 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9950 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
9951 mov r0, rSELF
9952 add r1, rFP, #OFF_FP_SHADOWFRAME
9953 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9954
9955/* ------------------------------ */
9956 .balign 128
9957.L_ALT_op_long_to_double: /* 0x86 */
9958/* File: arm/alt_stub.S */
9959/*
9960 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9961 * any interesting requests and then jump to the real instruction
9962 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9963 */
9964 .extern MterpCheckBefore
9965 EXPORT_PC
9966 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9967 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
9968 mov r0, rSELF
9969 add r1, rFP, #OFF_FP_SHADOWFRAME
9970 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9971
9972/* ------------------------------ */
9973 .balign 128
9974.L_ALT_op_float_to_int: /* 0x87 */
9975/* File: arm/alt_stub.S */
9976/*
9977 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9978 * any interesting requests and then jump to the real instruction
9979 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9980 */
9981 .extern MterpCheckBefore
9982 EXPORT_PC
9983 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9984 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
9985 mov r0, rSELF
9986 add r1, rFP, #OFF_FP_SHADOWFRAME
9987 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9988
9989/* ------------------------------ */
9990 .balign 128
9991.L_ALT_op_float_to_long: /* 0x88 */
9992/* File: arm/alt_stub.S */
9993/*
9994 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9995 * any interesting requests and then jump to the real instruction
9996 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9997 */
9998 .extern MterpCheckBefore
9999 EXPORT_PC
10000 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10001 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10002 mov r0, rSELF
10003 add r1, rFP, #OFF_FP_SHADOWFRAME
10004 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10005
10006/* ------------------------------ */
10007 .balign 128
10008.L_ALT_op_float_to_double: /* 0x89 */
10009/* File: arm/alt_stub.S */
10010/*
10011 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10012 * any interesting requests and then jump to the real instruction
10013 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10014 */
10015 .extern MterpCheckBefore
10016 EXPORT_PC
10017 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10018 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10019 mov r0, rSELF
10020 add r1, rFP, #OFF_FP_SHADOWFRAME
10021 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10022
10023/* ------------------------------ */
10024 .balign 128
10025.L_ALT_op_double_to_int: /* 0x8a */
10026/* File: arm/alt_stub.S */
10027/*
10028 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10029 * any interesting requests and then jump to the real instruction
10030 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10031 */
10032 .extern MterpCheckBefore
10033 EXPORT_PC
10034 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10035 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10036 mov r0, rSELF
10037 add r1, rFP, #OFF_FP_SHADOWFRAME
10038 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10039
10040/* ------------------------------ */
10041 .balign 128
10042.L_ALT_op_double_to_long: /* 0x8b */
10043/* File: arm/alt_stub.S */
10044/*
10045 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10046 * any interesting requests and then jump to the real instruction
10047 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10048 */
10049 .extern MterpCheckBefore
10050 EXPORT_PC
10051 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10052 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10053 mov r0, rSELF
10054 add r1, rFP, #OFF_FP_SHADOWFRAME
10055 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10056
10057/* ------------------------------ */
10058 .balign 128
10059.L_ALT_op_double_to_float: /* 0x8c */
10060/* File: arm/alt_stub.S */
10061/*
10062 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10063 * any interesting requests and then jump to the real instruction
10064 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10065 */
10066 .extern MterpCheckBefore
10067 EXPORT_PC
10068 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10069 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10070 mov r0, rSELF
10071 add r1, rFP, #OFF_FP_SHADOWFRAME
10072 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10073
10074/* ------------------------------ */
10075 .balign 128
10076.L_ALT_op_int_to_byte: /* 0x8d */
10077/* File: arm/alt_stub.S */
10078/*
10079 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10080 * any interesting requests and then jump to the real instruction
10081 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10082 */
10083 .extern MterpCheckBefore
10084 EXPORT_PC
10085 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10086 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10087 mov r0, rSELF
10088 add r1, rFP, #OFF_FP_SHADOWFRAME
10089 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10090
10091/* ------------------------------ */
10092 .balign 128
10093.L_ALT_op_int_to_char: /* 0x8e */
10094/* File: arm/alt_stub.S */
10095/*
10096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10097 * any interesting requests and then jump to the real instruction
10098 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10099 */
10100 .extern MterpCheckBefore
10101 EXPORT_PC
10102 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10103 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10104 mov r0, rSELF
10105 add r1, rFP, #OFF_FP_SHADOWFRAME
10106 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10107
10108/* ------------------------------ */
10109 .balign 128
10110.L_ALT_op_int_to_short: /* 0x8f */
10111/* File: arm/alt_stub.S */
10112/*
10113 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10114 * any interesting requests and then jump to the real instruction
10115 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10116 */
10117 .extern MterpCheckBefore
10118 EXPORT_PC
10119 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10120 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10121 mov r0, rSELF
10122 add r1, rFP, #OFF_FP_SHADOWFRAME
10123 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10124
10125/* ------------------------------ */
10126 .balign 128
10127.L_ALT_op_add_int: /* 0x90 */
10128/* File: arm/alt_stub.S */
10129/*
10130 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10131 * any interesting requests and then jump to the real instruction
10132 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10133 */
10134 .extern MterpCheckBefore
10135 EXPORT_PC
10136 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10137 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10138 mov r0, rSELF
10139 add r1, rFP, #OFF_FP_SHADOWFRAME
10140 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10141
10142/* ------------------------------ */
10143 .balign 128
10144.L_ALT_op_sub_int: /* 0x91 */
10145/* File: arm/alt_stub.S */
10146/*
10147 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10148 * any interesting requests and then jump to the real instruction
10149 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10150 */
10151 .extern MterpCheckBefore
10152 EXPORT_PC
10153 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10154 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10155 mov r0, rSELF
10156 add r1, rFP, #OFF_FP_SHADOWFRAME
10157 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10158
10159/* ------------------------------ */
10160 .balign 128
10161.L_ALT_op_mul_int: /* 0x92 */
10162/* File: arm/alt_stub.S */
10163/*
10164 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10165 * any interesting requests and then jump to the real instruction
10166 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10167 */
10168 .extern MterpCheckBefore
10169 EXPORT_PC
10170 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10171 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10172 mov r0, rSELF
10173 add r1, rFP, #OFF_FP_SHADOWFRAME
10174 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10175
10176/* ------------------------------ */
10177 .balign 128
10178.L_ALT_op_div_int: /* 0x93 */
10179/* File: arm/alt_stub.S */
10180/*
10181 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10182 * any interesting requests and then jump to the real instruction
10183 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10184 */
10185 .extern MterpCheckBefore
10186 EXPORT_PC
10187 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10188 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10189 mov r0, rSELF
10190 add r1, rFP, #OFF_FP_SHADOWFRAME
10191 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10192
10193/* ------------------------------ */
10194 .balign 128
10195.L_ALT_op_rem_int: /* 0x94 */
10196/* File: arm/alt_stub.S */
10197/*
10198 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10199 * any interesting requests and then jump to the real instruction
10200 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10201 */
10202 .extern MterpCheckBefore
10203 EXPORT_PC
10204 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10205 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10206 mov r0, rSELF
10207 add r1, rFP, #OFF_FP_SHADOWFRAME
10208 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10209
10210/* ------------------------------ */
10211 .balign 128
10212.L_ALT_op_and_int: /* 0x95 */
10213/* File: arm/alt_stub.S */
10214/*
10215 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10216 * any interesting requests and then jump to the real instruction
10217 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10218 */
10219 .extern MterpCheckBefore
10220 EXPORT_PC
10221 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10222 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10223 mov r0, rSELF
10224 add r1, rFP, #OFF_FP_SHADOWFRAME
10225 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10226
10227/* ------------------------------ */
10228 .balign 128
10229.L_ALT_op_or_int: /* 0x96 */
10230/* File: arm/alt_stub.S */
10231/*
10232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10233 * any interesting requests and then jump to the real instruction
10234 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10235 */
10236 .extern MterpCheckBefore
10237 EXPORT_PC
10238 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10239 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10240 mov r0, rSELF
10241 add r1, rFP, #OFF_FP_SHADOWFRAME
10242 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10243
10244/* ------------------------------ */
10245 .balign 128
10246.L_ALT_op_xor_int: /* 0x97 */
10247/* File: arm/alt_stub.S */
10248/*
10249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10250 * any interesting requests and then jump to the real instruction
10251 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10252 */
10253 .extern MterpCheckBefore
10254 EXPORT_PC
10255 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10256 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10257 mov r0, rSELF
10258 add r1, rFP, #OFF_FP_SHADOWFRAME
10259 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10260
10261/* ------------------------------ */
10262 .balign 128
10263.L_ALT_op_shl_int: /* 0x98 */
10264/* File: arm/alt_stub.S */
10265/*
10266 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10267 * any interesting requests and then jump to the real instruction
10268 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10269 */
10270 .extern MterpCheckBefore
10271 EXPORT_PC
10272 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10273 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10274 mov r0, rSELF
10275 add r1, rFP, #OFF_FP_SHADOWFRAME
10276 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10277
10278/* ------------------------------ */
10279 .balign 128
10280.L_ALT_op_shr_int: /* 0x99 */
10281/* File: arm/alt_stub.S */
10282/*
10283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10284 * any interesting requests and then jump to the real instruction
10285 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10286 */
10287 .extern MterpCheckBefore
10288 EXPORT_PC
10289 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10290 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10291 mov r0, rSELF
10292 add r1, rFP, #OFF_FP_SHADOWFRAME
10293 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10294
10295/* ------------------------------ */
10296 .balign 128
10297.L_ALT_op_ushr_int: /* 0x9a */
10298/* File: arm/alt_stub.S */
10299/*
10300 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10301 * any interesting requests and then jump to the real instruction
10302 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10303 */
10304 .extern MterpCheckBefore
10305 EXPORT_PC
10306 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10307 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10308 mov r0, rSELF
10309 add r1, rFP, #OFF_FP_SHADOWFRAME
10310 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10311
10312/* ------------------------------ */
10313 .balign 128
10314.L_ALT_op_add_long: /* 0x9b */
10315/* File: arm/alt_stub.S */
10316/*
10317 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10318 * any interesting requests and then jump to the real instruction
10319 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10320 */
10321 .extern MterpCheckBefore
10322 EXPORT_PC
10323 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10324 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10325 mov r0, rSELF
10326 add r1, rFP, #OFF_FP_SHADOWFRAME
10327 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10328
10329/* ------------------------------ */
10330 .balign 128
10331.L_ALT_op_sub_long: /* 0x9c */
10332/* File: arm/alt_stub.S */
10333/*
10334 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10335 * any interesting requests and then jump to the real instruction
10336 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10337 */
10338 .extern MterpCheckBefore
10339 EXPORT_PC
10340 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10341 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10342 mov r0, rSELF
10343 add r1, rFP, #OFF_FP_SHADOWFRAME
10344 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10345
10346/* ------------------------------ */
10347 .balign 128
10348.L_ALT_op_mul_long: /* 0x9d */
10349/* File: arm/alt_stub.S */
10350/*
10351 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10352 * any interesting requests and then jump to the real instruction
10353 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10354 */
10355 .extern MterpCheckBefore
10356 EXPORT_PC
10357 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10358 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10359 mov r0, rSELF
10360 add r1, rFP, #OFF_FP_SHADOWFRAME
10361 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10362
10363/* ------------------------------ */
10364 .balign 128
10365.L_ALT_op_div_long: /* 0x9e */
10366/* File: arm/alt_stub.S */
10367/*
10368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10369 * any interesting requests and then jump to the real instruction
10370 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10371 */
10372 .extern MterpCheckBefore
10373 EXPORT_PC
10374 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10375 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10376 mov r0, rSELF
10377 add r1, rFP, #OFF_FP_SHADOWFRAME
10378 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10379
10380/* ------------------------------ */
10381 .balign 128
10382.L_ALT_op_rem_long: /* 0x9f */
10383/* File: arm/alt_stub.S */
10384/*
10385 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10386 * any interesting requests and then jump to the real instruction
10387 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10388 */
10389 .extern MterpCheckBefore
10390 EXPORT_PC
10391 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10392 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10393 mov r0, rSELF
10394 add r1, rFP, #OFF_FP_SHADOWFRAME
10395 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10396
10397/* ------------------------------ */
10398 .balign 128
10399.L_ALT_op_and_long: /* 0xa0 */
10400/* File: arm/alt_stub.S */
10401/*
10402 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10403 * any interesting requests and then jump to the real instruction
10404 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10405 */
10406 .extern MterpCheckBefore
10407 EXPORT_PC
10408 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10409 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10410 mov r0, rSELF
10411 add r1, rFP, #OFF_FP_SHADOWFRAME
10412 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10413
10414/* ------------------------------ */
10415 .balign 128
10416.L_ALT_op_or_long: /* 0xa1 */
10417/* File: arm/alt_stub.S */
10418/*
10419 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10420 * any interesting requests and then jump to the real instruction
10421 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10422 */
10423 .extern MterpCheckBefore
10424 EXPORT_PC
10425 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10426 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10427 mov r0, rSELF
10428 add r1, rFP, #OFF_FP_SHADOWFRAME
10429 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10430
10431/* ------------------------------ */
10432 .balign 128
10433.L_ALT_op_xor_long: /* 0xa2 */
10434/* File: arm/alt_stub.S */
10435/*
10436 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10437 * any interesting requests and then jump to the real instruction
10438 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10439 */
10440 .extern MterpCheckBefore
10441 EXPORT_PC
10442 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10443 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10444 mov r0, rSELF
10445 add r1, rFP, #OFF_FP_SHADOWFRAME
10446 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10447
10448/* ------------------------------ */
10449 .balign 128
10450.L_ALT_op_shl_long: /* 0xa3 */
10451/* File: arm/alt_stub.S */
10452/*
10453 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10454 * any interesting requests and then jump to the real instruction
10455 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10456 */
10457 .extern MterpCheckBefore
10458 EXPORT_PC
10459 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10460 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10461 mov r0, rSELF
10462 add r1, rFP, #OFF_FP_SHADOWFRAME
10463 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10464
10465/* ------------------------------ */
10466 .balign 128
10467.L_ALT_op_shr_long: /* 0xa4 */
10468/* File: arm/alt_stub.S */
10469/*
10470 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10471 * any interesting requests and then jump to the real instruction
10472 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10473 */
10474 .extern MterpCheckBefore
10475 EXPORT_PC
10476 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10477 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10478 mov r0, rSELF
10479 add r1, rFP, #OFF_FP_SHADOWFRAME
10480 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10481
10482/* ------------------------------ */
10483 .balign 128
10484.L_ALT_op_ushr_long: /* 0xa5 */
10485/* File: arm/alt_stub.S */
10486/*
10487 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10488 * any interesting requests and then jump to the real instruction
10489 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10490 */
10491 .extern MterpCheckBefore
10492 EXPORT_PC
10493 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10494 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10495 mov r0, rSELF
10496 add r1, rFP, #OFF_FP_SHADOWFRAME
10497 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10498
10499/* ------------------------------ */
10500 .balign 128
10501.L_ALT_op_add_float: /* 0xa6 */
10502/* File: arm/alt_stub.S */
10503/*
10504 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10505 * any interesting requests and then jump to the real instruction
10506 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10507 */
10508 .extern MterpCheckBefore
10509 EXPORT_PC
10510 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10511 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10512 mov r0, rSELF
10513 add r1, rFP, #OFF_FP_SHADOWFRAME
10514 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10515
10516/* ------------------------------ */
10517 .balign 128
10518.L_ALT_op_sub_float: /* 0xa7 */
10519/* File: arm/alt_stub.S */
10520/*
10521 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10522 * any interesting requests and then jump to the real instruction
10523 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10524 */
10525 .extern MterpCheckBefore
10526 EXPORT_PC
10527 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10528 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10529 mov r0, rSELF
10530 add r1, rFP, #OFF_FP_SHADOWFRAME
10531 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10532
10533/* ------------------------------ */
10534 .balign 128
10535.L_ALT_op_mul_float: /* 0xa8 */
10536/* File: arm/alt_stub.S */
10537/*
10538 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10539 * any interesting requests and then jump to the real instruction
10540 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10541 */
10542 .extern MterpCheckBefore
10543 EXPORT_PC
10544 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10545 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10546 mov r0, rSELF
10547 add r1, rFP, #OFF_FP_SHADOWFRAME
10548 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10549
10550/* ------------------------------ */
10551 .balign 128
10552.L_ALT_op_div_float: /* 0xa9 */
10553/* File: arm/alt_stub.S */
10554/*
10555 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10556 * any interesting requests and then jump to the real instruction
10557 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10558 */
10559 .extern MterpCheckBefore
10560 EXPORT_PC
10561 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10562 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10563 mov r0, rSELF
10564 add r1, rFP, #OFF_FP_SHADOWFRAME
10565 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10566
10567/* ------------------------------ */
10568 .balign 128
10569.L_ALT_op_rem_float: /* 0xaa */
10570/* File: arm/alt_stub.S */
10571/*
10572 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10573 * any interesting requests and then jump to the real instruction
10574 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10575 */
10576 .extern MterpCheckBefore
10577 EXPORT_PC
10578 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10579 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10580 mov r0, rSELF
10581 add r1, rFP, #OFF_FP_SHADOWFRAME
10582 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10583
10584/* ------------------------------ */
10585 .balign 128
10586.L_ALT_op_add_double: /* 0xab */
10587/* File: arm/alt_stub.S */
10588/*
10589 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10590 * any interesting requests and then jump to the real instruction
10591 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10592 */
10593 .extern MterpCheckBefore
10594 EXPORT_PC
10595 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10596 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10597 mov r0, rSELF
10598 add r1, rFP, #OFF_FP_SHADOWFRAME
10599 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10600
10601/* ------------------------------ */
10602 .balign 128
10603.L_ALT_op_sub_double: /* 0xac */
10604/* File: arm/alt_stub.S */
10605/*
10606 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10607 * any interesting requests and then jump to the real instruction
10608 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10609 */
10610 .extern MterpCheckBefore
10611 EXPORT_PC
10612 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10613 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10614 mov r0, rSELF
10615 add r1, rFP, #OFF_FP_SHADOWFRAME
10616 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10617
10618/* ------------------------------ */
10619 .balign 128
10620.L_ALT_op_mul_double: /* 0xad */
10621/* File: arm/alt_stub.S */
10622/*
10623 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10624 * any interesting requests and then jump to the real instruction
10625 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10626 */
10627 .extern MterpCheckBefore
10628 EXPORT_PC
10629 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10630 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10631 mov r0, rSELF
10632 add r1, rFP, #OFF_FP_SHADOWFRAME
10633 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10634
10635/* ------------------------------ */
10636 .balign 128
10637.L_ALT_op_div_double: /* 0xae */
10638/* File: arm/alt_stub.S */
10639/*
10640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10641 * any interesting requests and then jump to the real instruction
10642 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10643 */
10644 .extern MterpCheckBefore
10645 EXPORT_PC
10646 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10647 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10648 mov r0, rSELF
10649 add r1, rFP, #OFF_FP_SHADOWFRAME
10650 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10651
10652/* ------------------------------ */
10653 .balign 128
10654.L_ALT_op_rem_double: /* 0xaf */
10655/* File: arm/alt_stub.S */
10656/*
10657 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10658 * any interesting requests and then jump to the real instruction
10659 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10660 */
10661 .extern MterpCheckBefore
10662 EXPORT_PC
10663 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10664 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10665 mov r0, rSELF
10666 add r1, rFP, #OFF_FP_SHADOWFRAME
10667 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10668
10669/* ------------------------------ */
10670 .balign 128
10671.L_ALT_op_add_int_2addr: /* 0xb0 */
10672/* File: arm/alt_stub.S */
10673/*
10674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10675 * any interesting requests and then jump to the real instruction
10676 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10677 */
10678 .extern MterpCheckBefore
10679 EXPORT_PC
10680 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10681 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10682 mov r0, rSELF
10683 add r1, rFP, #OFF_FP_SHADOWFRAME
10684 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10685
10686/* ------------------------------ */
10687 .balign 128
10688.L_ALT_op_sub_int_2addr: /* 0xb1 */
10689/* File: arm/alt_stub.S */
10690/*
10691 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10692 * any interesting requests and then jump to the real instruction
10693 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10694 */
10695 .extern MterpCheckBefore
10696 EXPORT_PC
10697 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10698 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10699 mov r0, rSELF
10700 add r1, rFP, #OFF_FP_SHADOWFRAME
10701 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10702
10703/* ------------------------------ */
10704 .balign 128
10705.L_ALT_op_mul_int_2addr: /* 0xb2 */
10706/* File: arm/alt_stub.S */
10707/*
10708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10709 * any interesting requests and then jump to the real instruction
10710 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10711 */
10712 .extern MterpCheckBefore
10713 EXPORT_PC
10714 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10715 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10716 mov r0, rSELF
10717 add r1, rFP, #OFF_FP_SHADOWFRAME
10718 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10719
10720/* ------------------------------ */
10721 .balign 128
10722.L_ALT_op_div_int_2addr: /* 0xb3 */
10723/* File: arm/alt_stub.S */
10724/*
10725 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10726 * any interesting requests and then jump to the real instruction
10727 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10728 */
10729 .extern MterpCheckBefore
10730 EXPORT_PC
10731 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10732 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
10733 mov r0, rSELF
10734 add r1, rFP, #OFF_FP_SHADOWFRAME
10735 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10736
10737/* ------------------------------ */
10738 .balign 128
10739.L_ALT_op_rem_int_2addr: /* 0xb4 */
10740/* File: arm/alt_stub.S */
10741/*
10742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10743 * any interesting requests and then jump to the real instruction
10744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10745 */
10746 .extern MterpCheckBefore
10747 EXPORT_PC
10748 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10749 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
10750 mov r0, rSELF
10751 add r1, rFP, #OFF_FP_SHADOWFRAME
10752 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10753
10754/* ------------------------------ */
10755 .balign 128
10756.L_ALT_op_and_int_2addr: /* 0xb5 */
10757/* File: arm/alt_stub.S */
10758/*
10759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10760 * any interesting requests and then jump to the real instruction
10761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10762 */
10763 .extern MterpCheckBefore
10764 EXPORT_PC
10765 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10766 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
10767 mov r0, rSELF
10768 add r1, rFP, #OFF_FP_SHADOWFRAME
10769 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10770
10771/* ------------------------------ */
10772 .balign 128
10773.L_ALT_op_or_int_2addr: /* 0xb6 */
10774/* File: arm/alt_stub.S */
10775/*
10776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10777 * any interesting requests and then jump to the real instruction
10778 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10779 */
10780 .extern MterpCheckBefore
10781 EXPORT_PC
10782 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10783 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
10784 mov r0, rSELF
10785 add r1, rFP, #OFF_FP_SHADOWFRAME
10786 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10787
10788/* ------------------------------ */
10789 .balign 128
10790.L_ALT_op_xor_int_2addr: /* 0xb7 */
10791/* File: arm/alt_stub.S */
10792/*
10793 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10794 * any interesting requests and then jump to the real instruction
10795 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10796 */
10797 .extern MterpCheckBefore
10798 EXPORT_PC
10799 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10800 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
10801 mov r0, rSELF
10802 add r1, rFP, #OFF_FP_SHADOWFRAME
10803 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10804
10805/* ------------------------------ */
10806 .balign 128
10807.L_ALT_op_shl_int_2addr: /* 0xb8 */
10808/* File: arm/alt_stub.S */
10809/*
10810 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10811 * any interesting requests and then jump to the real instruction
10812 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10813 */
10814 .extern MterpCheckBefore
10815 EXPORT_PC
10816 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10817 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
10818 mov r0, rSELF
10819 add r1, rFP, #OFF_FP_SHADOWFRAME
10820 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10821
10822/* ------------------------------ */
10823 .balign 128
10824.L_ALT_op_shr_int_2addr: /* 0xb9 */
10825/* File: arm/alt_stub.S */
10826/*
10827 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10828 * any interesting requests and then jump to the real instruction
10829 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10830 */
10831 .extern MterpCheckBefore
10832 EXPORT_PC
10833 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10834 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
10835 mov r0, rSELF
10836 add r1, rFP, #OFF_FP_SHADOWFRAME
10837 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10838
10839/* ------------------------------ */
10840 .balign 128
10841.L_ALT_op_ushr_int_2addr: /* 0xba */
10842/* File: arm/alt_stub.S */
10843/*
10844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10845 * any interesting requests and then jump to the real instruction
10846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10847 */
10848 .extern MterpCheckBefore
10849 EXPORT_PC
10850 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10851 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
10852 mov r0, rSELF
10853 add r1, rFP, #OFF_FP_SHADOWFRAME
10854 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10855
10856/* ------------------------------ */
10857 .balign 128
10858.L_ALT_op_add_long_2addr: /* 0xbb */
10859/* File: arm/alt_stub.S */
10860/*
10861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10862 * any interesting requests and then jump to the real instruction
10863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10864 */
10865 .extern MterpCheckBefore
10866 EXPORT_PC
10867 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10868 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
10869 mov r0, rSELF
10870 add r1, rFP, #OFF_FP_SHADOWFRAME
10871 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10872
10873/* ------------------------------ */
10874 .balign 128
10875.L_ALT_op_sub_long_2addr: /* 0xbc */
10876/* File: arm/alt_stub.S */
10877/*
10878 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10879 * any interesting requests and then jump to the real instruction
10880 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10881 */
10882 .extern MterpCheckBefore
10883 EXPORT_PC
10884 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10885 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
10886 mov r0, rSELF
10887 add r1, rFP, #OFF_FP_SHADOWFRAME
10888 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10889
10890/* ------------------------------ */
10891 .balign 128
10892.L_ALT_op_mul_long_2addr: /* 0xbd */
10893/* File: arm/alt_stub.S */
10894/*
10895 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10896 * any interesting requests and then jump to the real instruction
10897 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10898 */
10899 .extern MterpCheckBefore
10900 EXPORT_PC
10901 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10902 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
10903 mov r0, rSELF
10904 add r1, rFP, #OFF_FP_SHADOWFRAME
10905 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10906
10907/* ------------------------------ */
10908 .balign 128
10909.L_ALT_op_div_long_2addr: /* 0xbe */
10910/* File: arm/alt_stub.S */
10911/*
10912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10913 * any interesting requests and then jump to the real instruction
10914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10915 */
10916 .extern MterpCheckBefore
10917 EXPORT_PC
10918 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10919 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
10920 mov r0, rSELF
10921 add r1, rFP, #OFF_FP_SHADOWFRAME
10922 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10923
10924/* ------------------------------ */
10925 .balign 128
10926.L_ALT_op_rem_long_2addr: /* 0xbf */
10927/* File: arm/alt_stub.S */
10928/*
10929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10930 * any interesting requests and then jump to the real instruction
10931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10932 */
10933 .extern MterpCheckBefore
10934 EXPORT_PC
10935 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10936 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
10937 mov r0, rSELF
10938 add r1, rFP, #OFF_FP_SHADOWFRAME
10939 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10940
10941/* ------------------------------ */
10942 .balign 128
10943.L_ALT_op_and_long_2addr: /* 0xc0 */
10944/* File: arm/alt_stub.S */
10945/*
10946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10947 * any interesting requests and then jump to the real instruction
10948 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10949 */
10950 .extern MterpCheckBefore
10951 EXPORT_PC
10952 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10953 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
10954 mov r0, rSELF
10955 add r1, rFP, #OFF_FP_SHADOWFRAME
10956 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10957
10958/* ------------------------------ */
10959 .balign 128
10960.L_ALT_op_or_long_2addr: /* 0xc1 */
10961/* File: arm/alt_stub.S */
10962/*
10963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10964 * any interesting requests and then jump to the real instruction
10965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10966 */
10967 .extern MterpCheckBefore
10968 EXPORT_PC
10969 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10970 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
10971 mov r0, rSELF
10972 add r1, rFP, #OFF_FP_SHADOWFRAME
10973 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10974
10975/* ------------------------------ */
10976 .balign 128
10977.L_ALT_op_xor_long_2addr: /* 0xc2 */
10978/* File: arm/alt_stub.S */
10979/*
10980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10981 * any interesting requests and then jump to the real instruction
10982 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10983 */
10984 .extern MterpCheckBefore
10985 EXPORT_PC
10986 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10987 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
10988 mov r0, rSELF
10989 add r1, rFP, #OFF_FP_SHADOWFRAME
10990 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10991
10992/* ------------------------------ */
10993 .balign 128
10994.L_ALT_op_shl_long_2addr: /* 0xc3 */
10995/* File: arm/alt_stub.S */
10996/*
10997 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10998 * any interesting requests and then jump to the real instruction
10999 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11000 */
11001 .extern MterpCheckBefore
11002 EXPORT_PC
11003 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11004 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11005 mov r0, rSELF
11006 add r1, rFP, #OFF_FP_SHADOWFRAME
11007 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11008
11009/* ------------------------------ */
11010 .balign 128
11011.L_ALT_op_shr_long_2addr: /* 0xc4 */
11012/* File: arm/alt_stub.S */
11013/*
11014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11015 * any interesting requests and then jump to the real instruction
11016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11017 */
11018 .extern MterpCheckBefore
11019 EXPORT_PC
11020 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11021 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11022 mov r0, rSELF
11023 add r1, rFP, #OFF_FP_SHADOWFRAME
11024 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11025
11026/* ------------------------------ */
11027 .balign 128
11028.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11029/* File: arm/alt_stub.S */
11030/*
11031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11032 * any interesting requests and then jump to the real instruction
11033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11034 */
11035 .extern MterpCheckBefore
11036 EXPORT_PC
11037 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11038 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11039 mov r0, rSELF
11040 add r1, rFP, #OFF_FP_SHADOWFRAME
11041 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11042
11043/* ------------------------------ */
11044 .balign 128
11045.L_ALT_op_add_float_2addr: /* 0xc6 */
11046/* File: arm/alt_stub.S */
11047/*
11048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11049 * any interesting requests and then jump to the real instruction
11050 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11051 */
11052 .extern MterpCheckBefore
11053 EXPORT_PC
11054 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11055 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11056 mov r0, rSELF
11057 add r1, rFP, #OFF_FP_SHADOWFRAME
11058 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11059
11060/* ------------------------------ */
11061 .balign 128
11062.L_ALT_op_sub_float_2addr: /* 0xc7 */
11063/* File: arm/alt_stub.S */
11064/*
11065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11066 * any interesting requests and then jump to the real instruction
11067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11068 */
11069 .extern MterpCheckBefore
11070 EXPORT_PC
11071 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11072 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11073 mov r0, rSELF
11074 add r1, rFP, #OFF_FP_SHADOWFRAME
11075 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11076
11077/* ------------------------------ */
11078 .balign 128
11079.L_ALT_op_mul_float_2addr: /* 0xc8 */
11080/* File: arm/alt_stub.S */
11081/*
11082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11083 * any interesting requests and then jump to the real instruction
11084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11085 */
11086 .extern MterpCheckBefore
11087 EXPORT_PC
11088 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11089 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11090 mov r0, rSELF
11091 add r1, rFP, #OFF_FP_SHADOWFRAME
11092 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11093
11094/* ------------------------------ */
11095 .balign 128
11096.L_ALT_op_div_float_2addr: /* 0xc9 */
11097/* File: arm/alt_stub.S */
11098/*
11099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11100 * any interesting requests and then jump to the real instruction
11101 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11102 */
11103 .extern MterpCheckBefore
11104 EXPORT_PC
11105 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11106 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11107 mov r0, rSELF
11108 add r1, rFP, #OFF_FP_SHADOWFRAME
11109 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11110
11111/* ------------------------------ */
11112 .balign 128
11113.L_ALT_op_rem_float_2addr: /* 0xca */
11114/* File: arm/alt_stub.S */
11115/*
11116 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11117 * any interesting requests and then jump to the real instruction
11118 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11119 */
11120 .extern MterpCheckBefore
11121 EXPORT_PC
11122 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11123 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11124 mov r0, rSELF
11125 add r1, rFP, #OFF_FP_SHADOWFRAME
11126 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11127
11128/* ------------------------------ */
11129 .balign 128
11130.L_ALT_op_add_double_2addr: /* 0xcb */
11131/* File: arm/alt_stub.S */
11132/*
11133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11134 * any interesting requests and then jump to the real instruction
11135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11136 */
11137 .extern MterpCheckBefore
11138 EXPORT_PC
11139 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11140 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11141 mov r0, rSELF
11142 add r1, rFP, #OFF_FP_SHADOWFRAME
11143 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11144
11145/* ------------------------------ */
11146 .balign 128
11147.L_ALT_op_sub_double_2addr: /* 0xcc */
11148/* File: arm/alt_stub.S */
11149/*
11150 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11151 * any interesting requests and then jump to the real instruction
11152 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11153 */
11154 .extern MterpCheckBefore
11155 EXPORT_PC
11156 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11157 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11158 mov r0, rSELF
11159 add r1, rFP, #OFF_FP_SHADOWFRAME
11160 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11161
11162/* ------------------------------ */
11163 .balign 128
11164.L_ALT_op_mul_double_2addr: /* 0xcd */
11165/* File: arm/alt_stub.S */
11166/*
11167 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11168 * any interesting requests and then jump to the real instruction
11169 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11170 */
11171 .extern MterpCheckBefore
11172 EXPORT_PC
11173 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11174 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11175 mov r0, rSELF
11176 add r1, rFP, #OFF_FP_SHADOWFRAME
11177 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11178
11179/* ------------------------------ */
11180 .balign 128
11181.L_ALT_op_div_double_2addr: /* 0xce */
11182/* File: arm/alt_stub.S */
11183/*
11184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11185 * any interesting requests and then jump to the real instruction
11186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11187 */
11188 .extern MterpCheckBefore
11189 EXPORT_PC
11190 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11191 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11192 mov r0, rSELF
11193 add r1, rFP, #OFF_FP_SHADOWFRAME
11194 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11195
11196/* ------------------------------ */
11197 .balign 128
11198.L_ALT_op_rem_double_2addr: /* 0xcf */
11199/* File: arm/alt_stub.S */
11200/*
11201 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11202 * any interesting requests and then jump to the real instruction
11203 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11204 */
11205 .extern MterpCheckBefore
11206 EXPORT_PC
11207 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11208 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11209 mov r0, rSELF
11210 add r1, rFP, #OFF_FP_SHADOWFRAME
11211 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11212
11213/* ------------------------------ */
11214 .balign 128
11215.L_ALT_op_add_int_lit16: /* 0xd0 */
11216/* File: arm/alt_stub.S */
11217/*
11218 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11219 * any interesting requests and then jump to the real instruction
11220 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11221 */
11222 .extern MterpCheckBefore
11223 EXPORT_PC
11224 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11225 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11226 mov r0, rSELF
11227 add r1, rFP, #OFF_FP_SHADOWFRAME
11228 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11229
11230/* ------------------------------ */
11231 .balign 128
11232.L_ALT_op_rsub_int: /* 0xd1 */
11233/* File: arm/alt_stub.S */
11234/*
11235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11236 * any interesting requests and then jump to the real instruction
11237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11238 */
11239 .extern MterpCheckBefore
11240 EXPORT_PC
11241 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11242 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11243 mov r0, rSELF
11244 add r1, rFP, #OFF_FP_SHADOWFRAME
11245 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11246
11247/* ------------------------------ */
11248 .balign 128
11249.L_ALT_op_mul_int_lit16: /* 0xd2 */
11250/* File: arm/alt_stub.S */
11251/*
11252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11253 * any interesting requests and then jump to the real instruction
11254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11255 */
11256 .extern MterpCheckBefore
11257 EXPORT_PC
11258 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11259 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11260 mov r0, rSELF
11261 add r1, rFP, #OFF_FP_SHADOWFRAME
11262 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11263
11264/* ------------------------------ */
11265 .balign 128
11266.L_ALT_op_div_int_lit16: /* 0xd3 */
11267/* File: arm/alt_stub.S */
11268/*
11269 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11270 * any interesting requests and then jump to the real instruction
11271 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11272 */
11273 .extern MterpCheckBefore
11274 EXPORT_PC
11275 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11276 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11277 mov r0, rSELF
11278 add r1, rFP, #OFF_FP_SHADOWFRAME
11279 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11280
11281/* ------------------------------ */
11282 .balign 128
11283.L_ALT_op_rem_int_lit16: /* 0xd4 */
11284/* File: arm/alt_stub.S */
11285/*
11286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11287 * any interesting requests and then jump to the real instruction
11288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11289 */
11290 .extern MterpCheckBefore
11291 EXPORT_PC
11292 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11293 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11294 mov r0, rSELF
11295 add r1, rFP, #OFF_FP_SHADOWFRAME
11296 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11297
11298/* ------------------------------ */
11299 .balign 128
11300.L_ALT_op_and_int_lit16: /* 0xd5 */
11301/* File: arm/alt_stub.S */
11302/*
11303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11304 * any interesting requests and then jump to the real instruction
11305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11306 */
11307 .extern MterpCheckBefore
11308 EXPORT_PC
11309 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11310 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11311 mov r0, rSELF
11312 add r1, rFP, #OFF_FP_SHADOWFRAME
11313 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11314
11315/* ------------------------------ */
11316 .balign 128
11317.L_ALT_op_or_int_lit16: /* 0xd6 */
11318/* File: arm/alt_stub.S */
11319/*
11320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11321 * any interesting requests and then jump to the real instruction
11322 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11323 */
11324 .extern MterpCheckBefore
11325 EXPORT_PC
11326 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11327 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11328 mov r0, rSELF
11329 add r1, rFP, #OFF_FP_SHADOWFRAME
11330 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11331
11332/* ------------------------------ */
11333 .balign 128
11334.L_ALT_op_xor_int_lit16: /* 0xd7 */
11335/* File: arm/alt_stub.S */
11336/*
11337 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11338 * any interesting requests and then jump to the real instruction
11339 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11340 */
11341 .extern MterpCheckBefore
11342 EXPORT_PC
11343 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11344 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11345 mov r0, rSELF
11346 add r1, rFP, #OFF_FP_SHADOWFRAME
11347 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11348
11349/* ------------------------------ */
11350 .balign 128
11351.L_ALT_op_add_int_lit8: /* 0xd8 */
11352/* File: arm/alt_stub.S */
11353/*
11354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11355 * any interesting requests and then jump to the real instruction
11356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11357 */
11358 .extern MterpCheckBefore
11359 EXPORT_PC
11360 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11361 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11362 mov r0, rSELF
11363 add r1, rFP, #OFF_FP_SHADOWFRAME
11364 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11365
11366/* ------------------------------ */
11367 .balign 128
11368.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11369/* File: arm/alt_stub.S */
11370/*
11371 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11372 * any interesting requests and then jump to the real instruction
11373 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11374 */
11375 .extern MterpCheckBefore
11376 EXPORT_PC
11377 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11378 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11379 mov r0, rSELF
11380 add r1, rFP, #OFF_FP_SHADOWFRAME
11381 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11382
11383/* ------------------------------ */
11384 .balign 128
11385.L_ALT_op_mul_int_lit8: /* 0xda */
11386/* File: arm/alt_stub.S */
11387/*
11388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11389 * any interesting requests and then jump to the real instruction
11390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11391 */
11392 .extern MterpCheckBefore
11393 EXPORT_PC
11394 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11395 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11396 mov r0, rSELF
11397 add r1, rFP, #OFF_FP_SHADOWFRAME
11398 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11399
11400/* ------------------------------ */
11401 .balign 128
11402.L_ALT_op_div_int_lit8: /* 0xdb */
11403/* File: arm/alt_stub.S */
11404/*
11405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11406 * any interesting requests and then jump to the real instruction
11407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11408 */
11409 .extern MterpCheckBefore
11410 EXPORT_PC
11411 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11412 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11413 mov r0, rSELF
11414 add r1, rFP, #OFF_FP_SHADOWFRAME
11415 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11416
11417/* ------------------------------ */
11418 .balign 128
11419.L_ALT_op_rem_int_lit8: /* 0xdc */
11420/* File: arm/alt_stub.S */
11421/*
11422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11423 * any interesting requests and then jump to the real instruction
11424 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11425 */
11426 .extern MterpCheckBefore
11427 EXPORT_PC
11428 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11429 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11430 mov r0, rSELF
11431 add r1, rFP, #OFF_FP_SHADOWFRAME
11432 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11433
11434/* ------------------------------ */
11435 .balign 128
11436.L_ALT_op_and_int_lit8: /* 0xdd */
11437/* File: arm/alt_stub.S */
11438/*
11439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11440 * any interesting requests and then jump to the real instruction
11441 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11442 */
11443 .extern MterpCheckBefore
11444 EXPORT_PC
11445 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11446 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11447 mov r0, rSELF
11448 add r1, rFP, #OFF_FP_SHADOWFRAME
11449 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11450
11451/* ------------------------------ */
11452 .balign 128
11453.L_ALT_op_or_int_lit8: /* 0xde */
11454/* File: arm/alt_stub.S */
11455/*
11456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11457 * any interesting requests and then jump to the real instruction
11458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11459 */
11460 .extern MterpCheckBefore
11461 EXPORT_PC
11462 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11463 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11464 mov r0, rSELF
11465 add r1, rFP, #OFF_FP_SHADOWFRAME
11466 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11467
11468/* ------------------------------ */
11469 .balign 128
11470.L_ALT_op_xor_int_lit8: /* 0xdf */
11471/* File: arm/alt_stub.S */
11472/*
11473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11474 * any interesting requests and then jump to the real instruction
11475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11476 */
11477 .extern MterpCheckBefore
11478 EXPORT_PC
11479 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11480 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11481 mov r0, rSELF
11482 add r1, rFP, #OFF_FP_SHADOWFRAME
11483 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11484
11485/* ------------------------------ */
11486 .balign 128
11487.L_ALT_op_shl_int_lit8: /* 0xe0 */
11488/* File: arm/alt_stub.S */
11489/*
11490 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11491 * any interesting requests and then jump to the real instruction
11492 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11493 */
11494 .extern MterpCheckBefore
11495 EXPORT_PC
11496 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11497 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11498 mov r0, rSELF
11499 add r1, rFP, #OFF_FP_SHADOWFRAME
11500 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11501
11502/* ------------------------------ */
11503 .balign 128
11504.L_ALT_op_shr_int_lit8: /* 0xe1 */
11505/* File: arm/alt_stub.S */
11506/*
11507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11508 * any interesting requests and then jump to the real instruction
11509 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11510 */
11511 .extern MterpCheckBefore
11512 EXPORT_PC
11513 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11514 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11515 mov r0, rSELF
11516 add r1, rFP, #OFF_FP_SHADOWFRAME
11517 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11518
11519/* ------------------------------ */
11520 .balign 128
11521.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11522/* File: arm/alt_stub.S */
11523/*
11524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11525 * any interesting requests and then jump to the real instruction
11526 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11527 */
11528 .extern MterpCheckBefore
11529 EXPORT_PC
11530 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11531 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11532 mov r0, rSELF
11533 add r1, rFP, #OFF_FP_SHADOWFRAME
11534 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11535
11536/* ------------------------------ */
11537 .balign 128
11538.L_ALT_op_iget_quick: /* 0xe3 */
11539/* File: arm/alt_stub.S */
11540/*
11541 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11542 * any interesting requests and then jump to the real instruction
11543 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11544 */
11545 .extern MterpCheckBefore
11546 EXPORT_PC
11547 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11548 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11549 mov r0, rSELF
11550 add r1, rFP, #OFF_FP_SHADOWFRAME
11551 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11552
11553/* ------------------------------ */
11554 .balign 128
11555.L_ALT_op_iget_wide_quick: /* 0xe4 */
11556/* File: arm/alt_stub.S */
11557/*
11558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11559 * any interesting requests and then jump to the real instruction
11560 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11561 */
11562 .extern MterpCheckBefore
11563 EXPORT_PC
11564 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11565 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11566 mov r0, rSELF
11567 add r1, rFP, #OFF_FP_SHADOWFRAME
11568 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11569
11570/* ------------------------------ */
11571 .balign 128
11572.L_ALT_op_iget_object_quick: /* 0xe5 */
11573/* File: arm/alt_stub.S */
11574/*
11575 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11576 * any interesting requests and then jump to the real instruction
11577 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11578 */
11579 .extern MterpCheckBefore
11580 EXPORT_PC
11581 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11582 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11583 mov r0, rSELF
11584 add r1, rFP, #OFF_FP_SHADOWFRAME
11585 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11586
11587/* ------------------------------ */
11588 .balign 128
11589.L_ALT_op_iput_quick: /* 0xe6 */
11590/* File: arm/alt_stub.S */
11591/*
11592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11593 * any interesting requests and then jump to the real instruction
11594 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11595 */
11596 .extern MterpCheckBefore
11597 EXPORT_PC
11598 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11599 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11600 mov r0, rSELF
11601 add r1, rFP, #OFF_FP_SHADOWFRAME
11602 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11603
11604/* ------------------------------ */
11605 .balign 128
11606.L_ALT_op_iput_wide_quick: /* 0xe7 */
11607/* File: arm/alt_stub.S */
11608/*
11609 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11610 * any interesting requests and then jump to the real instruction
11611 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11612 */
11613 .extern MterpCheckBefore
11614 EXPORT_PC
11615 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11616 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11617 mov r0, rSELF
11618 add r1, rFP, #OFF_FP_SHADOWFRAME
11619 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11620
11621/* ------------------------------ */
11622 .balign 128
11623.L_ALT_op_iput_object_quick: /* 0xe8 */
11624/* File: arm/alt_stub.S */
11625/*
11626 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11627 * any interesting requests and then jump to the real instruction
11628 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11629 */
11630 .extern MterpCheckBefore
11631 EXPORT_PC
11632 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11633 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11634 mov r0, rSELF
11635 add r1, rFP, #OFF_FP_SHADOWFRAME
11636 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11637
11638/* ------------------------------ */
11639 .balign 128
11640.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11641/* File: arm/alt_stub.S */
11642/*
11643 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11644 * any interesting requests and then jump to the real instruction
11645 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11646 */
11647 .extern MterpCheckBefore
11648 EXPORT_PC
11649 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11650 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11651 mov r0, rSELF
11652 add r1, rFP, #OFF_FP_SHADOWFRAME
11653 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11654
11655/* ------------------------------ */
11656 .balign 128
11657.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11658/* File: arm/alt_stub.S */
11659/*
11660 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11661 * any interesting requests and then jump to the real instruction
11662 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11663 */
11664 .extern MterpCheckBefore
11665 EXPORT_PC
11666 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11667 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11668 mov r0, rSELF
11669 add r1, rFP, #OFF_FP_SHADOWFRAME
11670 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11671
11672/* ------------------------------ */
11673 .balign 128
11674.L_ALT_op_iput_boolean_quick: /* 0xeb */
11675/* File: arm/alt_stub.S */
11676/*
11677 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11678 * any interesting requests and then jump to the real instruction
11679 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11680 */
11681 .extern MterpCheckBefore
11682 EXPORT_PC
11683 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11684 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11685 mov r0, rSELF
11686 add r1, rFP, #OFF_FP_SHADOWFRAME
11687 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11688
11689/* ------------------------------ */
11690 .balign 128
11691.L_ALT_op_iput_byte_quick: /* 0xec */
11692/* File: arm/alt_stub.S */
11693/*
11694 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11695 * any interesting requests and then jump to the real instruction
11696 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11697 */
11698 .extern MterpCheckBefore
11699 EXPORT_PC
11700 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11701 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11702 mov r0, rSELF
11703 add r1, rFP, #OFF_FP_SHADOWFRAME
11704 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11705
11706/* ------------------------------ */
11707 .balign 128
11708.L_ALT_op_iput_char_quick: /* 0xed */
11709/* File: arm/alt_stub.S */
11710/*
11711 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11712 * any interesting requests and then jump to the real instruction
11713 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11714 */
11715 .extern MterpCheckBefore
11716 EXPORT_PC
11717 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11718 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11719 mov r0, rSELF
11720 add r1, rFP, #OFF_FP_SHADOWFRAME
11721 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11722
11723/* ------------------------------ */
11724 .balign 128
11725.L_ALT_op_iput_short_quick: /* 0xee */
11726/* File: arm/alt_stub.S */
11727/*
11728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11729 * any interesting requests and then jump to the real instruction
11730 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11731 */
11732 .extern MterpCheckBefore
11733 EXPORT_PC
11734 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11735 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
11736 mov r0, rSELF
11737 add r1, rFP, #OFF_FP_SHADOWFRAME
11738 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11739
11740/* ------------------------------ */
11741 .balign 128
11742.L_ALT_op_iget_boolean_quick: /* 0xef */
11743/* File: arm/alt_stub.S */
11744/*
11745 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11746 * any interesting requests and then jump to the real instruction
11747 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11748 */
11749 .extern MterpCheckBefore
11750 EXPORT_PC
11751 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11752 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
11753 mov r0, rSELF
11754 add r1, rFP, #OFF_FP_SHADOWFRAME
11755 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11756
11757/* ------------------------------ */
11758 .balign 128
11759.L_ALT_op_iget_byte_quick: /* 0xf0 */
11760/* File: arm/alt_stub.S */
11761/*
11762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11763 * any interesting requests and then jump to the real instruction
11764 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11765 */
11766 .extern MterpCheckBefore
11767 EXPORT_PC
11768 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11769 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
11770 mov r0, rSELF
11771 add r1, rFP, #OFF_FP_SHADOWFRAME
11772 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11773
11774/* ------------------------------ */
11775 .balign 128
11776.L_ALT_op_iget_char_quick: /* 0xf1 */
11777/* File: arm/alt_stub.S */
11778/*
11779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11780 * any interesting requests and then jump to the real instruction
11781 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11782 */
11783 .extern MterpCheckBefore
11784 EXPORT_PC
11785 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11786 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
11787 mov r0, rSELF
11788 add r1, rFP, #OFF_FP_SHADOWFRAME
11789 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11790
11791/* ------------------------------ */
11792 .balign 128
11793.L_ALT_op_iget_short_quick: /* 0xf2 */
11794/* File: arm/alt_stub.S */
11795/*
11796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11797 * any interesting requests and then jump to the real instruction
11798 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11799 */
11800 .extern MterpCheckBefore
11801 EXPORT_PC
11802 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11803 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
11804 mov r0, rSELF
11805 add r1, rFP, #OFF_FP_SHADOWFRAME
11806 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11807
11808/* ------------------------------ */
11809 .balign 128
11810.L_ALT_op_invoke_lambda: /* 0xf3 */
11811/* File: arm/alt_stub.S */
11812/*
11813 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11814 * any interesting requests and then jump to the real instruction
11815 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11816 */
11817 .extern MterpCheckBefore
11818 EXPORT_PC
11819 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11820 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
11821 mov r0, rSELF
11822 add r1, rFP, #OFF_FP_SHADOWFRAME
11823 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11824
11825/* ------------------------------ */
11826 .balign 128
11827.L_ALT_op_unused_f4: /* 0xf4 */
11828/* File: arm/alt_stub.S */
11829/*
11830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11831 * any interesting requests and then jump to the real instruction
11832 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11833 */
11834 .extern MterpCheckBefore
11835 EXPORT_PC
11836 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11837 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
11838 mov r0, rSELF
11839 add r1, rFP, #OFF_FP_SHADOWFRAME
11840 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11841
11842/* ------------------------------ */
11843 .balign 128
11844.L_ALT_op_capture_variable: /* 0xf5 */
11845/* File: arm/alt_stub.S */
11846/*
11847 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11848 * any interesting requests and then jump to the real instruction
11849 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11850 */
11851 .extern MterpCheckBefore
11852 EXPORT_PC
11853 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11854 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
11855 mov r0, rSELF
11856 add r1, rFP, #OFF_FP_SHADOWFRAME
11857 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11858
11859/* ------------------------------ */
11860 .balign 128
11861.L_ALT_op_create_lambda: /* 0xf6 */
11862/* File: arm/alt_stub.S */
11863/*
11864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11865 * any interesting requests and then jump to the real instruction
11866 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11867 */
11868 .extern MterpCheckBefore
11869 EXPORT_PC
11870 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11871 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
11872 mov r0, rSELF
11873 add r1, rFP, #OFF_FP_SHADOWFRAME
11874 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11875
11876/* ------------------------------ */
11877 .balign 128
11878.L_ALT_op_liberate_variable: /* 0xf7 */
11879/* File: arm/alt_stub.S */
11880/*
11881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11882 * any interesting requests and then jump to the real instruction
11883 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11884 */
11885 .extern MterpCheckBefore
11886 EXPORT_PC
11887 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11888 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
11889 mov r0, rSELF
11890 add r1, rFP, #OFF_FP_SHADOWFRAME
11891 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11892
11893/* ------------------------------ */
11894 .balign 128
11895.L_ALT_op_box_lambda: /* 0xf8 */
11896/* File: arm/alt_stub.S */
11897/*
11898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11899 * any interesting requests and then jump to the real instruction
11900 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11901 */
11902 .extern MterpCheckBefore
11903 EXPORT_PC
11904 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11905 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
11906 mov r0, rSELF
11907 add r1, rFP, #OFF_FP_SHADOWFRAME
11908 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11909
11910/* ------------------------------ */
11911 .balign 128
11912.L_ALT_op_unbox_lambda: /* 0xf9 */
11913/* File: arm/alt_stub.S */
11914/*
11915 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11916 * any interesting requests and then jump to the real instruction
11917 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11918 */
11919 .extern MterpCheckBefore
11920 EXPORT_PC
11921 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11922 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
11923 mov r0, rSELF
11924 add r1, rFP, #OFF_FP_SHADOWFRAME
11925 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11926
11927/* ------------------------------ */
11928 .balign 128
11929.L_ALT_op_unused_fa: /* 0xfa */
11930/* File: arm/alt_stub.S */
11931/*
11932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11933 * any interesting requests and then jump to the real instruction
11934 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11935 */
11936 .extern MterpCheckBefore
11937 EXPORT_PC
11938 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11939 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
11940 mov r0, rSELF
11941 add r1, rFP, #OFF_FP_SHADOWFRAME
11942 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11943
11944/* ------------------------------ */
11945 .balign 128
11946.L_ALT_op_unused_fb: /* 0xfb */
11947/* File: arm/alt_stub.S */
11948/*
11949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11950 * any interesting requests and then jump to the real instruction
11951 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11952 */
11953 .extern MterpCheckBefore
11954 EXPORT_PC
11955 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11956 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
11957 mov r0, rSELF
11958 add r1, rFP, #OFF_FP_SHADOWFRAME
11959 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11960
11961/* ------------------------------ */
11962 .balign 128
11963.L_ALT_op_unused_fc: /* 0xfc */
11964/* File: arm/alt_stub.S */
11965/*
11966 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11967 * any interesting requests and then jump to the real instruction
11968 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11969 */
11970 .extern MterpCheckBefore
11971 EXPORT_PC
11972 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11973 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
11974 mov r0, rSELF
11975 add r1, rFP, #OFF_FP_SHADOWFRAME
11976 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11977
11978/* ------------------------------ */
11979 .balign 128
11980.L_ALT_op_unused_fd: /* 0xfd */
11981/* File: arm/alt_stub.S */
11982/*
11983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11984 * any interesting requests and then jump to the real instruction
11985 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11986 */
11987 .extern MterpCheckBefore
11988 EXPORT_PC
11989 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11990 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
11991 mov r0, rSELF
11992 add r1, rFP, #OFF_FP_SHADOWFRAME
11993 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11994
11995/* ------------------------------ */
11996 .balign 128
11997.L_ALT_op_unused_fe: /* 0xfe */
11998/* File: arm/alt_stub.S */
11999/*
12000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12001 * any interesting requests and then jump to the real instruction
12002 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12003 */
12004 .extern MterpCheckBefore
12005 EXPORT_PC
12006 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12007 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12008 mov r0, rSELF
12009 add r1, rFP, #OFF_FP_SHADOWFRAME
12010 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12011
12012/* ------------------------------ */
12013 .balign 128
12014.L_ALT_op_unused_ff: /* 0xff */
12015/* File: arm/alt_stub.S */
12016/*
12017 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12018 * any interesting requests and then jump to the real instruction
12019 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12020 */
12021 .extern MterpCheckBefore
12022 EXPORT_PC
12023 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12024 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12025 mov r0, rSELF
12026 add r1, rFP, #OFF_FP_SHADOWFRAME
12027 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12028
12029 .balign 128
12030 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12031 .global artMterpAsmAltInstructionEnd
12032artMterpAsmAltInstructionEnd:
12033/* File: arm/footer.S */
12034/*
12035 * ===========================================================================
12036 * Common subroutines and data
12037 * ===========================================================================
12038 */
12039
12040 .text
12041 .align 2
12042
12043/*
12044 * We've detected a condition that will result in an exception, but the exception
12045 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12046 * TUNING: for consistency, we may want to just go ahead and handle these here.
12047 */
12048#define MTERP_LOGGING 0
12049common_errDivideByZero:
12050 EXPORT_PC
12051#if MTERP_LOGGING
12052 mov r0, rSELF
12053 add r1, rFP, #OFF_FP_SHADOWFRAME
12054 bl MterpLogDivideByZeroException
12055#endif
12056 b MterpCommonFallback
12057
12058common_errArrayIndex:
12059 EXPORT_PC
12060#if MTERP_LOGGING
12061 mov r0, rSELF
12062 add r1, rFP, #OFF_FP_SHADOWFRAME
12063 bl MterpLogArrayIndexException
12064#endif
12065 b MterpCommonFallback
12066
12067common_errNegativeArraySize:
12068 EXPORT_PC
12069#if MTERP_LOGGING
12070 mov r0, rSELF
12071 add r1, rFP, #OFF_FP_SHADOWFRAME
12072 bl MterpLogNegativeArraySizeException
12073#endif
12074 b MterpCommonFallback
12075
12076common_errNoSuchMethod:
12077 EXPORT_PC
12078#if MTERP_LOGGING
12079 mov r0, rSELF
12080 add r1, rFP, #OFF_FP_SHADOWFRAME
12081 bl MterpLogNoSuchMethodException
12082#endif
12083 b MterpCommonFallback
12084
12085common_errNullObject:
12086 EXPORT_PC
12087#if MTERP_LOGGING
12088 mov r0, rSELF
12089 add r1, rFP, #OFF_FP_SHADOWFRAME
12090 bl MterpLogNullObjectException
12091#endif
12092 b MterpCommonFallback
12093
12094common_exceptionThrown:
12095 EXPORT_PC
12096#if MTERP_LOGGING
12097 mov r0, rSELF
12098 add r1, rFP, #OFF_FP_SHADOWFRAME
12099 bl MterpLogExceptionThrownException
12100#endif
12101 b MterpCommonFallback
12102
12103MterpSuspendFallback:
12104 EXPORT_PC
12105#if MTERP_LOGGING
12106 mov r0, rSELF
12107 add r1, rFP, #OFF_FP_SHADOWFRAME
12108 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12109 bl MterpLogSuspendFallback
12110#endif
12111 b MterpCommonFallback
12112
12113/*
12114 * If we're here, something is out of the ordinary. If there is a pending
12115 * exception, handle it. Otherwise, roll back and retry with the reference
12116 * interpreter.
12117 */
12118MterpPossibleException:
12119 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12120 cmp r0, #0 @ Exception pending?
12121 beq MterpFallback @ If not, fall back to reference interpreter.
12122 /* intentional fallthrough - handle pending exception. */
12123/*
12124 * On return from a runtime helper routine, we've found a pending exception.
12125 * Can we handle it here - or need to bail out to caller?
12126 *
12127 */
12128MterpException:
12129 mov r0, rSELF
12130 add r1, rFP, #OFF_FP_SHADOWFRAME
12131 bl MterpHandleException @ (self, shadow_frame)
12132 cmp r0, #0
12133 beq MterpExceptionReturn @ no local catch, back to caller.
12134 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12135 ldr r1, [rFP, #OFF_FP_DEX_PC]
12136 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12137 add rPC, r0, #CODEITEM_INSNS_OFFSET
12138 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
12139 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
12140 /* resume execution at catch block */
12141 FETCH_INST
12142 GET_INST_OPCODE ip
12143 GOTO_OPCODE ip
12144 /* NOTE: no fallthrough */
12145
12146/*
12147 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12148 * still needs to get the opcode and branch to it, and flags are in lr.
12149 */
12150MterpCheckSuspendAndContinue:
12151 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
12152 EXPORT_PC
12153 mov r0, rSELF
12154 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12155 blne MterpSuspendCheck @ (self)
12156 GET_INST_OPCODE ip @ extract opcode from rINST
12157 GOTO_OPCODE ip @ jump to next instruction
12158
12159/*
12160 * Bail out to reference interpreter.
12161 */
12162MterpFallback:
12163 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -080012164#if MTERP_LOGGING
buzbee1452bee2015-03-06 14:43:04 -080012165 mov r0, rSELF
12166 add r1, rFP, #OFF_FP_SHADOWFRAME
12167 bl MterpLogFallback
buzbee76833da2016-01-13 13:06:22 -080012168#endif
buzbee1452bee2015-03-06 14:43:04 -080012169MterpCommonFallback:
12170 mov r0, #0 @ signal retry with reference interpreter.
12171 b MterpDone
12172
12173/*
12174 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12175 * SP and LR. Here we restore SP, restore the registers, and then restore
12176 * LR to PC.
12177 *
12178 * On entry:
12179 * uint32_t* rFP (should still be live, pointer to base of vregs)
12180 */
12181MterpExceptionReturn:
buzbee1452bee2015-03-06 14:43:04 -080012182 mov r0, #1 @ signal return to caller.
12183 b MterpDone
12184MterpReturn:
12185 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
12186 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
12187 str r0, [r2]
12188 str r1, [r2, #4]
12189 mov r0, rSELF
12190 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12191 blne MterpSuspendCheck @ (self)
12192 mov r0, #1 @ signal return to caller.
12193MterpDone:
12194 add sp, sp, #4 @ un-align 64
12195 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12196
12197
12198 .fnend
12199 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12200
12201