blob: 7b90c9dc7ea7525b7ed44d0fe0e4b0017e5f47c7 [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
Bill Buzbee9687f242016-02-05 14:08:10 +000095#define MTERP_PROFILE_BRANCHES 1
96#define MTERP_LOGGING 0
97
buzbee1452bee2015-03-06 14:43:04 -080098/* During bringup, we'll use the shadow frame model instead of rFP */
99/* single-purpose registers, given names for clarity */
100#define rPC r4
101#define rFP r5
102#define rSELF r6
103#define rINST r7
104#define rIBASE r8
105#define rREFS r11
106
107/*
108 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So,
109 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
110 */
111#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
112#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
113#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
114#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
115#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
116#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
117#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
118#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
119#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
120
121/*
buzbee1452bee2015-03-06 14:43:04 -0800122 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
123 * be done *before* something throws.
124 *
125 * It's okay to do this more than once.
126 *
127 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
128 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
129 * offset into the code_items_[] array. For effiency, we will "export" the
130 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
131 * to convert to a dex pc when needed.
132 */
133.macro EXPORT_PC
134 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
135.endm
136
137.macro EXPORT_DEX_PC tmp
138 ldr \tmp, [rFP, #OFF_FP_CODE_ITEM]
139 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
140 add \tmp, #CODEITEM_INSNS_OFFSET
141 sub \tmp, rPC, \tmp
142 asr \tmp, #1
143 str \tmp, [rFP, #OFF_FP_DEX_PC]
144.endm
145
146/*
147 * Fetch the next instruction from rPC into rINST. Does not advance rPC.
148 */
149.macro FETCH_INST
150 ldrh rINST, [rPC]
151.endm
152
153/*
154 * Fetch the next instruction from the specified offset. Advances rPC
155 * to point to the next instruction. "_count" is in 16-bit code units.
156 *
157 * Because of the limited size of immediate constants on ARM, this is only
158 * suitable for small forward movements (i.e. don't try to implement "goto"
159 * with this).
160 *
161 * This must come AFTER anything that can throw an exception, or the
162 * exception catch may miss. (This also implies that it must come after
163 * EXPORT_PC.)
164 */
165.macro FETCH_ADVANCE_INST count
166 ldrh rINST, [rPC, #((\count)*2)]!
167.endm
168
169/*
170 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
171 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
172 */
173.macro PREFETCH_ADVANCE_INST dreg, sreg, count
174 ldrh \dreg, [\sreg, #((\count)*2)]!
175.endm
176
177/*
178 * Similar to FETCH_ADVANCE_INST, but does not update rPC. Used to load
179 * rINST ahead of possible exception point. Be sure to manually advance rPC
180 * later.
181 */
182.macro PREFETCH_INST count
183 ldrh rINST, [rPC, #((\count)*2)]
184.endm
185
186/* Advance rPC by some number of code units. */
187.macro ADVANCE count
188 add rPC, #((\count)*2)
189.endm
190
191/*
192 * Fetch the next instruction from an offset specified by _reg. Updates
193 * rPC to point to the next instruction. "_reg" must specify the distance
194 * in bytes, *not* 16-bit code units, and may be a signed value.
195 *
196 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
197 * bits that hold the shift distance are used for the half/byte/sign flags.
198 * In some cases we can pre-double _reg for free, so we require a byte offset
199 * here.
200 */
201.macro FETCH_ADVANCE_INST_RB reg
202 ldrh rINST, [rPC, \reg]!
203.endm
204
205/*
206 * Fetch a half-word code unit from an offset past the current PC. The
207 * "_count" value is in 16-bit code units. Does not advance rPC.
208 *
209 * The "_S" variant works the same but treats the value as signed.
210 */
211.macro FETCH reg, count
212 ldrh \reg, [rPC, #((\count)*2)]
213.endm
214
215.macro FETCH_S reg, count
216 ldrsh \reg, [rPC, #((\count)*2)]
217.endm
218
219/*
220 * Fetch one byte from an offset past the current PC. Pass in the same
221 * "_count" as you would for FETCH, and an additional 0/1 indicating which
222 * byte of the halfword you want (lo/hi).
223 */
224.macro FETCH_B reg, count, byte
225 ldrb \reg, [rPC, #((\count)*2+(\byte))]
226.endm
227
228/*
229 * Put the instruction's opcode field into the specified register.
230 */
231.macro GET_INST_OPCODE reg
232 and \reg, rINST, #255
233.endm
234
235/*
236 * Put the prefetched instruction's opcode field into the specified register.
237 */
238.macro GET_PREFETCHED_OPCODE oreg, ireg
239 and \oreg, \ireg, #255
240.endm
241
242/*
243 * Begin executing the opcode in _reg. Because this only jumps within the
244 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
245 */
246.macro GOTO_OPCODE reg
247 add pc, rIBASE, \reg, lsl #7
248.endm
249.macro GOTO_OPCODE_BASE base,reg
250 add pc, \base, \reg, lsl #7
251.endm
252
253/*
254 * Get/set the 32-bit value from a Dalvik register.
255 */
256.macro GET_VREG reg, vreg
257 ldr \reg, [rFP, \vreg, lsl #2]
258.endm
259.macro SET_VREG reg, vreg
260 str \reg, [rFP, \vreg, lsl #2]
261 mov \reg, #0
262 str \reg, [rREFS, \vreg, lsl #2]
263.endm
264.macro SET_VREG_OBJECT reg, vreg, tmpreg
265 str \reg, [rFP, \vreg, lsl #2]
266 str \reg, [rREFS, \vreg, lsl #2]
267.endm
268
269/*
270 * Convert a virtual register index into an address.
271 */
272.macro VREG_INDEX_TO_ADDR reg, vreg
273 add \reg, rFP, \vreg, lsl #2 /* WARNING/FIXME: handle shadow frame vreg zero if store */
274.endm
275
276/*
277 * Refresh handler table.
278 */
279.macro REFRESH_IBASE
280 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
281.endm
282
283/* File: arm/entry.S */
284/*
285 * Copyright (C) 2016 The Android Open Source Project
286 *
287 * Licensed under the Apache License, Version 2.0 (the "License");
288 * you may not use this file except in compliance with the License.
289 * You may obtain a copy of the License at
290 *
291 * http://www.apache.org/licenses/LICENSE-2.0
292 *
293 * Unless required by applicable law or agreed to in writing, software
294 * distributed under the License is distributed on an "AS IS" BASIS,
295 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
296 * See the License for the specific language governing permissions and
297 * limitations under the License.
298 */
299/*
300 * Interpreter entry point.
301 */
302
303 .text
304 .align 2
305 .global ExecuteMterpImpl
306 .type ExecuteMterpImpl, %function
307
308/*
309 * On entry:
310 * r0 Thread* self/
311 * r1 code_item
312 * r2 ShadowFrame
313 * r3 JValue* result_register
314 *
315 */
316
317ExecuteMterpImpl:
318 .fnstart
319 .save {r4-r10,fp,lr}
320 stmfd sp!, {r4-r10,fp,lr} @ save 9 regs
321 .pad #4
322 sub sp, sp, #4 @ align 64
323
324 /* Remember the return register */
325 str r3, [r2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
326
327 /* Remember the code_item */
328 str r1, [r2, #SHADOWFRAME_CODE_ITEM_OFFSET]
329
330 /* set up "named" registers */
331 mov rSELF, r0
332 ldr r0, [r2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
333 add rFP, r2, #SHADOWFRAME_VREGS_OFFSET @ point to insns[] (i.e. - the dalivk byte code).
334 add rREFS, rFP, r0, lsl #2 @ point to reference array in shadow frame
335 ldr r0, [r2, #SHADOWFRAME_DEX_PC_OFFSET] @ Get starting dex_pc.
336 add rPC, r1, #CODEITEM_INSNS_OFFSET @ Point to base of insns[]
337 add rPC, rPC, r0, lsl #1 @ Create direct pointer to 1st dex opcode
338 EXPORT_PC
339
340 /* Starting ibase */
341 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
342
343 /* start executing the instruction at rPC */
344 FETCH_INST @ load rINST from rPC
345 GET_INST_OPCODE ip @ extract opcode from rINST
346 GOTO_OPCODE ip @ jump to next instruction
347 /* NOTE: no fallthrough */
348
349
350 .global artMterpAsmInstructionStart
351 .type artMterpAsmInstructionStart, %function
352artMterpAsmInstructionStart = .L_op_nop
353 .text
354
355/* ------------------------------ */
356 .balign 128
357.L_op_nop: /* 0x00 */
358/* File: arm/op_nop.S */
359 FETCH_ADVANCE_INST 1 @ advance to next instr, load rINST
360 GET_INST_OPCODE ip @ ip<- opcode from rINST
361 GOTO_OPCODE ip @ execute it
362
363/* ------------------------------ */
364 .balign 128
365.L_op_move: /* 0x01 */
366/* File: arm/op_move.S */
367 /* for move, move-object, long-to-int */
368 /* op vA, vB */
369 mov r1, rINST, lsr #12 @ r1<- B from 15:12
370 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
371 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
372 GET_VREG r2, r1 @ r2<- fp[B]
373 GET_INST_OPCODE ip @ ip<- opcode from rINST
374 .if 0
375 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
376 .else
377 SET_VREG r2, r0 @ fp[A]<- r2
378 .endif
379 GOTO_OPCODE ip @ execute next instruction
380
381/* ------------------------------ */
382 .balign 128
383.L_op_move_from16: /* 0x02 */
384/* File: arm/op_move_from16.S */
385 /* for: move/from16, move-object/from16 */
386 /* op vAA, vBBBB */
387 FETCH r1, 1 @ r1<- BBBB
388 mov r0, rINST, lsr #8 @ r0<- AA
389 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
390 GET_VREG r2, r1 @ r2<- fp[BBBB]
391 GET_INST_OPCODE ip @ extract opcode from rINST
392 .if 0
393 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
394 .else
395 SET_VREG r2, r0 @ fp[AA]<- r2
396 .endif
397 GOTO_OPCODE ip @ jump to next instruction
398
399/* ------------------------------ */
400 .balign 128
401.L_op_move_16: /* 0x03 */
402/* File: arm/op_move_16.S */
403 /* for: move/16, move-object/16 */
404 /* op vAAAA, vBBBB */
405 FETCH r1, 2 @ r1<- BBBB
406 FETCH r0, 1 @ r0<- AAAA
407 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
408 GET_VREG r2, r1 @ r2<- fp[BBBB]
409 GET_INST_OPCODE ip @ extract opcode from rINST
410 .if 0
411 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
412 .else
413 SET_VREG r2, r0 @ fp[AAAA]<- r2
414 .endif
415 GOTO_OPCODE ip @ jump to next instruction
416
417/* ------------------------------ */
418 .balign 128
419.L_op_move_wide: /* 0x04 */
420/* File: arm/op_move_wide.S */
421 /* move-wide vA, vB */
422 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
423 mov r3, rINST, lsr #12 @ r3<- B
424 ubfx r2, rINST, #8, #4 @ r2<- A
425 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
426 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
427 ldmia r3, {r0-r1} @ r0/r1<- fp[B]
428 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
429 GET_INST_OPCODE ip @ extract opcode from rINST
430 stmia r2, {r0-r1} @ fp[A]<- r0/r1
431 GOTO_OPCODE ip @ jump to next instruction
432
433/* ------------------------------ */
434 .balign 128
435.L_op_move_wide_from16: /* 0x05 */
436/* File: arm/op_move_wide_from16.S */
437 /* move-wide/from16 vAA, vBBBB */
438 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
439 FETCH r3, 1 @ r3<- BBBB
440 mov r2, rINST, lsr #8 @ r2<- AA
441 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
442 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
443 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
444 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
445 GET_INST_OPCODE ip @ extract opcode from rINST
446 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
447 GOTO_OPCODE ip @ jump to next instruction
448
449/* ------------------------------ */
450 .balign 128
451.L_op_move_wide_16: /* 0x06 */
452/* File: arm/op_move_wide_16.S */
453 /* move-wide/16 vAAAA, vBBBB */
454 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
455 FETCH r3, 2 @ r3<- BBBB
456 FETCH r2, 1 @ r2<- AAAA
457 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
458 add r2, rFP, r2, lsl #2 @ r2<- &fp[AAAA]
459 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
460 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
461 stmia r2, {r0-r1} @ fp[AAAA]<- r0/r1
462 GET_INST_OPCODE ip @ extract opcode from rINST
463 GOTO_OPCODE ip @ jump to next instruction
464
465/* ------------------------------ */
466 .balign 128
467.L_op_move_object: /* 0x07 */
468/* File: arm/op_move_object.S */
469/* File: arm/op_move.S */
470 /* for move, move-object, long-to-int */
471 /* op vA, vB */
472 mov r1, rINST, lsr #12 @ r1<- B from 15:12
473 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
474 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
475 GET_VREG r2, r1 @ r2<- fp[B]
476 GET_INST_OPCODE ip @ ip<- opcode from rINST
477 .if 1
478 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
479 .else
480 SET_VREG r2, r0 @ fp[A]<- r2
481 .endif
482 GOTO_OPCODE ip @ execute next instruction
483
484
485/* ------------------------------ */
486 .balign 128
487.L_op_move_object_from16: /* 0x08 */
488/* File: arm/op_move_object_from16.S */
489/* File: arm/op_move_from16.S */
490 /* for: move/from16, move-object/from16 */
491 /* op vAA, vBBBB */
492 FETCH r1, 1 @ r1<- BBBB
493 mov r0, rINST, lsr #8 @ r0<- AA
494 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
495 GET_VREG r2, r1 @ r2<- fp[BBBB]
496 GET_INST_OPCODE ip @ extract opcode from rINST
497 .if 1
498 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
499 .else
500 SET_VREG r2, r0 @ fp[AA]<- r2
501 .endif
502 GOTO_OPCODE ip @ jump to next instruction
503
504
505/* ------------------------------ */
506 .balign 128
507.L_op_move_object_16: /* 0x09 */
508/* File: arm/op_move_object_16.S */
509/* File: arm/op_move_16.S */
510 /* for: move/16, move-object/16 */
511 /* op vAAAA, vBBBB */
512 FETCH r1, 2 @ r1<- BBBB
513 FETCH r0, 1 @ r0<- AAAA
514 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
515 GET_VREG r2, r1 @ r2<- fp[BBBB]
516 GET_INST_OPCODE ip @ extract opcode from rINST
517 .if 1
518 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
519 .else
520 SET_VREG r2, r0 @ fp[AAAA]<- r2
521 .endif
522 GOTO_OPCODE ip @ jump to next instruction
523
524
525/* ------------------------------ */
526 .balign 128
527.L_op_move_result: /* 0x0a */
528/* File: arm/op_move_result.S */
529 /* for: move-result, move-result-object */
530 /* op vAA */
531 mov r2, rINST, lsr #8 @ r2<- AA
532 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
533 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
534 ldr r0, [r0] @ r0 <- result.i.
535 GET_INST_OPCODE ip @ extract opcode from rINST
536 .if 0
537 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
538 .else
539 SET_VREG r0, r2 @ fp[AA]<- r0
540 .endif
541 GOTO_OPCODE ip @ jump to next instruction
542
543/* ------------------------------ */
544 .balign 128
545.L_op_move_result_wide: /* 0x0b */
546/* File: arm/op_move_result_wide.S */
547 /* move-result-wide vAA */
548 mov r2, rINST, lsr #8 @ r2<- AA
549 ldr r3, [rFP, #OFF_FP_RESULT_REGISTER]
550 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
551 ldmia r3, {r0-r1} @ r0/r1<- retval.j
552 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
553 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
554 GET_INST_OPCODE ip @ extract opcode from rINST
555 GOTO_OPCODE ip @ jump to next instruction
556
557/* ------------------------------ */
558 .balign 128
559.L_op_move_result_object: /* 0x0c */
560/* File: arm/op_move_result_object.S */
561/* File: arm/op_move_result.S */
562 /* for: move-result, move-result-object */
563 /* op vAA */
564 mov r2, rINST, lsr #8 @ r2<- AA
565 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
566 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
567 ldr r0, [r0] @ r0 <- result.i.
568 GET_INST_OPCODE ip @ extract opcode from rINST
569 .if 1
570 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
571 .else
572 SET_VREG r0, r2 @ fp[AA]<- r0
573 .endif
574 GOTO_OPCODE ip @ jump to next instruction
575
576
577/* ------------------------------ */
578 .balign 128
579.L_op_move_exception: /* 0x0d */
580/* File: arm/op_move_exception.S */
581 /* move-exception vAA */
582 mov r2, rINST, lsr #8 @ r2<- AA
583 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
584 mov r1, #0 @ r1<- 0
585 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
586 SET_VREG_OBJECT r3, r2 @ fp[AA]<- exception obj
587 GET_INST_OPCODE ip @ extract opcode from rINST
588 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ clear exception
589 GOTO_OPCODE ip @ jump to next instruction
590
591/* ------------------------------ */
592 .balign 128
593.L_op_return_void: /* 0x0e */
594/* File: arm/op_return_void.S */
595 .extern MterpThreadFenceForConstructor
596 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800597 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
598 mov r0, rSELF
599 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
600 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800601 mov r0, #0
602 mov r1, #0
603 b MterpReturn
604
605/* ------------------------------ */
606 .balign 128
607.L_op_return: /* 0x0f */
608/* File: arm/op_return.S */
609 /*
610 * Return a 32-bit value.
611 *
612 * for: return, return-object
613 */
614 /* op vAA */
615 .extern MterpThreadFenceForConstructor
616 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800617 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
618 mov r0, rSELF
619 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
620 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800621 mov r2, rINST, lsr #8 @ r2<- AA
622 GET_VREG r0, r2 @ r0<- vAA
623 mov r1, #0
624 b MterpReturn
625
626/* ------------------------------ */
627 .balign 128
628.L_op_return_wide: /* 0x10 */
629/* File: arm/op_return_wide.S */
630 /*
631 * Return a 64-bit value.
632 */
633 /* return-wide vAA */
634 .extern MterpThreadFenceForConstructor
635 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800636 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
637 mov r0, rSELF
638 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
639 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800640 mov r2, rINST, lsr #8 @ r2<- AA
641 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
642 ldmia r2, {r0-r1} @ r0/r1 <- vAA/vAA+1
643 b MterpReturn
644
645/* ------------------------------ */
646 .balign 128
647.L_op_return_object: /* 0x11 */
648/* File: arm/op_return_object.S */
649/* File: arm/op_return.S */
650 /*
651 * Return a 32-bit value.
652 *
653 * for: return, return-object
654 */
655 /* op vAA */
656 .extern MterpThreadFenceForConstructor
657 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800658 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
659 mov r0, rSELF
660 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
661 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800662 mov r2, rINST, lsr #8 @ r2<- AA
663 GET_VREG r0, r2 @ r0<- vAA
664 mov r1, #0
665 b MterpReturn
666
667
668/* ------------------------------ */
669 .balign 128
670.L_op_const_4: /* 0x12 */
671/* File: arm/op_const_4.S */
672 /* const/4 vA, #+B */
673 mov r1, rINST, lsl #16 @ r1<- Bxxx0000
674 ubfx r0, rINST, #8, #4 @ r0<- A
675 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
676 mov r1, r1, asr #28 @ r1<- sssssssB (sign-extended)
677 GET_INST_OPCODE ip @ ip<- opcode from rINST
678 SET_VREG r1, r0 @ fp[A]<- r1
679 GOTO_OPCODE ip @ execute next instruction
680
681/* ------------------------------ */
682 .balign 128
683.L_op_const_16: /* 0x13 */
684/* File: arm/op_const_16.S */
685 /* const/16 vAA, #+BBBB */
686 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
687 mov r3, rINST, lsr #8 @ r3<- AA
688 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
689 SET_VREG r0, r3 @ vAA<- r0
690 GET_INST_OPCODE ip @ extract opcode from rINST
691 GOTO_OPCODE ip @ jump to next instruction
692
693/* ------------------------------ */
694 .balign 128
695.L_op_const: /* 0x14 */
696/* File: arm/op_const.S */
697 /* const vAA, #+BBBBbbbb */
698 mov r3, rINST, lsr #8 @ r3<- AA
699 FETCH r0, 1 @ r0<- bbbb (low
700 FETCH r1, 2 @ r1<- BBBB (high
701 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
702 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
703 GET_INST_OPCODE ip @ extract opcode from rINST
704 SET_VREG r0, r3 @ vAA<- r0
705 GOTO_OPCODE ip @ jump to next instruction
706
707/* ------------------------------ */
708 .balign 128
709.L_op_const_high16: /* 0x15 */
710/* File: arm/op_const_high16.S */
711 /* const/high16 vAA, #+BBBB0000 */
712 FETCH r0, 1 @ r0<- 0000BBBB (zero-extended
713 mov r3, rINST, lsr #8 @ r3<- AA
714 mov r0, r0, lsl #16 @ r0<- BBBB0000
715 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
716 SET_VREG r0, r3 @ vAA<- r0
717 GET_INST_OPCODE ip @ extract opcode from rINST
718 GOTO_OPCODE ip @ jump to next instruction
719
720/* ------------------------------ */
721 .balign 128
722.L_op_const_wide_16: /* 0x16 */
723/* File: arm/op_const_wide_16.S */
724 /* const-wide/16 vAA, #+BBBB */
725 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
726 mov r3, rINST, lsr #8 @ r3<- AA
727 mov r1, r0, asr #31 @ r1<- ssssssss
728 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
729 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
730 GET_INST_OPCODE ip @ extract opcode from rINST
731 stmia r3, {r0-r1} @ vAA<- r0/r1
732 GOTO_OPCODE ip @ jump to next instruction
733
734/* ------------------------------ */
735 .balign 128
736.L_op_const_wide_32: /* 0x17 */
737/* File: arm/op_const_wide_32.S */
738 /* const-wide/32 vAA, #+BBBBbbbb */
739 FETCH r0, 1 @ r0<- 0000bbbb (low)
740 mov r3, rINST, lsr #8 @ r3<- AA
741 FETCH_S r2, 2 @ r2<- ssssBBBB (high)
742 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
743 orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb
744 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
745 mov r1, r0, asr #31 @ r1<- ssssssss
746 GET_INST_OPCODE ip @ extract opcode from rINST
747 stmia r3, {r0-r1} @ vAA<- r0/r1
748 GOTO_OPCODE ip @ jump to next instruction
749
750/* ------------------------------ */
751 .balign 128
752.L_op_const_wide: /* 0x18 */
753/* File: arm/op_const_wide.S */
754 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
755 FETCH r0, 1 @ r0<- bbbb (low)
756 FETCH r1, 2 @ r1<- BBBB (low middle)
757 FETCH r2, 3 @ r2<- hhhh (high middle)
758 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word)
759 FETCH r3, 4 @ r3<- HHHH (high)
760 mov r9, rINST, lsr #8 @ r9<- AA
761 orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word)
762 FETCH_ADVANCE_INST 5 @ advance rPC, load rINST
763 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
764 GET_INST_OPCODE ip @ extract opcode from rINST
765 stmia r9, {r0-r1} @ vAA<- r0/r1
766 GOTO_OPCODE ip @ jump to next instruction
767
768/* ------------------------------ */
769 .balign 128
770.L_op_const_wide_high16: /* 0x19 */
771/* File: arm/op_const_wide_high16.S */
772 /* const-wide/high16 vAA, #+BBBB000000000000 */
773 FETCH r1, 1 @ r1<- 0000BBBB (zero-extended)
774 mov r3, rINST, lsr #8 @ r3<- AA
775 mov r0, #0 @ r0<- 00000000
776 mov r1, r1, lsl #16 @ r1<- BBBB0000
777 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
778 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
779 GET_INST_OPCODE ip @ extract opcode from rINST
780 stmia r3, {r0-r1} @ vAA<- r0/r1
781 GOTO_OPCODE ip @ jump to next instruction
782
783/* ------------------------------ */
784 .balign 128
785.L_op_const_string: /* 0x1a */
786/* File: arm/op_const_string.S */
787 /* const/string vAA, String@BBBB */
788 EXPORT_PC
789 FETCH r0, 1 @ r0<- BBBB
790 mov r1, rINST, lsr #8 @ r1<- AA
791 add r2, rFP, #OFF_FP_SHADOWFRAME
792 mov r3, rSELF
793 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
794 PREFETCH_INST 2 @ load rINST
795 cmp r0, #0 @ fail?
796 bne MterpPossibleException @ let reference interpreter deal with it.
797 ADVANCE 2 @ advance rPC
798 GET_INST_OPCODE ip @ extract opcode from rINST
799 GOTO_OPCODE ip @ jump to next instruction
800
801/* ------------------------------ */
802 .balign 128
803.L_op_const_string_jumbo: /* 0x1b */
804/* File: arm/op_const_string_jumbo.S */
805 /* const/string vAA, String@BBBBBBBB */
806 EXPORT_PC
807 FETCH r0, 1 @ r0<- bbbb (low
808 FETCH r2, 2 @ r2<- BBBB (high
809 mov r1, rINST, lsr #8 @ r1<- AA
810 orr r0, r0, r2, lsl #16 @ r1<- BBBBbbbb
811 add r2, rFP, #OFF_FP_SHADOWFRAME
812 mov r3, rSELF
813 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
814 PREFETCH_INST 3 @ advance rPC
815 cmp r0, #0 @ fail?
816 bne MterpPossibleException @ let reference interpreter deal with it.
817 ADVANCE 3 @ advance rPC
818 GET_INST_OPCODE ip @ extract opcode from rINST
819 GOTO_OPCODE ip @ jump to next instruction
820
821/* ------------------------------ */
822 .balign 128
823.L_op_const_class: /* 0x1c */
824/* File: arm/op_const_class.S */
825 /* const/class vAA, Class@BBBB */
826 EXPORT_PC
827 FETCH r0, 1 @ r0<- BBBB
828 mov r1, rINST, lsr #8 @ r1<- AA
829 add r2, rFP, #OFF_FP_SHADOWFRAME
830 mov r3, rSELF
831 bl MterpConstClass @ (index, tgt_reg, shadow_frame, self)
832 PREFETCH_INST 2
833 cmp r0, #0
834 bne MterpPossibleException
835 ADVANCE 2
836 GET_INST_OPCODE ip @ extract opcode from rINST
837 GOTO_OPCODE ip @ jump to next instruction
838
839/* ------------------------------ */
840 .balign 128
841.L_op_monitor_enter: /* 0x1d */
842/* File: arm/op_monitor_enter.S */
843 /*
844 * Synchronize on an object.
845 */
846 /* monitor-enter vAA */
847 EXPORT_PC
848 mov r2, rINST, lsr #8 @ r2<- AA
849 GET_VREG r0, r2 @ r0<- vAA (object)
850 mov r1, rSELF @ r1<- self
851 bl artLockObjectFromCode
852 cmp r0, #0
853 bne MterpException
854 FETCH_ADVANCE_INST 1
855 GET_INST_OPCODE ip @ extract opcode from rINST
856 GOTO_OPCODE ip @ jump to next instruction
857
858/* ------------------------------ */
859 .balign 128
860.L_op_monitor_exit: /* 0x1e */
861/* File: arm/op_monitor_exit.S */
862 /*
863 * Unlock an object.
864 *
865 * Exceptions that occur when unlocking a monitor need to appear as
866 * if they happened at the following instruction. See the Dalvik
867 * instruction spec.
868 */
869 /* monitor-exit vAA */
870 EXPORT_PC
871 mov r2, rINST, lsr #8 @ r2<- AA
872 GET_VREG r0, r2 @ r0<- vAA (object)
873 mov r1, rSELF @ r0<- self
874 bl artUnlockObjectFromCode @ r0<- success for unlock(self, obj)
875 cmp r0, #0 @ failed?
876 bne MterpException
877 FETCH_ADVANCE_INST 1 @ before throw: advance rPC, load rINST
878 GET_INST_OPCODE ip @ extract opcode from rINST
879 GOTO_OPCODE ip @ jump to next instruction
880
881/* ------------------------------ */
882 .balign 128
883.L_op_check_cast: /* 0x1f */
884/* File: arm/op_check_cast.S */
885 /*
886 * Check to see if a cast from one class to another is allowed.
887 */
888 /* check-cast vAA, class@BBBB */
889 EXPORT_PC
890 FETCH r0, 1 @ r0<- BBBB
891 mov r1, rINST, lsr #8 @ r1<- AA
buzbeea2c97a92016-01-25 15:41:24 -0800892 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800893 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
894 mov r3, rSELF @ r3<- self
buzbeea2c97a92016-01-25 15:41:24 -0800895 bl MterpCheckCast @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800896 PREFETCH_INST 2
897 cmp r0, #0
898 bne MterpPossibleException
899 ADVANCE 2
900 GET_INST_OPCODE ip @ extract opcode from rINST
901 GOTO_OPCODE ip @ jump to next instruction
902
903/* ------------------------------ */
904 .balign 128
905.L_op_instance_of: /* 0x20 */
906/* File: arm/op_instance_of.S */
907 /*
908 * Check to see if an object reference is an instance of a class.
909 *
910 * Most common situation is a non-null object, being compared against
911 * an already-resolved class.
912 */
913 /* instance-of vA, vB, class@CCCC */
914 EXPORT_PC
915 FETCH r0, 1 @ r0<- CCCC
916 mov r1, rINST, lsr #12 @ r1<- B
buzbeea2c97a92016-01-25 15:41:24 -0800917 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800918 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
919 mov r3, rSELF @ r3<- self
920 mov r9, rINST, lsr #8 @ r9<- A+
921 and r9, r9, #15 @ r9<- A
buzbeea2c97a92016-01-25 15:41:24 -0800922 bl MterpInstanceOf @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800923 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
924 PREFETCH_INST 2
925 cmp r1, #0 @ exception pending?
926 bne MterpException
927 ADVANCE 2 @ advance rPC
928 SET_VREG r0, r9 @ vA<- r0
929 GET_INST_OPCODE ip @ extract opcode from rINST
930 GOTO_OPCODE ip @ jump to next instruction
931
932/* ------------------------------ */
933 .balign 128
934.L_op_array_length: /* 0x21 */
935/* File: arm/op_array_length.S */
936 /*
937 * Return the length of an array.
938 */
939 mov r1, rINST, lsr #12 @ r1<- B
940 ubfx r2, rINST, #8, #4 @ r2<- A
941 GET_VREG r0, r1 @ r0<- vB (object ref)
942 cmp r0, #0 @ is object null?
943 beq common_errNullObject @ yup, fail
944 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
945 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- array length
946 GET_INST_OPCODE ip @ extract opcode from rINST
947 SET_VREG r3, r2 @ vB<- length
948 GOTO_OPCODE ip @ jump to next instruction
949
950/* ------------------------------ */
951 .balign 128
952.L_op_new_instance: /* 0x22 */
953/* File: arm/op_new_instance.S */
954 /*
955 * Create a new instance of a class.
956 */
957 /* new-instance vAA, class@BBBB */
958 EXPORT_PC
959 add r0, rFP, #OFF_FP_SHADOWFRAME
960 mov r1, rSELF
961 mov r2, rINST
962 bl MterpNewInstance @ (shadow_frame, self, inst_data)
963 cmp r0, #0
964 beq MterpPossibleException
965 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
966 GET_INST_OPCODE ip @ extract opcode from rINST
967 GOTO_OPCODE ip @ jump to next instruction
968
969/* ------------------------------ */
970 .balign 128
971.L_op_new_array: /* 0x23 */
972/* File: arm/op_new_array.S */
973 /*
974 * Allocate an array of objects, specified with the array class
975 * and a count.
976 *
977 * The verifier guarantees that this is an array class, so we don't
978 * check for it here.
979 */
980 /* new-array vA, vB, class@CCCC */
981 EXPORT_PC
982 add r0, rFP, #OFF_FP_SHADOWFRAME
983 mov r1, rPC
984 mov r2, rINST
985 mov r3, rSELF
986 bl MterpNewArray
987 cmp r0, #0
988 beq MterpPossibleException
989 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
990 GET_INST_OPCODE ip @ extract opcode from rINST
991 GOTO_OPCODE ip @ jump to next instruction
992
993/* ------------------------------ */
994 .balign 128
995.L_op_filled_new_array: /* 0x24 */
996/* File: arm/op_filled_new_array.S */
997 /*
998 * Create a new array with elements filled from registers.
999 *
1000 * for: filled-new-array, filled-new-array/range
1001 */
1002 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1003 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1004 .extern MterpFilledNewArray
1005 EXPORT_PC
1006 add r0, rFP, #OFF_FP_SHADOWFRAME
1007 mov r1, rPC
1008 mov r2, rSELF
1009 bl MterpFilledNewArray
1010 cmp r0, #0
1011 beq MterpPossibleException
1012 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1013 GET_INST_OPCODE ip @ extract opcode from rINST
1014 GOTO_OPCODE ip @ jump to next instruction
1015
1016/* ------------------------------ */
1017 .balign 128
1018.L_op_filled_new_array_range: /* 0x25 */
1019/* File: arm/op_filled_new_array_range.S */
1020/* File: arm/op_filled_new_array.S */
1021 /*
1022 * Create a new array with elements filled from registers.
1023 *
1024 * for: filled-new-array, filled-new-array/range
1025 */
1026 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1027 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1028 .extern MterpFilledNewArrayRange
1029 EXPORT_PC
1030 add r0, rFP, #OFF_FP_SHADOWFRAME
1031 mov r1, rPC
1032 mov r2, rSELF
1033 bl MterpFilledNewArrayRange
1034 cmp r0, #0
1035 beq MterpPossibleException
1036 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1037 GET_INST_OPCODE ip @ extract opcode from rINST
1038 GOTO_OPCODE ip @ jump to next instruction
1039
1040
1041/* ------------------------------ */
1042 .balign 128
1043.L_op_fill_array_data: /* 0x26 */
1044/* File: arm/op_fill_array_data.S */
1045 /* fill-array-data vAA, +BBBBBBBB */
1046 EXPORT_PC
1047 FETCH r0, 1 @ r0<- bbbb (lo)
1048 FETCH r1, 2 @ r1<- BBBB (hi)
1049 mov r3, rINST, lsr #8 @ r3<- AA
1050 orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb
1051 GET_VREG r0, r3 @ r0<- vAA (array object)
1052 add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.)
1053 bl MterpFillArrayData @ (obj, payload)
1054 cmp r0, #0 @ 0 means an exception is thrown
1055 beq MterpPossibleException @ exception?
1056 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1057 GET_INST_OPCODE ip @ extract opcode from rINST
1058 GOTO_OPCODE ip @ jump to next instruction
1059
1060/* ------------------------------ */
1061 .balign 128
1062.L_op_throw: /* 0x27 */
1063/* File: arm/op_throw.S */
1064 /*
1065 * Throw an exception object in the current thread.
1066 */
1067 /* throw vAA */
1068 EXPORT_PC
1069 mov r2, rINST, lsr #8 @ r2<- AA
1070 GET_VREG r1, r2 @ r1<- vAA (exception object)
1071 cmp r1, #0 @ null object?
1072 beq common_errNullObject @ yes, throw an NPE instead
1073 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ thread->exception<- obj
1074 b MterpException
1075
1076/* ------------------------------ */
1077 .balign 128
1078.L_op_goto: /* 0x28 */
1079/* File: arm/op_goto.S */
1080 /*
1081 * Unconditional branch, 8-bit offset.
1082 *
1083 * The branch distance is a signed code-unit offset, which we need to
1084 * double to get a byte offset.
1085 */
1086 /* goto +AA */
1087 /* tuning: use sbfx for 6t2+ targets */
Bill Buzbee9687f242016-02-05 14:08:10 +00001088#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001089 mov r0, rINST, lsl #16 @ r0<- AAxx0000
Bill Buzbee9687f242016-02-05 14:08:10 +00001090 movs rINST, r0, asr #24 @ rINST<- ssssssAA (sign-extended)
1091 EXPORT_PC
1092 mov r0, rSELF
1093 add r1, rFP, #OFF_FP_SHADOWFRAME
1094 mov r2, rINST
1095 bl MterpProfileBranch @ (self, shadow_frame, offset)
1096 cmp r0, #0
1097 bne MterpOnStackReplacement @ Note: offset must be in rINST
1098 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1099 add r2, rINST, rINST @ r2<- byte offset, set flags
buzbee1452bee2015-03-06 14:43:04 -08001100 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001101 @ If backwards branch refresh rIBASE
1102 bmi MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001103 GET_INST_OPCODE ip @ extract opcode from rINST
1104 GOTO_OPCODE ip @ jump to next instruction
1105#else
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001106 mov r0, rINST, lsl #16 @ r0<- AAxx0000
Bill Buzbee9687f242016-02-05 14:08:10 +00001107 movs rINST, r0, asr #24 @ rINST<- ssssssAA (sign-extended)
1108 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1109 add r2, rINST, rINST @ r2<- byte offset, set flags
buzbee1452bee2015-03-06 14:43:04 -08001110 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1111 @ If backwards branch refresh rIBASE
1112 bmi MterpCheckSuspendAndContinue
1113 GET_INST_OPCODE ip @ extract opcode from rINST
1114 GOTO_OPCODE ip @ jump to next instruction
1115#endif
1116
1117/* ------------------------------ */
1118 .balign 128
1119.L_op_goto_16: /* 0x29 */
1120/* File: arm/op_goto_16.S */
1121 /*
1122 * Unconditional branch, 16-bit offset.
1123 *
1124 * The branch distance is a signed code-unit offset, which we need to
1125 * double to get a byte offset.
1126 */
1127 /* goto/16 +AAAA */
Bill Buzbee9687f242016-02-05 14:08:10 +00001128#if MTERP_PROFILE_BRANCHES
1129 FETCH_S rINST, 1 @ rINST<- ssssAAAA (sign-extended)
1130 EXPORT_PC
1131 mov r0, rSELF
1132 add r1, rFP, #OFF_FP_SHADOWFRAME
1133 mov r2, rINST
1134 bl MterpProfileBranch @ (self, shadow_frame, offset)
1135 cmp r0, #0
1136 bne MterpOnStackReplacement @ Note: offset must be in rINST
1137 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1138 adds r1, rINST, rINST @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001139 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001140 bmi MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001141 GET_INST_OPCODE ip @ extract opcode from rINST
1142 GOTO_OPCODE ip @ jump to next instruction
1143#else
Bill Buzbee9687f242016-02-05 14:08:10 +00001144 FETCH_S rINST, 1 @ rINST<- ssssAAAA (sign-extended)
buzbee1452bee2015-03-06 14:43:04 -08001145 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001146 adds r1, rINST, rINST @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001147 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1148 bmi MterpCheckSuspendAndContinue
1149 GET_INST_OPCODE ip @ extract opcode from rINST
1150 GOTO_OPCODE ip @ jump to next instruction
1151#endif
1152
1153/* ------------------------------ */
1154 .balign 128
1155.L_op_goto_32: /* 0x2a */
1156/* File: arm/op_goto_32.S */
1157 /*
1158 * Unconditional branch, 32-bit offset.
1159 *
1160 * The branch distance is a signed code-unit offset, which we need to
1161 * double to get a byte offset.
1162 *
1163 * Unlike most opcodes, this one is allowed to branch to itself, so
1164 * our "backward branch" test must be "<=0" instead of "<0". Because
1165 * we need the V bit set, we'll use an adds to convert from Dalvik
1166 * offset to byte offset.
1167 */
1168 /* goto/32 +AAAAAAAA */
Bill Buzbee9687f242016-02-05 14:08:10 +00001169#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001170 FETCH r0, 1 @ r0<- aaaa (lo)
1171 FETCH r1, 2 @ r1<- AAAA (hi)
Bill Buzbee9687f242016-02-05 14:08:10 +00001172 orr rINST, r0, r1, lsl #16 @ rINST<- AAAAaaaa
1173 EXPORT_PC
1174 mov r0, rSELF
1175 add r1, rFP, #OFF_FP_SHADOWFRAME
1176 mov r2, rINST
1177 bl MterpProfileBranch @ (self, shadow_frame, offset)
1178 cmp r0, #0
1179 bne MterpOnStackReplacement @ Note: offset must be in rINST
1180 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1181 adds r1, rINST, rINST @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001182 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001183 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001184 GET_INST_OPCODE ip @ extract opcode from rINST
1185 GOTO_OPCODE ip @ jump to next instruction
1186#else
1187 FETCH r0, 1 @ r0<- aaaa (lo)
1188 FETCH r1, 2 @ r1<- AAAA (hi)
Bill Buzbee9687f242016-02-05 14:08:10 +00001189 orr rINST, r0, r1, lsl #16 @ rINST<- AAAAaaaa
buzbee1452bee2015-03-06 14:43:04 -08001190 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001191 adds r1, rINST, rINST @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001192 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1193 ble MterpCheckSuspendAndContinue
1194 GET_INST_OPCODE ip @ extract opcode from rINST
1195 GOTO_OPCODE ip @ jump to next instruction
1196#endif
1197
1198/* ------------------------------ */
1199 .balign 128
1200.L_op_packed_switch: /* 0x2b */
1201/* File: arm/op_packed_switch.S */
1202 /*
1203 * Handle a packed-switch or sparse-switch instruction. In both cases
1204 * we decode it and hand it off to a helper function.
1205 *
1206 * We don't really expect backward branches in a switch statement, but
1207 * they're perfectly legal, so we check for them here.
1208 *
1209 * for: packed-switch, sparse-switch
1210 */
1211 /* op vAA, +BBBB */
Bill Buzbee9687f242016-02-05 14:08:10 +00001212#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001213 FETCH r0, 1 @ r0<- bbbb (lo)
1214 FETCH r1, 2 @ r1<- BBBB (hi)
1215 mov r3, rINST, lsr #8 @ r3<- AA
1216 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1217 GET_VREG r1, r3 @ r1<- vAA
1218 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1219 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
Bill Buzbee9687f242016-02-05 14:08:10 +00001220 mov rINST, r0
1221 EXPORT_PC
1222 mov r0, rSELF
1223 add r1, rFP, #OFF_FP_SHADOWFRAME
1224 mov r2, rINST
1225 bl MterpProfileBranch @ (self, shadow_frame, offset)
1226 cmp r0, #0
1227 bne MterpOnStackReplacement @ Note: offset must be in rINST
1228 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1229 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001230 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001231 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001232 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 MterpDoPackedSwitch @ r0<- code-unit branch offset
Bill Buzbee9687f242016-02-05 14:08:10 +00001242 mov rINST, r0
buzbee1452bee2015-03-06 14:43:04 -08001243 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001244 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001245 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1246 ble MterpCheckSuspendAndContinue
1247 GET_INST_OPCODE ip @ extract opcode from rINST
1248 GOTO_OPCODE ip @ jump to next instruction
1249#endif
1250
1251/* ------------------------------ */
1252 .balign 128
1253.L_op_sparse_switch: /* 0x2c */
1254/* File: arm/op_sparse_switch.S */
1255/* File: arm/op_packed_switch.S */
1256 /*
1257 * Handle a packed-switch or sparse-switch instruction. In both cases
1258 * we decode it and hand it off to a helper function.
1259 *
1260 * We don't really expect backward branches in a switch statement, but
1261 * they're perfectly legal, so we check for them here.
1262 *
1263 * for: packed-switch, sparse-switch
1264 */
1265 /* op vAA, +BBBB */
Bill Buzbee9687f242016-02-05 14:08:10 +00001266#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001267 FETCH r0, 1 @ r0<- bbbb (lo)
1268 FETCH r1, 2 @ r1<- BBBB (hi)
1269 mov r3, rINST, lsr #8 @ r3<- AA
1270 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1271 GET_VREG r1, r3 @ r1<- vAA
1272 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1273 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
Bill Buzbee9687f242016-02-05 14:08:10 +00001274 mov rINST, r0
1275 EXPORT_PC
1276 mov r0, rSELF
1277 add r1, rFP, #OFF_FP_SHADOWFRAME
1278 mov r2, rINST
1279 bl MterpProfileBranch @ (self, shadow_frame, offset)
1280 cmp r0, #0
1281 bne MterpOnStackReplacement @ Note: offset must be in rINST
1282 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1283 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001284 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001285 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001286 GET_INST_OPCODE ip @ extract opcode from rINST
1287 GOTO_OPCODE ip @ jump to next instruction
1288#else
1289 FETCH r0, 1 @ r0<- bbbb (lo)
1290 FETCH r1, 2 @ r1<- BBBB (hi)
1291 mov r3, rINST, lsr #8 @ r3<- AA
1292 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1293 GET_VREG r1, r3 @ r1<- vAA
1294 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1295 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
Bill Buzbee9687f242016-02-05 14:08:10 +00001296 mov rINST, r0
buzbee1452bee2015-03-06 14:43:04 -08001297 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001298 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001299 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1300 ble MterpCheckSuspendAndContinue
1301 GET_INST_OPCODE ip @ extract opcode from rINST
1302 GOTO_OPCODE ip @ jump to next instruction
1303#endif
1304
1305
1306/* ------------------------------ */
1307 .balign 128
1308.L_op_cmpl_float: /* 0x2d */
1309/* File: arm/op_cmpl_float.S */
1310 /*
1311 * Compare two floating-point values. Puts 0, 1, or -1 into the
1312 * destination register based on the results of the comparison.
1313 *
1314 * int compare(x, y) {
1315 * if (x == y) {
1316 * return 0;
1317 * } else if (x > y) {
1318 * return 1;
1319 * } else if (x < y) {
1320 * return -1;
1321 * } else {
1322 * return -1;
1323 * }
1324 * }
1325 */
1326 /* op vAA, vBB, vCC */
1327 FETCH r0, 1 @ r0<- CCBB
1328 mov r9, rINST, lsr #8 @ r9<- AA
1329 and r2, r0, #255 @ r2<- BB
1330 mov r3, r0, lsr #8 @ r3<- CC
1331 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1332 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1333 flds s0, [r2] @ s0<- vBB
1334 flds s1, [r3] @ s1<- vCC
1335 fcmpes s0, s1 @ compare (vBB, vCC)
1336 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1337 mvn r0, #0 @ r0<- -1 (default)
1338 GET_INST_OPCODE ip @ extract opcode from rINST
1339 fmstat @ export status flags
1340 movgt r0, #1 @ (greater than) r1<- 1
1341 moveq r0, #0 @ (equal) r1<- 0
1342 SET_VREG r0, r9 @ vAA<- r0
1343 GOTO_OPCODE ip @ jump to next instruction
1344
1345/* ------------------------------ */
1346 .balign 128
1347.L_op_cmpg_float: /* 0x2e */
1348/* File: arm/op_cmpg_float.S */
1349 /*
1350 * Compare two floating-point values. Puts 0, 1, or -1 into the
1351 * destination register based on the results of the comparison.
1352 *
1353 * int compare(x, y) {
1354 * if (x == y) {
1355 * return 0;
1356 * } else if (x < y) {
1357 * return -1;
1358 * } else if (x > y) {
1359 * return 1;
1360 * } else {
1361 * return 1;
1362 * }
1363 * }
1364 */
1365 /* op vAA, vBB, vCC */
1366 FETCH r0, 1 @ r0<- CCBB
1367 mov r9, rINST, lsr #8 @ r9<- AA
1368 and r2, r0, #255 @ r2<- BB
1369 mov r3, r0, lsr #8 @ r3<- CC
1370 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1371 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1372 flds s0, [r2] @ s0<- vBB
1373 flds s1, [r3] @ s1<- vCC
1374 fcmpes s0, s1 @ compare (vBB, vCC)
1375 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1376 mov r0, #1 @ r0<- 1 (default)
1377 GET_INST_OPCODE ip @ extract opcode from rINST
1378 fmstat @ export status flags
1379 mvnmi r0, #0 @ (less than) r1<- -1
1380 moveq r0, #0 @ (equal) r1<- 0
1381 SET_VREG r0, r9 @ vAA<- r0
1382 GOTO_OPCODE ip @ jump to next instruction
1383
1384/* ------------------------------ */
1385 .balign 128
1386.L_op_cmpl_double: /* 0x2f */
1387/* File: arm/op_cmpl_double.S */
1388 /*
1389 * Compare two floating-point values. Puts 0, 1, or -1 into the
1390 * destination register based on the results of the comparison.
1391 *
1392 * int compare(x, y) {
1393 * if (x == y) {
1394 * return 0;
1395 * } else if (x > y) {
1396 * return 1;
1397 * } else if (x < y) {
1398 * return -1;
1399 * } else {
1400 * return -1;
1401 * }
1402 * }
1403 */
1404 /* op vAA, vBB, vCC */
1405 FETCH r0, 1 @ r0<- CCBB
1406 mov r9, rINST, lsr #8 @ r9<- AA
1407 and r2, r0, #255 @ r2<- BB
1408 mov r3, r0, lsr #8 @ r3<- CC
1409 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1410 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1411 fldd d0, [r2] @ d0<- vBB
1412 fldd d1, [r3] @ d1<- vCC
1413 fcmped d0, d1 @ compare (vBB, vCC)
1414 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1415 mvn r0, #0 @ r0<- -1 (default)
1416 GET_INST_OPCODE ip @ extract opcode from rINST
1417 fmstat @ export status flags
1418 movgt r0, #1 @ (greater than) r1<- 1
1419 moveq r0, #0 @ (equal) r1<- 0
1420 SET_VREG r0, r9 @ vAA<- r0
1421 GOTO_OPCODE ip @ jump to next instruction
1422
1423/* ------------------------------ */
1424 .balign 128
1425.L_op_cmpg_double: /* 0x30 */
1426/* File: arm/op_cmpg_double.S */
1427 /*
1428 * Compare two floating-point values. Puts 0, 1, or -1 into the
1429 * destination register based on the results of the comparison.
1430 *
1431 * int compare(x, y) {
1432 * if (x == y) {
1433 * return 0;
1434 * } else if (x < y) {
1435 * return -1;
1436 * } else if (x > y) {
1437 * return 1;
1438 * } else {
1439 * return 1;
1440 * }
1441 * }
1442 */
1443 /* op vAA, vBB, vCC */
1444 FETCH r0, 1 @ r0<- CCBB
1445 mov r9, rINST, lsr #8 @ r9<- AA
1446 and r2, r0, #255 @ r2<- BB
1447 mov r3, r0, lsr #8 @ r3<- CC
1448 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1449 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1450 fldd d0, [r2] @ d0<- vBB
1451 fldd d1, [r3] @ d1<- vCC
1452 fcmped d0, d1 @ compare (vBB, vCC)
1453 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1454 mov r0, #1 @ r0<- 1 (default)
1455 GET_INST_OPCODE ip @ extract opcode from rINST
1456 fmstat @ export status flags
1457 mvnmi r0, #0 @ (less than) r1<- -1
1458 moveq r0, #0 @ (equal) r1<- 0
1459 SET_VREG r0, r9 @ vAA<- r0
1460 GOTO_OPCODE ip @ jump to next instruction
1461
1462/* ------------------------------ */
1463 .balign 128
1464.L_op_cmp_long: /* 0x31 */
1465/* File: arm/op_cmp_long.S */
1466 /*
1467 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination
1468 * register based on the results of the comparison.
1469 *
1470 * We load the full values with LDM, but in practice many values could
1471 * be resolved by only looking at the high word. This could be made
1472 * faster or slower by splitting the LDM into a pair of LDRs.
1473 *
1474 * If we just wanted to set condition flags, we could do this:
1475 * subs ip, r0, r2
1476 * sbcs ip, r1, r3
1477 * subeqs ip, r0, r2
1478 * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific
1479 * integer value, which we can do with 2 conditional mov/mvn instructions
1480 * (set 1, set -1; if they're equal we already have 0 in ip), giving
1481 * us a constant 5-cycle path plus a branch at the end to the
1482 * instruction epilogue code. The multi-compare approach below needs
1483 * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1484 * in the worst case (the 64-bit values are equal).
1485 */
1486 /* cmp-long vAA, vBB, vCC */
1487 FETCH r0, 1 @ r0<- CCBB
1488 mov r9, rINST, lsr #8 @ r9<- AA
1489 and r2, r0, #255 @ r2<- BB
1490 mov r3, r0, lsr #8 @ r3<- CC
1491 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
1492 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
1493 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
1494 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
1495 cmp r1, r3 @ compare (vBB+1, vCC+1)
1496 blt .Lop_cmp_long_less @ signed compare on high part
1497 bgt .Lop_cmp_long_greater
1498 subs r1, r0, r2 @ r1<- r0 - r2
1499 bhi .Lop_cmp_long_greater @ unsigned compare on low part
1500 bne .Lop_cmp_long_less
1501 b .Lop_cmp_long_finish @ equal; r1 already holds 0
1502
1503/* ------------------------------ */
1504 .balign 128
1505.L_op_if_eq: /* 0x32 */
1506/* File: arm/op_if_eq.S */
1507/* File: arm/bincmp.S */
1508 /*
1509 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1510 * fragment that specifies the *reverse* comparison to perform, e.g.
1511 * for "if-le" you would use "gt".
1512 *
1513 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1514 */
1515 /* if-cmp vA, vB, +CCCC */
Bill Buzbee9687f242016-02-05 14:08:10 +00001516#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001517 mov r1, rINST, lsr #12 @ r1<- B
1518 ubfx r0, rINST, #8, #4 @ r0<- A
1519 GET_VREG r3, r1 @ r3<- vB
1520 GET_VREG r2, r0 @ r2<- vA
Bill Buzbee9687f242016-02-05 14:08:10 +00001521 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001522 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001523 bne .L_op_if_eq_not_taken
1524 EXPORT_PC
1525 mov r0, rSELF
1526 add r1, rFP, #OFF_FP_SHADOWFRAME
1527 mov r2, rINST
1528 bl MterpProfileBranch @ (self, shadow_frame, offset)
1529 cmp r0, #0
1530 bne MterpOnStackReplacement @ Note: offset must be in rINST
1531 adds r2, rINST, rINST @ convert to bytes, check sign
1532 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001533 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001534 bmi MterpCheckSuspendAndContinue
1535 GET_INST_OPCODE ip @ extract opcode from rINST
1536 GOTO_OPCODE ip @ jump to next instruction
1537.L_op_if_eq_not_taken:
1538 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001539 GET_INST_OPCODE ip @ extract opcode from rINST
1540 GOTO_OPCODE ip @ jump to next instruction
1541#else
1542 mov r1, rINST, lsr #12 @ r1<- B
1543 ubfx r0, rINST, #8, #4 @ r0<- A
1544 GET_VREG r3, r1 @ r3<- vB
1545 GET_VREG r2, r0 @ r2<- vA
1546 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001547 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001548 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001549 movne rINST, #2 @ rINST<- BYTE branch dist for not-taken
1550 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001551 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1552 bmi MterpCheckSuspendAndContinue
1553 GET_INST_OPCODE ip @ extract opcode from rINST
1554 GOTO_OPCODE ip @ jump to next instruction
1555#endif
1556
1557
1558/* ------------------------------ */
1559 .balign 128
1560.L_op_if_ne: /* 0x33 */
1561/* File: arm/op_if_ne.S */
1562/* File: arm/bincmp.S */
1563 /*
1564 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1565 * fragment that specifies the *reverse* comparison to perform, e.g.
1566 * for "if-le" you would use "gt".
1567 *
1568 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1569 */
1570 /* if-cmp vA, vB, +CCCC */
Bill Buzbee9687f242016-02-05 14:08:10 +00001571#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001572 mov r1, rINST, lsr #12 @ r1<- B
1573 ubfx r0, rINST, #8, #4 @ r0<- A
1574 GET_VREG r3, r1 @ r3<- vB
1575 GET_VREG r2, r0 @ r2<- vA
Bill Buzbee9687f242016-02-05 14:08:10 +00001576 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001577 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001578 beq .L_op_if_ne_not_taken
1579 EXPORT_PC
1580 mov r0, rSELF
1581 add r1, rFP, #OFF_FP_SHADOWFRAME
1582 mov r2, rINST
1583 bl MterpProfileBranch @ (self, shadow_frame, offset)
1584 cmp r0, #0
1585 bne MterpOnStackReplacement @ Note: offset must be in rINST
1586 adds r2, rINST, rINST @ convert to bytes, check sign
1587 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001588 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001589 bmi MterpCheckSuspendAndContinue
1590 GET_INST_OPCODE ip @ extract opcode from rINST
1591 GOTO_OPCODE ip @ jump to next instruction
1592.L_op_if_ne_not_taken:
1593 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001594 GET_INST_OPCODE ip @ extract opcode from rINST
1595 GOTO_OPCODE ip @ jump to next instruction
1596#else
1597 mov r1, rINST, lsr #12 @ r1<- B
1598 ubfx r0, rINST, #8, #4 @ r0<- A
1599 GET_VREG r3, r1 @ r3<- vB
1600 GET_VREG r2, r0 @ r2<- vA
1601 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001602 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001603 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001604 moveq rINST, #2 @ rINST<- BYTE branch dist for not-taken
1605 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001606 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1607 bmi MterpCheckSuspendAndContinue
1608 GET_INST_OPCODE ip @ extract opcode from rINST
1609 GOTO_OPCODE ip @ jump to next instruction
1610#endif
1611
1612
1613/* ------------------------------ */
1614 .balign 128
1615.L_op_if_lt: /* 0x34 */
1616/* File: arm/op_if_lt.S */
1617/* File: arm/bincmp.S */
1618 /*
1619 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1620 * fragment that specifies the *reverse* comparison to perform, e.g.
1621 * for "if-le" you would use "gt".
1622 *
1623 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1624 */
1625 /* if-cmp vA, vB, +CCCC */
Bill Buzbee9687f242016-02-05 14:08:10 +00001626#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001627 mov r1, rINST, lsr #12 @ r1<- B
1628 ubfx r0, rINST, #8, #4 @ r0<- A
1629 GET_VREG r3, r1 @ r3<- vB
1630 GET_VREG r2, r0 @ r2<- vA
Bill Buzbee9687f242016-02-05 14:08:10 +00001631 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001632 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001633 bge .L_op_if_lt_not_taken
1634 EXPORT_PC
1635 mov r0, rSELF
1636 add r1, rFP, #OFF_FP_SHADOWFRAME
1637 mov r2, rINST
1638 bl MterpProfileBranch @ (self, shadow_frame, offset)
1639 cmp r0, #0
1640 bne MterpOnStackReplacement @ Note: offset must be in rINST
1641 adds r2, rINST, rINST @ convert to bytes, check sign
1642 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001643 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001644 bmi MterpCheckSuspendAndContinue
1645 GET_INST_OPCODE ip @ extract opcode from rINST
1646 GOTO_OPCODE ip @ jump to next instruction
1647.L_op_if_lt_not_taken:
1648 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001649 GET_INST_OPCODE ip @ extract opcode from rINST
1650 GOTO_OPCODE ip @ jump to next instruction
1651#else
1652 mov r1, rINST, lsr #12 @ r1<- B
1653 ubfx r0, rINST, #8, #4 @ r0<- A
1654 GET_VREG r3, r1 @ r3<- vB
1655 GET_VREG r2, r0 @ r2<- vA
1656 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001657 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001658 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001659 movge rINST, #2 @ rINST<- BYTE branch dist for not-taken
1660 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001661 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1662 bmi MterpCheckSuspendAndContinue
1663 GET_INST_OPCODE ip @ extract opcode from rINST
1664 GOTO_OPCODE ip @ jump to next instruction
1665#endif
1666
1667
1668/* ------------------------------ */
1669 .balign 128
1670.L_op_if_ge: /* 0x35 */
1671/* File: arm/op_if_ge.S */
1672/* File: arm/bincmp.S */
1673 /*
1674 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1675 * fragment that specifies the *reverse* comparison to perform, e.g.
1676 * for "if-le" you would use "gt".
1677 *
1678 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1679 */
1680 /* if-cmp vA, vB, +CCCC */
Bill Buzbee9687f242016-02-05 14:08:10 +00001681#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001682 mov r1, rINST, lsr #12 @ r1<- B
1683 ubfx r0, rINST, #8, #4 @ r0<- A
1684 GET_VREG r3, r1 @ r3<- vB
1685 GET_VREG r2, r0 @ r2<- vA
Bill Buzbee9687f242016-02-05 14:08:10 +00001686 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001687 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001688 blt .L_op_if_ge_not_taken
1689 EXPORT_PC
1690 mov r0, rSELF
1691 add r1, rFP, #OFF_FP_SHADOWFRAME
1692 mov r2, rINST
1693 bl MterpProfileBranch @ (self, shadow_frame, offset)
1694 cmp r0, #0
1695 bne MterpOnStackReplacement @ Note: offset must be in rINST
1696 adds r2, rINST, rINST @ convert to bytes, check sign
1697 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001698 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001699 bmi MterpCheckSuspendAndContinue
1700 GET_INST_OPCODE ip @ extract opcode from rINST
1701 GOTO_OPCODE ip @ jump to next instruction
1702.L_op_if_ge_not_taken:
1703 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001704 GET_INST_OPCODE ip @ extract opcode from rINST
1705 GOTO_OPCODE ip @ jump to next instruction
1706#else
1707 mov r1, rINST, lsr #12 @ r1<- B
1708 ubfx r0, rINST, #8, #4 @ r0<- A
1709 GET_VREG r3, r1 @ r3<- vB
1710 GET_VREG r2, r0 @ r2<- vA
1711 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001712 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001713 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001714 movlt rINST, #2 @ rINST<- BYTE branch dist for not-taken
1715 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001716 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1717 bmi MterpCheckSuspendAndContinue
1718 GET_INST_OPCODE ip @ extract opcode from rINST
1719 GOTO_OPCODE ip @ jump to next instruction
1720#endif
1721
1722
1723/* ------------------------------ */
1724 .balign 128
1725.L_op_if_gt: /* 0x36 */
1726/* File: arm/op_if_gt.S */
1727/* File: arm/bincmp.S */
1728 /*
1729 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1730 * fragment that specifies the *reverse* comparison to perform, e.g.
1731 * for "if-le" you would use "gt".
1732 *
1733 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1734 */
1735 /* if-cmp vA, vB, +CCCC */
Bill Buzbee9687f242016-02-05 14:08:10 +00001736#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001737 mov r1, rINST, lsr #12 @ r1<- B
1738 ubfx r0, rINST, #8, #4 @ r0<- A
1739 GET_VREG r3, r1 @ r3<- vB
1740 GET_VREG r2, r0 @ r2<- vA
Bill Buzbee9687f242016-02-05 14:08:10 +00001741 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001742 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001743 ble .L_op_if_gt_not_taken
1744 EXPORT_PC
1745 mov r0, rSELF
1746 add r1, rFP, #OFF_FP_SHADOWFRAME
1747 mov r2, rINST
1748 bl MterpProfileBranch @ (self, shadow_frame, offset)
1749 cmp r0, #0
1750 bne MterpOnStackReplacement @ Note: offset must be in rINST
1751 adds r2, rINST, rINST @ convert to bytes, check sign
1752 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001753 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001754 bmi MterpCheckSuspendAndContinue
1755 GET_INST_OPCODE ip @ extract opcode from rINST
1756 GOTO_OPCODE ip @ jump to next instruction
1757.L_op_if_gt_not_taken:
1758 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001759 GET_INST_OPCODE ip @ extract opcode from rINST
1760 GOTO_OPCODE ip @ jump to next instruction
1761#else
1762 mov r1, rINST, lsr #12 @ r1<- B
1763 ubfx r0, rINST, #8, #4 @ r0<- A
1764 GET_VREG r3, r1 @ r3<- vB
1765 GET_VREG r2, r0 @ r2<- vA
1766 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001767 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001768 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001769 movle rINST, #2 @ rINST<- BYTE branch dist for not-taken
1770 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001771 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1772 bmi MterpCheckSuspendAndContinue
1773 GET_INST_OPCODE ip @ extract opcode from rINST
1774 GOTO_OPCODE ip @ jump to next instruction
1775#endif
1776
1777
1778/* ------------------------------ */
1779 .balign 128
1780.L_op_if_le: /* 0x37 */
1781/* File: arm/op_if_le.S */
1782/* File: arm/bincmp.S */
1783 /*
1784 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1785 * fragment that specifies the *reverse* comparison to perform, e.g.
1786 * for "if-le" you would use "gt".
1787 *
1788 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1789 */
1790 /* if-cmp vA, vB, +CCCC */
Bill Buzbee9687f242016-02-05 14:08:10 +00001791#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001792 mov r1, rINST, lsr #12 @ r1<- B
1793 ubfx r0, rINST, #8, #4 @ r0<- A
1794 GET_VREG r3, r1 @ r3<- vB
1795 GET_VREG r2, r0 @ r2<- vA
Bill Buzbee9687f242016-02-05 14:08:10 +00001796 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001797 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001798 bgt .L_op_if_le_not_taken
1799 EXPORT_PC
1800 mov r0, rSELF
1801 add r1, rFP, #OFF_FP_SHADOWFRAME
1802 mov r2, rINST
1803 bl MterpProfileBranch @ (self, shadow_frame, offset)
1804 cmp r0, #0
1805 bne MterpOnStackReplacement @ Note: offset must be in rINST
1806 adds r2, rINST, rINST @ convert to bytes, check sign
1807 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001808 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001809 bmi MterpCheckSuspendAndContinue
1810 GET_INST_OPCODE ip @ extract opcode from rINST
1811 GOTO_OPCODE ip @ jump to next instruction
1812.L_op_if_le_not_taken:
1813 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001814 GET_INST_OPCODE ip @ extract opcode from rINST
1815 GOTO_OPCODE ip @ jump to next instruction
1816#else
1817 mov r1, rINST, lsr #12 @ r1<- B
1818 ubfx r0, rINST, #8, #4 @ r0<- A
1819 GET_VREG r3, r1 @ r3<- vB
1820 GET_VREG r2, r0 @ r2<- vA
1821 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbee9687f242016-02-05 14:08:10 +00001822 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001823 cmp r2, r3 @ compare (vA, vB)
Bill Buzbee9687f242016-02-05 14:08:10 +00001824 movgt rINST, #2 @ rINST<- BYTE branch dist for not-taken
1825 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001826 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1827 bmi MterpCheckSuspendAndContinue
1828 GET_INST_OPCODE ip @ extract opcode from rINST
1829 GOTO_OPCODE ip @ jump to next instruction
1830#endif
1831
1832
1833/* ------------------------------ */
1834 .balign 128
1835.L_op_if_eqz: /* 0x38 */
1836/* File: arm/op_if_eqz.S */
1837/* File: arm/zcmp.S */
1838 /*
1839 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1840 * fragment that specifies the *reverse* comparison to perform, e.g.
1841 * for "if-le" you would use "gt".
1842 *
1843 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1844 */
1845 /* if-cmp vAA, +BBBB */
Bill Buzbee9687f242016-02-05 14:08:10 +00001846#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001847 mov r0, rINST, lsr #8 @ r0<- AA
1848 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00001849 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1850 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001851 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00001852 bne .L_op_if_eqz_not_taken
1853 EXPORT_PC
1854 mov r0, rSELF
1855 add r1, rFP, #OFF_FP_SHADOWFRAME
1856 mov r2, rINST
1857 bl MterpProfileBranch @ (self, shadow_frame, offset)
1858 cmp r0, #0
1859 bne MterpOnStackReplacement @ Note: offset must be in rINST
1860 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001861 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001862 bmi MterpCheckSuspendAndContinue
1863 GET_INST_OPCODE ip @ extract opcode from rINST
1864 GOTO_OPCODE ip @ jump to next instruction
1865.L_op_if_eqz_not_taken:
1866 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001867 GET_INST_OPCODE ip @ extract opcode from rINST
1868 GOTO_OPCODE ip @ jump to next instruction
1869#else
1870 mov r0, rINST, lsr #8 @ r0<- AA
1871 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00001872 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001873 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1874 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00001875 movne rINST, #2 @ rINST<- inst branch dist for not-taken
1876 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001877 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1878 bmi MterpCheckSuspendAndContinue
1879 GET_INST_OPCODE ip @ extract opcode from rINST
1880 GOTO_OPCODE ip @ jump to next instruction
1881#endif
1882
1883
1884/* ------------------------------ */
1885 .balign 128
1886.L_op_if_nez: /* 0x39 */
1887/* File: arm/op_if_nez.S */
1888/* File: arm/zcmp.S */
1889 /*
1890 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1891 * fragment that specifies the *reverse* comparison to perform, e.g.
1892 * for "if-le" you would use "gt".
1893 *
1894 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1895 */
1896 /* if-cmp vAA, +BBBB */
Bill Buzbee9687f242016-02-05 14:08:10 +00001897#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001898 mov r0, rINST, lsr #8 @ r0<- AA
1899 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00001900 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1901 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001902 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00001903 beq .L_op_if_nez_not_taken
1904 EXPORT_PC
1905 mov r0, rSELF
1906 add r1, rFP, #OFF_FP_SHADOWFRAME
1907 mov r2, rINST
1908 bl MterpProfileBranch @ (self, shadow_frame, offset)
1909 cmp r0, #0
1910 bne MterpOnStackReplacement @ Note: offset must be in rINST
1911 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001912 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001913 bmi MterpCheckSuspendAndContinue
1914 GET_INST_OPCODE ip @ extract opcode from rINST
1915 GOTO_OPCODE ip @ jump to next instruction
1916.L_op_if_nez_not_taken:
1917 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001918 GET_INST_OPCODE ip @ extract opcode from rINST
1919 GOTO_OPCODE ip @ jump to next instruction
1920#else
1921 mov r0, rINST, lsr #8 @ r0<- AA
1922 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00001923 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001924 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1925 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00001926 moveq rINST, #2 @ rINST<- inst branch dist for not-taken
1927 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001928 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1929 bmi MterpCheckSuspendAndContinue
1930 GET_INST_OPCODE ip @ extract opcode from rINST
1931 GOTO_OPCODE ip @ jump to next instruction
1932#endif
1933
1934
1935/* ------------------------------ */
1936 .balign 128
1937.L_op_if_ltz: /* 0x3a */
1938/* File: arm/op_if_ltz.S */
1939/* File: arm/zcmp.S */
1940 /*
1941 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1942 * fragment that specifies the *reverse* comparison to perform, e.g.
1943 * for "if-le" you would use "gt".
1944 *
1945 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1946 */
1947 /* if-cmp vAA, +BBBB */
Bill Buzbee9687f242016-02-05 14:08:10 +00001948#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001949 mov r0, rINST, lsr #8 @ r0<- AA
1950 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00001951 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1952 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001953 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00001954 bge .L_op_if_ltz_not_taken
1955 EXPORT_PC
1956 mov r0, rSELF
1957 add r1, rFP, #OFF_FP_SHADOWFRAME
1958 mov r2, rINST
1959 bl MterpProfileBranch @ (self, shadow_frame, offset)
1960 cmp r0, #0
1961 bne MterpOnStackReplacement @ Note: offset must be in rINST
1962 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001963 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00001964 bmi MterpCheckSuspendAndContinue
1965 GET_INST_OPCODE ip @ extract opcode from rINST
1966 GOTO_OPCODE ip @ jump to next instruction
1967.L_op_if_ltz_not_taken:
1968 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001969 GET_INST_OPCODE ip @ extract opcode from rINST
1970 GOTO_OPCODE ip @ jump to next instruction
1971#else
1972 mov r0, rINST, lsr #8 @ r0<- AA
1973 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00001974 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001975 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1976 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00001977 movge rINST, #2 @ rINST<- inst branch dist for not-taken
1978 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001979 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1980 bmi MterpCheckSuspendAndContinue
1981 GET_INST_OPCODE ip @ extract opcode from rINST
1982 GOTO_OPCODE ip @ jump to next instruction
1983#endif
1984
1985
1986/* ------------------------------ */
1987 .balign 128
1988.L_op_if_gez: /* 0x3b */
1989/* File: arm/op_if_gez.S */
1990/* File: arm/zcmp.S */
1991 /*
1992 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1993 * fragment that specifies the *reverse* comparison to perform, e.g.
1994 * for "if-le" you would use "gt".
1995 *
1996 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1997 */
1998 /* if-cmp vAA, +BBBB */
Bill Buzbee9687f242016-02-05 14:08:10 +00001999#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08002000 mov r0, rINST, lsr #8 @ r0<- AA
2001 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00002002 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
2003 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08002004 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00002005 blt .L_op_if_gez_not_taken
2006 EXPORT_PC
2007 mov r0, rSELF
2008 add r1, rFP, #OFF_FP_SHADOWFRAME
2009 mov r2, rINST
2010 bl MterpProfileBranch @ (self, shadow_frame, offset)
2011 cmp r0, #0
2012 bne MterpOnStackReplacement @ Note: offset must be in rINST
2013 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002014 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00002015 bmi MterpCheckSuspendAndContinue
2016 GET_INST_OPCODE ip @ extract opcode from rINST
2017 GOTO_OPCODE ip @ jump to next instruction
2018.L_op_if_gez_not_taken:
2019 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08002020 GET_INST_OPCODE ip @ extract opcode from rINST
2021 GOTO_OPCODE ip @ jump to next instruction
2022#else
2023 mov r0, rINST, lsr #8 @ r0<- AA
2024 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00002025 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08002026 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
2027 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00002028 movlt rINST, #2 @ rINST<- inst branch dist for not-taken
2029 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002030 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
2031 bmi MterpCheckSuspendAndContinue
2032 GET_INST_OPCODE ip @ extract opcode from rINST
2033 GOTO_OPCODE ip @ jump to next instruction
2034#endif
2035
2036
2037/* ------------------------------ */
2038 .balign 128
2039.L_op_if_gtz: /* 0x3c */
2040/* File: arm/op_if_gtz.S */
2041/* File: arm/zcmp.S */
2042 /*
2043 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
2044 * fragment that specifies the *reverse* comparison to perform, e.g.
2045 * for "if-le" you would use "gt".
2046 *
2047 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2048 */
2049 /* if-cmp vAA, +BBBB */
Bill Buzbee9687f242016-02-05 14:08:10 +00002050#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08002051 mov r0, rINST, lsr #8 @ r0<- AA
2052 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00002053 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
2054 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08002055 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00002056 ble .L_op_if_gtz_not_taken
2057 EXPORT_PC
2058 mov r0, rSELF
2059 add r1, rFP, #OFF_FP_SHADOWFRAME
2060 mov r2, rINST
2061 bl MterpProfileBranch @ (self, shadow_frame, offset)
2062 cmp r0, #0
2063 bne MterpOnStackReplacement @ Note: offset must be in rINST
2064 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002065 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00002066 bmi MterpCheckSuspendAndContinue
2067 GET_INST_OPCODE ip @ extract opcode from rINST
2068 GOTO_OPCODE ip @ jump to next instruction
2069.L_op_if_gtz_not_taken:
2070 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08002071 GET_INST_OPCODE ip @ extract opcode from rINST
2072 GOTO_OPCODE ip @ jump to next instruction
2073#else
2074 mov r0, rINST, lsr #8 @ r0<- AA
2075 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00002076 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08002077 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
2078 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00002079 movle rINST, #2 @ rINST<- inst branch dist for not-taken
2080 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002081 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
2082 bmi MterpCheckSuspendAndContinue
2083 GET_INST_OPCODE ip @ extract opcode from rINST
2084 GOTO_OPCODE ip @ jump to next instruction
2085#endif
2086
2087
2088/* ------------------------------ */
2089 .balign 128
2090.L_op_if_lez: /* 0x3d */
2091/* File: arm/op_if_lez.S */
2092/* File: arm/zcmp.S */
2093 /*
2094 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
2095 * fragment that specifies the *reverse* comparison to perform, e.g.
2096 * for "if-le" you would use "gt".
2097 *
2098 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2099 */
2100 /* if-cmp vAA, +BBBB */
Bill Buzbee9687f242016-02-05 14:08:10 +00002101#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08002102 mov r0, rINST, lsr #8 @ r0<- AA
2103 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00002104 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
2105 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08002106 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00002107 bgt .L_op_if_lez_not_taken
2108 EXPORT_PC
2109 mov r0, rSELF
2110 add r1, rFP, #OFF_FP_SHADOWFRAME
2111 mov r2, rINST
2112 bl MterpProfileBranch @ (self, shadow_frame, offset)
2113 cmp r0, #0
2114 bne MterpOnStackReplacement @ Note: offset must be in rINST
2115 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002116 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbee9687f242016-02-05 14:08:10 +00002117 bmi MterpCheckSuspendAndContinue
2118 GET_INST_OPCODE ip @ extract opcode from rINST
2119 GOTO_OPCODE ip @ jump to next instruction
2120.L_op_if_lez_not_taken:
2121 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08002122 GET_INST_OPCODE ip @ extract opcode from rINST
2123 GOTO_OPCODE ip @ jump to next instruction
2124#else
2125 mov r0, rINST, lsr #8 @ r0<- AA
2126 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbee9687f242016-02-05 14:08:10 +00002127 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08002128 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
2129 cmp r2, #0 @ compare (vA, 0)
Bill Buzbee9687f242016-02-05 14:08:10 +00002130 movgt rINST, #2 @ rINST<- inst branch dist for not-taken
2131 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002132 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
2133 bmi MterpCheckSuspendAndContinue
2134 GET_INST_OPCODE ip @ extract opcode from rINST
2135 GOTO_OPCODE ip @ jump to next instruction
2136#endif
2137
2138
2139/* ------------------------------ */
2140 .balign 128
2141.L_op_unused_3e: /* 0x3e */
2142/* File: arm/op_unused_3e.S */
2143/* File: arm/unused.S */
2144/*
2145 * Bail to reference interpreter to throw.
2146 */
2147 b MterpFallback
2148
2149
2150/* ------------------------------ */
2151 .balign 128
2152.L_op_unused_3f: /* 0x3f */
2153/* File: arm/op_unused_3f.S */
2154/* File: arm/unused.S */
2155/*
2156 * Bail to reference interpreter to throw.
2157 */
2158 b MterpFallback
2159
2160
2161/* ------------------------------ */
2162 .balign 128
2163.L_op_unused_40: /* 0x40 */
2164/* File: arm/op_unused_40.S */
2165/* File: arm/unused.S */
2166/*
2167 * Bail to reference interpreter to throw.
2168 */
2169 b MterpFallback
2170
2171
2172/* ------------------------------ */
2173 .balign 128
2174.L_op_unused_41: /* 0x41 */
2175/* File: arm/op_unused_41.S */
2176/* File: arm/unused.S */
2177/*
2178 * Bail to reference interpreter to throw.
2179 */
2180 b MterpFallback
2181
2182
2183/* ------------------------------ */
2184 .balign 128
2185.L_op_unused_42: /* 0x42 */
2186/* File: arm/op_unused_42.S */
2187/* File: arm/unused.S */
2188/*
2189 * Bail to reference interpreter to throw.
2190 */
2191 b MterpFallback
2192
2193
2194/* ------------------------------ */
2195 .balign 128
2196.L_op_unused_43: /* 0x43 */
2197/* File: arm/op_unused_43.S */
2198/* File: arm/unused.S */
2199/*
2200 * Bail to reference interpreter to throw.
2201 */
2202 b MterpFallback
2203
2204
2205/* ------------------------------ */
2206 .balign 128
2207.L_op_aget: /* 0x44 */
2208/* File: arm/op_aget.S */
2209 /*
2210 * Array get, 32 bits or less. vAA <- vBB[vCC].
2211 *
2212 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2213 * instructions. We use a pair of FETCH_Bs instead.
2214 *
buzbee76833da2016-01-13 13:06:22 -08002215 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002216 *
2217 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2218 * If this changes, specialize.
2219 */
2220 /* op vAA, vBB, vCC */
2221 FETCH_B r2, 1, 0 @ r2<- BB
2222 mov r9, rINST, lsr #8 @ r9<- AA
2223 FETCH_B r3, 1, 1 @ r3<- CC
2224 GET_VREG r0, r2 @ r0<- vBB (array object)
2225 GET_VREG r1, r3 @ r1<- vCC (requested index)
2226 cmp r0, #0 @ null array object?
2227 beq common_errNullObject @ yes, bail
2228 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2229 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2230 cmp r1, r3 @ compare unsigned index, length
2231 bcs common_errArrayIndex @ index >= length, bail
2232 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2233 ldr r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2234 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002235 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002236 GOTO_OPCODE ip @ jump to next instruction
2237
2238/* ------------------------------ */
2239 .balign 128
2240.L_op_aget_wide: /* 0x45 */
2241/* File: arm/op_aget_wide.S */
2242 /*
2243 * Array get, 64 bits. vAA <- vBB[vCC].
2244 *
2245 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2246 */
2247 /* aget-wide vAA, vBB, vCC */
2248 FETCH r0, 1 @ r0<- CCBB
2249 mov r9, rINST, lsr #8 @ r9<- AA
2250 and r2, r0, #255 @ r2<- BB
2251 mov r3, r0, lsr #8 @ r3<- CC
2252 GET_VREG r0, r2 @ r0<- vBB (array object)
2253 GET_VREG r1, r3 @ r1<- vCC (requested index)
2254 cmp r0, #0 @ null array object?
2255 beq common_errNullObject @ yes, bail
2256 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2257 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2258 cmp r1, r3 @ compare unsigned index, length
2259 bcs common_errArrayIndex @ index >= length, bail
2260 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2261 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2262 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2263 GET_INST_OPCODE ip @ extract opcode from rINST
2264 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3
2265 GOTO_OPCODE ip @ jump to next instruction
2266
2267/* ------------------------------ */
2268 .balign 128
2269.L_op_aget_object: /* 0x46 */
2270/* File: arm/op_aget_object.S */
2271 /*
2272 * Array object get. vAA <- vBB[vCC].
2273 *
2274 * for: aget-object
2275 */
2276 /* op vAA, vBB, vCC */
2277 FETCH_B r2, 1, 0 @ r2<- BB
2278 mov r9, rINST, lsr #8 @ r9<- AA
2279 FETCH_B r3, 1, 1 @ r3<- CC
2280 EXPORT_PC
2281 GET_VREG r0, r2 @ r0<- vBB (array object)
2282 GET_VREG r1, r3 @ r1<- vCC (requested index)
2283 bl artAGetObjectFromMterp @ (array, index)
2284 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
2285 PREFETCH_INST 2
2286 cmp r1, #0
2287 bne MterpException
2288 SET_VREG_OBJECT r0, r9
2289 ADVANCE 2
2290 GET_INST_OPCODE ip
2291 GOTO_OPCODE ip @ jump to next instruction
2292
2293/* ------------------------------ */
2294 .balign 128
2295.L_op_aget_boolean: /* 0x47 */
2296/* File: arm/op_aget_boolean.S */
2297/* File: arm/op_aget.S */
2298 /*
2299 * Array get, 32 bits or less. vAA <- vBB[vCC].
2300 *
2301 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2302 * instructions. We use a pair of FETCH_Bs instead.
2303 *
buzbee76833da2016-01-13 13:06:22 -08002304 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002305 *
2306 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2307 * If this changes, specialize.
2308 */
2309 /* op vAA, vBB, vCC */
2310 FETCH_B r2, 1, 0 @ r2<- BB
2311 mov r9, rINST, lsr #8 @ r9<- AA
2312 FETCH_B r3, 1, 1 @ r3<- CC
2313 GET_VREG r0, r2 @ r0<- vBB (array object)
2314 GET_VREG r1, r3 @ r1<- vCC (requested index)
2315 cmp r0, #0 @ null array object?
2316 beq common_errNullObject @ yes, bail
2317 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2318 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2319 cmp r1, r3 @ compare unsigned index, length
2320 bcs common_errArrayIndex @ index >= length, bail
2321 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2322 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2323 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002324 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002325 GOTO_OPCODE ip @ jump to next instruction
2326
2327
2328/* ------------------------------ */
2329 .balign 128
2330.L_op_aget_byte: /* 0x48 */
2331/* File: arm/op_aget_byte.S */
2332/* File: arm/op_aget.S */
2333 /*
2334 * Array get, 32 bits or less. vAA <- vBB[vCC].
2335 *
2336 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2337 * instructions. We use a pair of FETCH_Bs instead.
2338 *
buzbee76833da2016-01-13 13:06:22 -08002339 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002340 *
2341 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2342 * If this changes, specialize.
2343 */
2344 /* op vAA, vBB, vCC */
2345 FETCH_B r2, 1, 0 @ r2<- BB
2346 mov r9, rINST, lsr #8 @ r9<- AA
2347 FETCH_B r3, 1, 1 @ r3<- CC
2348 GET_VREG r0, r2 @ r0<- vBB (array object)
2349 GET_VREG r1, r3 @ r1<- vCC (requested index)
2350 cmp r0, #0 @ null array object?
2351 beq common_errNullObject @ yes, bail
2352 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2353 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2354 cmp r1, r3 @ compare unsigned index, length
2355 bcs common_errArrayIndex @ index >= length, bail
2356 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2357 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2358 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002359 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002360 GOTO_OPCODE ip @ jump to next instruction
2361
2362
2363/* ------------------------------ */
2364 .balign 128
2365.L_op_aget_char: /* 0x49 */
2366/* File: arm/op_aget_char.S */
2367/* File: arm/op_aget.S */
2368 /*
2369 * Array get, 32 bits or less. vAA <- vBB[vCC].
2370 *
2371 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2372 * instructions. We use a pair of FETCH_Bs instead.
2373 *
buzbee76833da2016-01-13 13:06:22 -08002374 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002375 *
2376 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2377 * If this changes, specialize.
2378 */
2379 /* op vAA, vBB, vCC */
2380 FETCH_B r2, 1, 0 @ r2<- BB
2381 mov r9, rINST, lsr #8 @ r9<- AA
2382 FETCH_B r3, 1, 1 @ r3<- CC
2383 GET_VREG r0, r2 @ r0<- vBB (array object)
2384 GET_VREG r1, r3 @ r1<- vCC (requested index)
2385 cmp r0, #0 @ null array object?
2386 beq common_errNullObject @ yes, bail
2387 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2388 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2389 cmp r1, r3 @ compare unsigned index, length
2390 bcs common_errArrayIndex @ index >= length, bail
2391 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2392 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2393 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002394 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002395 GOTO_OPCODE ip @ jump to next instruction
2396
2397
2398/* ------------------------------ */
2399 .balign 128
2400.L_op_aget_short: /* 0x4a */
2401/* File: arm/op_aget_short.S */
2402/* File: arm/op_aget.S */
2403 /*
2404 * Array get, 32 bits or less. vAA <- vBB[vCC].
2405 *
2406 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2407 * instructions. We use a pair of FETCH_Bs instead.
2408 *
buzbee76833da2016-01-13 13:06:22 -08002409 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002410 *
2411 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2412 * If this changes, specialize.
2413 */
2414 /* op vAA, vBB, vCC */
2415 FETCH_B r2, 1, 0 @ r2<- BB
2416 mov r9, rINST, lsr #8 @ r9<- AA
2417 FETCH_B r3, 1, 1 @ r3<- CC
2418 GET_VREG r0, r2 @ r0<- vBB (array object)
2419 GET_VREG r1, r3 @ r1<- vCC (requested index)
2420 cmp r0, #0 @ null array object?
2421 beq common_errNullObject @ yes, bail
2422 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2423 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2424 cmp r1, r3 @ compare unsigned index, length
2425 bcs common_errArrayIndex @ index >= length, bail
2426 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2427 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2428 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002429 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002430 GOTO_OPCODE ip @ jump to next instruction
2431
2432
2433/* ------------------------------ */
2434 .balign 128
2435.L_op_aput: /* 0x4b */
2436/* File: arm/op_aput.S */
2437 /*
2438 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2439 *
2440 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2441 * instructions. We use a pair of FETCH_Bs instead.
2442 *
2443 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2444 *
2445 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2446 * If this changes, specialize.
2447 */
2448 /* op vAA, vBB, vCC */
2449 FETCH_B r2, 1, 0 @ r2<- BB
2450 mov r9, rINST, lsr #8 @ r9<- AA
2451 FETCH_B r3, 1, 1 @ r3<- CC
2452 GET_VREG r0, r2 @ r0<- vBB (array object)
2453 GET_VREG r1, r3 @ r1<- vCC (requested index)
2454 cmp r0, #0 @ null array object?
2455 beq common_errNullObject @ yes, bail
2456 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2457 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2458 cmp r1, r3 @ compare unsigned index, length
2459 bcs common_errArrayIndex @ index >= length, bail
2460 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2461 GET_VREG r2, r9 @ r2<- vAA
2462 GET_INST_OPCODE ip @ extract opcode from rINST
2463 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2464 GOTO_OPCODE ip @ jump to next instruction
2465
2466/* ------------------------------ */
2467 .balign 128
2468.L_op_aput_wide: /* 0x4c */
2469/* File: arm/op_aput_wide.S */
2470 /*
2471 * Array put, 64 bits. vBB[vCC] <- vAA.
2472 *
2473 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2474 */
2475 /* aput-wide vAA, vBB, vCC */
2476 FETCH r0, 1 @ r0<- CCBB
2477 mov r9, rINST, lsr #8 @ r9<- AA
2478 and r2, r0, #255 @ r2<- BB
2479 mov r3, r0, lsr #8 @ r3<- CC
2480 GET_VREG r0, r2 @ r0<- vBB (array object)
2481 GET_VREG r1, r3 @ r1<- vCC (requested index)
2482 cmp r0, #0 @ null array object?
2483 beq common_errNullObject @ yes, bail
2484 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2485 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2486 cmp r1, r3 @ compare unsigned index, length
2487 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2488 bcs common_errArrayIndex @ index >= length, bail
2489 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2490 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1
2491 GET_INST_OPCODE ip @ extract opcode from rINST
2492 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2493 GOTO_OPCODE ip @ jump to next instruction
2494
2495/* ------------------------------ */
2496 .balign 128
2497.L_op_aput_object: /* 0x4d */
2498/* File: arm/op_aput_object.S */
2499 /*
2500 * Store an object into an array. vBB[vCC] <- vAA.
2501 */
2502 /* op vAA, vBB, vCC */
2503 EXPORT_PC
2504 add r0, rFP, #OFF_FP_SHADOWFRAME
2505 mov r1, rPC
2506 mov r2, rINST
2507 bl MterpAputObject
2508 cmp r0, #0
2509 beq MterpPossibleException
2510 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2511 GET_INST_OPCODE ip @ extract opcode from rINST
2512 GOTO_OPCODE ip @ jump to next instruction
2513
2514/* ------------------------------ */
2515 .balign 128
2516.L_op_aput_boolean: /* 0x4e */
2517/* File: arm/op_aput_boolean.S */
2518/* File: arm/op_aput.S */
2519 /*
2520 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2521 *
2522 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2523 * instructions. We use a pair of FETCH_Bs instead.
2524 *
2525 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2526 *
2527 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2528 * If this changes, specialize.
2529 */
2530 /* op vAA, vBB, vCC */
2531 FETCH_B r2, 1, 0 @ r2<- BB
2532 mov r9, rINST, lsr #8 @ r9<- AA
2533 FETCH_B r3, 1, 1 @ r3<- CC
2534 GET_VREG r0, r2 @ r0<- vBB (array object)
2535 GET_VREG r1, r3 @ r1<- vCC (requested index)
2536 cmp r0, #0 @ null array object?
2537 beq common_errNullObject @ yes, bail
2538 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2539 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2540 cmp r1, r3 @ compare unsigned index, length
2541 bcs common_errArrayIndex @ index >= length, bail
2542 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2543 GET_VREG r2, r9 @ r2<- vAA
2544 GET_INST_OPCODE ip @ extract opcode from rINST
2545 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2546 GOTO_OPCODE ip @ jump to next instruction
2547
2548
2549/* ------------------------------ */
2550 .balign 128
2551.L_op_aput_byte: /* 0x4f */
2552/* File: arm/op_aput_byte.S */
2553/* File: arm/op_aput.S */
2554 /*
2555 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2556 *
2557 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2558 * instructions. We use a pair of FETCH_Bs instead.
2559 *
2560 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2561 *
2562 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2563 * If this changes, specialize.
2564 */
2565 /* op vAA, vBB, vCC */
2566 FETCH_B r2, 1, 0 @ r2<- BB
2567 mov r9, rINST, lsr #8 @ r9<- AA
2568 FETCH_B r3, 1, 1 @ r3<- CC
2569 GET_VREG r0, r2 @ r0<- vBB (array object)
2570 GET_VREG r1, r3 @ r1<- vCC (requested index)
2571 cmp r0, #0 @ null array object?
2572 beq common_errNullObject @ yes, bail
2573 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2574 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2575 cmp r1, r3 @ compare unsigned index, length
2576 bcs common_errArrayIndex @ index >= length, bail
2577 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2578 GET_VREG r2, r9 @ r2<- vAA
2579 GET_INST_OPCODE ip @ extract opcode from rINST
2580 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2581 GOTO_OPCODE ip @ jump to next instruction
2582
2583
2584/* ------------------------------ */
2585 .balign 128
2586.L_op_aput_char: /* 0x50 */
2587/* File: arm/op_aput_char.S */
2588/* File: arm/op_aput.S */
2589 /*
2590 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2591 *
2592 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2593 * instructions. We use a pair of FETCH_Bs instead.
2594 *
2595 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2596 *
2597 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2598 * If this changes, specialize.
2599 */
2600 /* op vAA, vBB, vCC */
2601 FETCH_B r2, 1, 0 @ r2<- BB
2602 mov r9, rINST, lsr #8 @ r9<- AA
2603 FETCH_B r3, 1, 1 @ r3<- CC
2604 GET_VREG r0, r2 @ r0<- vBB (array object)
2605 GET_VREG r1, r3 @ r1<- vCC (requested index)
2606 cmp r0, #0 @ null array object?
2607 beq common_errNullObject @ yes, bail
2608 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2609 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2610 cmp r1, r3 @ compare unsigned index, length
2611 bcs common_errArrayIndex @ index >= length, bail
2612 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2613 GET_VREG r2, r9 @ r2<- vAA
2614 GET_INST_OPCODE ip @ extract opcode from rINST
2615 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2616 GOTO_OPCODE ip @ jump to next instruction
2617
2618
2619/* ------------------------------ */
2620 .balign 128
2621.L_op_aput_short: /* 0x51 */
2622/* File: arm/op_aput_short.S */
2623/* File: arm/op_aput.S */
2624 /*
2625 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2626 *
2627 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2628 * instructions. We use a pair of FETCH_Bs instead.
2629 *
2630 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2631 *
2632 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2633 * If this changes, specialize.
2634 */
2635 /* op vAA, vBB, vCC */
2636 FETCH_B r2, 1, 0 @ r2<- BB
2637 mov r9, rINST, lsr #8 @ r9<- AA
2638 FETCH_B r3, 1, 1 @ r3<- CC
2639 GET_VREG r0, r2 @ r0<- vBB (array object)
2640 GET_VREG r1, r3 @ r1<- vCC (requested index)
2641 cmp r0, #0 @ null array object?
2642 beq common_errNullObject @ yes, bail
2643 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2644 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2645 cmp r1, r3 @ compare unsigned index, length
2646 bcs common_errArrayIndex @ index >= length, bail
2647 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2648 GET_VREG r2, r9 @ r2<- vAA
2649 GET_INST_OPCODE ip @ extract opcode from rINST
2650 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2651 GOTO_OPCODE ip @ jump to next instruction
2652
2653
2654/* ------------------------------ */
2655 .balign 128
2656.L_op_iget: /* 0x52 */
2657/* File: arm/op_iget.S */
2658 /*
2659 * General instance field get.
2660 *
2661 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2662 */
2663 EXPORT_PC
2664 FETCH r0, 1 @ r0<- field ref CCCC
2665 mov r1, rINST, lsr #12 @ r1<- B
2666 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2667 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2668 mov r3, rSELF @ r3<- self
2669 bl artGet32InstanceFromCode
2670 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2671 ubfx r2, rINST, #8, #4 @ r2<- A
2672 PREFETCH_INST 2
2673 cmp r3, #0
2674 bne MterpPossibleException @ bail out
2675 .if 0
2676 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2677 .else
2678 SET_VREG r0, r2 @ fp[A]<- r0
2679 .endif
2680 ADVANCE 2
2681 GET_INST_OPCODE ip @ extract opcode from rINST
2682 GOTO_OPCODE ip @ jump to next instruction
2683
2684/* ------------------------------ */
2685 .balign 128
2686.L_op_iget_wide: /* 0x53 */
2687/* File: arm/op_iget_wide.S */
2688 /*
2689 * 64-bit instance field get.
2690 *
2691 * for: iget-wide
2692 */
2693 EXPORT_PC
2694 FETCH r0, 1 @ r0<- field ref CCCC
2695 mov r1, rINST, lsr #12 @ r1<- B
2696 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2697 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2698 mov r3, rSELF @ r3<- self
2699 bl artGet64InstanceFromCode
2700 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2701 ubfx r2, rINST, #8, #4 @ r2<- A
2702 PREFETCH_INST 2
2703 cmp r3, #0
2704 bne MterpException @ bail out
2705 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
2706 stmia r3, {r0-r1} @ fp[A]<- r0/r1
2707 ADVANCE 2
2708 GET_INST_OPCODE ip @ extract opcode from rINST
2709 GOTO_OPCODE ip @ jump to next instruction
2710
2711/* ------------------------------ */
2712 .balign 128
2713.L_op_iget_object: /* 0x54 */
2714/* File: arm/op_iget_object.S */
2715/* File: arm/op_iget.S */
2716 /*
2717 * General instance field get.
2718 *
2719 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2720 */
2721 EXPORT_PC
2722 FETCH r0, 1 @ r0<- field ref CCCC
2723 mov r1, rINST, lsr #12 @ r1<- B
2724 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2725 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2726 mov r3, rSELF @ r3<- self
2727 bl artGetObjInstanceFromCode
2728 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2729 ubfx r2, rINST, #8, #4 @ r2<- A
2730 PREFETCH_INST 2
2731 cmp r3, #0
2732 bne MterpPossibleException @ bail out
2733 .if 1
2734 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2735 .else
2736 SET_VREG r0, r2 @ fp[A]<- r0
2737 .endif
2738 ADVANCE 2
2739 GET_INST_OPCODE ip @ extract opcode from rINST
2740 GOTO_OPCODE ip @ jump to next instruction
2741
2742
2743/* ------------------------------ */
2744 .balign 128
2745.L_op_iget_boolean: /* 0x55 */
2746/* File: arm/op_iget_boolean.S */
2747/* File: arm/op_iget.S */
2748 /*
2749 * General instance field get.
2750 *
2751 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2752 */
2753 EXPORT_PC
2754 FETCH r0, 1 @ r0<- field ref CCCC
2755 mov r1, rINST, lsr #12 @ r1<- B
2756 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2757 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2758 mov r3, rSELF @ r3<- self
2759 bl artGetBooleanInstanceFromCode
2760 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2761 ubfx r2, rINST, #8, #4 @ r2<- A
2762 PREFETCH_INST 2
2763 cmp r3, #0
2764 bne MterpPossibleException @ bail out
2765 .if 0
2766 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2767 .else
2768 SET_VREG r0, r2 @ fp[A]<- r0
2769 .endif
2770 ADVANCE 2
2771 GET_INST_OPCODE ip @ extract opcode from rINST
2772 GOTO_OPCODE ip @ jump to next instruction
2773
2774
2775/* ------------------------------ */
2776 .balign 128
2777.L_op_iget_byte: /* 0x56 */
2778/* File: arm/op_iget_byte.S */
2779/* File: arm/op_iget.S */
2780 /*
2781 * General instance field get.
2782 *
2783 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2784 */
2785 EXPORT_PC
2786 FETCH r0, 1 @ r0<- field ref CCCC
2787 mov r1, rINST, lsr #12 @ r1<- B
2788 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2789 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2790 mov r3, rSELF @ r3<- self
2791 bl artGetByteInstanceFromCode
2792 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2793 ubfx r2, rINST, #8, #4 @ r2<- A
2794 PREFETCH_INST 2
2795 cmp r3, #0
2796 bne MterpPossibleException @ bail out
2797 .if 0
2798 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2799 .else
2800 SET_VREG r0, r2 @ fp[A]<- r0
2801 .endif
2802 ADVANCE 2
2803 GET_INST_OPCODE ip @ extract opcode from rINST
2804 GOTO_OPCODE ip @ jump to next instruction
2805
2806
2807/* ------------------------------ */
2808 .balign 128
2809.L_op_iget_char: /* 0x57 */
2810/* File: arm/op_iget_char.S */
2811/* File: arm/op_iget.S */
2812 /*
2813 * General instance field get.
2814 *
2815 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2816 */
2817 EXPORT_PC
2818 FETCH r0, 1 @ r0<- field ref CCCC
2819 mov r1, rINST, lsr #12 @ r1<- B
2820 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2821 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2822 mov r3, rSELF @ r3<- self
2823 bl artGetCharInstanceFromCode
2824 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2825 ubfx r2, rINST, #8, #4 @ r2<- A
2826 PREFETCH_INST 2
2827 cmp r3, #0
2828 bne MterpPossibleException @ bail out
2829 .if 0
2830 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2831 .else
2832 SET_VREG r0, r2 @ fp[A]<- r0
2833 .endif
2834 ADVANCE 2
2835 GET_INST_OPCODE ip @ extract opcode from rINST
2836 GOTO_OPCODE ip @ jump to next instruction
2837
2838
2839/* ------------------------------ */
2840 .balign 128
2841.L_op_iget_short: /* 0x58 */
2842/* File: arm/op_iget_short.S */
2843/* File: arm/op_iget.S */
2844 /*
2845 * General instance field get.
2846 *
2847 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2848 */
2849 EXPORT_PC
2850 FETCH r0, 1 @ r0<- field ref CCCC
2851 mov r1, rINST, lsr #12 @ r1<- B
2852 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2853 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2854 mov r3, rSELF @ r3<- self
2855 bl artGetShortInstanceFromCode
2856 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2857 ubfx r2, rINST, #8, #4 @ r2<- A
2858 PREFETCH_INST 2
2859 cmp r3, #0
2860 bne MterpPossibleException @ bail out
2861 .if 0
2862 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2863 .else
2864 SET_VREG r0, r2 @ fp[A]<- r0
2865 .endif
2866 ADVANCE 2
2867 GET_INST_OPCODE ip @ extract opcode from rINST
2868 GOTO_OPCODE ip @ jump to next instruction
2869
2870
2871/* ------------------------------ */
2872 .balign 128
2873.L_op_iput: /* 0x59 */
2874/* File: arm/op_iput.S */
2875 /*
2876 * General 32-bit instance field put.
2877 *
2878 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2879 */
2880 /* op vA, vB, field@CCCC */
2881 .extern artSet32InstanceFromMterp
2882 EXPORT_PC
2883 FETCH r0, 1 @ r0<- field ref CCCC
2884 mov r1, rINST, lsr #12 @ r1<- B
2885 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2886 ubfx r2, rINST, #8, #4 @ r2<- A
2887 GET_VREG r2, r2 @ r2<- fp[A]
2888 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2889 PREFETCH_INST 2
2890 bl artSet32InstanceFromMterp
2891 cmp r0, #0
2892 bne MterpPossibleException
2893 ADVANCE 2 @ advance rPC
2894 GET_INST_OPCODE ip @ extract opcode from rINST
2895 GOTO_OPCODE ip @ jump to next instruction
2896
2897/* ------------------------------ */
2898 .balign 128
2899.L_op_iput_wide: /* 0x5a */
2900/* File: arm/op_iput_wide.S */
2901 /* iput-wide vA, vB, field@CCCC */
2902 .extern artSet64InstanceFromMterp
2903 EXPORT_PC
2904 FETCH r0, 1 @ r0<- field ref CCCC
2905 mov r1, rINST, lsr #12 @ r1<- B
2906 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2907 ubfx r2, rINST, #8, #4 @ r2<- A
2908 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
2909 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2910 PREFETCH_INST 2
2911 bl artSet64InstanceFromMterp
2912 cmp r0, #0
2913 bne MterpPossibleException
2914 ADVANCE 2 @ advance rPC
2915 GET_INST_OPCODE ip @ extract opcode from rINST
2916 GOTO_OPCODE ip @ jump to next instruction
2917
2918/* ------------------------------ */
2919 .balign 128
2920.L_op_iput_object: /* 0x5b */
2921/* File: arm/op_iput_object.S */
2922 EXPORT_PC
2923 add r0, rFP, #OFF_FP_SHADOWFRAME
2924 mov r1, rPC
2925 mov r2, rINST
2926 mov r3, rSELF
2927 bl MterpIputObject
2928 cmp r0, #0
2929 beq MterpException
2930 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2931 GET_INST_OPCODE ip @ extract opcode from rINST
2932 GOTO_OPCODE ip @ jump to next instruction
2933
2934/* ------------------------------ */
2935 .balign 128
2936.L_op_iput_boolean: /* 0x5c */
2937/* File: arm/op_iput_boolean.S */
2938/* File: arm/op_iput.S */
2939 /*
2940 * General 32-bit instance field put.
2941 *
2942 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2943 */
2944 /* op vA, vB, field@CCCC */
2945 .extern artSet8InstanceFromMterp
2946 EXPORT_PC
2947 FETCH r0, 1 @ r0<- field ref CCCC
2948 mov r1, rINST, lsr #12 @ r1<- B
2949 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2950 ubfx r2, rINST, #8, #4 @ r2<- A
2951 GET_VREG r2, r2 @ r2<- fp[A]
2952 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2953 PREFETCH_INST 2
2954 bl artSet8InstanceFromMterp
2955 cmp r0, #0
2956 bne MterpPossibleException
2957 ADVANCE 2 @ advance rPC
2958 GET_INST_OPCODE ip @ extract opcode from rINST
2959 GOTO_OPCODE ip @ jump to next instruction
2960
2961
2962/* ------------------------------ */
2963 .balign 128
2964.L_op_iput_byte: /* 0x5d */
2965/* File: arm/op_iput_byte.S */
2966/* File: arm/op_iput.S */
2967 /*
2968 * General 32-bit instance field put.
2969 *
2970 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2971 */
2972 /* op vA, vB, field@CCCC */
2973 .extern artSet8InstanceFromMterp
2974 EXPORT_PC
2975 FETCH r0, 1 @ r0<- field ref CCCC
2976 mov r1, rINST, lsr #12 @ r1<- B
2977 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2978 ubfx r2, rINST, #8, #4 @ r2<- A
2979 GET_VREG r2, r2 @ r2<- fp[A]
2980 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2981 PREFETCH_INST 2
2982 bl artSet8InstanceFromMterp
2983 cmp r0, #0
2984 bne MterpPossibleException
2985 ADVANCE 2 @ advance rPC
2986 GET_INST_OPCODE ip @ extract opcode from rINST
2987 GOTO_OPCODE ip @ jump to next instruction
2988
2989
2990/* ------------------------------ */
2991 .balign 128
2992.L_op_iput_char: /* 0x5e */
2993/* File: arm/op_iput_char.S */
2994/* File: arm/op_iput.S */
2995 /*
2996 * General 32-bit instance field put.
2997 *
2998 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2999 */
3000 /* op vA, vB, field@CCCC */
3001 .extern artSet16InstanceFromMterp
3002 EXPORT_PC
3003 FETCH r0, 1 @ r0<- field ref CCCC
3004 mov r1, rINST, lsr #12 @ r1<- B
3005 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
3006 ubfx r2, rINST, #8, #4 @ r2<- A
3007 GET_VREG r2, r2 @ r2<- fp[A]
3008 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
3009 PREFETCH_INST 2
3010 bl artSet16InstanceFromMterp
3011 cmp r0, #0
3012 bne MterpPossibleException
3013 ADVANCE 2 @ advance rPC
3014 GET_INST_OPCODE ip @ extract opcode from rINST
3015 GOTO_OPCODE ip @ jump to next instruction
3016
3017
3018/* ------------------------------ */
3019 .balign 128
3020.L_op_iput_short: /* 0x5f */
3021/* File: arm/op_iput_short.S */
3022/* File: arm/op_iput.S */
3023 /*
3024 * General 32-bit instance field put.
3025 *
3026 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
3027 */
3028 /* op vA, vB, field@CCCC */
3029 .extern artSet16InstanceFromMterp
3030 EXPORT_PC
3031 FETCH r0, 1 @ r0<- field ref CCCC
3032 mov r1, rINST, lsr #12 @ r1<- B
3033 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
3034 ubfx r2, rINST, #8, #4 @ r2<- A
3035 GET_VREG r2, r2 @ r2<- fp[A]
3036 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
3037 PREFETCH_INST 2
3038 bl artSet16InstanceFromMterp
3039 cmp r0, #0
3040 bne MterpPossibleException
3041 ADVANCE 2 @ advance rPC
3042 GET_INST_OPCODE ip @ extract opcode from rINST
3043 GOTO_OPCODE ip @ jump to next instruction
3044
3045
3046/* ------------------------------ */
3047 .balign 128
3048.L_op_sget: /* 0x60 */
3049/* File: arm/op_sget.S */
3050 /*
3051 * General SGET handler wrapper.
3052 *
3053 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3054 */
3055 /* op vAA, field@BBBB */
3056
3057 .extern artGet32StaticFromCode
3058 EXPORT_PC
3059 FETCH r0, 1 @ r0<- field ref BBBB
3060 ldr r1, [rFP, #OFF_FP_METHOD]
3061 mov r2, rSELF
3062 bl artGet32StaticFromCode
3063 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3064 mov r2, rINST, lsr #8 @ r2<- AA
3065 PREFETCH_INST 2
3066 cmp r3, #0 @ Fail to resolve?
3067 bne MterpException @ bail out
3068.if 0
3069 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3070.else
3071 SET_VREG r0, r2 @ fp[AA]<- r0
3072.endif
3073 ADVANCE 2
3074 GET_INST_OPCODE ip @ extract opcode from rINST
3075 GOTO_OPCODE ip
3076
3077/* ------------------------------ */
3078 .balign 128
3079.L_op_sget_wide: /* 0x61 */
3080/* File: arm/op_sget_wide.S */
3081 /*
3082 * SGET_WIDE handler wrapper.
3083 *
3084 */
3085 /* sget-wide vAA, field@BBBB */
3086
3087 .extern artGet64StaticFromCode
3088 EXPORT_PC
3089 FETCH r0, 1 @ r0<- field ref BBBB
3090 ldr r1, [rFP, #OFF_FP_METHOD]
3091 mov r2, rSELF
3092 bl artGet64StaticFromCode
3093 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3094 mov r9, rINST, lsr #8 @ r9<- AA
3095 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
3096 cmp r3, #0 @ Fail to resolve?
3097 bne MterpException @ bail out
3098 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3099 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
3100 GET_INST_OPCODE ip @ extract opcode from rINST
3101 GOTO_OPCODE ip @ jump to next instruction
3102
3103/* ------------------------------ */
3104 .balign 128
3105.L_op_sget_object: /* 0x62 */
3106/* File: arm/op_sget_object.S */
3107/* File: arm/op_sget.S */
3108 /*
3109 * General SGET handler wrapper.
3110 *
3111 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3112 */
3113 /* op vAA, field@BBBB */
3114
3115 .extern artGetObjStaticFromCode
3116 EXPORT_PC
3117 FETCH r0, 1 @ r0<- field ref BBBB
3118 ldr r1, [rFP, #OFF_FP_METHOD]
3119 mov r2, rSELF
3120 bl artGetObjStaticFromCode
3121 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3122 mov r2, rINST, lsr #8 @ r2<- AA
3123 PREFETCH_INST 2
3124 cmp r3, #0 @ Fail to resolve?
3125 bne MterpException @ bail out
3126.if 1
3127 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3128.else
3129 SET_VREG r0, r2 @ fp[AA]<- r0
3130.endif
3131 ADVANCE 2
3132 GET_INST_OPCODE ip @ extract opcode from rINST
3133 GOTO_OPCODE ip
3134
3135
3136/* ------------------------------ */
3137 .balign 128
3138.L_op_sget_boolean: /* 0x63 */
3139/* File: arm/op_sget_boolean.S */
3140/* File: arm/op_sget.S */
3141 /*
3142 * General SGET handler wrapper.
3143 *
3144 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3145 */
3146 /* op vAA, field@BBBB */
3147
3148 .extern artGetBooleanStaticFromCode
3149 EXPORT_PC
3150 FETCH r0, 1 @ r0<- field ref BBBB
3151 ldr r1, [rFP, #OFF_FP_METHOD]
3152 mov r2, rSELF
3153 bl artGetBooleanStaticFromCode
3154 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3155 mov r2, rINST, lsr #8 @ r2<- AA
3156 PREFETCH_INST 2
3157 cmp r3, #0 @ Fail to resolve?
3158 bne MterpException @ bail out
3159.if 0
3160 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3161.else
3162 SET_VREG r0, r2 @ fp[AA]<- r0
3163.endif
3164 ADVANCE 2
3165 GET_INST_OPCODE ip @ extract opcode from rINST
3166 GOTO_OPCODE ip
3167
3168
3169/* ------------------------------ */
3170 .balign 128
3171.L_op_sget_byte: /* 0x64 */
3172/* File: arm/op_sget_byte.S */
3173/* File: arm/op_sget.S */
3174 /*
3175 * General SGET handler wrapper.
3176 *
3177 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3178 */
3179 /* op vAA, field@BBBB */
3180
3181 .extern artGetByteStaticFromCode
3182 EXPORT_PC
3183 FETCH r0, 1 @ r0<- field ref BBBB
3184 ldr r1, [rFP, #OFF_FP_METHOD]
3185 mov r2, rSELF
3186 bl artGetByteStaticFromCode
3187 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3188 mov r2, rINST, lsr #8 @ r2<- AA
3189 PREFETCH_INST 2
3190 cmp r3, #0 @ Fail to resolve?
3191 bne MterpException @ bail out
3192.if 0
3193 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3194.else
3195 SET_VREG r0, r2 @ fp[AA]<- r0
3196.endif
3197 ADVANCE 2
3198 GET_INST_OPCODE ip @ extract opcode from rINST
3199 GOTO_OPCODE ip
3200
3201
3202/* ------------------------------ */
3203 .balign 128
3204.L_op_sget_char: /* 0x65 */
3205/* File: arm/op_sget_char.S */
3206/* File: arm/op_sget.S */
3207 /*
3208 * General SGET handler wrapper.
3209 *
3210 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3211 */
3212 /* op vAA, field@BBBB */
3213
3214 .extern artGetCharStaticFromCode
3215 EXPORT_PC
3216 FETCH r0, 1 @ r0<- field ref BBBB
3217 ldr r1, [rFP, #OFF_FP_METHOD]
3218 mov r2, rSELF
3219 bl artGetCharStaticFromCode
3220 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3221 mov r2, rINST, lsr #8 @ r2<- AA
3222 PREFETCH_INST 2
3223 cmp r3, #0 @ Fail to resolve?
3224 bne MterpException @ bail out
3225.if 0
3226 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3227.else
3228 SET_VREG r0, r2 @ fp[AA]<- r0
3229.endif
3230 ADVANCE 2
3231 GET_INST_OPCODE ip @ extract opcode from rINST
3232 GOTO_OPCODE ip
3233
3234
3235/* ------------------------------ */
3236 .balign 128
3237.L_op_sget_short: /* 0x66 */
3238/* File: arm/op_sget_short.S */
3239/* File: arm/op_sget.S */
3240 /*
3241 * General SGET handler wrapper.
3242 *
3243 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3244 */
3245 /* op vAA, field@BBBB */
3246
3247 .extern artGetShortStaticFromCode
3248 EXPORT_PC
3249 FETCH r0, 1 @ r0<- field ref BBBB
3250 ldr r1, [rFP, #OFF_FP_METHOD]
3251 mov r2, rSELF
3252 bl artGetShortStaticFromCode
3253 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3254 mov r2, rINST, lsr #8 @ r2<- AA
3255 PREFETCH_INST 2
3256 cmp r3, #0 @ Fail to resolve?
3257 bne MterpException @ bail out
3258.if 0
3259 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3260.else
3261 SET_VREG r0, r2 @ fp[AA]<- r0
3262.endif
3263 ADVANCE 2
3264 GET_INST_OPCODE ip @ extract opcode from rINST
3265 GOTO_OPCODE ip
3266
3267
3268/* ------------------------------ */
3269 .balign 128
3270.L_op_sput: /* 0x67 */
3271/* File: arm/op_sput.S */
3272 /*
3273 * General SPUT handler wrapper.
3274 *
3275 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3276 */
3277 /* op vAA, field@BBBB */
3278 EXPORT_PC
3279 FETCH r0, 1 @ r0<- field ref BBBB
3280 mov r3, rINST, lsr #8 @ r3<- AA
3281 GET_VREG r1, r3 @ r1<= fp[AA]
3282 ldr r2, [rFP, #OFF_FP_METHOD]
3283 mov r3, rSELF
3284 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3285 bl artSet32StaticFromCode
3286 cmp r0, #0 @ 0 on success, -1 on failure
3287 bne MterpException
3288 ADVANCE 2 @ Past exception point - now advance rPC
3289 GET_INST_OPCODE ip @ extract opcode from rINST
3290 GOTO_OPCODE ip @ jump to next instruction
3291
3292/* ------------------------------ */
3293 .balign 128
3294.L_op_sput_wide: /* 0x68 */
3295/* File: arm/op_sput_wide.S */
3296 /*
3297 * SPUT_WIDE handler wrapper.
3298 *
3299 */
3300 /* sput-wide vAA, field@BBBB */
3301 .extern artSet64IndirectStaticFromMterp
3302 EXPORT_PC
3303 FETCH r0, 1 @ r0<- field ref BBBB
3304 ldr r1, [rFP, #OFF_FP_METHOD]
3305 mov r2, rINST, lsr #8 @ r3<- AA
3306 add r2, rFP, r2, lsl #2
3307 mov r3, rSELF
3308 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3309 bl artSet64IndirectStaticFromMterp
3310 cmp r0, #0 @ 0 on success, -1 on failure
3311 bne MterpException
3312 ADVANCE 2 @ Past exception point - now advance rPC
3313 GET_INST_OPCODE ip @ extract opcode from rINST
3314 GOTO_OPCODE ip @ jump to next instruction
3315
3316/* ------------------------------ */
3317 .balign 128
3318.L_op_sput_object: /* 0x69 */
3319/* File: arm/op_sput_object.S */
3320 EXPORT_PC
3321 add r0, rFP, #OFF_FP_SHADOWFRAME
3322 mov r1, rPC
3323 mov r2, rINST
3324 mov r3, rSELF
3325 bl MterpSputObject
3326 cmp r0, #0
3327 beq MterpException
3328 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3329 GET_INST_OPCODE ip @ extract opcode from rINST
3330 GOTO_OPCODE ip @ jump to next instruction
3331
3332/* ------------------------------ */
3333 .balign 128
3334.L_op_sput_boolean: /* 0x6a */
3335/* File: arm/op_sput_boolean.S */
3336/* File: arm/op_sput.S */
3337 /*
3338 * General SPUT handler wrapper.
3339 *
3340 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3341 */
3342 /* op vAA, field@BBBB */
3343 EXPORT_PC
3344 FETCH r0, 1 @ r0<- field ref BBBB
3345 mov r3, rINST, lsr #8 @ r3<- AA
3346 GET_VREG r1, r3 @ r1<= fp[AA]
3347 ldr r2, [rFP, #OFF_FP_METHOD]
3348 mov r3, rSELF
3349 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3350 bl artSet8StaticFromCode
3351 cmp r0, #0 @ 0 on success, -1 on failure
3352 bne MterpException
3353 ADVANCE 2 @ Past exception point - now advance rPC
3354 GET_INST_OPCODE ip @ extract opcode from rINST
3355 GOTO_OPCODE ip @ jump to next instruction
3356
3357
3358/* ------------------------------ */
3359 .balign 128
3360.L_op_sput_byte: /* 0x6b */
3361/* File: arm/op_sput_byte.S */
3362/* File: arm/op_sput.S */
3363 /*
3364 * General SPUT handler wrapper.
3365 *
3366 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3367 */
3368 /* op vAA, field@BBBB */
3369 EXPORT_PC
3370 FETCH r0, 1 @ r0<- field ref BBBB
3371 mov r3, rINST, lsr #8 @ r3<- AA
3372 GET_VREG r1, r3 @ r1<= fp[AA]
3373 ldr r2, [rFP, #OFF_FP_METHOD]
3374 mov r3, rSELF
3375 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3376 bl artSet8StaticFromCode
3377 cmp r0, #0 @ 0 on success, -1 on failure
3378 bne MterpException
3379 ADVANCE 2 @ Past exception point - now advance rPC
3380 GET_INST_OPCODE ip @ extract opcode from rINST
3381 GOTO_OPCODE ip @ jump to next instruction
3382
3383
3384/* ------------------------------ */
3385 .balign 128
3386.L_op_sput_char: /* 0x6c */
3387/* File: arm/op_sput_char.S */
3388/* File: arm/op_sput.S */
3389 /*
3390 * General SPUT handler wrapper.
3391 *
3392 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3393 */
3394 /* op vAA, field@BBBB */
3395 EXPORT_PC
3396 FETCH r0, 1 @ r0<- field ref BBBB
3397 mov r3, rINST, lsr #8 @ r3<- AA
3398 GET_VREG r1, r3 @ r1<= fp[AA]
3399 ldr r2, [rFP, #OFF_FP_METHOD]
3400 mov r3, rSELF
3401 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3402 bl artSet16StaticFromCode
3403 cmp r0, #0 @ 0 on success, -1 on failure
3404 bne MterpException
3405 ADVANCE 2 @ Past exception point - now advance rPC
3406 GET_INST_OPCODE ip @ extract opcode from rINST
3407 GOTO_OPCODE ip @ jump to next instruction
3408
3409
3410/* ------------------------------ */
3411 .balign 128
3412.L_op_sput_short: /* 0x6d */
3413/* File: arm/op_sput_short.S */
3414/* File: arm/op_sput.S */
3415 /*
3416 * General SPUT handler wrapper.
3417 *
3418 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3419 */
3420 /* op vAA, field@BBBB */
3421 EXPORT_PC
3422 FETCH r0, 1 @ r0<- field ref BBBB
3423 mov r3, rINST, lsr #8 @ r3<- AA
3424 GET_VREG r1, r3 @ r1<= fp[AA]
3425 ldr r2, [rFP, #OFF_FP_METHOD]
3426 mov r3, rSELF
3427 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3428 bl artSet16StaticFromCode
3429 cmp r0, #0 @ 0 on success, -1 on failure
3430 bne MterpException
3431 ADVANCE 2 @ Past exception point - now advance rPC
3432 GET_INST_OPCODE ip @ extract opcode from rINST
3433 GOTO_OPCODE ip @ jump to next instruction
3434
3435
3436/* ------------------------------ */
3437 .balign 128
3438.L_op_invoke_virtual: /* 0x6e */
3439/* File: arm/op_invoke_virtual.S */
3440/* File: arm/invoke.S */
3441 /*
3442 * Generic invoke handler wrapper.
3443 */
3444 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3445 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3446 .extern MterpInvokeVirtual
3447 EXPORT_PC
3448 mov r0, rSELF
3449 add r1, rFP, #OFF_FP_SHADOWFRAME
3450 mov r2, rPC
3451 mov r3, rINST
3452 bl MterpInvokeVirtual
3453 cmp r0, #0
3454 beq MterpException
3455 FETCH_ADVANCE_INST 3
3456 GET_INST_OPCODE ip
3457 GOTO_OPCODE ip
3458
3459
3460 /*
3461 * Handle a virtual method call.
3462 *
3463 * for: invoke-virtual, invoke-virtual/range
3464 */
3465 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3466 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3467
3468/* ------------------------------ */
3469 .balign 128
3470.L_op_invoke_super: /* 0x6f */
3471/* File: arm/op_invoke_super.S */
3472/* File: arm/invoke.S */
3473 /*
3474 * Generic invoke handler wrapper.
3475 */
3476 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3477 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3478 .extern MterpInvokeSuper
3479 EXPORT_PC
3480 mov r0, rSELF
3481 add r1, rFP, #OFF_FP_SHADOWFRAME
3482 mov r2, rPC
3483 mov r3, rINST
3484 bl MterpInvokeSuper
3485 cmp r0, #0
3486 beq MterpException
3487 FETCH_ADVANCE_INST 3
3488 GET_INST_OPCODE ip
3489 GOTO_OPCODE ip
3490
3491
3492 /*
3493 * Handle a "super" method call.
3494 *
3495 * for: invoke-super, invoke-super/range
3496 */
3497 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3498 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3499
3500/* ------------------------------ */
3501 .balign 128
3502.L_op_invoke_direct: /* 0x70 */
3503/* File: arm/op_invoke_direct.S */
3504/* File: arm/invoke.S */
3505 /*
3506 * Generic invoke handler wrapper.
3507 */
3508 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3509 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3510 .extern MterpInvokeDirect
3511 EXPORT_PC
3512 mov r0, rSELF
3513 add r1, rFP, #OFF_FP_SHADOWFRAME
3514 mov r2, rPC
3515 mov r3, rINST
3516 bl MterpInvokeDirect
3517 cmp r0, #0
3518 beq MterpException
3519 FETCH_ADVANCE_INST 3
3520 GET_INST_OPCODE ip
3521 GOTO_OPCODE ip
3522
3523
3524
3525/* ------------------------------ */
3526 .balign 128
3527.L_op_invoke_static: /* 0x71 */
3528/* File: arm/op_invoke_static.S */
3529/* File: arm/invoke.S */
3530 /*
3531 * Generic invoke handler wrapper.
3532 */
3533 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3534 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3535 .extern MterpInvokeStatic
3536 EXPORT_PC
3537 mov r0, rSELF
3538 add r1, rFP, #OFF_FP_SHADOWFRAME
3539 mov r2, rPC
3540 mov r3, rINST
3541 bl MterpInvokeStatic
3542 cmp r0, #0
3543 beq MterpException
3544 FETCH_ADVANCE_INST 3
3545 GET_INST_OPCODE ip
3546 GOTO_OPCODE ip
3547
3548
3549
3550
3551/* ------------------------------ */
3552 .balign 128
3553.L_op_invoke_interface: /* 0x72 */
3554/* File: arm/op_invoke_interface.S */
3555/* File: arm/invoke.S */
3556 /*
3557 * Generic invoke handler wrapper.
3558 */
3559 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3560 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3561 .extern MterpInvokeInterface
3562 EXPORT_PC
3563 mov r0, rSELF
3564 add r1, rFP, #OFF_FP_SHADOWFRAME
3565 mov r2, rPC
3566 mov r3, rINST
3567 bl MterpInvokeInterface
3568 cmp r0, #0
3569 beq MterpException
3570 FETCH_ADVANCE_INST 3
3571 GET_INST_OPCODE ip
3572 GOTO_OPCODE ip
3573
3574
3575 /*
3576 * Handle an interface method call.
3577 *
3578 * for: invoke-interface, invoke-interface/range
3579 */
3580 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3581 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3582
3583/* ------------------------------ */
3584 .balign 128
3585.L_op_return_void_no_barrier: /* 0x73 */
3586/* File: arm/op_return_void_no_barrier.S */
buzbeea2c97a92016-01-25 15:41:24 -08003587 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
3588 mov r0, rSELF
3589 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3590 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -08003591 mov r0, #0
3592 mov r1, #0
3593 b MterpReturn
3594
3595/* ------------------------------ */
3596 .balign 128
3597.L_op_invoke_virtual_range: /* 0x74 */
3598/* File: arm/op_invoke_virtual_range.S */
3599/* File: arm/invoke.S */
3600 /*
3601 * Generic invoke handler wrapper.
3602 */
3603 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3604 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3605 .extern MterpInvokeVirtualRange
3606 EXPORT_PC
3607 mov r0, rSELF
3608 add r1, rFP, #OFF_FP_SHADOWFRAME
3609 mov r2, rPC
3610 mov r3, rINST
3611 bl MterpInvokeVirtualRange
3612 cmp r0, #0
3613 beq MterpException
3614 FETCH_ADVANCE_INST 3
3615 GET_INST_OPCODE ip
3616 GOTO_OPCODE ip
3617
3618
3619
3620/* ------------------------------ */
3621 .balign 128
3622.L_op_invoke_super_range: /* 0x75 */
3623/* File: arm/op_invoke_super_range.S */
3624/* File: arm/invoke.S */
3625 /*
3626 * Generic invoke handler wrapper.
3627 */
3628 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3629 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3630 .extern MterpInvokeSuperRange
3631 EXPORT_PC
3632 mov r0, rSELF
3633 add r1, rFP, #OFF_FP_SHADOWFRAME
3634 mov r2, rPC
3635 mov r3, rINST
3636 bl MterpInvokeSuperRange
3637 cmp r0, #0
3638 beq MterpException
3639 FETCH_ADVANCE_INST 3
3640 GET_INST_OPCODE ip
3641 GOTO_OPCODE ip
3642
3643
3644
3645/* ------------------------------ */
3646 .balign 128
3647.L_op_invoke_direct_range: /* 0x76 */
3648/* File: arm/op_invoke_direct_range.S */
3649/* File: arm/invoke.S */
3650 /*
3651 * Generic invoke handler wrapper.
3652 */
3653 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3654 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3655 .extern MterpInvokeDirectRange
3656 EXPORT_PC
3657 mov r0, rSELF
3658 add r1, rFP, #OFF_FP_SHADOWFRAME
3659 mov r2, rPC
3660 mov r3, rINST
3661 bl MterpInvokeDirectRange
3662 cmp r0, #0
3663 beq MterpException
3664 FETCH_ADVANCE_INST 3
3665 GET_INST_OPCODE ip
3666 GOTO_OPCODE ip
3667
3668
3669
3670/* ------------------------------ */
3671 .balign 128
3672.L_op_invoke_static_range: /* 0x77 */
3673/* File: arm/op_invoke_static_range.S */
3674/* File: arm/invoke.S */
3675 /*
3676 * Generic invoke handler wrapper.
3677 */
3678 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3679 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3680 .extern MterpInvokeStaticRange
3681 EXPORT_PC
3682 mov r0, rSELF
3683 add r1, rFP, #OFF_FP_SHADOWFRAME
3684 mov r2, rPC
3685 mov r3, rINST
3686 bl MterpInvokeStaticRange
3687 cmp r0, #0
3688 beq MterpException
3689 FETCH_ADVANCE_INST 3
3690 GET_INST_OPCODE ip
3691 GOTO_OPCODE ip
3692
3693
3694
3695/* ------------------------------ */
3696 .balign 128
3697.L_op_invoke_interface_range: /* 0x78 */
3698/* File: arm/op_invoke_interface_range.S */
3699/* File: arm/invoke.S */
3700 /*
3701 * Generic invoke handler wrapper.
3702 */
3703 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3704 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3705 .extern MterpInvokeInterfaceRange
3706 EXPORT_PC
3707 mov r0, rSELF
3708 add r1, rFP, #OFF_FP_SHADOWFRAME
3709 mov r2, rPC
3710 mov r3, rINST
3711 bl MterpInvokeInterfaceRange
3712 cmp r0, #0
3713 beq MterpException
3714 FETCH_ADVANCE_INST 3
3715 GET_INST_OPCODE ip
3716 GOTO_OPCODE ip
3717
3718
3719
3720/* ------------------------------ */
3721 .balign 128
3722.L_op_unused_79: /* 0x79 */
3723/* File: arm/op_unused_79.S */
3724/* File: arm/unused.S */
3725/*
3726 * Bail to reference interpreter to throw.
3727 */
3728 b MterpFallback
3729
3730
3731/* ------------------------------ */
3732 .balign 128
3733.L_op_unused_7a: /* 0x7a */
3734/* File: arm/op_unused_7a.S */
3735/* File: arm/unused.S */
3736/*
3737 * Bail to reference interpreter to throw.
3738 */
3739 b MterpFallback
3740
3741
3742/* ------------------------------ */
3743 .balign 128
3744.L_op_neg_int: /* 0x7b */
3745/* File: arm/op_neg_int.S */
3746/* File: arm/unop.S */
3747 /*
3748 * Generic 32-bit unary operation. Provide an "instr" line that
3749 * specifies an instruction that performs "result = op r0".
3750 * This could be an ARM instruction or a function call.
3751 *
3752 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3753 * int-to-byte, int-to-char, int-to-short
3754 */
3755 /* unop vA, vB */
3756 mov r3, rINST, lsr #12 @ r3<- B
3757 ubfx r9, rINST, #8, #4 @ r9<- A
3758 GET_VREG r0, r3 @ r0<- vB
3759 @ optional op; may set condition codes
3760 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3761 rsb r0, r0, #0 @ r0<- op, r0-r3 changed
3762 GET_INST_OPCODE ip @ extract opcode from rINST
3763 SET_VREG r0, r9 @ vAA<- r0
3764 GOTO_OPCODE ip @ jump to next instruction
3765 /* 8-9 instructions */
3766
3767
3768/* ------------------------------ */
3769 .balign 128
3770.L_op_not_int: /* 0x7c */
3771/* File: arm/op_not_int.S */
3772/* File: arm/unop.S */
3773 /*
3774 * Generic 32-bit unary operation. Provide an "instr" line that
3775 * specifies an instruction that performs "result = op r0".
3776 * This could be an ARM instruction or a function call.
3777 *
3778 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3779 * int-to-byte, int-to-char, int-to-short
3780 */
3781 /* unop vA, vB */
3782 mov r3, rINST, lsr #12 @ r3<- B
3783 ubfx r9, rINST, #8, #4 @ r9<- A
3784 GET_VREG r0, r3 @ r0<- vB
3785 @ optional op; may set condition codes
3786 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3787 mvn r0, r0 @ r0<- op, r0-r3 changed
3788 GET_INST_OPCODE ip @ extract opcode from rINST
3789 SET_VREG r0, r9 @ vAA<- r0
3790 GOTO_OPCODE ip @ jump to next instruction
3791 /* 8-9 instructions */
3792
3793
3794/* ------------------------------ */
3795 .balign 128
3796.L_op_neg_long: /* 0x7d */
3797/* File: arm/op_neg_long.S */
3798/* File: arm/unopWide.S */
3799 /*
3800 * Generic 64-bit unary operation. Provide an "instr" line that
3801 * specifies an instruction that performs "result = op r0/r1".
3802 * This could be an ARM instruction or a function call.
3803 *
3804 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3805 */
3806 /* unop vA, vB */
3807 mov r3, rINST, lsr #12 @ r3<- B
3808 ubfx r9, rINST, #8, #4 @ r9<- A
3809 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3810 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3811 ldmia r3, {r0-r1} @ r0/r1<- vAA
3812 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3813 rsbs r0, r0, #0 @ optional op; may set condition codes
3814 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed
3815 GET_INST_OPCODE ip @ extract opcode from rINST
3816 stmia r9, {r0-r1} @ vAA<- r0/r1
3817 GOTO_OPCODE ip @ jump to next instruction
3818 /* 10-11 instructions */
3819
3820
3821/* ------------------------------ */
3822 .balign 128
3823.L_op_not_long: /* 0x7e */
3824/* File: arm/op_not_long.S */
3825/* File: arm/unopWide.S */
3826 /*
3827 * Generic 64-bit unary operation. Provide an "instr" line that
3828 * specifies an instruction that performs "result = op r0/r1".
3829 * This could be an ARM instruction or a function call.
3830 *
3831 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3832 */
3833 /* unop vA, vB */
3834 mov r3, rINST, lsr #12 @ r3<- B
3835 ubfx r9, rINST, #8, #4 @ r9<- A
3836 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3837 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3838 ldmia r3, {r0-r1} @ r0/r1<- vAA
3839 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3840 mvn r0, r0 @ optional op; may set condition codes
3841 mvn r1, r1 @ r0/r1<- op, r2-r3 changed
3842 GET_INST_OPCODE ip @ extract opcode from rINST
3843 stmia r9, {r0-r1} @ vAA<- r0/r1
3844 GOTO_OPCODE ip @ jump to next instruction
3845 /* 10-11 instructions */
3846
3847
3848/* ------------------------------ */
3849 .balign 128
3850.L_op_neg_float: /* 0x7f */
3851/* File: arm/op_neg_float.S */
3852/* File: arm/unop.S */
3853 /*
3854 * Generic 32-bit unary operation. Provide an "instr" line that
3855 * specifies an instruction that performs "result = op r0".
3856 * This could be an ARM instruction or a function call.
3857 *
3858 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3859 * int-to-byte, int-to-char, int-to-short
3860 */
3861 /* unop vA, vB */
3862 mov r3, rINST, lsr #12 @ r3<- B
3863 ubfx r9, rINST, #8, #4 @ r9<- A
3864 GET_VREG r0, r3 @ r0<- vB
3865 @ optional op; may set condition codes
3866 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3867 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed
3868 GET_INST_OPCODE ip @ extract opcode from rINST
3869 SET_VREG r0, r9 @ vAA<- r0
3870 GOTO_OPCODE ip @ jump to next instruction
3871 /* 8-9 instructions */
3872
3873
3874/* ------------------------------ */
3875 .balign 128
3876.L_op_neg_double: /* 0x80 */
3877/* File: arm/op_neg_double.S */
3878/* File: arm/unopWide.S */
3879 /*
3880 * Generic 64-bit unary operation. Provide an "instr" line that
3881 * specifies an instruction that performs "result = op r0/r1".
3882 * This could be an ARM instruction or a function call.
3883 *
3884 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3885 */
3886 /* unop vA, vB */
3887 mov r3, rINST, lsr #12 @ r3<- B
3888 ubfx r9, rINST, #8, #4 @ r9<- A
3889 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3890 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3891 ldmia r3, {r0-r1} @ r0/r1<- vAA
3892 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3893 @ optional op; may set condition codes
3894 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed
3895 GET_INST_OPCODE ip @ extract opcode from rINST
3896 stmia r9, {r0-r1} @ vAA<- r0/r1
3897 GOTO_OPCODE ip @ jump to next instruction
3898 /* 10-11 instructions */
3899
3900
3901/* ------------------------------ */
3902 .balign 128
3903.L_op_int_to_long: /* 0x81 */
3904/* File: arm/op_int_to_long.S */
3905/* File: arm/unopWider.S */
3906 /*
3907 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3908 * that specifies an instruction that performs "result = op r0", where
3909 * "result" is a 64-bit quantity in r0/r1.
3910 *
3911 * For: int-to-long, int-to-double, float-to-long, float-to-double
3912 */
3913 /* unop vA, vB */
3914 mov r3, rINST, lsr #12 @ r3<- B
3915 ubfx r9, rINST, #8, #4 @ r9<- A
3916 GET_VREG r0, r3 @ r0<- vB
3917 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3918 @ optional op; may set condition codes
3919 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3920 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed
3921 GET_INST_OPCODE ip @ extract opcode from rINST
3922 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3923 GOTO_OPCODE ip @ jump to next instruction
3924 /* 9-10 instructions */
3925
3926
3927/* ------------------------------ */
3928 .balign 128
3929.L_op_int_to_float: /* 0x82 */
3930/* File: arm/op_int_to_float.S */
3931/* File: arm/funop.S */
3932 /*
3933 * Generic 32-bit unary floating-point operation. Provide an "instr"
3934 * line that specifies an instruction that performs "s1 = op s0".
3935 *
3936 * for: int-to-float, float-to-int
3937 */
3938 /* unop vA, vB */
3939 mov r3, rINST, lsr #12 @ r3<- B
3940 mov r9, rINST, lsr #8 @ r9<- A+
3941 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3942 flds s0, [r3] @ s0<- vB
3943 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3944 and r9, r9, #15 @ r9<- A
3945 fsitos s1, s0 @ s1<- op
3946 GET_INST_OPCODE ip @ extract opcode from rINST
3947 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3948 fsts s1, [r9] @ vA<- s1
3949 GOTO_OPCODE ip @ jump to next instruction
3950
3951
3952/* ------------------------------ */
3953 .balign 128
3954.L_op_int_to_double: /* 0x83 */
3955/* File: arm/op_int_to_double.S */
3956/* File: arm/funopWider.S */
3957 /*
3958 * Generic 32bit-to-64bit floating point unary operation. Provide an
3959 * "instr" line that specifies an instruction that performs "d0 = op s0".
3960 *
3961 * For: int-to-double, float-to-double
3962 */
3963 /* unop vA, vB */
3964 mov r3, rINST, lsr #12 @ r3<- B
3965 mov r9, rINST, lsr #8 @ r9<- A+
3966 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3967 flds s0, [r3] @ s0<- vB
3968 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3969 and r9, r9, #15 @ r9<- A
3970 fsitod d0, s0 @ d0<- op
3971 GET_INST_OPCODE ip @ extract opcode from rINST
3972 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3973 fstd d0, [r9] @ vA<- d0
3974 GOTO_OPCODE ip @ jump to next instruction
3975
3976
3977/* ------------------------------ */
3978 .balign 128
3979.L_op_long_to_int: /* 0x84 */
3980/* File: arm/op_long_to_int.S */
3981/* we ignore the high word, making this equivalent to a 32-bit reg move */
3982/* File: arm/op_move.S */
3983 /* for move, move-object, long-to-int */
3984 /* op vA, vB */
3985 mov r1, rINST, lsr #12 @ r1<- B from 15:12
3986 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
3987 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3988 GET_VREG r2, r1 @ r2<- fp[B]
3989 GET_INST_OPCODE ip @ ip<- opcode from rINST
3990 .if 0
3991 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
3992 .else
3993 SET_VREG r2, r0 @ fp[A]<- r2
3994 .endif
3995 GOTO_OPCODE ip @ execute next instruction
3996
3997
3998/* ------------------------------ */
3999 .balign 128
4000.L_op_long_to_float: /* 0x85 */
4001/* File: arm/op_long_to_float.S */
4002/* File: arm/unopNarrower.S */
4003 /*
4004 * Generic 64bit-to-32bit unary operation. Provide an "instr" line
4005 * that specifies an instruction that performs "result = op r0/r1", where
4006 * "result" is a 32-bit quantity in r0.
4007 *
4008 * For: long-to-float, double-to-int, double-to-float
4009 *
4010 * (This would work for long-to-int, but that instruction is actually
4011 * an exact match for op_move.)
4012 */
4013 /* unop vA, vB */
4014 mov r3, rINST, lsr #12 @ r3<- B
4015 ubfx r9, rINST, #8, #4 @ r9<- A
4016 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
4017 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1
4018 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4019 @ optional op; may set condition codes
4020 bl __aeabi_l2f @ r0<- op, r0-r3 changed
4021 GET_INST_OPCODE ip @ extract opcode from rINST
4022 SET_VREG r0, r9 @ vA<- r0
4023 GOTO_OPCODE ip @ jump to next instruction
4024 /* 9-10 instructions */
4025
4026
4027/* ------------------------------ */
4028 .balign 128
4029.L_op_long_to_double: /* 0x86 */
4030/* File: arm/op_long_to_double.S */
4031 /*
4032 * Specialised 64-bit floating point operation.
4033 *
4034 * Note: The result will be returned in d2.
4035 *
4036 * For: long-to-double
4037 */
4038 mov r3, rINST, lsr #12 @ r3<- B
4039 ubfx r9, rINST, #8, #4 @ r9<- A
4040 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
4041 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
4042 vldr d0, [r3] @ d0<- vAA
4043 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4044
4045 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh)
4046 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl)
4047 vldr d3, constvalop_long_to_double
4048 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl
4049
4050 GET_INST_OPCODE ip @ extract opcode from rINST
4051 vstr.64 d2, [r9] @ vAA<- d2
4052 GOTO_OPCODE ip @ jump to next instruction
4053
4054 /* literal pool helper */
4055constvalop_long_to_double:
4056 .8byte 0x41f0000000000000
4057
4058/* ------------------------------ */
4059 .balign 128
4060.L_op_float_to_int: /* 0x87 */
4061/* File: arm/op_float_to_int.S */
4062/* File: arm/funop.S */
4063 /*
4064 * Generic 32-bit unary floating-point operation. Provide an "instr"
4065 * line that specifies an instruction that performs "s1 = op s0".
4066 *
4067 * for: int-to-float, float-to-int
4068 */
4069 /* unop vA, vB */
4070 mov r3, rINST, lsr #12 @ r3<- B
4071 mov r9, rINST, lsr #8 @ r9<- A+
4072 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4073 flds s0, [r3] @ s0<- vB
4074 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4075 and r9, r9, #15 @ r9<- A
4076 ftosizs s1, s0 @ s1<- op
4077 GET_INST_OPCODE ip @ extract opcode from rINST
4078 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4079 fsts s1, [r9] @ vA<- s1
4080 GOTO_OPCODE ip @ jump to next instruction
4081
4082
4083/* ------------------------------ */
4084 .balign 128
4085.L_op_float_to_long: /* 0x88 */
4086/* File: arm/op_float_to_long.S */
4087@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"}
4088/* File: arm/unopWider.S */
4089 /*
4090 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
4091 * that specifies an instruction that performs "result = op r0", where
4092 * "result" is a 64-bit quantity in r0/r1.
4093 *
4094 * For: int-to-long, int-to-double, float-to-long, float-to-double
4095 */
4096 /* unop vA, vB */
4097 mov r3, rINST, lsr #12 @ r3<- B
4098 ubfx r9, rINST, #8, #4 @ r9<- A
4099 GET_VREG r0, r3 @ r0<- vB
4100 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
4101 @ optional op; may set condition codes
4102 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4103 bl f2l_doconv @ r0<- op, r0-r3 changed
4104 GET_INST_OPCODE ip @ extract opcode from rINST
4105 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
4106 GOTO_OPCODE ip @ jump to next instruction
4107 /* 9-10 instructions */
4108
4109
4110
4111/* ------------------------------ */
4112 .balign 128
4113.L_op_float_to_double: /* 0x89 */
4114/* File: arm/op_float_to_double.S */
4115/* File: arm/funopWider.S */
4116 /*
4117 * Generic 32bit-to-64bit floating point unary operation. Provide an
4118 * "instr" line that specifies an instruction that performs "d0 = op s0".
4119 *
4120 * For: int-to-double, float-to-double
4121 */
4122 /* unop vA, vB */
4123 mov r3, rINST, lsr #12 @ r3<- B
4124 mov r9, rINST, lsr #8 @ r9<- A+
4125 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4126 flds s0, [r3] @ s0<- vB
4127 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4128 and r9, r9, #15 @ r9<- A
4129 fcvtds d0, s0 @ d0<- op
4130 GET_INST_OPCODE ip @ extract opcode from rINST
4131 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4132 fstd d0, [r9] @ vA<- d0
4133 GOTO_OPCODE ip @ jump to next instruction
4134
4135
4136/* ------------------------------ */
4137 .balign 128
4138.L_op_double_to_int: /* 0x8a */
4139/* File: arm/op_double_to_int.S */
4140/* File: arm/funopNarrower.S */
4141 /*
4142 * Generic 64bit-to-32bit unary floating point operation. Provide an
4143 * "instr" line that specifies an instruction that performs "s0 = op d0".
4144 *
4145 * For: double-to-int, double-to-float
4146 */
4147 /* unop vA, vB */
4148 mov r3, rINST, lsr #12 @ r3<- B
4149 mov r9, rINST, lsr #8 @ r9<- A+
4150 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4151 fldd d0, [r3] @ d0<- vB
4152 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4153 and r9, r9, #15 @ r9<- A
4154 ftosizd s0, d0 @ s0<- op
4155 GET_INST_OPCODE ip @ extract opcode from rINST
4156 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4157 fsts s0, [r9] @ vA<- s0
4158 GOTO_OPCODE ip @ jump to next instruction
4159
4160
4161/* ------------------------------ */
4162 .balign 128
4163.L_op_double_to_long: /* 0x8b */
4164/* File: arm/op_double_to_long.S */
4165@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"}
4166/* File: arm/unopWide.S */
4167 /*
4168 * Generic 64-bit unary operation. Provide an "instr" line that
4169 * specifies an instruction that performs "result = op r0/r1".
4170 * This could be an ARM instruction or a function call.
4171 *
4172 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
4173 */
4174 /* unop vA, vB */
4175 mov r3, rINST, lsr #12 @ r3<- B
4176 ubfx r9, rINST, #8, #4 @ r9<- A
4177 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
4178 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
4179 ldmia r3, {r0-r1} @ r0/r1<- vAA
4180 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4181 @ optional op; may set condition codes
4182 bl d2l_doconv @ r0/r1<- op, r2-r3 changed
4183 GET_INST_OPCODE ip @ extract opcode from rINST
4184 stmia r9, {r0-r1} @ vAA<- r0/r1
4185 GOTO_OPCODE ip @ jump to next instruction
4186 /* 10-11 instructions */
4187
4188
4189
4190/* ------------------------------ */
4191 .balign 128
4192.L_op_double_to_float: /* 0x8c */
4193/* File: arm/op_double_to_float.S */
4194/* File: arm/funopNarrower.S */
4195 /*
4196 * Generic 64bit-to-32bit unary floating point operation. Provide an
4197 * "instr" line that specifies an instruction that performs "s0 = op d0".
4198 *
4199 * For: double-to-int, double-to-float
4200 */
4201 /* unop vA, vB */
4202 mov r3, rINST, lsr #12 @ r3<- B
4203 mov r9, rINST, lsr #8 @ r9<- A+
4204 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4205 fldd d0, [r3] @ d0<- vB
4206 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4207 and r9, r9, #15 @ r9<- A
4208 fcvtsd s0, d0 @ s0<- op
4209 GET_INST_OPCODE ip @ extract opcode from rINST
4210 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4211 fsts s0, [r9] @ vA<- s0
4212 GOTO_OPCODE ip @ jump to next instruction
4213
4214
4215/* ------------------------------ */
4216 .balign 128
4217.L_op_int_to_byte: /* 0x8d */
4218/* File: arm/op_int_to_byte.S */
4219/* File: arm/unop.S */
4220 /*
4221 * Generic 32-bit unary operation. Provide an "instr" line that
4222 * specifies an instruction that performs "result = op r0".
4223 * This could be an ARM instruction or a function call.
4224 *
4225 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4226 * int-to-byte, int-to-char, int-to-short
4227 */
4228 /* unop vA, vB */
4229 mov r3, rINST, lsr #12 @ r3<- B
4230 ubfx r9, rINST, #8, #4 @ r9<- A
4231 GET_VREG r0, r3 @ r0<- vB
4232 @ optional op; may set condition codes
4233 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4234 sxtb r0, r0 @ r0<- op, r0-r3 changed
4235 GET_INST_OPCODE ip @ extract opcode from rINST
4236 SET_VREG r0, r9 @ vAA<- r0
4237 GOTO_OPCODE ip @ jump to next instruction
4238 /* 8-9 instructions */
4239
4240
4241/* ------------------------------ */
4242 .balign 128
4243.L_op_int_to_char: /* 0x8e */
4244/* File: arm/op_int_to_char.S */
4245/* File: arm/unop.S */
4246 /*
4247 * Generic 32-bit unary operation. Provide an "instr" line that
4248 * specifies an instruction that performs "result = op r0".
4249 * This could be an ARM instruction or a function call.
4250 *
4251 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4252 * int-to-byte, int-to-char, int-to-short
4253 */
4254 /* unop vA, vB */
4255 mov r3, rINST, lsr #12 @ r3<- B
4256 ubfx r9, rINST, #8, #4 @ r9<- A
4257 GET_VREG r0, r3 @ r0<- vB
4258 @ optional op; may set condition codes
4259 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4260 uxth r0, r0 @ r0<- op, r0-r3 changed
4261 GET_INST_OPCODE ip @ extract opcode from rINST
4262 SET_VREG r0, r9 @ vAA<- r0
4263 GOTO_OPCODE ip @ jump to next instruction
4264 /* 8-9 instructions */
4265
4266
4267/* ------------------------------ */
4268 .balign 128
4269.L_op_int_to_short: /* 0x8f */
4270/* File: arm/op_int_to_short.S */
4271/* File: arm/unop.S */
4272 /*
4273 * Generic 32-bit unary operation. Provide an "instr" line that
4274 * specifies an instruction that performs "result = op r0".
4275 * This could be an ARM instruction or a function call.
4276 *
4277 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4278 * int-to-byte, int-to-char, int-to-short
4279 */
4280 /* unop vA, vB */
4281 mov r3, rINST, lsr #12 @ r3<- B
4282 ubfx r9, rINST, #8, #4 @ r9<- A
4283 GET_VREG r0, r3 @ r0<- vB
4284 @ optional op; may set condition codes
4285 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4286 sxth r0, r0 @ r0<- op, r0-r3 changed
4287 GET_INST_OPCODE ip @ extract opcode from rINST
4288 SET_VREG r0, r9 @ vAA<- r0
4289 GOTO_OPCODE ip @ jump to next instruction
4290 /* 8-9 instructions */
4291
4292
4293/* ------------------------------ */
4294 .balign 128
4295.L_op_add_int: /* 0x90 */
4296/* File: arm/op_add_int.S */
4297/* File: arm/binop.S */
4298 /*
4299 * Generic 32-bit binary operation. Provide an "instr" line that
4300 * specifies an instruction that performs "result = r0 op r1".
4301 * This could be an ARM instruction or a function call. (If the result
4302 * comes back in a register other than r0, you can override "result".)
4303 *
4304 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4305 * vCC (r1). Useful for integer division and modulus. Note that we
4306 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4307 * handles it correctly.
4308 *
4309 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4310 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4311 * mul-float, div-float, rem-float
4312 */
4313 /* binop vAA, vBB, vCC */
4314 FETCH r0, 1 @ r0<- CCBB
4315 mov r9, rINST, lsr #8 @ r9<- AA
4316 mov r3, r0, lsr #8 @ r3<- CC
4317 and r2, r0, #255 @ r2<- BB
4318 GET_VREG r1, r3 @ r1<- vCC
4319 GET_VREG r0, r2 @ r0<- vBB
4320 .if 0
4321 cmp r1, #0 @ is second operand zero?
4322 beq common_errDivideByZero
4323 .endif
4324
4325 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4326 @ optional op; may set condition codes
4327 add r0, r0, r1 @ r0<- op, r0-r3 changed
4328 GET_INST_OPCODE ip @ extract opcode from rINST
4329 SET_VREG r0, r9 @ vAA<- r0
4330 GOTO_OPCODE ip @ jump to next instruction
4331 /* 11-14 instructions */
4332
4333
4334/* ------------------------------ */
4335 .balign 128
4336.L_op_sub_int: /* 0x91 */
4337/* File: arm/op_sub_int.S */
4338/* File: arm/binop.S */
4339 /*
4340 * Generic 32-bit binary operation. Provide an "instr" line that
4341 * specifies an instruction that performs "result = r0 op r1".
4342 * This could be an ARM instruction or a function call. (If the result
4343 * comes back in a register other than r0, you can override "result".)
4344 *
4345 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4346 * vCC (r1). Useful for integer division and modulus. Note that we
4347 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4348 * handles it correctly.
4349 *
4350 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4351 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4352 * mul-float, div-float, rem-float
4353 */
4354 /* binop vAA, vBB, vCC */
4355 FETCH r0, 1 @ r0<- CCBB
4356 mov r9, rINST, lsr #8 @ r9<- AA
4357 mov r3, r0, lsr #8 @ r3<- CC
4358 and r2, r0, #255 @ r2<- BB
4359 GET_VREG r1, r3 @ r1<- vCC
4360 GET_VREG r0, r2 @ r0<- vBB
4361 .if 0
4362 cmp r1, #0 @ is second operand zero?
4363 beq common_errDivideByZero
4364 .endif
4365
4366 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4367 @ optional op; may set condition codes
4368 sub r0, r0, r1 @ r0<- op, r0-r3 changed
4369 GET_INST_OPCODE ip @ extract opcode from rINST
4370 SET_VREG r0, r9 @ vAA<- r0
4371 GOTO_OPCODE ip @ jump to next instruction
4372 /* 11-14 instructions */
4373
4374
4375/* ------------------------------ */
4376 .balign 128
4377.L_op_mul_int: /* 0x92 */
4378/* File: arm/op_mul_int.S */
4379/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4380/* File: arm/binop.S */
4381 /*
4382 * Generic 32-bit binary operation. Provide an "instr" line that
4383 * specifies an instruction that performs "result = r0 op r1".
4384 * This could be an ARM instruction or a function call. (If the result
4385 * comes back in a register other than r0, you can override "result".)
4386 *
4387 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4388 * vCC (r1). Useful for integer division and modulus. Note that we
4389 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4390 * handles it correctly.
4391 *
4392 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4393 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4394 * mul-float, div-float, rem-float
4395 */
4396 /* binop vAA, vBB, vCC */
4397 FETCH r0, 1 @ r0<- CCBB
4398 mov r9, rINST, lsr #8 @ r9<- AA
4399 mov r3, r0, lsr #8 @ r3<- CC
4400 and r2, r0, #255 @ r2<- BB
4401 GET_VREG r1, r3 @ r1<- vCC
4402 GET_VREG r0, r2 @ r0<- vBB
4403 .if 0
4404 cmp r1, #0 @ is second operand zero?
4405 beq common_errDivideByZero
4406 .endif
4407
4408 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4409 @ optional op; may set condition codes
4410 mul r0, r1, r0 @ r0<- op, r0-r3 changed
4411 GET_INST_OPCODE ip @ extract opcode from rINST
4412 SET_VREG r0, r9 @ vAA<- r0
4413 GOTO_OPCODE ip @ jump to next instruction
4414 /* 11-14 instructions */
4415
4416
4417/* ------------------------------ */
4418 .balign 128
4419.L_op_div_int: /* 0x93 */
4420/* File: arm/op_div_int.S */
4421 /*
4422 * Specialized 32-bit binary operation
4423 *
4424 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4425 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4426 * ARMv7 CPUs that have hardware division support).
4427 *
4428 * div-int
4429 *
4430 */
4431 FETCH r0, 1 @ r0<- CCBB
4432 mov r9, rINST, lsr #8 @ r9<- AA
4433 mov r3, r0, lsr #8 @ r3<- CC
4434 and r2, r0, #255 @ r2<- BB
4435 GET_VREG r1, r3 @ r1<- vCC
4436 GET_VREG r0, r2 @ r0<- vBB
4437 cmp r1, #0 @ is second operand zero?
4438 beq common_errDivideByZero
4439
4440 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4441#ifdef __ARM_ARCH_EXT_IDIV__
4442 sdiv r0, r0, r1 @ r0<- op
4443#else
4444 bl __aeabi_idiv @ r0<- op, r0-r3 changed
4445#endif
4446 GET_INST_OPCODE ip @ extract opcode from rINST
4447 SET_VREG r0, r9 @ vAA<- r0
4448 GOTO_OPCODE ip @ jump to next instruction
4449 /* 11-14 instructions */
4450
4451/* ------------------------------ */
4452 .balign 128
4453.L_op_rem_int: /* 0x94 */
4454/* File: arm/op_rem_int.S */
4455 /*
4456 * Specialized 32-bit binary operation
4457 *
4458 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4459 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4460 * ARMv7 CPUs that have hardware division support).
4461 *
4462 * NOTE: idivmod returns quotient in r0 and remainder in r1
4463 *
4464 * rem-int
4465 *
4466 */
4467 FETCH r0, 1 @ r0<- CCBB
4468 mov r9, rINST, lsr #8 @ r9<- AA
4469 mov r3, r0, lsr #8 @ r3<- CC
4470 and r2, r0, #255 @ r2<- BB
4471 GET_VREG r1, r3 @ r1<- vCC
4472 GET_VREG r0, r2 @ r0<- vBB
4473 cmp r1, #0 @ is second operand zero?
4474 beq common_errDivideByZero
4475
4476 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4477#ifdef __ARM_ARCH_EXT_IDIV__
4478 sdiv r2, r0, r1
4479 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed
4480#else
4481 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
4482#endif
4483 GET_INST_OPCODE ip @ extract opcode from rINST
4484 SET_VREG r1, r9 @ vAA<- r1
4485 GOTO_OPCODE ip @ jump to next instruction
4486 /* 11-14 instructions */
4487
4488/* ------------------------------ */
4489 .balign 128
4490.L_op_and_int: /* 0x95 */
4491/* File: arm/op_and_int.S */
4492/* File: arm/binop.S */
4493 /*
4494 * Generic 32-bit binary operation. Provide an "instr" line that
4495 * specifies an instruction that performs "result = r0 op r1".
4496 * This could be an ARM instruction or a function call. (If the result
4497 * comes back in a register other than r0, you can override "result".)
4498 *
4499 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4500 * vCC (r1). Useful for integer division and modulus. Note that we
4501 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4502 * handles it correctly.
4503 *
4504 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4505 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4506 * mul-float, div-float, rem-float
4507 */
4508 /* binop vAA, vBB, vCC */
4509 FETCH r0, 1 @ r0<- CCBB
4510 mov r9, rINST, lsr #8 @ r9<- AA
4511 mov r3, r0, lsr #8 @ r3<- CC
4512 and r2, r0, #255 @ r2<- BB
4513 GET_VREG r1, r3 @ r1<- vCC
4514 GET_VREG r0, r2 @ r0<- vBB
4515 .if 0
4516 cmp r1, #0 @ is second operand zero?
4517 beq common_errDivideByZero
4518 .endif
4519
4520 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4521 @ optional op; may set condition codes
4522 and r0, r0, r1 @ r0<- op, r0-r3 changed
4523 GET_INST_OPCODE ip @ extract opcode from rINST
4524 SET_VREG r0, r9 @ vAA<- r0
4525 GOTO_OPCODE ip @ jump to next instruction
4526 /* 11-14 instructions */
4527
4528
4529/* ------------------------------ */
4530 .balign 128
4531.L_op_or_int: /* 0x96 */
4532/* File: arm/op_or_int.S */
4533/* File: arm/binop.S */
4534 /*
4535 * Generic 32-bit binary operation. Provide an "instr" line that
4536 * specifies an instruction that performs "result = r0 op r1".
4537 * This could be an ARM instruction or a function call. (If the result
4538 * comes back in a register other than r0, you can override "result".)
4539 *
4540 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4541 * vCC (r1). Useful for integer division and modulus. Note that we
4542 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4543 * handles it correctly.
4544 *
4545 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4546 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4547 * mul-float, div-float, rem-float
4548 */
4549 /* binop vAA, vBB, vCC */
4550 FETCH r0, 1 @ r0<- CCBB
4551 mov r9, rINST, lsr #8 @ r9<- AA
4552 mov r3, r0, lsr #8 @ r3<- CC
4553 and r2, r0, #255 @ r2<- BB
4554 GET_VREG r1, r3 @ r1<- vCC
4555 GET_VREG r0, r2 @ r0<- vBB
4556 .if 0
4557 cmp r1, #0 @ is second operand zero?
4558 beq common_errDivideByZero
4559 .endif
4560
4561 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4562 @ optional op; may set condition codes
4563 orr r0, r0, r1 @ r0<- op, r0-r3 changed
4564 GET_INST_OPCODE ip @ extract opcode from rINST
4565 SET_VREG r0, r9 @ vAA<- r0
4566 GOTO_OPCODE ip @ jump to next instruction
4567 /* 11-14 instructions */
4568
4569
4570/* ------------------------------ */
4571 .balign 128
4572.L_op_xor_int: /* 0x97 */
4573/* File: arm/op_xor_int.S */
4574/* File: arm/binop.S */
4575 /*
4576 * Generic 32-bit binary operation. Provide an "instr" line that
4577 * specifies an instruction that performs "result = r0 op r1".
4578 * This could be an ARM instruction or a function call. (If the result
4579 * comes back in a register other than r0, you can override "result".)
4580 *
4581 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4582 * vCC (r1). Useful for integer division and modulus. Note that we
4583 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4584 * handles it correctly.
4585 *
4586 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4587 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4588 * mul-float, div-float, rem-float
4589 */
4590 /* binop vAA, vBB, vCC */
4591 FETCH r0, 1 @ r0<- CCBB
4592 mov r9, rINST, lsr #8 @ r9<- AA
4593 mov r3, r0, lsr #8 @ r3<- CC
4594 and r2, r0, #255 @ r2<- BB
4595 GET_VREG r1, r3 @ r1<- vCC
4596 GET_VREG r0, r2 @ r0<- vBB
4597 .if 0
4598 cmp r1, #0 @ is second operand zero?
4599 beq common_errDivideByZero
4600 .endif
4601
4602 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4603 @ optional op; may set condition codes
4604 eor r0, r0, r1 @ r0<- op, r0-r3 changed
4605 GET_INST_OPCODE ip @ extract opcode from rINST
4606 SET_VREG r0, r9 @ vAA<- r0
4607 GOTO_OPCODE ip @ jump to next instruction
4608 /* 11-14 instructions */
4609
4610
4611/* ------------------------------ */
4612 .balign 128
4613.L_op_shl_int: /* 0x98 */
4614/* File: arm/op_shl_int.S */
4615/* File: arm/binop.S */
4616 /*
4617 * Generic 32-bit binary operation. Provide an "instr" line that
4618 * specifies an instruction that performs "result = r0 op r1".
4619 * This could be an ARM instruction or a function call. (If the result
4620 * comes back in a register other than r0, you can override "result".)
4621 *
4622 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4623 * vCC (r1). Useful for integer division and modulus. Note that we
4624 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4625 * handles it correctly.
4626 *
4627 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4628 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4629 * mul-float, div-float, rem-float
4630 */
4631 /* binop vAA, vBB, vCC */
4632 FETCH r0, 1 @ r0<- CCBB
4633 mov r9, rINST, lsr #8 @ r9<- AA
4634 mov r3, r0, lsr #8 @ r3<- CC
4635 and r2, r0, #255 @ r2<- BB
4636 GET_VREG r1, r3 @ r1<- vCC
4637 GET_VREG r0, r2 @ r0<- vBB
4638 .if 0
4639 cmp r1, #0 @ is second operand zero?
4640 beq common_errDivideByZero
4641 .endif
4642
4643 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4644 and r1, r1, #31 @ optional op; may set condition codes
4645 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
4646 GET_INST_OPCODE ip @ extract opcode from rINST
4647 SET_VREG r0, r9 @ vAA<- r0
4648 GOTO_OPCODE ip @ jump to next instruction
4649 /* 11-14 instructions */
4650
4651
4652/* ------------------------------ */
4653 .balign 128
4654.L_op_shr_int: /* 0x99 */
4655/* File: arm/op_shr_int.S */
4656/* File: arm/binop.S */
4657 /*
4658 * Generic 32-bit binary operation. Provide an "instr" line that
4659 * specifies an instruction that performs "result = r0 op r1".
4660 * This could be an ARM instruction or a function call. (If the result
4661 * comes back in a register other than r0, you can override "result".)
4662 *
4663 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4664 * vCC (r1). Useful for integer division and modulus. Note that we
4665 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4666 * handles it correctly.
4667 *
4668 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4669 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4670 * mul-float, div-float, rem-float
4671 */
4672 /* binop vAA, vBB, vCC */
4673 FETCH r0, 1 @ r0<- CCBB
4674 mov r9, rINST, lsr #8 @ r9<- AA
4675 mov r3, r0, lsr #8 @ r3<- CC
4676 and r2, r0, #255 @ r2<- BB
4677 GET_VREG r1, r3 @ r1<- vCC
4678 GET_VREG r0, r2 @ r0<- vBB
4679 .if 0
4680 cmp r1, #0 @ is second operand zero?
4681 beq common_errDivideByZero
4682 .endif
4683
4684 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4685 and r1, r1, #31 @ optional op; may set condition codes
4686 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
4687 GET_INST_OPCODE ip @ extract opcode from rINST
4688 SET_VREG r0, r9 @ vAA<- r0
4689 GOTO_OPCODE ip @ jump to next instruction
4690 /* 11-14 instructions */
4691
4692
4693/* ------------------------------ */
4694 .balign 128
4695.L_op_ushr_int: /* 0x9a */
4696/* File: arm/op_ushr_int.S */
4697/* File: arm/binop.S */
4698 /*
4699 * Generic 32-bit binary operation. Provide an "instr" line that
4700 * specifies an instruction that performs "result = r0 op r1".
4701 * This could be an ARM instruction or a function call. (If the result
4702 * comes back in a register other than r0, you can override "result".)
4703 *
4704 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4705 * vCC (r1). Useful for integer division and modulus. Note that we
4706 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4707 * handles it correctly.
4708 *
4709 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4710 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4711 * mul-float, div-float, rem-float
4712 */
4713 /* binop vAA, vBB, vCC */
4714 FETCH r0, 1 @ r0<- CCBB
4715 mov r9, rINST, lsr #8 @ r9<- AA
4716 mov r3, r0, lsr #8 @ r3<- CC
4717 and r2, r0, #255 @ r2<- BB
4718 GET_VREG r1, r3 @ r1<- vCC
4719 GET_VREG r0, r2 @ r0<- vBB
4720 .if 0
4721 cmp r1, #0 @ is second operand zero?
4722 beq common_errDivideByZero
4723 .endif
4724
4725 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4726 and r1, r1, #31 @ optional op; may set condition codes
4727 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
4728 GET_INST_OPCODE ip @ extract opcode from rINST
4729 SET_VREG r0, r9 @ vAA<- r0
4730 GOTO_OPCODE ip @ jump to next instruction
4731 /* 11-14 instructions */
4732
4733
4734/* ------------------------------ */
4735 .balign 128
4736.L_op_add_long: /* 0x9b */
4737/* File: arm/op_add_long.S */
4738/* File: arm/binopWide.S */
4739 /*
4740 * Generic 64-bit binary operation. Provide an "instr" line that
4741 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4742 * This could be an ARM instruction or a function call. (If the result
4743 * comes back in a register other than r0, you can override "result".)
4744 *
4745 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4746 * vCC (r1). Useful for integer division and modulus.
4747 *
4748 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4749 * xor-long, add-double, sub-double, mul-double, div-double,
4750 * rem-double
4751 *
4752 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4753 */
4754 /* binop vAA, vBB, vCC */
4755 FETCH r0, 1 @ r0<- CCBB
4756 mov r9, rINST, lsr #8 @ r9<- AA
4757 and r2, r0, #255 @ r2<- BB
4758 mov r3, r0, lsr #8 @ r3<- CC
4759 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4760 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4761 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4762 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4763 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4764 .if 0
4765 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4766 beq common_errDivideByZero
4767 .endif
4768 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4769
4770 adds r0, r0, r2 @ optional op; may set condition codes
4771 adc r1, r1, r3 @ result<- op, r0-r3 changed
4772 GET_INST_OPCODE ip @ extract opcode from rINST
4773 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4774 GOTO_OPCODE ip @ jump to next instruction
4775 /* 14-17 instructions */
4776
4777
4778/* ------------------------------ */
4779 .balign 128
4780.L_op_sub_long: /* 0x9c */
4781/* File: arm/op_sub_long.S */
4782/* File: arm/binopWide.S */
4783 /*
4784 * Generic 64-bit binary operation. Provide an "instr" line that
4785 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4786 * This could be an ARM instruction or a function call. (If the result
4787 * comes back in a register other than r0, you can override "result".)
4788 *
4789 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4790 * vCC (r1). Useful for integer division and modulus.
4791 *
4792 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4793 * xor-long, add-double, sub-double, mul-double, div-double,
4794 * rem-double
4795 *
4796 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4797 */
4798 /* binop vAA, vBB, vCC */
4799 FETCH r0, 1 @ r0<- CCBB
4800 mov r9, rINST, lsr #8 @ r9<- AA
4801 and r2, r0, #255 @ r2<- BB
4802 mov r3, r0, lsr #8 @ r3<- CC
4803 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4804 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4805 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4806 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4807 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4808 .if 0
4809 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4810 beq common_errDivideByZero
4811 .endif
4812 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4813
4814 subs r0, r0, r2 @ optional op; may set condition codes
4815 sbc r1, r1, r3 @ result<- op, r0-r3 changed
4816 GET_INST_OPCODE ip @ extract opcode from rINST
4817 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4818 GOTO_OPCODE ip @ jump to next instruction
4819 /* 14-17 instructions */
4820
4821
4822/* ------------------------------ */
4823 .balign 128
4824.L_op_mul_long: /* 0x9d */
4825/* File: arm/op_mul_long.S */
4826 /*
4827 * Signed 64-bit integer multiply.
4828 *
4829 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4830 * WX
4831 * x YZ
4832 * --------
4833 * ZW ZX
4834 * YW YX
4835 *
4836 * The low word of the result holds ZX, the high word holds
4837 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
4838 * it doesn't fit in the low 64 bits.
4839 *
4840 * Unlike most ARM math operations, multiply instructions have
4841 * restrictions on using the same register more than once (Rd and Rm
4842 * cannot be the same).
4843 */
4844 /* mul-long vAA, vBB, vCC */
4845 FETCH r0, 1 @ r0<- CCBB
4846 and r2, r0, #255 @ r2<- BB
4847 mov r3, r0, lsr #8 @ r3<- CC
4848 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4849 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4850 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4851 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4852 mul ip, r2, r1 @ ip<- ZxW
4853 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
4854 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
4855 mov r0, rINST, lsr #8 @ r0<- AA
4856 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
4857 add r0, rFP, r0, lsl #2 @ r0<- &fp[AA]
4858 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4859 GET_INST_OPCODE ip @ extract opcode from rINST
4860 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
4861 GOTO_OPCODE ip @ jump to next instruction
4862
4863/* ------------------------------ */
4864 .balign 128
4865.L_op_div_long: /* 0x9e */
4866/* File: arm/op_div_long.S */
4867/* File: arm/binopWide.S */
4868 /*
4869 * Generic 64-bit binary operation. Provide an "instr" line that
4870 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4871 * This could be an ARM instruction or a function call. (If the result
4872 * comes back in a register other than r0, you can override "result".)
4873 *
4874 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4875 * vCC (r1). Useful for integer division and modulus.
4876 *
4877 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4878 * xor-long, add-double, sub-double, mul-double, div-double,
4879 * rem-double
4880 *
4881 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4882 */
4883 /* binop vAA, vBB, vCC */
4884 FETCH r0, 1 @ r0<- CCBB
4885 mov r9, rINST, lsr #8 @ r9<- AA
4886 and r2, r0, #255 @ r2<- BB
4887 mov r3, r0, lsr #8 @ r3<- CC
4888 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4889 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4890 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4891 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4892 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4893 .if 1
4894 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4895 beq common_errDivideByZero
4896 .endif
4897 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4898
4899 @ optional op; may set condition codes
4900 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4901 GET_INST_OPCODE ip @ extract opcode from rINST
4902 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4903 GOTO_OPCODE ip @ jump to next instruction
4904 /* 14-17 instructions */
4905
4906
4907/* ------------------------------ */
4908 .balign 128
4909.L_op_rem_long: /* 0x9f */
4910/* File: arm/op_rem_long.S */
4911/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4912/* File: arm/binopWide.S */
4913 /*
4914 * Generic 64-bit binary operation. Provide an "instr" line that
4915 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4916 * This could be an ARM instruction or a function call. (If the result
4917 * comes back in a register other than r0, you can override "result".)
4918 *
4919 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4920 * vCC (r1). Useful for integer division and modulus.
4921 *
4922 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4923 * xor-long, add-double, sub-double, mul-double, div-double,
4924 * rem-double
4925 *
4926 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4927 */
4928 /* binop vAA, vBB, vCC */
4929 FETCH r0, 1 @ r0<- CCBB
4930 mov r9, rINST, lsr #8 @ r9<- AA
4931 and r2, r0, #255 @ r2<- BB
4932 mov r3, r0, lsr #8 @ r3<- CC
4933 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4934 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4935 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4936 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4937 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4938 .if 1
4939 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4940 beq common_errDivideByZero
4941 .endif
4942 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4943
4944 @ optional op; may set condition codes
4945 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4946 GET_INST_OPCODE ip @ extract opcode from rINST
4947 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
4948 GOTO_OPCODE ip @ jump to next instruction
4949 /* 14-17 instructions */
4950
4951
4952/* ------------------------------ */
4953 .balign 128
4954.L_op_and_long: /* 0xa0 */
4955/* File: arm/op_and_long.S */
4956/* File: arm/binopWide.S */
4957 /*
4958 * Generic 64-bit binary operation. Provide an "instr" line that
4959 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4960 * This could be an ARM instruction or a function call. (If the result
4961 * comes back in a register other than r0, you can override "result".)
4962 *
4963 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4964 * vCC (r1). Useful for integer division and modulus.
4965 *
4966 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4967 * xor-long, add-double, sub-double, mul-double, div-double,
4968 * rem-double
4969 *
4970 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4971 */
4972 /* binop vAA, vBB, vCC */
4973 FETCH r0, 1 @ r0<- CCBB
4974 mov r9, rINST, lsr #8 @ r9<- AA
4975 and r2, r0, #255 @ r2<- BB
4976 mov r3, r0, lsr #8 @ r3<- CC
4977 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4978 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4979 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4980 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4981 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4982 .if 0
4983 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4984 beq common_errDivideByZero
4985 .endif
4986 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4987
4988 and r0, r0, r2 @ optional op; may set condition codes
4989 and r1, r1, r3 @ result<- op, r0-r3 changed
4990 GET_INST_OPCODE ip @ extract opcode from rINST
4991 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4992 GOTO_OPCODE ip @ jump to next instruction
4993 /* 14-17 instructions */
4994
4995
4996/* ------------------------------ */
4997 .balign 128
4998.L_op_or_long: /* 0xa1 */
4999/* File: arm/op_or_long.S */
5000/* File: arm/binopWide.S */
5001 /*
5002 * Generic 64-bit binary operation. Provide an "instr" line that
5003 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5004 * This could be an ARM instruction or a function call. (If the result
5005 * comes back in a register other than r0, you can override "result".)
5006 *
5007 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5008 * vCC (r1). Useful for integer division and modulus.
5009 *
5010 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5011 * xor-long, add-double, sub-double, mul-double, div-double,
5012 * rem-double
5013 *
5014 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5015 */
5016 /* binop vAA, vBB, vCC */
5017 FETCH r0, 1 @ r0<- CCBB
5018 mov r9, rINST, lsr #8 @ r9<- AA
5019 and r2, r0, #255 @ r2<- BB
5020 mov r3, r0, lsr #8 @ r3<- CC
5021 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5022 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5023 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5024 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5025 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5026 .if 0
5027 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5028 beq common_errDivideByZero
5029 .endif
5030 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5031
5032 orr r0, r0, r2 @ optional op; may set condition codes
5033 orr r1, r1, r3 @ result<- op, r0-r3 changed
5034 GET_INST_OPCODE ip @ extract opcode from rINST
5035 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5036 GOTO_OPCODE ip @ jump to next instruction
5037 /* 14-17 instructions */
5038
5039
5040/* ------------------------------ */
5041 .balign 128
5042.L_op_xor_long: /* 0xa2 */
5043/* File: arm/op_xor_long.S */
5044/* File: arm/binopWide.S */
5045 /*
5046 * Generic 64-bit binary operation. Provide an "instr" line that
5047 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5048 * This could be an ARM instruction or a function call. (If the result
5049 * comes back in a register other than r0, you can override "result".)
5050 *
5051 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5052 * vCC (r1). Useful for integer division and modulus.
5053 *
5054 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5055 * xor-long, add-double, sub-double, mul-double, div-double,
5056 * rem-double
5057 *
5058 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5059 */
5060 /* binop vAA, vBB, vCC */
5061 FETCH r0, 1 @ r0<- CCBB
5062 mov r9, rINST, lsr #8 @ r9<- AA
5063 and r2, r0, #255 @ r2<- BB
5064 mov r3, r0, lsr #8 @ r3<- CC
5065 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5066 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5067 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5068 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5069 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5070 .if 0
5071 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5072 beq common_errDivideByZero
5073 .endif
5074 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5075
5076 eor r0, r0, r2 @ optional op; may set condition codes
5077 eor r1, r1, r3 @ result<- op, r0-r3 changed
5078 GET_INST_OPCODE ip @ extract opcode from rINST
5079 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5080 GOTO_OPCODE ip @ jump to next instruction
5081 /* 14-17 instructions */
5082
5083
5084/* ------------------------------ */
5085 .balign 128
5086.L_op_shl_long: /* 0xa3 */
5087/* File: arm/op_shl_long.S */
5088 /*
5089 * Long integer shift. This is different from the generic 32/64-bit
5090 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5091 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5092 * 6 bits of the shift distance.
5093 */
5094 /* shl-long vAA, vBB, vCC */
5095 FETCH r0, 1 @ r0<- CCBB
5096 mov r9, rINST, lsr #8 @ r9<- AA
5097 and r3, r0, #255 @ r3<- BB
5098 mov r0, r0, lsr #8 @ r0<- CC
5099 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5100 GET_VREG r2, r0 @ r2<- vCC
5101 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
5102 and r2, r2, #63 @ r2<- r2 & 0x3f
5103 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5104
5105 mov r1, r1, asl r2 @ r1<- r1 << r2
5106 rsb r3, r2, #32 @ r3<- 32 - r2
5107 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
5108 subs ip, r2, #32 @ ip<- r2 - 32
5109 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
5110 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5111 mov r0, r0, asl r2 @ r0<- r0 << r2
5112 GET_INST_OPCODE ip @ extract opcode from rINST
5113 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5114 GOTO_OPCODE ip @ jump to next instruction
5115
5116/* ------------------------------ */
5117 .balign 128
5118.L_op_shr_long: /* 0xa4 */
5119/* File: arm/op_shr_long.S */
5120 /*
5121 * Long integer shift. This is different from the generic 32/64-bit
5122 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5123 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5124 * 6 bits of the shift distance.
5125 */
5126 /* shr-long vAA, vBB, vCC */
5127 FETCH r0, 1 @ r0<- CCBB
5128 mov r9, rINST, lsr #8 @ r9<- AA
5129 and r3, r0, #255 @ r3<- BB
5130 mov r0, r0, lsr #8 @ r0<- CC
5131 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5132 GET_VREG r2, r0 @ r2<- vCC
5133 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
5134 and r2, r2, #63 @ r0<- r0 & 0x3f
5135 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5136
5137 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5138 rsb r3, r2, #32 @ r3<- 32 - r2
5139 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5140 subs ip, r2, #32 @ ip<- r2 - 32
5141 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
5142 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5143 mov r1, r1, asr r2 @ r1<- r1 >> r2
5144 GET_INST_OPCODE ip @ extract opcode from rINST
5145 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5146 GOTO_OPCODE ip @ jump to next instruction
5147
5148/* ------------------------------ */
5149 .balign 128
5150.L_op_ushr_long: /* 0xa5 */
5151/* File: arm/op_ushr_long.S */
5152 /*
5153 * Long integer shift. This is different from the generic 32/64-bit
5154 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5155 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5156 * 6 bits of the shift distance.
5157 */
5158 /* ushr-long vAA, vBB, vCC */
5159 FETCH r0, 1 @ r0<- CCBB
5160 mov r9, rINST, lsr #8 @ r9<- AA
5161 and r3, r0, #255 @ r3<- BB
5162 mov r0, r0, lsr #8 @ r0<- CC
5163 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5164 GET_VREG r2, r0 @ r2<- vCC
5165 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
5166 and r2, r2, #63 @ r0<- r0 & 0x3f
5167 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5168
5169 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5170 rsb r3, r2, #32 @ r3<- 32 - r2
5171 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5172 subs ip, r2, #32 @ ip<- r2 - 32
5173 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
5174 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5175 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
5176 GET_INST_OPCODE ip @ extract opcode from rINST
5177 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5178 GOTO_OPCODE ip @ jump to next instruction
5179
5180/* ------------------------------ */
5181 .balign 128
5182.L_op_add_float: /* 0xa6 */
5183/* File: arm/op_add_float.S */
5184/* File: arm/fbinop.S */
5185 /*
5186 * Generic 32-bit floating-point operation. Provide an "instr" line that
5187 * specifies an instruction that performs "s2 = s0 op s1". Because we
5188 * use the "softfp" ABI, this must be an instruction, not a function call.
5189 *
5190 * For: add-float, sub-float, mul-float, div-float
5191 */
5192 /* floatop vAA, vBB, vCC */
5193 FETCH r0, 1 @ r0<- CCBB
5194 mov r9, rINST, lsr #8 @ r9<- AA
5195 mov r3, r0, lsr #8 @ r3<- CC
5196 and r2, r0, #255 @ r2<- BB
5197 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5198 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5199 flds s1, [r3] @ s1<- vCC
5200 flds s0, [r2] @ s0<- vBB
5201
5202 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5203 fadds s2, s0, s1 @ s2<- op
5204 GET_INST_OPCODE ip @ extract opcode from rINST
5205 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5206 fsts s2, [r9] @ vAA<- s2
5207 GOTO_OPCODE ip @ jump to next instruction
5208
5209
5210/* ------------------------------ */
5211 .balign 128
5212.L_op_sub_float: /* 0xa7 */
5213/* File: arm/op_sub_float.S */
5214/* File: arm/fbinop.S */
5215 /*
5216 * Generic 32-bit floating-point operation. Provide an "instr" line that
5217 * specifies an instruction that performs "s2 = s0 op s1". Because we
5218 * use the "softfp" ABI, this must be an instruction, not a function call.
5219 *
5220 * For: add-float, sub-float, mul-float, div-float
5221 */
5222 /* floatop vAA, vBB, vCC */
5223 FETCH r0, 1 @ r0<- CCBB
5224 mov r9, rINST, lsr #8 @ r9<- AA
5225 mov r3, r0, lsr #8 @ r3<- CC
5226 and r2, r0, #255 @ r2<- BB
5227 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5228 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5229 flds s1, [r3] @ s1<- vCC
5230 flds s0, [r2] @ s0<- vBB
5231
5232 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5233 fsubs s2, s0, s1 @ s2<- op
5234 GET_INST_OPCODE ip @ extract opcode from rINST
5235 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5236 fsts s2, [r9] @ vAA<- s2
5237 GOTO_OPCODE ip @ jump to next instruction
5238
5239
5240/* ------------------------------ */
5241 .balign 128
5242.L_op_mul_float: /* 0xa8 */
5243/* File: arm/op_mul_float.S */
5244/* File: arm/fbinop.S */
5245 /*
5246 * Generic 32-bit floating-point operation. Provide an "instr" line that
5247 * specifies an instruction that performs "s2 = s0 op s1". Because we
5248 * use the "softfp" ABI, this must be an instruction, not a function call.
5249 *
5250 * For: add-float, sub-float, mul-float, div-float
5251 */
5252 /* floatop vAA, vBB, vCC */
5253 FETCH r0, 1 @ r0<- CCBB
5254 mov r9, rINST, lsr #8 @ r9<- AA
5255 mov r3, r0, lsr #8 @ r3<- CC
5256 and r2, r0, #255 @ r2<- BB
5257 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5258 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5259 flds s1, [r3] @ s1<- vCC
5260 flds s0, [r2] @ s0<- vBB
5261
5262 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5263 fmuls s2, s0, s1 @ s2<- op
5264 GET_INST_OPCODE ip @ extract opcode from rINST
5265 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5266 fsts s2, [r9] @ vAA<- s2
5267 GOTO_OPCODE ip @ jump to next instruction
5268
5269
5270/* ------------------------------ */
5271 .balign 128
5272.L_op_div_float: /* 0xa9 */
5273/* File: arm/op_div_float.S */
5274/* File: arm/fbinop.S */
5275 /*
5276 * Generic 32-bit floating-point operation. Provide an "instr" line that
5277 * specifies an instruction that performs "s2 = s0 op s1". Because we
5278 * use the "softfp" ABI, this must be an instruction, not a function call.
5279 *
5280 * For: add-float, sub-float, mul-float, div-float
5281 */
5282 /* floatop vAA, vBB, vCC */
5283 FETCH r0, 1 @ r0<- CCBB
5284 mov r9, rINST, lsr #8 @ r9<- AA
5285 mov r3, r0, lsr #8 @ r3<- CC
5286 and r2, r0, #255 @ r2<- BB
5287 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5288 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5289 flds s1, [r3] @ s1<- vCC
5290 flds s0, [r2] @ s0<- vBB
5291
5292 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5293 fdivs s2, s0, s1 @ s2<- op
5294 GET_INST_OPCODE ip @ extract opcode from rINST
5295 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5296 fsts s2, [r9] @ vAA<- s2
5297 GOTO_OPCODE ip @ jump to next instruction
5298
5299
5300/* ------------------------------ */
5301 .balign 128
5302.L_op_rem_float: /* 0xaa */
5303/* File: arm/op_rem_float.S */
5304/* EABI doesn't define a float remainder function, but libm does */
5305/* File: arm/binop.S */
5306 /*
5307 * Generic 32-bit binary operation. Provide an "instr" line that
5308 * specifies an instruction that performs "result = r0 op r1".
5309 * This could be an ARM instruction or a function call. (If the result
5310 * comes back in a register other than r0, you can override "result".)
5311 *
5312 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5313 * vCC (r1). Useful for integer division and modulus. Note that we
5314 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5315 * handles it correctly.
5316 *
5317 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5318 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5319 * mul-float, div-float, rem-float
5320 */
5321 /* binop vAA, vBB, vCC */
5322 FETCH r0, 1 @ r0<- CCBB
5323 mov r9, rINST, lsr #8 @ r9<- AA
5324 mov r3, r0, lsr #8 @ r3<- CC
5325 and r2, r0, #255 @ r2<- BB
5326 GET_VREG r1, r3 @ r1<- vCC
5327 GET_VREG r0, r2 @ r0<- vBB
5328 .if 0
5329 cmp r1, #0 @ is second operand zero?
5330 beq common_errDivideByZero
5331 .endif
5332
5333 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5334 @ optional op; may set condition codes
5335 bl fmodf @ 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 /* 11-14 instructions */
5340
5341
5342/* ------------------------------ */
5343 .balign 128
5344.L_op_add_double: /* 0xab */
5345/* File: arm/op_add_double.S */
5346/* File: arm/fbinopWide.S */
5347 /*
5348 * Generic 64-bit double-precision floating point binary operation.
5349 * Provide an "instr" line that specifies an instruction that performs
5350 * "d2 = d0 op d1".
5351 *
5352 * for: add-double, sub-double, mul-double, div-double
5353 */
5354 /* doubleop vAA, vBB, vCC */
5355 FETCH r0, 1 @ r0<- CCBB
5356 mov r9, rINST, lsr #8 @ r9<- AA
5357 mov r3, r0, lsr #8 @ r3<- CC
5358 and r2, r0, #255 @ r2<- BB
5359 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5360 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5361 fldd d1, [r3] @ d1<- vCC
5362 fldd d0, [r2] @ d0<- vBB
5363
5364 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5365 faddd d2, d0, d1 @ s2<- op
5366 GET_INST_OPCODE ip @ extract opcode from rINST
5367 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5368 fstd d2, [r9] @ vAA<- d2
5369 GOTO_OPCODE ip @ jump to next instruction
5370
5371
5372/* ------------------------------ */
5373 .balign 128
5374.L_op_sub_double: /* 0xac */
5375/* File: arm/op_sub_double.S */
5376/* File: arm/fbinopWide.S */
5377 /*
5378 * Generic 64-bit double-precision floating point binary operation.
5379 * Provide an "instr" line that specifies an instruction that performs
5380 * "d2 = d0 op d1".
5381 *
5382 * for: add-double, sub-double, mul-double, div-double
5383 */
5384 /* doubleop vAA, vBB, vCC */
5385 FETCH r0, 1 @ r0<- CCBB
5386 mov r9, rINST, lsr #8 @ r9<- AA
5387 mov r3, r0, lsr #8 @ r3<- CC
5388 and r2, r0, #255 @ r2<- BB
5389 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5390 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5391 fldd d1, [r3] @ d1<- vCC
5392 fldd d0, [r2] @ d0<- vBB
5393
5394 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5395 fsubd d2, d0, d1 @ s2<- op
5396 GET_INST_OPCODE ip @ extract opcode from rINST
5397 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5398 fstd d2, [r9] @ vAA<- d2
5399 GOTO_OPCODE ip @ jump to next instruction
5400
5401
5402/* ------------------------------ */
5403 .balign 128
5404.L_op_mul_double: /* 0xad */
5405/* File: arm/op_mul_double.S */
5406/* File: arm/fbinopWide.S */
5407 /*
5408 * Generic 64-bit double-precision floating point binary operation.
5409 * Provide an "instr" line that specifies an instruction that performs
5410 * "d2 = d0 op d1".
5411 *
5412 * for: add-double, sub-double, mul-double, div-double
5413 */
5414 /* doubleop vAA, vBB, vCC */
5415 FETCH r0, 1 @ r0<- CCBB
5416 mov r9, rINST, lsr #8 @ r9<- AA
5417 mov r3, r0, lsr #8 @ r3<- CC
5418 and r2, r0, #255 @ r2<- BB
5419 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5420 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5421 fldd d1, [r3] @ d1<- vCC
5422 fldd d0, [r2] @ d0<- vBB
5423
5424 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5425 fmuld d2, d0, d1 @ s2<- op
5426 GET_INST_OPCODE ip @ extract opcode from rINST
5427 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5428 fstd d2, [r9] @ vAA<- d2
5429 GOTO_OPCODE ip @ jump to next instruction
5430
5431
5432/* ------------------------------ */
5433 .balign 128
5434.L_op_div_double: /* 0xae */
5435/* File: arm/op_div_double.S */
5436/* File: arm/fbinopWide.S */
5437 /*
5438 * Generic 64-bit double-precision floating point binary operation.
5439 * Provide an "instr" line that specifies an instruction that performs
5440 * "d2 = d0 op d1".
5441 *
5442 * for: add-double, sub-double, mul-double, div-double
5443 */
5444 /* doubleop vAA, vBB, vCC */
5445 FETCH r0, 1 @ r0<- CCBB
5446 mov r9, rINST, lsr #8 @ r9<- AA
5447 mov r3, r0, lsr #8 @ r3<- CC
5448 and r2, r0, #255 @ r2<- BB
5449 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5450 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5451 fldd d1, [r3] @ d1<- vCC
5452 fldd d0, [r2] @ d0<- vBB
5453
5454 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5455 fdivd d2, d0, d1 @ s2<- op
5456 GET_INST_OPCODE ip @ extract opcode from rINST
5457 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5458 fstd d2, [r9] @ vAA<- d2
5459 GOTO_OPCODE ip @ jump to next instruction
5460
5461
5462/* ------------------------------ */
5463 .balign 128
5464.L_op_rem_double: /* 0xaf */
5465/* File: arm/op_rem_double.S */
5466/* EABI doesn't define a double remainder function, but libm does */
5467/* File: arm/binopWide.S */
5468 /*
5469 * Generic 64-bit binary operation. Provide an "instr" line that
5470 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5471 * This could be an ARM instruction or a function call. (If the result
5472 * comes back in a register other than r0, you can override "result".)
5473 *
5474 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5475 * vCC (r1). Useful for integer division and modulus.
5476 *
5477 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5478 * xor-long, add-double, sub-double, mul-double, div-double,
5479 * rem-double
5480 *
5481 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5482 */
5483 /* binop vAA, vBB, vCC */
5484 FETCH r0, 1 @ r0<- CCBB
5485 mov r9, rINST, lsr #8 @ r9<- AA
5486 and r2, r0, #255 @ r2<- BB
5487 mov r3, r0, lsr #8 @ r3<- CC
5488 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5489 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5490 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5491 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5492 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5493 .if 0
5494 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5495 beq common_errDivideByZero
5496 .endif
5497 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5498
5499 @ optional op; may set condition codes
5500 bl fmod @ result<- op, r0-r3 changed
5501 GET_INST_OPCODE ip @ extract opcode from rINST
5502 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5503 GOTO_OPCODE ip @ jump to next instruction
5504 /* 14-17 instructions */
5505
5506
5507/* ------------------------------ */
5508 .balign 128
5509.L_op_add_int_2addr: /* 0xb0 */
5510/* File: arm/op_add_int_2addr.S */
5511/* File: arm/binop2addr.S */
5512 /*
5513 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5514 * that specifies an instruction that performs "result = r0 op r1".
5515 * This could be an ARM instruction or a function call. (If the result
5516 * comes back in a register other than r0, you can override "result".)
5517 *
5518 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5519 * vCC (r1). Useful for integer division and modulus.
5520 *
5521 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5522 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5523 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5524 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5525 */
5526 /* binop/2addr vA, vB */
5527 mov r3, rINST, lsr #12 @ r3<- B
5528 ubfx r9, rINST, #8, #4 @ r9<- A
5529 GET_VREG r1, r3 @ r1<- vB
5530 GET_VREG r0, r9 @ r0<- vA
5531 .if 0
5532 cmp r1, #0 @ is second operand zero?
5533 beq common_errDivideByZero
5534 .endif
5535 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5536
5537 @ optional op; may set condition codes
5538 add r0, r0, r1 @ r0<- op, r0-r3 changed
5539 GET_INST_OPCODE ip @ extract opcode from rINST
5540 SET_VREG r0, r9 @ vAA<- r0
5541 GOTO_OPCODE ip @ jump to next instruction
5542 /* 10-13 instructions */
5543
5544
5545/* ------------------------------ */
5546 .balign 128
5547.L_op_sub_int_2addr: /* 0xb1 */
5548/* File: arm/op_sub_int_2addr.S */
5549/* File: arm/binop2addr.S */
5550 /*
5551 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5552 * that specifies an instruction that performs "result = r0 op r1".
5553 * This could be an ARM instruction or a function call. (If the result
5554 * comes back in a register other than r0, you can override "result".)
5555 *
5556 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5557 * vCC (r1). Useful for integer division and modulus.
5558 *
5559 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5560 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5561 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5562 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5563 */
5564 /* binop/2addr vA, vB */
5565 mov r3, rINST, lsr #12 @ r3<- B
5566 ubfx r9, rINST, #8, #4 @ r9<- A
5567 GET_VREG r1, r3 @ r1<- vB
5568 GET_VREG r0, r9 @ r0<- vA
5569 .if 0
5570 cmp r1, #0 @ is second operand zero?
5571 beq common_errDivideByZero
5572 .endif
5573 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5574
5575 @ optional op; may set condition codes
5576 sub r0, r0, r1 @ r0<- op, r0-r3 changed
5577 GET_INST_OPCODE ip @ extract opcode from rINST
5578 SET_VREG r0, r9 @ vAA<- r0
5579 GOTO_OPCODE ip @ jump to next instruction
5580 /* 10-13 instructions */
5581
5582
5583/* ------------------------------ */
5584 .balign 128
5585.L_op_mul_int_2addr: /* 0xb2 */
5586/* File: arm/op_mul_int_2addr.S */
5587/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5588/* File: arm/binop2addr.S */
5589 /*
5590 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5591 * that specifies an instruction that performs "result = r0 op r1".
5592 * This could be an ARM instruction or a function call. (If the result
5593 * comes back in a register other than r0, you can override "result".)
5594 *
5595 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5596 * vCC (r1). Useful for integer division and modulus.
5597 *
5598 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5599 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5600 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5601 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5602 */
5603 /* binop/2addr vA, vB */
5604 mov r3, rINST, lsr #12 @ r3<- B
5605 ubfx r9, rINST, #8, #4 @ r9<- A
5606 GET_VREG r1, r3 @ r1<- vB
5607 GET_VREG r0, r9 @ r0<- vA
5608 .if 0
5609 cmp r1, #0 @ is second operand zero?
5610 beq common_errDivideByZero
5611 .endif
5612 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5613
5614 @ optional op; may set condition codes
5615 mul r0, r1, r0 @ r0<- op, r0-r3 changed
5616 GET_INST_OPCODE ip @ extract opcode from rINST
5617 SET_VREG r0, r9 @ vAA<- r0
5618 GOTO_OPCODE ip @ jump to next instruction
5619 /* 10-13 instructions */
5620
5621
5622/* ------------------------------ */
5623 .balign 128
5624.L_op_div_int_2addr: /* 0xb3 */
5625/* File: arm/op_div_int_2addr.S */
5626 /*
5627 * Specialized 32-bit binary operation
5628 *
5629 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5630 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5631 * ARMv7 CPUs that have hardware division support).
5632 *
5633 * div-int/2addr
5634 *
5635 */
5636 mov r3, rINST, lsr #12 @ r3<- B
5637 ubfx r9, rINST, #8, #4 @ r9<- A
5638 GET_VREG r1, r3 @ r1<- vB
5639 GET_VREG r0, r9 @ r0<- vA
5640 cmp r1, #0 @ is second operand zero?
5641 beq common_errDivideByZero
5642 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5643
5644#ifdef __ARM_ARCH_EXT_IDIV__
5645 sdiv r0, r0, r1 @ r0<- op
5646#else
5647 bl __aeabi_idiv @ r0<- op, r0-r3 changed
5648#endif
5649 GET_INST_OPCODE ip @ extract opcode from rINST
5650 SET_VREG r0, r9 @ vAA<- r0
5651 GOTO_OPCODE ip @ jump to next instruction
5652 /* 10-13 instructions */
5653
5654
5655/* ------------------------------ */
5656 .balign 128
5657.L_op_rem_int_2addr: /* 0xb4 */
5658/* File: arm/op_rem_int_2addr.S */
5659 /*
5660 * Specialized 32-bit binary operation
5661 *
5662 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5663 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5664 * ARMv7 CPUs that have hardware division support).
5665 *
5666 * NOTE: idivmod returns quotient in r0 and remainder in r1
5667 *
5668 * rem-int/2addr
5669 *
5670 */
5671 mov r3, rINST, lsr #12 @ r3<- B
5672 ubfx r9, rINST, #8, #4 @ r9<- A
5673 GET_VREG r1, r3 @ r1<- vB
5674 GET_VREG r0, r9 @ r0<- vA
5675 cmp r1, #0 @ is second operand zero?
5676 beq common_errDivideByZero
5677 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5678
5679#ifdef __ARM_ARCH_EXT_IDIV__
5680 sdiv r2, r0, r1
5681 mls r1, r1, r2, r0 @ r1<- op
5682#else
5683 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
5684#endif
5685 GET_INST_OPCODE ip @ extract opcode from rINST
5686 SET_VREG r1, r9 @ vAA<- r1
5687 GOTO_OPCODE ip @ jump to next instruction
5688 /* 10-13 instructions */
5689
5690
5691/* ------------------------------ */
5692 .balign 128
5693.L_op_and_int_2addr: /* 0xb5 */
5694/* File: arm/op_and_int_2addr.S */
5695/* File: arm/binop2addr.S */
5696 /*
5697 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5698 * that specifies an instruction that performs "result = r0 op r1".
5699 * This could be an ARM instruction or a function call. (If the result
5700 * comes back in a register other than r0, you can override "result".)
5701 *
5702 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5703 * vCC (r1). Useful for integer division and modulus.
5704 *
5705 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5706 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5707 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5708 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5709 */
5710 /* binop/2addr vA, vB */
5711 mov r3, rINST, lsr #12 @ r3<- B
5712 ubfx r9, rINST, #8, #4 @ r9<- A
5713 GET_VREG r1, r3 @ r1<- vB
5714 GET_VREG r0, r9 @ r0<- vA
5715 .if 0
5716 cmp r1, #0 @ is second operand zero?
5717 beq common_errDivideByZero
5718 .endif
5719 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5720
5721 @ optional op; may set condition codes
5722 and r0, r0, r1 @ r0<- op, r0-r3 changed
5723 GET_INST_OPCODE ip @ extract opcode from rINST
5724 SET_VREG r0, r9 @ vAA<- r0
5725 GOTO_OPCODE ip @ jump to next instruction
5726 /* 10-13 instructions */
5727
5728
5729/* ------------------------------ */
5730 .balign 128
5731.L_op_or_int_2addr: /* 0xb6 */
5732/* File: arm/op_or_int_2addr.S */
5733/* File: arm/binop2addr.S */
5734 /*
5735 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5736 * that specifies an instruction that performs "result = r0 op r1".
5737 * This could be an ARM instruction or a function call. (If the result
5738 * comes back in a register other than r0, you can override "result".)
5739 *
5740 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5741 * vCC (r1). Useful for integer division and modulus.
5742 *
5743 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5744 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5745 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5746 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5747 */
5748 /* binop/2addr vA, vB */
5749 mov r3, rINST, lsr #12 @ r3<- B
5750 ubfx r9, rINST, #8, #4 @ r9<- A
5751 GET_VREG r1, r3 @ r1<- vB
5752 GET_VREG r0, r9 @ r0<- vA
5753 .if 0
5754 cmp r1, #0 @ is second operand zero?
5755 beq common_errDivideByZero
5756 .endif
5757 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5758
5759 @ optional op; may set condition codes
5760 orr r0, r0, r1 @ r0<- op, r0-r3 changed
5761 GET_INST_OPCODE ip @ extract opcode from rINST
5762 SET_VREG r0, r9 @ vAA<- r0
5763 GOTO_OPCODE ip @ jump to next instruction
5764 /* 10-13 instructions */
5765
5766
5767/* ------------------------------ */
5768 .balign 128
5769.L_op_xor_int_2addr: /* 0xb7 */
5770/* File: arm/op_xor_int_2addr.S */
5771/* File: arm/binop2addr.S */
5772 /*
5773 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5774 * that specifies an instruction that performs "result = r0 op r1".
5775 * This could be an ARM instruction or a function call. (If the result
5776 * comes back in a register other than r0, you can override "result".)
5777 *
5778 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5779 * vCC (r1). Useful for integer division and modulus.
5780 *
5781 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5782 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5783 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5784 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5785 */
5786 /* binop/2addr vA, vB */
5787 mov r3, rINST, lsr #12 @ r3<- B
5788 ubfx r9, rINST, #8, #4 @ r9<- A
5789 GET_VREG r1, r3 @ r1<- vB
5790 GET_VREG r0, r9 @ r0<- vA
5791 .if 0
5792 cmp r1, #0 @ is second operand zero?
5793 beq common_errDivideByZero
5794 .endif
5795 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5796
5797 @ optional op; may set condition codes
5798 eor r0, r0, r1 @ r0<- op, r0-r3 changed
5799 GET_INST_OPCODE ip @ extract opcode from rINST
5800 SET_VREG r0, r9 @ vAA<- r0
5801 GOTO_OPCODE ip @ jump to next instruction
5802 /* 10-13 instructions */
5803
5804
5805/* ------------------------------ */
5806 .balign 128
5807.L_op_shl_int_2addr: /* 0xb8 */
5808/* File: arm/op_shl_int_2addr.S */
5809/* File: arm/binop2addr.S */
5810 /*
5811 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5812 * that specifies an instruction that performs "result = r0 op r1".
5813 * This could be an ARM instruction or a function call. (If the result
5814 * comes back in a register other than r0, you can override "result".)
5815 *
5816 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5817 * vCC (r1). Useful for integer division and modulus.
5818 *
5819 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5820 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5821 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5822 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5823 */
5824 /* binop/2addr vA, vB */
5825 mov r3, rINST, lsr #12 @ r3<- B
5826 ubfx r9, rINST, #8, #4 @ r9<- A
5827 GET_VREG r1, r3 @ r1<- vB
5828 GET_VREG r0, r9 @ r0<- vA
5829 .if 0
5830 cmp r1, #0 @ is second operand zero?
5831 beq common_errDivideByZero
5832 .endif
5833 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5834
5835 and r1, r1, #31 @ optional op; may set condition codes
5836 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
5837 GET_INST_OPCODE ip @ extract opcode from rINST
5838 SET_VREG r0, r9 @ vAA<- r0
5839 GOTO_OPCODE ip @ jump to next instruction
5840 /* 10-13 instructions */
5841
5842
5843/* ------------------------------ */
5844 .balign 128
5845.L_op_shr_int_2addr: /* 0xb9 */
5846/* File: arm/op_shr_int_2addr.S */
5847/* File: arm/binop2addr.S */
5848 /*
5849 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5850 * that specifies an instruction that performs "result = r0 op r1".
5851 * This could be an ARM instruction or a function call. (If the result
5852 * comes back in a register other than r0, you can override "result".)
5853 *
5854 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5855 * vCC (r1). Useful for integer division and modulus.
5856 *
5857 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5858 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5859 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5860 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5861 */
5862 /* binop/2addr vA, vB */
5863 mov r3, rINST, lsr #12 @ r3<- B
5864 ubfx r9, rINST, #8, #4 @ r9<- A
5865 GET_VREG r1, r3 @ r1<- vB
5866 GET_VREG r0, r9 @ r0<- vA
5867 .if 0
5868 cmp r1, #0 @ is second operand zero?
5869 beq common_errDivideByZero
5870 .endif
5871 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5872
5873 and r1, r1, #31 @ optional op; may set condition codes
5874 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
5875 GET_INST_OPCODE ip @ extract opcode from rINST
5876 SET_VREG r0, r9 @ vAA<- r0
5877 GOTO_OPCODE ip @ jump to next instruction
5878 /* 10-13 instructions */
5879
5880
5881/* ------------------------------ */
5882 .balign 128
5883.L_op_ushr_int_2addr: /* 0xba */
5884/* File: arm/op_ushr_int_2addr.S */
5885/* File: arm/binop2addr.S */
5886 /*
5887 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5888 * that specifies an instruction that performs "result = r0 op r1".
5889 * This could be an ARM instruction or a function call. (If the result
5890 * comes back in a register other than r0, you can override "result".)
5891 *
5892 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5893 * vCC (r1). Useful for integer division and modulus.
5894 *
5895 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5896 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5897 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5898 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5899 */
5900 /* binop/2addr vA, vB */
5901 mov r3, rINST, lsr #12 @ r3<- B
5902 ubfx r9, rINST, #8, #4 @ r9<- A
5903 GET_VREG r1, r3 @ r1<- vB
5904 GET_VREG r0, r9 @ r0<- vA
5905 .if 0
5906 cmp r1, #0 @ is second operand zero?
5907 beq common_errDivideByZero
5908 .endif
5909 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5910
5911 and r1, r1, #31 @ optional op; may set condition codes
5912 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
5913 GET_INST_OPCODE ip @ extract opcode from rINST
5914 SET_VREG r0, r9 @ vAA<- r0
5915 GOTO_OPCODE ip @ jump to next instruction
5916 /* 10-13 instructions */
5917
5918
5919/* ------------------------------ */
5920 .balign 128
5921.L_op_add_long_2addr: /* 0xbb */
5922/* File: arm/op_add_long_2addr.S */
5923/* File: arm/binopWide2addr.S */
5924 /*
5925 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5926 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5927 * This could be an ARM instruction or a function call. (If the result
5928 * comes back in a register other than r0, you can override "result".)
5929 *
5930 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5931 * vCC (r1). Useful for integer division and modulus.
5932 *
5933 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5934 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5935 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5936 * rem-double/2addr
5937 */
5938 /* binop/2addr vA, vB */
5939 mov r1, rINST, lsr #12 @ r1<- B
5940 ubfx r9, rINST, #8, #4 @ r9<- A
5941 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5942 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5943 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5944 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5945 .if 0
5946 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5947 beq common_errDivideByZero
5948 .endif
5949 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5950
5951 adds r0, r0, r2 @ optional op; may set condition codes
5952 adc r1, r1, r3 @ result<- op, r0-r3 changed
5953 GET_INST_OPCODE ip @ extract opcode from rINST
5954 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5955 GOTO_OPCODE ip @ jump to next instruction
5956 /* 12-15 instructions */
5957
5958
5959/* ------------------------------ */
5960 .balign 128
5961.L_op_sub_long_2addr: /* 0xbc */
5962/* File: arm/op_sub_long_2addr.S */
5963/* File: arm/binopWide2addr.S */
5964 /*
5965 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5966 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5967 * This could be an ARM instruction or a function call. (If the result
5968 * comes back in a register other than r0, you can override "result".)
5969 *
5970 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5971 * vCC (r1). Useful for integer division and modulus.
5972 *
5973 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5974 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5975 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5976 * rem-double/2addr
5977 */
5978 /* binop/2addr vA, vB */
5979 mov r1, rINST, lsr #12 @ r1<- B
5980 ubfx r9, rINST, #8, #4 @ r9<- A
5981 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5982 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5983 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5984 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5985 .if 0
5986 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5987 beq common_errDivideByZero
5988 .endif
5989 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5990
5991 subs r0, r0, r2 @ optional op; may set condition codes
5992 sbc r1, r1, r3 @ result<- op, r0-r3 changed
5993 GET_INST_OPCODE ip @ extract opcode from rINST
5994 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5995 GOTO_OPCODE ip @ jump to next instruction
5996 /* 12-15 instructions */
5997
5998
5999/* ------------------------------ */
6000 .balign 128
6001.L_op_mul_long_2addr: /* 0xbd */
6002/* File: arm/op_mul_long_2addr.S */
6003 /*
6004 * Signed 64-bit integer multiply, "/2addr" version.
6005 *
6006 * See op_mul_long for an explanation.
6007 *
6008 * We get a little tight on registers, so to avoid looking up &fp[A]
6009 * again we stuff it into rINST.
6010 */
6011 /* mul-long/2addr vA, vB */
6012 mov r1, rINST, lsr #12 @ r1<- B
6013 ubfx r9, rINST, #8, #4 @ r9<- A
6014 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6015 add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A]
6016 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6017 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1
6018 mul ip, r2, r1 @ ip<- ZxW
6019 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
6020 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
6021 mov r0, rINST @ r0<- &fp[A] (free up rINST)
6022 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6023 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
6024 GET_INST_OPCODE ip @ extract opcode from rINST
6025 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
6026 GOTO_OPCODE ip @ jump to next instruction
6027
6028/* ------------------------------ */
6029 .balign 128
6030.L_op_div_long_2addr: /* 0xbe */
6031/* File: arm/op_div_long_2addr.S */
6032/* File: arm/binopWide2addr.S */
6033 /*
6034 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6035 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6036 * This could be an ARM instruction or a function call. (If the result
6037 * comes back in a register other than r0, you can override "result".)
6038 *
6039 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6040 * vCC (r1). Useful for integer division and modulus.
6041 *
6042 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6043 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6044 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6045 * rem-double/2addr
6046 */
6047 /* binop/2addr vA, vB */
6048 mov r1, rINST, lsr #12 @ r1<- B
6049 ubfx r9, rINST, #8, #4 @ r9<- A
6050 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6051 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6052 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6053 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6054 .if 1
6055 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6056 beq common_errDivideByZero
6057 .endif
6058 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6059
6060 @ optional op; may set condition codes
6061 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
6062 GET_INST_OPCODE ip @ extract opcode from rINST
6063 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6064 GOTO_OPCODE ip @ jump to next instruction
6065 /* 12-15 instructions */
6066
6067
6068/* ------------------------------ */
6069 .balign 128
6070.L_op_rem_long_2addr: /* 0xbf */
6071/* File: arm/op_rem_long_2addr.S */
6072/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
6073/* File: arm/binopWide2addr.S */
6074 /*
6075 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6076 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6077 * This could be an ARM instruction or a function call. (If the result
6078 * comes back in a register other than r0, you can override "result".)
6079 *
6080 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6081 * vCC (r1). Useful for integer division and modulus.
6082 *
6083 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6084 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6085 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6086 * rem-double/2addr
6087 */
6088 /* binop/2addr vA, vB */
6089 mov r1, rINST, lsr #12 @ r1<- B
6090 ubfx r9, rINST, #8, #4 @ r9<- A
6091 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6092 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6093 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6094 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6095 .if 1
6096 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6097 beq common_errDivideByZero
6098 .endif
6099 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6100
6101 @ optional op; may set condition codes
6102 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
6103 GET_INST_OPCODE ip @ extract opcode from rINST
6104 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
6105 GOTO_OPCODE ip @ jump to next instruction
6106 /* 12-15 instructions */
6107
6108
6109/* ------------------------------ */
6110 .balign 128
6111.L_op_and_long_2addr: /* 0xc0 */
6112/* File: arm/op_and_long_2addr.S */
6113/* File: arm/binopWide2addr.S */
6114 /*
6115 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6116 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6117 * This could be an ARM instruction or a function call. (If the result
6118 * comes back in a register other than r0, you can override "result".)
6119 *
6120 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6121 * vCC (r1). Useful for integer division and modulus.
6122 *
6123 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6124 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6125 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6126 * rem-double/2addr
6127 */
6128 /* binop/2addr vA, vB */
6129 mov r1, rINST, lsr #12 @ r1<- B
6130 ubfx r9, rINST, #8, #4 @ r9<- A
6131 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6132 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6133 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6134 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6135 .if 0
6136 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6137 beq common_errDivideByZero
6138 .endif
6139 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6140
6141 and r0, r0, r2 @ optional op; may set condition codes
6142 and r1, r1, r3 @ result<- op, r0-r3 changed
6143 GET_INST_OPCODE ip @ extract opcode from rINST
6144 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6145 GOTO_OPCODE ip @ jump to next instruction
6146 /* 12-15 instructions */
6147
6148
6149/* ------------------------------ */
6150 .balign 128
6151.L_op_or_long_2addr: /* 0xc1 */
6152/* File: arm/op_or_long_2addr.S */
6153/* File: arm/binopWide2addr.S */
6154 /*
6155 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6156 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6157 * This could be an ARM instruction or a function call. (If the result
6158 * comes back in a register other than r0, you can override "result".)
6159 *
6160 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6161 * vCC (r1). Useful for integer division and modulus.
6162 *
6163 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6164 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6165 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6166 * rem-double/2addr
6167 */
6168 /* binop/2addr vA, vB */
6169 mov r1, rINST, lsr #12 @ r1<- B
6170 ubfx r9, rINST, #8, #4 @ r9<- A
6171 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6172 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6173 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6174 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6175 .if 0
6176 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6177 beq common_errDivideByZero
6178 .endif
6179 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6180
6181 orr r0, r0, r2 @ optional op; may set condition codes
6182 orr r1, r1, r3 @ result<- op, r0-r3 changed
6183 GET_INST_OPCODE ip @ extract opcode from rINST
6184 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6185 GOTO_OPCODE ip @ jump to next instruction
6186 /* 12-15 instructions */
6187
6188
6189/* ------------------------------ */
6190 .balign 128
6191.L_op_xor_long_2addr: /* 0xc2 */
6192/* File: arm/op_xor_long_2addr.S */
6193/* File: arm/binopWide2addr.S */
6194 /*
6195 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6196 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6197 * This could be an ARM instruction or a function call. (If the result
6198 * comes back in a register other than r0, you can override "result".)
6199 *
6200 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6201 * vCC (r1). Useful for integer division and modulus.
6202 *
6203 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6204 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6205 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6206 * rem-double/2addr
6207 */
6208 /* binop/2addr vA, vB */
6209 mov r1, rINST, lsr #12 @ r1<- B
6210 ubfx r9, rINST, #8, #4 @ r9<- A
6211 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6212 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6213 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6214 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6215 .if 0
6216 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6217 beq common_errDivideByZero
6218 .endif
6219 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6220
6221 eor r0, r0, r2 @ optional op; may set condition codes
6222 eor r1, r1, r3 @ result<- op, r0-r3 changed
6223 GET_INST_OPCODE ip @ extract opcode from rINST
6224 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6225 GOTO_OPCODE ip @ jump to next instruction
6226 /* 12-15 instructions */
6227
6228
6229/* ------------------------------ */
6230 .balign 128
6231.L_op_shl_long_2addr: /* 0xc3 */
6232/* File: arm/op_shl_long_2addr.S */
6233 /*
6234 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6235 * 32-bit shift distance.
6236 */
6237 /* shl-long/2addr vA, vB */
6238 mov r3, rINST, lsr #12 @ r3<- B
6239 ubfx r9, rINST, #8, #4 @ r9<- A
6240 GET_VREG r2, r3 @ r2<- vB
6241 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6242 and r2, r2, #63 @ r2<- r2 & 0x3f
6243 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6244
6245 mov r1, r1, asl r2 @ r1<- r1 << r2
6246 rsb r3, r2, #32 @ r3<- 32 - r2
6247 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
6248 subs ip, r2, #32 @ ip<- r2 - 32
6249 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6250 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
6251 mov r0, r0, asl r2 @ r0<- r0 << r2
6252 GET_INST_OPCODE ip @ extract opcode from rINST
6253 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6254 GOTO_OPCODE ip @ jump to next instruction
6255
6256/* ------------------------------ */
6257 .balign 128
6258.L_op_shr_long_2addr: /* 0xc4 */
6259/* File: arm/op_shr_long_2addr.S */
6260 /*
6261 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6262 * 32-bit shift distance.
6263 */
6264 /* shr-long/2addr vA, vB */
6265 mov r3, rINST, lsr #12 @ r3<- B
6266 ubfx r9, rINST, #8, #4 @ r9<- A
6267 GET_VREG r2, r3 @ r2<- vB
6268 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6269 and r2, r2, #63 @ r2<- r2 & 0x3f
6270 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6271
6272 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6273 rsb r3, r2, #32 @ r3<- 32 - r2
6274 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6275 subs ip, r2, #32 @ ip<- r2 - 32
6276 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6277 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
6278 mov r1, r1, asr r2 @ r1<- r1 >> r2
6279 GET_INST_OPCODE ip @ extract opcode from rINST
6280 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6281 GOTO_OPCODE ip @ jump to next instruction
6282
6283/* ------------------------------ */
6284 .balign 128
6285.L_op_ushr_long_2addr: /* 0xc5 */
6286/* File: arm/op_ushr_long_2addr.S */
6287 /*
6288 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6289 * 32-bit shift distance.
6290 */
6291 /* ushr-long/2addr vA, vB */
6292 mov r3, rINST, lsr #12 @ r3<- B
6293 ubfx r9, rINST, #8, #4 @ r9<- A
6294 GET_VREG r2, r3 @ r2<- vB
6295 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6296 and r2, r2, #63 @ r2<- r2 & 0x3f
6297 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6298
6299 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6300 rsb r3, r2, #32 @ r3<- 32 - r2
6301 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6302 subs ip, r2, #32 @ ip<- r2 - 32
6303 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6304 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
6305 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
6306 GET_INST_OPCODE ip @ extract opcode from rINST
6307 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6308 GOTO_OPCODE ip @ jump to next instruction
6309
6310/* ------------------------------ */
6311 .balign 128
6312.L_op_add_float_2addr: /* 0xc6 */
6313/* File: arm/op_add_float_2addr.S */
6314/* File: arm/fbinop2addr.S */
6315 /*
6316 * Generic 32-bit floating point "/2addr" binary operation. Provide
6317 * an "instr" line that specifies an instruction that performs
6318 * "s2 = s0 op s1".
6319 *
6320 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6321 */
6322 /* binop/2addr vA, vB */
6323 mov r3, rINST, lsr #12 @ r3<- B
6324 mov r9, rINST, lsr #8 @ r9<- A+
6325 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6326 and r9, r9, #15 @ r9<- A
6327 flds s1, [r3] @ s1<- vB
6328 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6329 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6330 flds s0, [r9] @ s0<- vA
6331
6332 fadds s2, s0, s1 @ s2<- op
6333 GET_INST_OPCODE ip @ extract opcode from rINST
6334 fsts s2, [r9] @ vAA<- s2
6335 GOTO_OPCODE ip @ jump to next instruction
6336
6337
6338/* ------------------------------ */
6339 .balign 128
6340.L_op_sub_float_2addr: /* 0xc7 */
6341/* File: arm/op_sub_float_2addr.S */
6342/* File: arm/fbinop2addr.S */
6343 /*
6344 * Generic 32-bit floating point "/2addr" binary operation. Provide
6345 * an "instr" line that specifies an instruction that performs
6346 * "s2 = s0 op s1".
6347 *
6348 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6349 */
6350 /* binop/2addr vA, vB */
6351 mov r3, rINST, lsr #12 @ r3<- B
6352 mov r9, rINST, lsr #8 @ r9<- A+
6353 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6354 and r9, r9, #15 @ r9<- A
6355 flds s1, [r3] @ s1<- vB
6356 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6357 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6358 flds s0, [r9] @ s0<- vA
6359
6360 fsubs s2, s0, s1 @ s2<- op
6361 GET_INST_OPCODE ip @ extract opcode from rINST
6362 fsts s2, [r9] @ vAA<- s2
6363 GOTO_OPCODE ip @ jump to next instruction
6364
6365
6366/* ------------------------------ */
6367 .balign 128
6368.L_op_mul_float_2addr: /* 0xc8 */
6369/* File: arm/op_mul_float_2addr.S */
6370/* File: arm/fbinop2addr.S */
6371 /*
6372 * Generic 32-bit floating point "/2addr" binary operation. Provide
6373 * an "instr" line that specifies an instruction that performs
6374 * "s2 = s0 op s1".
6375 *
6376 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6377 */
6378 /* binop/2addr vA, vB */
6379 mov r3, rINST, lsr #12 @ r3<- B
6380 mov r9, rINST, lsr #8 @ r9<- A+
6381 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6382 and r9, r9, #15 @ r9<- A
6383 flds s1, [r3] @ s1<- vB
6384 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6385 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6386 flds s0, [r9] @ s0<- vA
6387
6388 fmuls s2, s0, s1 @ s2<- op
6389 GET_INST_OPCODE ip @ extract opcode from rINST
6390 fsts s2, [r9] @ vAA<- s2
6391 GOTO_OPCODE ip @ jump to next instruction
6392
6393
6394/* ------------------------------ */
6395 .balign 128
6396.L_op_div_float_2addr: /* 0xc9 */
6397/* File: arm/op_div_float_2addr.S */
6398/* File: arm/fbinop2addr.S */
6399 /*
6400 * Generic 32-bit floating point "/2addr" binary operation. Provide
6401 * an "instr" line that specifies an instruction that performs
6402 * "s2 = s0 op s1".
6403 *
6404 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6405 */
6406 /* binop/2addr vA, vB */
6407 mov r3, rINST, lsr #12 @ r3<- B
6408 mov r9, rINST, lsr #8 @ r9<- A+
6409 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6410 and r9, r9, #15 @ r9<- A
6411 flds s1, [r3] @ s1<- vB
6412 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6413 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6414 flds s0, [r9] @ s0<- vA
6415
6416 fdivs s2, s0, s1 @ s2<- op
6417 GET_INST_OPCODE ip @ extract opcode from rINST
6418 fsts s2, [r9] @ vAA<- s2
6419 GOTO_OPCODE ip @ jump to next instruction
6420
6421
6422/* ------------------------------ */
6423 .balign 128
6424.L_op_rem_float_2addr: /* 0xca */
6425/* File: arm/op_rem_float_2addr.S */
6426/* EABI doesn't define a float remainder function, but libm does */
6427/* File: arm/binop2addr.S */
6428 /*
6429 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
6430 * that specifies an instruction that performs "result = r0 op r1".
6431 * This could be an ARM instruction or a function call. (If the result
6432 * comes back in a register other than r0, you can override "result".)
6433 *
6434 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6435 * vCC (r1). Useful for integer division and modulus.
6436 *
6437 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6438 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6439 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6440 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6441 */
6442 /* binop/2addr vA, vB */
6443 mov r3, rINST, lsr #12 @ r3<- B
6444 ubfx r9, rINST, #8, #4 @ r9<- A
6445 GET_VREG r1, r3 @ r1<- vB
6446 GET_VREG r0, r9 @ r0<- vA
6447 .if 0
6448 cmp r1, #0 @ is second operand zero?
6449 beq common_errDivideByZero
6450 .endif
6451 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6452
6453 @ optional op; may set condition codes
6454 bl fmodf @ r0<- op, r0-r3 changed
6455 GET_INST_OPCODE ip @ extract opcode from rINST
6456 SET_VREG r0, r9 @ vAA<- r0
6457 GOTO_OPCODE ip @ jump to next instruction
6458 /* 10-13 instructions */
6459
6460
6461/* ------------------------------ */
6462 .balign 128
6463.L_op_add_double_2addr: /* 0xcb */
6464/* File: arm/op_add_double_2addr.S */
6465/* File: arm/fbinopWide2addr.S */
6466 /*
6467 * Generic 64-bit floating point "/2addr" binary operation. Provide
6468 * an "instr" line that specifies an instruction that performs
6469 * "d2 = d0 op d1".
6470 *
6471 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6472 * div-double/2addr
6473 */
6474 /* binop/2addr vA, vB */
6475 mov r3, rINST, lsr #12 @ r3<- B
6476 mov r9, rINST, lsr #8 @ r9<- A+
6477 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6478 and r9, r9, #15 @ r9<- A
6479 fldd d1, [r3] @ d1<- vB
6480 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6481 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6482 fldd d0, [r9] @ d0<- vA
6483
6484 faddd d2, d0, d1 @ d2<- op
6485 GET_INST_OPCODE ip @ extract opcode from rINST
6486 fstd d2, [r9] @ vAA<- d2
6487 GOTO_OPCODE ip @ jump to next instruction
6488
6489
6490/* ------------------------------ */
6491 .balign 128
6492.L_op_sub_double_2addr: /* 0xcc */
6493/* File: arm/op_sub_double_2addr.S */
6494/* File: arm/fbinopWide2addr.S */
6495 /*
6496 * Generic 64-bit floating point "/2addr" binary operation. Provide
6497 * an "instr" line that specifies an instruction that performs
6498 * "d2 = d0 op d1".
6499 *
6500 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6501 * div-double/2addr
6502 */
6503 /* binop/2addr vA, vB */
6504 mov r3, rINST, lsr #12 @ r3<- B
6505 mov r9, rINST, lsr #8 @ r9<- A+
6506 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6507 and r9, r9, #15 @ r9<- A
6508 fldd d1, [r3] @ d1<- vB
6509 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6510 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6511 fldd d0, [r9] @ d0<- vA
6512
6513 fsubd d2, d0, d1 @ d2<- op
6514 GET_INST_OPCODE ip @ extract opcode from rINST
6515 fstd d2, [r9] @ vAA<- d2
6516 GOTO_OPCODE ip @ jump to next instruction
6517
6518
6519/* ------------------------------ */
6520 .balign 128
6521.L_op_mul_double_2addr: /* 0xcd */
6522/* File: arm/op_mul_double_2addr.S */
6523/* File: arm/fbinopWide2addr.S */
6524 /*
6525 * Generic 64-bit floating point "/2addr" binary operation. Provide
6526 * an "instr" line that specifies an instruction that performs
6527 * "d2 = d0 op d1".
6528 *
6529 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6530 * div-double/2addr
6531 */
6532 /* binop/2addr vA, vB */
6533 mov r3, rINST, lsr #12 @ r3<- B
6534 mov r9, rINST, lsr #8 @ r9<- A+
6535 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6536 and r9, r9, #15 @ r9<- A
6537 fldd d1, [r3] @ d1<- vB
6538 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6539 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6540 fldd d0, [r9] @ d0<- vA
6541
6542 fmuld d2, d0, d1 @ d2<- op
6543 GET_INST_OPCODE ip @ extract opcode from rINST
6544 fstd d2, [r9] @ vAA<- d2
6545 GOTO_OPCODE ip @ jump to next instruction
6546
6547
6548/* ------------------------------ */
6549 .balign 128
6550.L_op_div_double_2addr: /* 0xce */
6551/* File: arm/op_div_double_2addr.S */
6552/* File: arm/fbinopWide2addr.S */
6553 /*
6554 * Generic 64-bit floating point "/2addr" binary operation. Provide
6555 * an "instr" line that specifies an instruction that performs
6556 * "d2 = d0 op d1".
6557 *
6558 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6559 * div-double/2addr
6560 */
6561 /* binop/2addr vA, vB */
6562 mov r3, rINST, lsr #12 @ r3<- B
6563 mov r9, rINST, lsr #8 @ r9<- A+
6564 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6565 and r9, r9, #15 @ r9<- A
6566 fldd d1, [r3] @ d1<- vB
6567 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6568 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6569 fldd d0, [r9] @ d0<- vA
6570
6571 fdivd d2, d0, d1 @ d2<- op
6572 GET_INST_OPCODE ip @ extract opcode from rINST
6573 fstd d2, [r9] @ vAA<- d2
6574 GOTO_OPCODE ip @ jump to next instruction
6575
6576
6577/* ------------------------------ */
6578 .balign 128
6579.L_op_rem_double_2addr: /* 0xcf */
6580/* File: arm/op_rem_double_2addr.S */
6581/* EABI doesn't define a double remainder function, but libm does */
6582/* File: arm/binopWide2addr.S */
6583 /*
6584 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6585 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6586 * This could be an ARM instruction or a function call. (If the result
6587 * comes back in a register other than r0, you can override "result".)
6588 *
6589 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6590 * vCC (r1). Useful for integer division and modulus.
6591 *
6592 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6593 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6594 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6595 * rem-double/2addr
6596 */
6597 /* binop/2addr vA, vB */
6598 mov r1, rINST, lsr #12 @ r1<- B
6599 ubfx r9, rINST, #8, #4 @ r9<- A
6600 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6601 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6602 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6603 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6604 .if 0
6605 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6606 beq common_errDivideByZero
6607 .endif
6608 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6609
6610 @ optional op; may set condition codes
6611 bl fmod @ result<- op, r0-r3 changed
6612 GET_INST_OPCODE ip @ extract opcode from rINST
6613 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6614 GOTO_OPCODE ip @ jump to next instruction
6615 /* 12-15 instructions */
6616
6617
6618/* ------------------------------ */
6619 .balign 128
6620.L_op_add_int_lit16: /* 0xd0 */
6621/* File: arm/op_add_int_lit16.S */
6622/* File: arm/binopLit16.S */
6623 /*
6624 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6625 * that specifies an instruction that performs "result = r0 op r1".
6626 * This could be an ARM instruction or a function call. (If the result
6627 * comes back in a register other than r0, you can override "result".)
6628 *
6629 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6630 * vCC (r1). Useful for integer division and modulus.
6631 *
6632 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6633 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6634 */
6635 /* binop/lit16 vA, vB, #+CCCC */
6636 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6637 mov r2, rINST, lsr #12 @ r2<- B
6638 ubfx r9, rINST, #8, #4 @ r9<- A
6639 GET_VREG r0, r2 @ r0<- vB
6640 .if 0
6641 cmp r1, #0 @ is second operand zero?
6642 beq common_errDivideByZero
6643 .endif
6644 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6645
6646 add r0, r0, r1 @ r0<- op, r0-r3 changed
6647 GET_INST_OPCODE ip @ extract opcode from rINST
6648 SET_VREG r0, r9 @ vAA<- r0
6649 GOTO_OPCODE ip @ jump to next instruction
6650 /* 10-13 instructions */
6651
6652
6653/* ------------------------------ */
6654 .balign 128
6655.L_op_rsub_int: /* 0xd1 */
6656/* File: arm/op_rsub_int.S */
6657/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6658/* File: arm/binopLit16.S */
6659 /*
6660 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6661 * that specifies an instruction that performs "result = r0 op r1".
6662 * This could be an ARM instruction or a function call. (If the result
6663 * comes back in a register other than r0, you can override "result".)
6664 *
6665 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6666 * vCC (r1). Useful for integer division and modulus.
6667 *
6668 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6669 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6670 */
6671 /* binop/lit16 vA, vB, #+CCCC */
6672 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6673 mov r2, rINST, lsr #12 @ r2<- B
6674 ubfx r9, rINST, #8, #4 @ r9<- A
6675 GET_VREG r0, r2 @ r0<- vB
6676 .if 0
6677 cmp r1, #0 @ is second operand zero?
6678 beq common_errDivideByZero
6679 .endif
6680 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6681
6682 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6683 GET_INST_OPCODE ip @ extract opcode from rINST
6684 SET_VREG r0, r9 @ vAA<- r0
6685 GOTO_OPCODE ip @ jump to next instruction
6686 /* 10-13 instructions */
6687
6688
6689/* ------------------------------ */
6690 .balign 128
6691.L_op_mul_int_lit16: /* 0xd2 */
6692/* File: arm/op_mul_int_lit16.S */
6693/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6694/* File: arm/binopLit16.S */
6695 /*
6696 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6697 * that specifies an instruction that performs "result = r0 op r1".
6698 * This could be an ARM instruction or a function call. (If the result
6699 * comes back in a register other than r0, you can override "result".)
6700 *
6701 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6702 * vCC (r1). Useful for integer division and modulus.
6703 *
6704 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6705 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6706 */
6707 /* binop/lit16 vA, vB, #+CCCC */
6708 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6709 mov r2, rINST, lsr #12 @ r2<- B
6710 ubfx r9, rINST, #8, #4 @ r9<- A
6711 GET_VREG r0, r2 @ r0<- vB
6712 .if 0
6713 cmp r1, #0 @ is second operand zero?
6714 beq common_errDivideByZero
6715 .endif
6716 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6717
6718 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6719 GET_INST_OPCODE ip @ extract opcode from rINST
6720 SET_VREG r0, r9 @ vAA<- r0
6721 GOTO_OPCODE ip @ jump to next instruction
6722 /* 10-13 instructions */
6723
6724
6725/* ------------------------------ */
6726 .balign 128
6727.L_op_div_int_lit16: /* 0xd3 */
6728/* File: arm/op_div_int_lit16.S */
6729 /*
6730 * Specialized 32-bit binary operation
6731 *
6732 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6733 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6734 * ARMv7 CPUs that have hardware division support).
6735 *
6736 * div-int/lit16
6737 *
6738 */
6739 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6740 mov r2, rINST, lsr #12 @ r2<- B
6741 ubfx r9, rINST, #8, #4 @ r9<- A
6742 GET_VREG r0, r2 @ r0<- vB
6743 cmp r1, #0 @ is second operand zero?
6744 beq common_errDivideByZero
6745 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6746
6747#ifdef __ARM_ARCH_EXT_IDIV__
6748 sdiv r0, r0, r1 @ r0<- op
6749#else
6750 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6751#endif
6752 GET_INST_OPCODE ip @ extract opcode from rINST
6753 SET_VREG r0, r9 @ vAA<- r0
6754 GOTO_OPCODE ip @ jump to next instruction
6755 /* 10-13 instructions */
6756
6757/* ------------------------------ */
6758 .balign 128
6759.L_op_rem_int_lit16: /* 0xd4 */
6760/* File: arm/op_rem_int_lit16.S */
6761 /*
6762 * Specialized 32-bit binary operation
6763 *
6764 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6765 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6766 * ARMv7 CPUs that have hardware division support).
6767 *
6768 * NOTE: idivmod returns quotient in r0 and remainder in r1
6769 *
6770 * rem-int/lit16
6771 *
6772 */
6773 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6774 mov r2, rINST, lsr #12 @ r2<- B
6775 ubfx r9, rINST, #8, #4 @ r9<- A
6776 GET_VREG r0, r2 @ r0<- vB
6777 cmp r1, #0 @ is second operand zero?
6778 beq common_errDivideByZero
6779 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6780
6781#ifdef __ARM_ARCH_EXT_IDIV__
6782 sdiv r2, r0, r1
6783 mls r1, r1, r2, r0 @ r1<- op
6784#else
6785 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6786#endif
6787 GET_INST_OPCODE ip @ extract opcode from rINST
6788 SET_VREG r1, r9 @ vAA<- r1
6789 GOTO_OPCODE ip @ jump to next instruction
6790 /* 10-13 instructions */
6791
6792/* ------------------------------ */
6793 .balign 128
6794.L_op_and_int_lit16: /* 0xd5 */
6795/* File: arm/op_and_int_lit16.S */
6796/* File: arm/binopLit16.S */
6797 /*
6798 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6799 * that specifies an instruction that performs "result = r0 op r1".
6800 * This could be an ARM instruction or a function call. (If the result
6801 * comes back in a register other than r0, you can override "result".)
6802 *
6803 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6804 * vCC (r1). Useful for integer division and modulus.
6805 *
6806 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6807 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6808 */
6809 /* binop/lit16 vA, vB, #+CCCC */
6810 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6811 mov r2, rINST, lsr #12 @ r2<- B
6812 ubfx r9, rINST, #8, #4 @ r9<- A
6813 GET_VREG r0, r2 @ r0<- vB
6814 .if 0
6815 cmp r1, #0 @ is second operand zero?
6816 beq common_errDivideByZero
6817 .endif
6818 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6819
6820 and r0, r0, r1 @ r0<- op, r0-r3 changed
6821 GET_INST_OPCODE ip @ extract opcode from rINST
6822 SET_VREG r0, r9 @ vAA<- r0
6823 GOTO_OPCODE ip @ jump to next instruction
6824 /* 10-13 instructions */
6825
6826
6827/* ------------------------------ */
6828 .balign 128
6829.L_op_or_int_lit16: /* 0xd6 */
6830/* File: arm/op_or_int_lit16.S */
6831/* File: arm/binopLit16.S */
6832 /*
6833 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6834 * that specifies an instruction that performs "result = r0 op r1".
6835 * This could be an ARM instruction or a function call. (If the result
6836 * comes back in a register other than r0, you can override "result".)
6837 *
6838 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6839 * vCC (r1). Useful for integer division and modulus.
6840 *
6841 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6842 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6843 */
6844 /* binop/lit16 vA, vB, #+CCCC */
6845 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6846 mov r2, rINST, lsr #12 @ r2<- B
6847 ubfx r9, rINST, #8, #4 @ r9<- A
6848 GET_VREG r0, r2 @ r0<- vB
6849 .if 0
6850 cmp r1, #0 @ is second operand zero?
6851 beq common_errDivideByZero
6852 .endif
6853 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6854
6855 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6856 GET_INST_OPCODE ip @ extract opcode from rINST
6857 SET_VREG r0, r9 @ vAA<- r0
6858 GOTO_OPCODE ip @ jump to next instruction
6859 /* 10-13 instructions */
6860
6861
6862/* ------------------------------ */
6863 .balign 128
6864.L_op_xor_int_lit16: /* 0xd7 */
6865/* File: arm/op_xor_int_lit16.S */
6866/* File: arm/binopLit16.S */
6867 /*
6868 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6869 * that specifies an instruction that performs "result = r0 op r1".
6870 * This could be an ARM instruction or a function call. (If the result
6871 * comes back in a register other than r0, you can override "result".)
6872 *
6873 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6874 * vCC (r1). Useful for integer division and modulus.
6875 *
6876 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6877 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6878 */
6879 /* binop/lit16 vA, vB, #+CCCC */
6880 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6881 mov r2, rINST, lsr #12 @ r2<- B
6882 ubfx r9, rINST, #8, #4 @ r9<- A
6883 GET_VREG r0, r2 @ r0<- vB
6884 .if 0
6885 cmp r1, #0 @ is second operand zero?
6886 beq common_errDivideByZero
6887 .endif
6888 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6889
6890 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6891 GET_INST_OPCODE ip @ extract opcode from rINST
6892 SET_VREG r0, r9 @ vAA<- r0
6893 GOTO_OPCODE ip @ jump to next instruction
6894 /* 10-13 instructions */
6895
6896
6897/* ------------------------------ */
6898 .balign 128
6899.L_op_add_int_lit8: /* 0xd8 */
6900/* File: arm/op_add_int_lit8.S */
6901/* File: arm/binopLit8.S */
6902 /*
6903 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6904 * that specifies an instruction that performs "result = r0 op r1".
6905 * This could be an ARM instruction or a function call. (If the result
6906 * comes back in a register other than r0, you can override "result".)
6907 *
6908 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6909 * vCC (r1). Useful for integer division and modulus.
6910 *
6911 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6912 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6913 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6914 */
6915 /* binop/lit8 vAA, vBB, #+CC */
6916 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6917 mov r9, rINST, lsr #8 @ r9<- AA
6918 and r2, r3, #255 @ r2<- BB
6919 GET_VREG r0, r2 @ r0<- vBB
6920 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6921 .if 0
6922 @cmp r1, #0 @ is second operand zero?
6923 beq common_errDivideByZero
6924 .endif
6925 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6926
6927 @ optional op; may set condition codes
6928 add r0, r0, r1 @ r0<- op, r0-r3 changed
6929 GET_INST_OPCODE ip @ extract opcode from rINST
6930 SET_VREG r0, r9 @ vAA<- r0
6931 GOTO_OPCODE ip @ jump to next instruction
6932 /* 10-12 instructions */
6933
6934
6935/* ------------------------------ */
6936 .balign 128
6937.L_op_rsub_int_lit8: /* 0xd9 */
6938/* File: arm/op_rsub_int_lit8.S */
6939/* File: arm/binopLit8.S */
6940 /*
6941 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6942 * that specifies an instruction that performs "result = r0 op r1".
6943 * This could be an ARM instruction or a function call. (If the result
6944 * comes back in a register other than r0, you can override "result".)
6945 *
6946 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6947 * vCC (r1). Useful for integer division and modulus.
6948 *
6949 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6950 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6951 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6952 */
6953 /* binop/lit8 vAA, vBB, #+CC */
6954 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6955 mov r9, rINST, lsr #8 @ r9<- AA
6956 and r2, r3, #255 @ r2<- BB
6957 GET_VREG r0, r2 @ r0<- vBB
6958 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6959 .if 0
6960 @cmp r1, #0 @ is second operand zero?
6961 beq common_errDivideByZero
6962 .endif
6963 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6964
6965 @ optional op; may set condition codes
6966 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6967 GET_INST_OPCODE ip @ extract opcode from rINST
6968 SET_VREG r0, r9 @ vAA<- r0
6969 GOTO_OPCODE ip @ jump to next instruction
6970 /* 10-12 instructions */
6971
6972
6973/* ------------------------------ */
6974 .balign 128
6975.L_op_mul_int_lit8: /* 0xda */
6976/* File: arm/op_mul_int_lit8.S */
6977/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6978/* File: arm/binopLit8.S */
6979 /*
6980 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6981 * that specifies an instruction that performs "result = r0 op r1".
6982 * This could be an ARM instruction or a function call. (If the result
6983 * comes back in a register other than r0, you can override "result".)
6984 *
6985 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6986 * vCC (r1). Useful for integer division and modulus.
6987 *
6988 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6989 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6990 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6991 */
6992 /* binop/lit8 vAA, vBB, #+CC */
6993 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6994 mov r9, rINST, lsr #8 @ r9<- AA
6995 and r2, r3, #255 @ r2<- BB
6996 GET_VREG r0, r2 @ r0<- vBB
6997 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6998 .if 0
6999 @cmp r1, #0 @ is second operand zero?
7000 beq common_errDivideByZero
7001 .endif
7002 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7003
7004 @ optional op; may set condition codes
7005 mul r0, r1, r0 @ r0<- op, r0-r3 changed
7006 GET_INST_OPCODE ip @ extract opcode from rINST
7007 SET_VREG r0, r9 @ vAA<- r0
7008 GOTO_OPCODE ip @ jump to next instruction
7009 /* 10-12 instructions */
7010
7011
7012/* ------------------------------ */
7013 .balign 128
7014.L_op_div_int_lit8: /* 0xdb */
7015/* File: arm/op_div_int_lit8.S */
7016 /*
7017 * Specialized 32-bit binary operation
7018 *
7019 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
7020 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
7021 * ARMv7 CPUs that have hardware division support).
7022 *
7023 * div-int/lit8
7024 *
7025 */
7026 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7027 mov r9, rINST, lsr #8 @ r9<- AA
7028 and r2, r3, #255 @ r2<- BB
7029 GET_VREG r0, r2 @ r0<- vBB
7030 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7031 @cmp r1, #0 @ is second operand zero?
7032 beq common_errDivideByZero
7033 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7034
7035#ifdef __ARM_ARCH_EXT_IDIV__
7036 sdiv r0, r0, r1 @ r0<- op
7037#else
7038 bl __aeabi_idiv @ r0<- op, r0-r3 changed
7039#endif
7040 GET_INST_OPCODE ip @ extract opcode from rINST
7041 SET_VREG r0, r9 @ vAA<- r0
7042 GOTO_OPCODE ip @ jump to next instruction
7043 /* 10-12 instructions */
7044
7045/* ------------------------------ */
7046 .balign 128
7047.L_op_rem_int_lit8: /* 0xdc */
7048/* File: arm/op_rem_int_lit8.S */
7049 /*
7050 * Specialized 32-bit binary operation
7051 *
7052 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
7053 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
7054 * ARMv7 CPUs that have hardware division support).
7055 *
7056 * NOTE: idivmod returns quotient in r0 and remainder in r1
7057 *
7058 * rem-int/lit8
7059 *
7060 */
7061 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
7062 mov r9, rINST, lsr #8 @ r9<- AA
7063 and r2, r3, #255 @ r2<- BB
7064 GET_VREG r0, r2 @ r0<- vBB
7065 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7066 @cmp r1, #0 @ is second operand zero?
7067 beq common_errDivideByZero
7068 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7069
7070#ifdef __ARM_ARCH_EXT_IDIV__
7071 sdiv r2, r0, r1
7072 mls r1, r1, r2, r0 @ r1<- op
7073#else
7074 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
7075#endif
7076 GET_INST_OPCODE ip @ extract opcode from rINST
7077 SET_VREG r1, r9 @ vAA<- r1
7078 GOTO_OPCODE ip @ jump to next instruction
7079 /* 10-12 instructions */
7080
7081/* ------------------------------ */
7082 .balign 128
7083.L_op_and_int_lit8: /* 0xdd */
7084/* File: arm/op_and_int_lit8.S */
7085/* File: arm/binopLit8.S */
7086 /*
7087 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7088 * that specifies an instruction that performs "result = r0 op r1".
7089 * This could be an ARM instruction or a function call. (If the result
7090 * comes back in a register other than r0, you can override "result".)
7091 *
7092 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7093 * vCC (r1). Useful for integer division and modulus.
7094 *
7095 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7096 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7097 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7098 */
7099 /* binop/lit8 vAA, vBB, #+CC */
7100 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7101 mov r9, rINST, lsr #8 @ r9<- AA
7102 and r2, r3, #255 @ r2<- BB
7103 GET_VREG r0, r2 @ r0<- vBB
7104 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7105 .if 0
7106 @cmp r1, #0 @ is second operand zero?
7107 beq common_errDivideByZero
7108 .endif
7109 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7110
7111 @ optional op; may set condition codes
7112 and r0, r0, r1 @ r0<- op, r0-r3 changed
7113 GET_INST_OPCODE ip @ extract opcode from rINST
7114 SET_VREG r0, r9 @ vAA<- r0
7115 GOTO_OPCODE ip @ jump to next instruction
7116 /* 10-12 instructions */
7117
7118
7119/* ------------------------------ */
7120 .balign 128
7121.L_op_or_int_lit8: /* 0xde */
7122/* File: arm/op_or_int_lit8.S */
7123/* File: arm/binopLit8.S */
7124 /*
7125 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7126 * that specifies an instruction that performs "result = r0 op r1".
7127 * This could be an ARM instruction or a function call. (If the result
7128 * comes back in a register other than r0, you can override "result".)
7129 *
7130 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7131 * vCC (r1). Useful for integer division and modulus.
7132 *
7133 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7134 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7135 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7136 */
7137 /* binop/lit8 vAA, vBB, #+CC */
7138 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7139 mov r9, rINST, lsr #8 @ r9<- AA
7140 and r2, r3, #255 @ r2<- BB
7141 GET_VREG r0, r2 @ r0<- vBB
7142 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7143 .if 0
7144 @cmp r1, #0 @ is second operand zero?
7145 beq common_errDivideByZero
7146 .endif
7147 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7148
7149 @ optional op; may set condition codes
7150 orr r0, r0, r1 @ r0<- op, r0-r3 changed
7151 GET_INST_OPCODE ip @ extract opcode from rINST
7152 SET_VREG r0, r9 @ vAA<- r0
7153 GOTO_OPCODE ip @ jump to next instruction
7154 /* 10-12 instructions */
7155
7156
7157/* ------------------------------ */
7158 .balign 128
7159.L_op_xor_int_lit8: /* 0xdf */
7160/* File: arm/op_xor_int_lit8.S */
7161/* File: arm/binopLit8.S */
7162 /*
7163 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7164 * that specifies an instruction that performs "result = r0 op r1".
7165 * This could be an ARM instruction or a function call. (If the result
7166 * comes back in a register other than r0, you can override "result".)
7167 *
7168 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7169 * vCC (r1). Useful for integer division and modulus.
7170 *
7171 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7172 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7173 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7174 */
7175 /* binop/lit8 vAA, vBB, #+CC */
7176 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7177 mov r9, rINST, lsr #8 @ r9<- AA
7178 and r2, r3, #255 @ r2<- BB
7179 GET_VREG r0, r2 @ r0<- vBB
7180 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7181 .if 0
7182 @cmp r1, #0 @ is second operand zero?
7183 beq common_errDivideByZero
7184 .endif
7185 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7186
7187 @ optional op; may set condition codes
7188 eor r0, r0, r1 @ r0<- op, r0-r3 changed
7189 GET_INST_OPCODE ip @ extract opcode from rINST
7190 SET_VREG r0, r9 @ vAA<- r0
7191 GOTO_OPCODE ip @ jump to next instruction
7192 /* 10-12 instructions */
7193
7194
7195/* ------------------------------ */
7196 .balign 128
7197.L_op_shl_int_lit8: /* 0xe0 */
7198/* File: arm/op_shl_int_lit8.S */
7199/* File: arm/binopLit8.S */
7200 /*
7201 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7202 * that specifies an instruction that performs "result = r0 op r1".
7203 * This could be an ARM instruction or a function call. (If the result
7204 * comes back in a register other than r0, you can override "result".)
7205 *
7206 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7207 * vCC (r1). Useful for integer division and modulus.
7208 *
7209 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7210 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7211 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7212 */
7213 /* binop/lit8 vAA, vBB, #+CC */
7214 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7215 mov r9, rINST, lsr #8 @ r9<- AA
7216 and r2, r3, #255 @ r2<- BB
7217 GET_VREG r0, r2 @ r0<- vBB
7218 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7219 .if 0
7220 @cmp r1, #0 @ is second operand zero?
7221 beq common_errDivideByZero
7222 .endif
7223 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7224
7225 and r1, r1, #31 @ optional op; may set condition codes
7226 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
7227 GET_INST_OPCODE ip @ extract opcode from rINST
7228 SET_VREG r0, r9 @ vAA<- r0
7229 GOTO_OPCODE ip @ jump to next instruction
7230 /* 10-12 instructions */
7231
7232
7233/* ------------------------------ */
7234 .balign 128
7235.L_op_shr_int_lit8: /* 0xe1 */
7236/* File: arm/op_shr_int_lit8.S */
7237/* File: arm/binopLit8.S */
7238 /*
7239 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7240 * that specifies an instruction that performs "result = r0 op r1".
7241 * This could be an ARM instruction or a function call. (If the result
7242 * comes back in a register other than r0, you can override "result".)
7243 *
7244 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7245 * vCC (r1). Useful for integer division and modulus.
7246 *
7247 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7248 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7249 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7250 */
7251 /* binop/lit8 vAA, vBB, #+CC */
7252 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7253 mov r9, rINST, lsr #8 @ r9<- AA
7254 and r2, r3, #255 @ r2<- BB
7255 GET_VREG r0, r2 @ r0<- vBB
7256 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7257 .if 0
7258 @cmp r1, #0 @ is second operand zero?
7259 beq common_errDivideByZero
7260 .endif
7261 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7262
7263 and r1, r1, #31 @ optional op; may set condition codes
7264 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
7265 GET_INST_OPCODE ip @ extract opcode from rINST
7266 SET_VREG r0, r9 @ vAA<- r0
7267 GOTO_OPCODE ip @ jump to next instruction
7268 /* 10-12 instructions */
7269
7270
7271/* ------------------------------ */
7272 .balign 128
7273.L_op_ushr_int_lit8: /* 0xe2 */
7274/* File: arm/op_ushr_int_lit8.S */
7275/* File: arm/binopLit8.S */
7276 /*
7277 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7278 * that specifies an instruction that performs "result = r0 op r1".
7279 * This could be an ARM instruction or a function call. (If the result
7280 * comes back in a register other than r0, you can override "result".)
7281 *
7282 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7283 * vCC (r1). Useful for integer division and modulus.
7284 *
7285 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7286 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7287 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7288 */
7289 /* binop/lit8 vAA, vBB, #+CC */
7290 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7291 mov r9, rINST, lsr #8 @ r9<- AA
7292 and r2, r3, #255 @ r2<- BB
7293 GET_VREG r0, r2 @ r0<- vBB
7294 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7295 .if 0
7296 @cmp r1, #0 @ is second operand zero?
7297 beq common_errDivideByZero
7298 .endif
7299 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7300
7301 and r1, r1, #31 @ optional op; may set condition codes
7302 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
7303 GET_INST_OPCODE ip @ extract opcode from rINST
7304 SET_VREG r0, r9 @ vAA<- r0
7305 GOTO_OPCODE ip @ jump to next instruction
7306 /* 10-12 instructions */
7307
7308
7309/* ------------------------------ */
7310 .balign 128
7311.L_op_iget_quick: /* 0xe3 */
7312/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007313 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007314 /* op vA, vB, offset@CCCC */
7315 mov r2, rINST, lsr #12 @ r2<- B
7316 FETCH r1, 1 @ r1<- field byte offset
7317 GET_VREG r3, r2 @ r3<- object we're operating on
7318 ubfx r2, rINST, #8, #4 @ r2<- A
7319 cmp r3, #0 @ check object for null
7320 beq common_errNullObject @ object was null
7321 ldr r0, [r3, r1] @ r0<- obj.field
7322 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007323 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007324 GET_INST_OPCODE ip @ extract opcode from rINST
7325 GOTO_OPCODE ip @ jump to next instruction
7326
7327/* ------------------------------ */
7328 .balign 128
7329.L_op_iget_wide_quick: /* 0xe4 */
7330/* File: arm/op_iget_wide_quick.S */
7331 /* iget-wide-quick vA, vB, offset@CCCC */
7332 mov r2, rINST, lsr #12 @ r2<- B
7333 FETCH ip, 1 @ ip<- field byte offset
7334 GET_VREG r3, r2 @ r3<- object we're operating on
7335 ubfx r2, rINST, #8, #4 @ r2<- A
7336 cmp r3, #0 @ check object for null
7337 beq common_errNullObject @ object was null
7338 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
7339 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7340 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
7341 GET_INST_OPCODE ip @ extract opcode from rINST
7342 stmia r3, {r0-r1} @ fp[A]<- r0/r1
7343 GOTO_OPCODE ip @ jump to next instruction
7344
7345/* ------------------------------ */
7346 .balign 128
7347.L_op_iget_object_quick: /* 0xe5 */
7348/* File: arm/op_iget_object_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007349 /* For: iget-object-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
buzbeebb6e7262016-01-14 05:34:34 -08007353 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -08007354 GET_VREG r0, r2 @ r0<- object we're operating on
buzbee76833da2016-01-13 13:06:22 -08007355 bl artIGetObjectFromMterp @ (obj, offset)
7356 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
7357 ubfx r2, rINST, #8, #4 @ r2<- A
7358 PREFETCH_INST 2
7359 cmp r3, #0
7360 bne MterpPossibleException @ bail out
buzbee1452bee2015-03-06 14:43:04 -08007361 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
buzbee76833da2016-01-13 13:06:22 -08007362 ADVANCE 2 @ advance rPC
buzbee1452bee2015-03-06 14:43:04 -08007363 GET_INST_OPCODE ip @ extract opcode from rINST
7364 GOTO_OPCODE ip @ jump to next instruction
7365
buzbee1452bee2015-03-06 14:43:04 -08007366/* ------------------------------ */
7367 .balign 128
7368.L_op_iput_quick: /* 0xe6 */
7369/* File: arm/op_iput_quick.S */
7370 /* For: iput-quick, iput-object-quick */
7371 /* op vA, vB, offset@CCCC */
7372 mov r2, rINST, lsr #12 @ r2<- B
7373 FETCH r1, 1 @ r1<- field byte offset
7374 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7375 ubfx r2, rINST, #8, #4 @ r2<- A
7376 cmp r3, #0 @ check object for null
7377 beq common_errNullObject @ object was null
7378 GET_VREG r0, r2 @ r0<- fp[A]
7379 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7380 str r0, [r3, r1] @ obj.field<- r0
7381 GET_INST_OPCODE ip @ extract opcode from rINST
7382 GOTO_OPCODE ip @ jump to next instruction
7383
7384/* ------------------------------ */
7385 .balign 128
7386.L_op_iput_wide_quick: /* 0xe7 */
7387/* File: arm/op_iput_wide_quick.S */
7388 /* iput-wide-quick vA, vB, offset@CCCC */
7389 mov r2, rINST, lsr #12 @ r2<- B
7390 FETCH r3, 1 @ r3<- field byte offset
7391 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7392 ubfx r0, rINST, #8, #4 @ r0<- A
7393 cmp r2, #0 @ check object for null
7394 beq common_errNullObject @ object was null
7395 add r0, rFP, r0, lsl #2 @ r0<- &fp[A]
7396 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7397 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7398 strd r0, [r2, r3] @ obj.field<- r0/r1
7399 GET_INST_OPCODE ip @ extract opcode from rINST
7400 GOTO_OPCODE ip @ jump to next instruction
7401
7402/* ------------------------------ */
7403 .balign 128
7404.L_op_iput_object_quick: /* 0xe8 */
7405/* File: arm/op_iput_object_quick.S */
7406 EXPORT_PC
7407 add r0, rFP, #OFF_FP_SHADOWFRAME
7408 mov r1, rPC
7409 mov r2, rINST
7410 bl MterpIputObjectQuick
7411 cmp r0, #0
7412 beq MterpException
7413 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7414 GET_INST_OPCODE ip @ extract opcode from rINST
7415 GOTO_OPCODE ip @ jump to next instruction
7416
7417/* ------------------------------ */
7418 .balign 128
7419.L_op_invoke_virtual_quick: /* 0xe9 */
7420/* File: arm/op_invoke_virtual_quick.S */
7421/* File: arm/invoke.S */
7422 /*
7423 * Generic invoke handler wrapper.
7424 */
7425 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7426 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7427 .extern MterpInvokeVirtualQuick
7428 EXPORT_PC
7429 mov r0, rSELF
7430 add r1, rFP, #OFF_FP_SHADOWFRAME
7431 mov r2, rPC
7432 mov r3, rINST
7433 bl MterpInvokeVirtualQuick
7434 cmp r0, #0
7435 beq MterpException
7436 FETCH_ADVANCE_INST 3
7437 GET_INST_OPCODE ip
7438 GOTO_OPCODE ip
7439
7440
7441
7442/* ------------------------------ */
7443 .balign 128
7444.L_op_invoke_virtual_range_quick: /* 0xea */
7445/* File: arm/op_invoke_virtual_range_quick.S */
7446/* File: arm/invoke.S */
7447 /*
7448 * Generic invoke handler wrapper.
7449 */
7450 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7451 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7452 .extern MterpInvokeVirtualQuickRange
7453 EXPORT_PC
7454 mov r0, rSELF
7455 add r1, rFP, #OFF_FP_SHADOWFRAME
7456 mov r2, rPC
7457 mov r3, rINST
7458 bl MterpInvokeVirtualQuickRange
7459 cmp r0, #0
7460 beq MterpException
7461 FETCH_ADVANCE_INST 3
7462 GET_INST_OPCODE ip
7463 GOTO_OPCODE ip
7464
7465
7466
7467/* ------------------------------ */
7468 .balign 128
7469.L_op_iput_boolean_quick: /* 0xeb */
7470/* File: arm/op_iput_boolean_quick.S */
7471/* File: arm/op_iput_quick.S */
7472 /* For: iput-quick, iput-object-quick */
7473 /* op vA, vB, offset@CCCC */
7474 mov r2, rINST, lsr #12 @ r2<- B
7475 FETCH r1, 1 @ r1<- field byte offset
7476 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7477 ubfx r2, rINST, #8, #4 @ r2<- A
7478 cmp r3, #0 @ check object for null
7479 beq common_errNullObject @ object was null
7480 GET_VREG r0, r2 @ r0<- fp[A]
7481 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7482 strb r0, [r3, r1] @ obj.field<- r0
7483 GET_INST_OPCODE ip @ extract opcode from rINST
7484 GOTO_OPCODE ip @ jump to next instruction
7485
7486
7487/* ------------------------------ */
7488 .balign 128
7489.L_op_iput_byte_quick: /* 0xec */
7490/* File: arm/op_iput_byte_quick.S */
7491/* File: arm/op_iput_quick.S */
7492 /* For: iput-quick, iput-object-quick */
7493 /* op vA, vB, offset@CCCC */
7494 mov r2, rINST, lsr #12 @ r2<- B
7495 FETCH r1, 1 @ r1<- field byte offset
7496 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7497 ubfx r2, rINST, #8, #4 @ r2<- A
7498 cmp r3, #0 @ check object for null
7499 beq common_errNullObject @ object was null
7500 GET_VREG r0, r2 @ r0<- fp[A]
7501 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7502 strb r0, [r3, r1] @ obj.field<- r0
7503 GET_INST_OPCODE ip @ extract opcode from rINST
7504 GOTO_OPCODE ip @ jump to next instruction
7505
7506
7507/* ------------------------------ */
7508 .balign 128
7509.L_op_iput_char_quick: /* 0xed */
7510/* File: arm/op_iput_char_quick.S */
7511/* File: arm/op_iput_quick.S */
7512 /* For: iput-quick, iput-object-quick */
7513 /* op vA, vB, offset@CCCC */
7514 mov r2, rINST, lsr #12 @ r2<- B
7515 FETCH r1, 1 @ r1<- field byte offset
7516 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7517 ubfx r2, rINST, #8, #4 @ r2<- A
7518 cmp r3, #0 @ check object for null
7519 beq common_errNullObject @ object was null
7520 GET_VREG r0, r2 @ r0<- fp[A]
7521 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7522 strh r0, [r3, r1] @ obj.field<- r0
7523 GET_INST_OPCODE ip @ extract opcode from rINST
7524 GOTO_OPCODE ip @ jump to next instruction
7525
7526
7527/* ------------------------------ */
7528 .balign 128
7529.L_op_iput_short_quick: /* 0xee */
7530/* File: arm/op_iput_short_quick.S */
7531/* File: arm/op_iput_quick.S */
7532 /* For: iput-quick, iput-object-quick */
7533 /* op vA, vB, offset@CCCC */
7534 mov r2, rINST, lsr #12 @ r2<- B
7535 FETCH r1, 1 @ r1<- field byte offset
7536 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7537 ubfx r2, rINST, #8, #4 @ r2<- A
7538 cmp r3, #0 @ check object for null
7539 beq common_errNullObject @ object was null
7540 GET_VREG r0, r2 @ r0<- fp[A]
7541 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7542 strh r0, [r3, r1] @ obj.field<- r0
7543 GET_INST_OPCODE ip @ extract opcode from rINST
7544 GOTO_OPCODE ip @ jump to next instruction
7545
7546
7547/* ------------------------------ */
7548 .balign 128
7549.L_op_iget_boolean_quick: /* 0xef */
7550/* File: arm/op_iget_boolean_quick.S */
7551/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007552 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007553 /* op vA, vB, offset@CCCC */
7554 mov r2, rINST, lsr #12 @ r2<- B
7555 FETCH r1, 1 @ r1<- field byte offset
7556 GET_VREG r3, r2 @ r3<- object we're operating on
7557 ubfx r2, rINST, #8, #4 @ r2<- A
7558 cmp r3, #0 @ check object for null
7559 beq common_errNullObject @ object was null
7560 ldrb r0, [r3, r1] @ r0<- obj.field
7561 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007562 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007563 GET_INST_OPCODE ip @ extract opcode from rINST
7564 GOTO_OPCODE ip @ jump to next instruction
7565
7566
7567/* ------------------------------ */
7568 .balign 128
7569.L_op_iget_byte_quick: /* 0xf0 */
7570/* File: arm/op_iget_byte_quick.S */
7571/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007572 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007573 /* op vA, vB, offset@CCCC */
7574 mov r2, rINST, lsr #12 @ r2<- B
7575 FETCH r1, 1 @ r1<- field byte offset
7576 GET_VREG r3, r2 @ r3<- object we're operating on
7577 ubfx r2, rINST, #8, #4 @ r2<- A
7578 cmp r3, #0 @ check object for null
7579 beq common_errNullObject @ object was null
7580 ldrsb r0, [r3, r1] @ r0<- obj.field
7581 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007582 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007583 GET_INST_OPCODE ip @ extract opcode from rINST
7584 GOTO_OPCODE ip @ jump to next instruction
7585
7586
7587/* ------------------------------ */
7588 .balign 128
7589.L_op_iget_char_quick: /* 0xf1 */
7590/* File: arm/op_iget_char_quick.S */
7591/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007592 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007593 /* op vA, vB, offset@CCCC */
7594 mov r2, rINST, lsr #12 @ r2<- B
7595 FETCH r1, 1 @ r1<- field byte offset
7596 GET_VREG r3, r2 @ r3<- object we're operating on
7597 ubfx r2, rINST, #8, #4 @ r2<- A
7598 cmp r3, #0 @ check object for null
7599 beq common_errNullObject @ object was null
7600 ldrh r0, [r3, r1] @ r0<- obj.field
7601 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007602 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007603 GET_INST_OPCODE ip @ extract opcode from rINST
7604 GOTO_OPCODE ip @ jump to next instruction
7605
7606
7607/* ------------------------------ */
7608 .balign 128
7609.L_op_iget_short_quick: /* 0xf2 */
7610/* File: arm/op_iget_short_quick.S */
7611/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007612 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007613 /* op vA, vB, offset@CCCC */
7614 mov r2, rINST, lsr #12 @ r2<- B
7615 FETCH r1, 1 @ r1<- field byte offset
7616 GET_VREG r3, r2 @ r3<- object we're operating on
7617 ubfx r2, rINST, #8, #4 @ r2<- A
7618 cmp r3, #0 @ check object for null
7619 beq common_errNullObject @ object was null
7620 ldrsh r0, [r3, r1] @ r0<- obj.field
7621 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007622 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007623 GET_INST_OPCODE ip @ extract opcode from rINST
7624 GOTO_OPCODE ip @ jump to next instruction
7625
7626
7627/* ------------------------------ */
7628 .balign 128
7629.L_op_invoke_lambda: /* 0xf3 */
7630/* Transfer stub to alternate interpreter */
7631 b MterpFallback
7632
7633
7634/* ------------------------------ */
7635 .balign 128
7636.L_op_unused_f4: /* 0xf4 */
7637/* File: arm/op_unused_f4.S */
7638/* File: arm/unused.S */
7639/*
7640 * Bail to reference interpreter to throw.
7641 */
7642 b MterpFallback
7643
7644
7645/* ------------------------------ */
7646 .balign 128
7647.L_op_capture_variable: /* 0xf5 */
7648/* Transfer stub to alternate interpreter */
7649 b MterpFallback
7650
7651
7652/* ------------------------------ */
7653 .balign 128
7654.L_op_create_lambda: /* 0xf6 */
7655/* Transfer stub to alternate interpreter */
7656 b MterpFallback
7657
7658
7659/* ------------------------------ */
7660 .balign 128
7661.L_op_liberate_variable: /* 0xf7 */
7662/* Transfer stub to alternate interpreter */
7663 b MterpFallback
7664
7665
7666/* ------------------------------ */
7667 .balign 128
7668.L_op_box_lambda: /* 0xf8 */
7669/* Transfer stub to alternate interpreter */
7670 b MterpFallback
7671
7672
7673/* ------------------------------ */
7674 .balign 128
7675.L_op_unbox_lambda: /* 0xf9 */
7676/* Transfer stub to alternate interpreter */
7677 b MterpFallback
7678
7679
7680/* ------------------------------ */
7681 .balign 128
7682.L_op_unused_fa: /* 0xfa */
7683/* File: arm/op_unused_fa.S */
7684/* File: arm/unused.S */
7685/*
7686 * Bail to reference interpreter to throw.
7687 */
7688 b MterpFallback
7689
7690
7691/* ------------------------------ */
7692 .balign 128
7693.L_op_unused_fb: /* 0xfb */
7694/* File: arm/op_unused_fb.S */
7695/* File: arm/unused.S */
7696/*
7697 * Bail to reference interpreter to throw.
7698 */
7699 b MterpFallback
7700
7701
7702/* ------------------------------ */
7703 .balign 128
7704.L_op_unused_fc: /* 0xfc */
7705/* File: arm/op_unused_fc.S */
7706/* File: arm/unused.S */
7707/*
7708 * Bail to reference interpreter to throw.
7709 */
7710 b MterpFallback
7711
7712
7713/* ------------------------------ */
7714 .balign 128
7715.L_op_unused_fd: /* 0xfd */
7716/* File: arm/op_unused_fd.S */
7717/* File: arm/unused.S */
7718/*
7719 * Bail to reference interpreter to throw.
7720 */
7721 b MterpFallback
7722
7723
7724/* ------------------------------ */
7725 .balign 128
7726.L_op_unused_fe: /* 0xfe */
7727/* File: arm/op_unused_fe.S */
7728/* File: arm/unused.S */
7729/*
7730 * Bail to reference interpreter to throw.
7731 */
7732 b MterpFallback
7733
7734
7735/* ------------------------------ */
7736 .balign 128
7737.L_op_unused_ff: /* 0xff */
7738/* File: arm/op_unused_ff.S */
7739/* File: arm/unused.S */
7740/*
7741 * Bail to reference interpreter to throw.
7742 */
7743 b MterpFallback
7744
7745
7746 .balign 128
7747 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7748 .global artMterpAsmInstructionEnd
7749artMterpAsmInstructionEnd:
7750
7751/*
7752 * ===========================================================================
7753 * Sister implementations
7754 * ===========================================================================
7755 */
7756 .global artMterpAsmSisterStart
7757 .type artMterpAsmSisterStart, %function
7758 .text
7759 .balign 4
7760artMterpAsmSisterStart:
7761
7762/* continuation for op_cmp_long */
7763
7764.Lop_cmp_long_less:
7765 mvn r1, #0 @ r1<- -1
7766 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7767 @ instead, we just replicate the tail end.
7768 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7769 SET_VREG r1, r9 @ vAA<- r1
7770 GET_INST_OPCODE ip @ extract opcode from rINST
7771 GOTO_OPCODE ip @ jump to next instruction
7772
7773.Lop_cmp_long_greater:
7774 mov r1, #1 @ r1<- 1
7775 @ fall through to _finish
7776
7777.Lop_cmp_long_finish:
7778 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7779 SET_VREG r1, r9 @ vAA<- r1
7780 GET_INST_OPCODE ip @ extract opcode from rINST
7781 GOTO_OPCODE ip @ jump to next instruction
7782
7783/* continuation for op_float_to_long */
7784/*
7785 * Convert the float in r0 to a long in r0/r1.
7786 *
7787 * We have to clip values to long min/max per the specification. The
7788 * expected common case is a "reasonable" value that converts directly
7789 * to modest integer. The EABI convert function isn't doing this for us.
7790 */
7791f2l_doconv:
7792 stmfd sp!, {r4, lr}
7793 mov r1, #0x5f000000 @ (float)maxlong
7794 mov r4, r0
7795 bl __aeabi_fcmpge @ is arg >= maxlong?
7796 cmp r0, #0 @ nonzero == yes
7797 mvnne r0, #0 @ return maxlong (7fffffff)
7798 mvnne r1, #0x80000000
7799 ldmnefd sp!, {r4, pc}
7800
7801 mov r0, r4 @ recover arg
7802 mov r1, #0xdf000000 @ (float)minlong
7803 bl __aeabi_fcmple @ is arg <= minlong?
7804 cmp r0, #0 @ nonzero == yes
7805 movne r0, #0 @ return minlong (80000000)
7806 movne r1, #0x80000000
7807 ldmnefd sp!, {r4, pc}
7808
7809 mov r0, r4 @ recover arg
7810 mov r1, r4
7811 bl __aeabi_fcmpeq @ is arg == self?
7812 cmp r0, #0 @ zero == no
7813 moveq r1, #0 @ return zero for NaN
7814 ldmeqfd sp!, {r4, pc}
7815
7816 mov r0, r4 @ recover arg
7817 bl __aeabi_f2lz @ convert float to long
7818 ldmfd sp!, {r4, pc}
7819
7820/* continuation for op_double_to_long */
7821/*
7822 * Convert the double in r0/r1 to a long in r0/r1.
7823 *
7824 * We have to clip values to long min/max per the specification. The
7825 * expected common case is a "reasonable" value that converts directly
7826 * to modest integer. The EABI convert function isn't doing this for us.
7827 */
7828d2l_doconv:
7829 stmfd sp!, {r4, r5, lr} @ save regs
7830 mov r3, #0x43000000 @ maxlong, as a double (high word)
7831 add r3, #0x00e00000 @ 0x43e00000
7832 mov r2, #0 @ maxlong, as a double (low word)
7833 sub sp, sp, #4 @ align for EABI
7834 mov r4, r0 @ save a copy of r0
7835 mov r5, r1 @ and r1
7836 bl __aeabi_dcmpge @ is arg >= maxlong?
7837 cmp r0, #0 @ nonzero == yes
7838 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7839 mvnne r1, #0x80000000
7840 bne 1f
7841
7842 mov r0, r4 @ recover arg
7843 mov r1, r5
7844 mov r3, #0xc3000000 @ minlong, as a double (high word)
7845 add r3, #0x00e00000 @ 0xc3e00000
7846 mov r2, #0 @ minlong, as a double (low word)
7847 bl __aeabi_dcmple @ is arg <= minlong?
7848 cmp r0, #0 @ nonzero == yes
7849 movne r0, #0 @ return minlong (8000000000000000)
7850 movne r1, #0x80000000
7851 bne 1f
7852
7853 mov r0, r4 @ recover arg
7854 mov r1, r5
7855 mov r2, r4 @ compare against self
7856 mov r3, r5
7857 bl __aeabi_dcmpeq @ is arg == self?
7858 cmp r0, #0 @ zero == no
7859 moveq r1, #0 @ return zero for NaN
7860 beq 1f
7861
7862 mov r0, r4 @ recover arg
7863 mov r1, r5
7864 bl __aeabi_d2lz @ convert double to long
7865
78661:
7867 add sp, sp, #4
7868 ldmfd sp!, {r4, r5, pc}
7869
7870 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7871 .global artMterpAsmSisterEnd
7872artMterpAsmSisterEnd:
7873
7874
7875 .global artMterpAsmAltInstructionStart
7876 .type artMterpAsmAltInstructionStart, %function
7877 .text
7878
7879artMterpAsmAltInstructionStart = .L_ALT_op_nop
7880/* ------------------------------ */
7881 .balign 128
7882.L_ALT_op_nop: /* 0x00 */
7883/* File: arm/alt_stub.S */
7884/*
7885 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7886 * any interesting requests and then jump to the real instruction
7887 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7888 */
7889 .extern MterpCheckBefore
7890 EXPORT_PC
7891 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7892 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7893 mov r0, rSELF
7894 add r1, rFP, #OFF_FP_SHADOWFRAME
7895 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7896
7897/* ------------------------------ */
7898 .balign 128
7899.L_ALT_op_move: /* 0x01 */
7900/* File: arm/alt_stub.S */
7901/*
7902 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7903 * any interesting requests and then jump to the real instruction
7904 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7905 */
7906 .extern MterpCheckBefore
7907 EXPORT_PC
7908 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7909 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7910 mov r0, rSELF
7911 add r1, rFP, #OFF_FP_SHADOWFRAME
7912 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7913
7914/* ------------------------------ */
7915 .balign 128
7916.L_ALT_op_move_from16: /* 0x02 */
7917/* File: arm/alt_stub.S */
7918/*
7919 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7920 * any interesting requests and then jump to the real instruction
7921 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7922 */
7923 .extern MterpCheckBefore
7924 EXPORT_PC
7925 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7926 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7927 mov r0, rSELF
7928 add r1, rFP, #OFF_FP_SHADOWFRAME
7929 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7930
7931/* ------------------------------ */
7932 .balign 128
7933.L_ALT_op_move_16: /* 0x03 */
7934/* File: arm/alt_stub.S */
7935/*
7936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7937 * any interesting requests and then jump to the real instruction
7938 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7939 */
7940 .extern MterpCheckBefore
7941 EXPORT_PC
7942 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7943 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
7944 mov r0, rSELF
7945 add r1, rFP, #OFF_FP_SHADOWFRAME
7946 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7947
7948/* ------------------------------ */
7949 .balign 128
7950.L_ALT_op_move_wide: /* 0x04 */
7951/* File: arm/alt_stub.S */
7952/*
7953 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7954 * any interesting requests and then jump to the real instruction
7955 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7956 */
7957 .extern MterpCheckBefore
7958 EXPORT_PC
7959 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7960 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
7961 mov r0, rSELF
7962 add r1, rFP, #OFF_FP_SHADOWFRAME
7963 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7964
7965/* ------------------------------ */
7966 .balign 128
7967.L_ALT_op_move_wide_from16: /* 0x05 */
7968/* File: arm/alt_stub.S */
7969/*
7970 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7971 * any interesting requests and then jump to the real instruction
7972 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7973 */
7974 .extern MterpCheckBefore
7975 EXPORT_PC
7976 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7977 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
7978 mov r0, rSELF
7979 add r1, rFP, #OFF_FP_SHADOWFRAME
7980 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7981
7982/* ------------------------------ */
7983 .balign 128
7984.L_ALT_op_move_wide_16: /* 0x06 */
7985/* File: arm/alt_stub.S */
7986/*
7987 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7988 * any interesting requests and then jump to the real instruction
7989 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7990 */
7991 .extern MterpCheckBefore
7992 EXPORT_PC
7993 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7994 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
7995 mov r0, rSELF
7996 add r1, rFP, #OFF_FP_SHADOWFRAME
7997 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7998
7999/* ------------------------------ */
8000 .balign 128
8001.L_ALT_op_move_object: /* 0x07 */
8002/* File: arm/alt_stub.S */
8003/*
8004 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8005 * any interesting requests and then jump to the real instruction
8006 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8007 */
8008 .extern MterpCheckBefore
8009 EXPORT_PC
8010 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8011 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
8012 mov r0, rSELF
8013 add r1, rFP, #OFF_FP_SHADOWFRAME
8014 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8015
8016/* ------------------------------ */
8017 .balign 128
8018.L_ALT_op_move_object_from16: /* 0x08 */
8019/* File: arm/alt_stub.S */
8020/*
8021 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8022 * any interesting requests and then jump to the real instruction
8023 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8024 */
8025 .extern MterpCheckBefore
8026 EXPORT_PC
8027 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8028 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
8029 mov r0, rSELF
8030 add r1, rFP, #OFF_FP_SHADOWFRAME
8031 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8032
8033/* ------------------------------ */
8034 .balign 128
8035.L_ALT_op_move_object_16: /* 0x09 */
8036/* File: arm/alt_stub.S */
8037/*
8038 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8039 * any interesting requests and then jump to the real instruction
8040 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8041 */
8042 .extern MterpCheckBefore
8043 EXPORT_PC
8044 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8045 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
8046 mov r0, rSELF
8047 add r1, rFP, #OFF_FP_SHADOWFRAME
8048 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8049
8050/* ------------------------------ */
8051 .balign 128
8052.L_ALT_op_move_result: /* 0x0a */
8053/* File: arm/alt_stub.S */
8054/*
8055 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8056 * any interesting requests and then jump to the real instruction
8057 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8058 */
8059 .extern MterpCheckBefore
8060 EXPORT_PC
8061 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8062 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
8063 mov r0, rSELF
8064 add r1, rFP, #OFF_FP_SHADOWFRAME
8065 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8066
8067/* ------------------------------ */
8068 .balign 128
8069.L_ALT_op_move_result_wide: /* 0x0b */
8070/* File: arm/alt_stub.S */
8071/*
8072 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8073 * any interesting requests and then jump to the real instruction
8074 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8075 */
8076 .extern MterpCheckBefore
8077 EXPORT_PC
8078 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8079 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
8080 mov r0, rSELF
8081 add r1, rFP, #OFF_FP_SHADOWFRAME
8082 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8083
8084/* ------------------------------ */
8085 .balign 128
8086.L_ALT_op_move_result_object: /* 0x0c */
8087/* File: arm/alt_stub.S */
8088/*
8089 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8090 * any interesting requests and then jump to the real instruction
8091 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8092 */
8093 .extern MterpCheckBefore
8094 EXPORT_PC
8095 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8096 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
8097 mov r0, rSELF
8098 add r1, rFP, #OFF_FP_SHADOWFRAME
8099 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8100
8101/* ------------------------------ */
8102 .balign 128
8103.L_ALT_op_move_exception: /* 0x0d */
8104/* File: arm/alt_stub.S */
8105/*
8106 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8107 * any interesting requests and then jump to the real instruction
8108 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8109 */
8110 .extern MterpCheckBefore
8111 EXPORT_PC
8112 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8113 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
8114 mov r0, rSELF
8115 add r1, rFP, #OFF_FP_SHADOWFRAME
8116 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8117
8118/* ------------------------------ */
8119 .balign 128
8120.L_ALT_op_return_void: /* 0x0e */
8121/* File: arm/alt_stub.S */
8122/*
8123 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8124 * any interesting requests and then jump to the real instruction
8125 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8126 */
8127 .extern MterpCheckBefore
8128 EXPORT_PC
8129 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8130 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
8131 mov r0, rSELF
8132 add r1, rFP, #OFF_FP_SHADOWFRAME
8133 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8134
8135/* ------------------------------ */
8136 .balign 128
8137.L_ALT_op_return: /* 0x0f */
8138/* File: arm/alt_stub.S */
8139/*
8140 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8141 * any interesting requests and then jump to the real instruction
8142 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8143 */
8144 .extern MterpCheckBefore
8145 EXPORT_PC
8146 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8147 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
8148 mov r0, rSELF
8149 add r1, rFP, #OFF_FP_SHADOWFRAME
8150 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8151
8152/* ------------------------------ */
8153 .balign 128
8154.L_ALT_op_return_wide: /* 0x10 */
8155/* File: arm/alt_stub.S */
8156/*
8157 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8158 * any interesting requests and then jump to the real instruction
8159 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8160 */
8161 .extern MterpCheckBefore
8162 EXPORT_PC
8163 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8164 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
8165 mov r0, rSELF
8166 add r1, rFP, #OFF_FP_SHADOWFRAME
8167 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8168
8169/* ------------------------------ */
8170 .balign 128
8171.L_ALT_op_return_object: /* 0x11 */
8172/* File: arm/alt_stub.S */
8173/*
8174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8175 * any interesting requests and then jump to the real instruction
8176 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8177 */
8178 .extern MterpCheckBefore
8179 EXPORT_PC
8180 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8181 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
8182 mov r0, rSELF
8183 add r1, rFP, #OFF_FP_SHADOWFRAME
8184 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8185
8186/* ------------------------------ */
8187 .balign 128
8188.L_ALT_op_const_4: /* 0x12 */
8189/* File: arm/alt_stub.S */
8190/*
8191 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8192 * any interesting requests and then jump to the real instruction
8193 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8194 */
8195 .extern MterpCheckBefore
8196 EXPORT_PC
8197 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8198 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
8199 mov r0, rSELF
8200 add r1, rFP, #OFF_FP_SHADOWFRAME
8201 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8202
8203/* ------------------------------ */
8204 .balign 128
8205.L_ALT_op_const_16: /* 0x13 */
8206/* File: arm/alt_stub.S */
8207/*
8208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8209 * any interesting requests and then jump to the real instruction
8210 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8211 */
8212 .extern MterpCheckBefore
8213 EXPORT_PC
8214 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8215 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8216 mov r0, rSELF
8217 add r1, rFP, #OFF_FP_SHADOWFRAME
8218 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8219
8220/* ------------------------------ */
8221 .balign 128
8222.L_ALT_op_const: /* 0x14 */
8223/* File: arm/alt_stub.S */
8224/*
8225 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8226 * any interesting requests and then jump to the real instruction
8227 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8228 */
8229 .extern MterpCheckBefore
8230 EXPORT_PC
8231 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8232 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8233 mov r0, rSELF
8234 add r1, rFP, #OFF_FP_SHADOWFRAME
8235 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8236
8237/* ------------------------------ */
8238 .balign 128
8239.L_ALT_op_const_high16: /* 0x15 */
8240/* File: arm/alt_stub.S */
8241/*
8242 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8243 * any interesting requests and then jump to the real instruction
8244 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8245 */
8246 .extern MterpCheckBefore
8247 EXPORT_PC
8248 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8249 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8250 mov r0, rSELF
8251 add r1, rFP, #OFF_FP_SHADOWFRAME
8252 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8253
8254/* ------------------------------ */
8255 .balign 128
8256.L_ALT_op_const_wide_16: /* 0x16 */
8257/* File: arm/alt_stub.S */
8258/*
8259 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8260 * any interesting requests and then jump to the real instruction
8261 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8262 */
8263 .extern MterpCheckBefore
8264 EXPORT_PC
8265 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8266 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8267 mov r0, rSELF
8268 add r1, rFP, #OFF_FP_SHADOWFRAME
8269 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8270
8271/* ------------------------------ */
8272 .balign 128
8273.L_ALT_op_const_wide_32: /* 0x17 */
8274/* File: arm/alt_stub.S */
8275/*
8276 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8277 * any interesting requests and then jump to the real instruction
8278 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8279 */
8280 .extern MterpCheckBefore
8281 EXPORT_PC
8282 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8283 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8284 mov r0, rSELF
8285 add r1, rFP, #OFF_FP_SHADOWFRAME
8286 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8287
8288/* ------------------------------ */
8289 .balign 128
8290.L_ALT_op_const_wide: /* 0x18 */
8291/* File: arm/alt_stub.S */
8292/*
8293 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8294 * any interesting requests and then jump to the real instruction
8295 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8296 */
8297 .extern MterpCheckBefore
8298 EXPORT_PC
8299 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8300 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8301 mov r0, rSELF
8302 add r1, rFP, #OFF_FP_SHADOWFRAME
8303 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8304
8305/* ------------------------------ */
8306 .balign 128
8307.L_ALT_op_const_wide_high16: /* 0x19 */
8308/* File: arm/alt_stub.S */
8309/*
8310 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8311 * any interesting requests and then jump to the real instruction
8312 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8313 */
8314 .extern MterpCheckBefore
8315 EXPORT_PC
8316 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8317 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8318 mov r0, rSELF
8319 add r1, rFP, #OFF_FP_SHADOWFRAME
8320 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8321
8322/* ------------------------------ */
8323 .balign 128
8324.L_ALT_op_const_string: /* 0x1a */
8325/* File: arm/alt_stub.S */
8326/*
8327 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8328 * any interesting requests and then jump to the real instruction
8329 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8330 */
8331 .extern MterpCheckBefore
8332 EXPORT_PC
8333 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8334 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8335 mov r0, rSELF
8336 add r1, rFP, #OFF_FP_SHADOWFRAME
8337 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8338
8339/* ------------------------------ */
8340 .balign 128
8341.L_ALT_op_const_string_jumbo: /* 0x1b */
8342/* File: arm/alt_stub.S */
8343/*
8344 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8345 * any interesting requests and then jump to the real instruction
8346 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8347 */
8348 .extern MterpCheckBefore
8349 EXPORT_PC
8350 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8351 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8352 mov r0, rSELF
8353 add r1, rFP, #OFF_FP_SHADOWFRAME
8354 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8355
8356/* ------------------------------ */
8357 .balign 128
8358.L_ALT_op_const_class: /* 0x1c */
8359/* File: arm/alt_stub.S */
8360/*
8361 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8362 * any interesting requests and then jump to the real instruction
8363 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8364 */
8365 .extern MterpCheckBefore
8366 EXPORT_PC
8367 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8368 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8369 mov r0, rSELF
8370 add r1, rFP, #OFF_FP_SHADOWFRAME
8371 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8372
8373/* ------------------------------ */
8374 .balign 128
8375.L_ALT_op_monitor_enter: /* 0x1d */
8376/* File: arm/alt_stub.S */
8377/*
8378 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8379 * any interesting requests and then jump to the real instruction
8380 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8381 */
8382 .extern MterpCheckBefore
8383 EXPORT_PC
8384 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8385 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8386 mov r0, rSELF
8387 add r1, rFP, #OFF_FP_SHADOWFRAME
8388 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8389
8390/* ------------------------------ */
8391 .balign 128
8392.L_ALT_op_monitor_exit: /* 0x1e */
8393/* File: arm/alt_stub.S */
8394/*
8395 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8396 * any interesting requests and then jump to the real instruction
8397 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8398 */
8399 .extern MterpCheckBefore
8400 EXPORT_PC
8401 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8402 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8403 mov r0, rSELF
8404 add r1, rFP, #OFF_FP_SHADOWFRAME
8405 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8406
8407/* ------------------------------ */
8408 .balign 128
8409.L_ALT_op_check_cast: /* 0x1f */
8410/* File: arm/alt_stub.S */
8411/*
8412 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8413 * any interesting requests and then jump to the real instruction
8414 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8415 */
8416 .extern MterpCheckBefore
8417 EXPORT_PC
8418 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8419 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8420 mov r0, rSELF
8421 add r1, rFP, #OFF_FP_SHADOWFRAME
8422 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8423
8424/* ------------------------------ */
8425 .balign 128
8426.L_ALT_op_instance_of: /* 0x20 */
8427/* File: arm/alt_stub.S */
8428/*
8429 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8430 * any interesting requests and then jump to the real instruction
8431 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8432 */
8433 .extern MterpCheckBefore
8434 EXPORT_PC
8435 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8436 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8437 mov r0, rSELF
8438 add r1, rFP, #OFF_FP_SHADOWFRAME
8439 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8440
8441/* ------------------------------ */
8442 .balign 128
8443.L_ALT_op_array_length: /* 0x21 */
8444/* File: arm/alt_stub.S */
8445/*
8446 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8447 * any interesting requests and then jump to the real instruction
8448 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8449 */
8450 .extern MterpCheckBefore
8451 EXPORT_PC
8452 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8453 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8454 mov r0, rSELF
8455 add r1, rFP, #OFF_FP_SHADOWFRAME
8456 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8457
8458/* ------------------------------ */
8459 .balign 128
8460.L_ALT_op_new_instance: /* 0x22 */
8461/* File: arm/alt_stub.S */
8462/*
8463 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8464 * any interesting requests and then jump to the real instruction
8465 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8466 */
8467 .extern MterpCheckBefore
8468 EXPORT_PC
8469 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8470 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8471 mov r0, rSELF
8472 add r1, rFP, #OFF_FP_SHADOWFRAME
8473 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8474
8475/* ------------------------------ */
8476 .balign 128
8477.L_ALT_op_new_array: /* 0x23 */
8478/* File: arm/alt_stub.S */
8479/*
8480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8481 * any interesting requests and then jump to the real instruction
8482 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8483 */
8484 .extern MterpCheckBefore
8485 EXPORT_PC
8486 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8487 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8488 mov r0, rSELF
8489 add r1, rFP, #OFF_FP_SHADOWFRAME
8490 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8491
8492/* ------------------------------ */
8493 .balign 128
8494.L_ALT_op_filled_new_array: /* 0x24 */
8495/* File: arm/alt_stub.S */
8496/*
8497 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8498 * any interesting requests and then jump to the real instruction
8499 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8500 */
8501 .extern MterpCheckBefore
8502 EXPORT_PC
8503 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8504 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8505 mov r0, rSELF
8506 add r1, rFP, #OFF_FP_SHADOWFRAME
8507 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8508
8509/* ------------------------------ */
8510 .balign 128
8511.L_ALT_op_filled_new_array_range: /* 0x25 */
8512/* File: arm/alt_stub.S */
8513/*
8514 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8515 * any interesting requests and then jump to the real instruction
8516 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8517 */
8518 .extern MterpCheckBefore
8519 EXPORT_PC
8520 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8521 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8522 mov r0, rSELF
8523 add r1, rFP, #OFF_FP_SHADOWFRAME
8524 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8525
8526/* ------------------------------ */
8527 .balign 128
8528.L_ALT_op_fill_array_data: /* 0x26 */
8529/* File: arm/alt_stub.S */
8530/*
8531 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8532 * any interesting requests and then jump to the real instruction
8533 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8534 */
8535 .extern MterpCheckBefore
8536 EXPORT_PC
8537 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8538 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8539 mov r0, rSELF
8540 add r1, rFP, #OFF_FP_SHADOWFRAME
8541 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8542
8543/* ------------------------------ */
8544 .balign 128
8545.L_ALT_op_throw: /* 0x27 */
8546/* File: arm/alt_stub.S */
8547/*
8548 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8549 * any interesting requests and then jump to the real instruction
8550 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8551 */
8552 .extern MterpCheckBefore
8553 EXPORT_PC
8554 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8555 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8556 mov r0, rSELF
8557 add r1, rFP, #OFF_FP_SHADOWFRAME
8558 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8559
8560/* ------------------------------ */
8561 .balign 128
8562.L_ALT_op_goto: /* 0x28 */
8563/* File: arm/alt_stub.S */
8564/*
8565 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8566 * any interesting requests and then jump to the real instruction
8567 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8568 */
8569 .extern MterpCheckBefore
8570 EXPORT_PC
8571 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8572 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8573 mov r0, rSELF
8574 add r1, rFP, #OFF_FP_SHADOWFRAME
8575 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8576
8577/* ------------------------------ */
8578 .balign 128
8579.L_ALT_op_goto_16: /* 0x29 */
8580/* File: arm/alt_stub.S */
8581/*
8582 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8583 * any interesting requests and then jump to the real instruction
8584 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8585 */
8586 .extern MterpCheckBefore
8587 EXPORT_PC
8588 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8589 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8590 mov r0, rSELF
8591 add r1, rFP, #OFF_FP_SHADOWFRAME
8592 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8593
8594/* ------------------------------ */
8595 .balign 128
8596.L_ALT_op_goto_32: /* 0x2a */
8597/* File: arm/alt_stub.S */
8598/*
8599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8600 * any interesting requests and then jump to the real instruction
8601 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8602 */
8603 .extern MterpCheckBefore
8604 EXPORT_PC
8605 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8606 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8607 mov r0, rSELF
8608 add r1, rFP, #OFF_FP_SHADOWFRAME
8609 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8610
8611/* ------------------------------ */
8612 .balign 128
8613.L_ALT_op_packed_switch: /* 0x2b */
8614/* File: arm/alt_stub.S */
8615/*
8616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8617 * any interesting requests and then jump to the real instruction
8618 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8619 */
8620 .extern MterpCheckBefore
8621 EXPORT_PC
8622 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8623 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8624 mov r0, rSELF
8625 add r1, rFP, #OFF_FP_SHADOWFRAME
8626 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8627
8628/* ------------------------------ */
8629 .balign 128
8630.L_ALT_op_sparse_switch: /* 0x2c */
8631/* File: arm/alt_stub.S */
8632/*
8633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8634 * any interesting requests and then jump to the real instruction
8635 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8636 */
8637 .extern MterpCheckBefore
8638 EXPORT_PC
8639 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8640 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8641 mov r0, rSELF
8642 add r1, rFP, #OFF_FP_SHADOWFRAME
8643 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8644
8645/* ------------------------------ */
8646 .balign 128
8647.L_ALT_op_cmpl_float: /* 0x2d */
8648/* File: arm/alt_stub.S */
8649/*
8650 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8651 * any interesting requests and then jump to the real instruction
8652 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8653 */
8654 .extern MterpCheckBefore
8655 EXPORT_PC
8656 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8657 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8658 mov r0, rSELF
8659 add r1, rFP, #OFF_FP_SHADOWFRAME
8660 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8661
8662/* ------------------------------ */
8663 .balign 128
8664.L_ALT_op_cmpg_float: /* 0x2e */
8665/* File: arm/alt_stub.S */
8666/*
8667 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8668 * any interesting requests and then jump to the real instruction
8669 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8670 */
8671 .extern MterpCheckBefore
8672 EXPORT_PC
8673 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8674 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8675 mov r0, rSELF
8676 add r1, rFP, #OFF_FP_SHADOWFRAME
8677 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8678
8679/* ------------------------------ */
8680 .balign 128
8681.L_ALT_op_cmpl_double: /* 0x2f */
8682/* File: arm/alt_stub.S */
8683/*
8684 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8685 * any interesting requests and then jump to the real instruction
8686 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8687 */
8688 .extern MterpCheckBefore
8689 EXPORT_PC
8690 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8691 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8692 mov r0, rSELF
8693 add r1, rFP, #OFF_FP_SHADOWFRAME
8694 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8695
8696/* ------------------------------ */
8697 .balign 128
8698.L_ALT_op_cmpg_double: /* 0x30 */
8699/* File: arm/alt_stub.S */
8700/*
8701 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8702 * any interesting requests and then jump to the real instruction
8703 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8704 */
8705 .extern MterpCheckBefore
8706 EXPORT_PC
8707 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8708 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8709 mov r0, rSELF
8710 add r1, rFP, #OFF_FP_SHADOWFRAME
8711 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8712
8713/* ------------------------------ */
8714 .balign 128
8715.L_ALT_op_cmp_long: /* 0x31 */
8716/* File: arm/alt_stub.S */
8717/*
8718 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8719 * any interesting requests and then jump to the real instruction
8720 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8721 */
8722 .extern MterpCheckBefore
8723 EXPORT_PC
8724 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8725 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8726 mov r0, rSELF
8727 add r1, rFP, #OFF_FP_SHADOWFRAME
8728 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8729
8730/* ------------------------------ */
8731 .balign 128
8732.L_ALT_op_if_eq: /* 0x32 */
8733/* File: arm/alt_stub.S */
8734/*
8735 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8736 * any interesting requests and then jump to the real instruction
8737 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8738 */
8739 .extern MterpCheckBefore
8740 EXPORT_PC
8741 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8742 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8743 mov r0, rSELF
8744 add r1, rFP, #OFF_FP_SHADOWFRAME
8745 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8746
8747/* ------------------------------ */
8748 .balign 128
8749.L_ALT_op_if_ne: /* 0x33 */
8750/* File: arm/alt_stub.S */
8751/*
8752 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8753 * any interesting requests and then jump to the real instruction
8754 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8755 */
8756 .extern MterpCheckBefore
8757 EXPORT_PC
8758 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8759 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8760 mov r0, rSELF
8761 add r1, rFP, #OFF_FP_SHADOWFRAME
8762 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8763
8764/* ------------------------------ */
8765 .balign 128
8766.L_ALT_op_if_lt: /* 0x34 */
8767/* File: arm/alt_stub.S */
8768/*
8769 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8770 * any interesting requests and then jump to the real instruction
8771 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8772 */
8773 .extern MterpCheckBefore
8774 EXPORT_PC
8775 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8776 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8777 mov r0, rSELF
8778 add r1, rFP, #OFF_FP_SHADOWFRAME
8779 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8780
8781/* ------------------------------ */
8782 .balign 128
8783.L_ALT_op_if_ge: /* 0x35 */
8784/* File: arm/alt_stub.S */
8785/*
8786 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8787 * any interesting requests and then jump to the real instruction
8788 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8789 */
8790 .extern MterpCheckBefore
8791 EXPORT_PC
8792 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8793 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8794 mov r0, rSELF
8795 add r1, rFP, #OFF_FP_SHADOWFRAME
8796 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8797
8798/* ------------------------------ */
8799 .balign 128
8800.L_ALT_op_if_gt: /* 0x36 */
8801/* File: arm/alt_stub.S */
8802/*
8803 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8804 * any interesting requests and then jump to the real instruction
8805 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8806 */
8807 .extern MterpCheckBefore
8808 EXPORT_PC
8809 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8810 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8811 mov r0, rSELF
8812 add r1, rFP, #OFF_FP_SHADOWFRAME
8813 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8814
8815/* ------------------------------ */
8816 .balign 128
8817.L_ALT_op_if_le: /* 0x37 */
8818/* File: arm/alt_stub.S */
8819/*
8820 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8821 * any interesting requests and then jump to the real instruction
8822 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8823 */
8824 .extern MterpCheckBefore
8825 EXPORT_PC
8826 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8827 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8828 mov r0, rSELF
8829 add r1, rFP, #OFF_FP_SHADOWFRAME
8830 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8831
8832/* ------------------------------ */
8833 .balign 128
8834.L_ALT_op_if_eqz: /* 0x38 */
8835/* File: arm/alt_stub.S */
8836/*
8837 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8838 * any interesting requests and then jump to the real instruction
8839 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8840 */
8841 .extern MterpCheckBefore
8842 EXPORT_PC
8843 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8844 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8845 mov r0, rSELF
8846 add r1, rFP, #OFF_FP_SHADOWFRAME
8847 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8848
8849/* ------------------------------ */
8850 .balign 128
8851.L_ALT_op_if_nez: /* 0x39 */
8852/* File: arm/alt_stub.S */
8853/*
8854 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8855 * any interesting requests and then jump to the real instruction
8856 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8857 */
8858 .extern MterpCheckBefore
8859 EXPORT_PC
8860 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8861 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8862 mov r0, rSELF
8863 add r1, rFP, #OFF_FP_SHADOWFRAME
8864 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8865
8866/* ------------------------------ */
8867 .balign 128
8868.L_ALT_op_if_ltz: /* 0x3a */
8869/* File: arm/alt_stub.S */
8870/*
8871 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8872 * any interesting requests and then jump to the real instruction
8873 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8874 */
8875 .extern MterpCheckBefore
8876 EXPORT_PC
8877 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8878 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8879 mov r0, rSELF
8880 add r1, rFP, #OFF_FP_SHADOWFRAME
8881 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8882
8883/* ------------------------------ */
8884 .balign 128
8885.L_ALT_op_if_gez: /* 0x3b */
8886/* File: arm/alt_stub.S */
8887/*
8888 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8889 * any interesting requests and then jump to the real instruction
8890 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8891 */
8892 .extern MterpCheckBefore
8893 EXPORT_PC
8894 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8895 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8896 mov r0, rSELF
8897 add r1, rFP, #OFF_FP_SHADOWFRAME
8898 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8899
8900/* ------------------------------ */
8901 .balign 128
8902.L_ALT_op_if_gtz: /* 0x3c */
8903/* File: arm/alt_stub.S */
8904/*
8905 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8906 * any interesting requests and then jump to the real instruction
8907 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8908 */
8909 .extern MterpCheckBefore
8910 EXPORT_PC
8911 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8912 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8913 mov r0, rSELF
8914 add r1, rFP, #OFF_FP_SHADOWFRAME
8915 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8916
8917/* ------------------------------ */
8918 .balign 128
8919.L_ALT_op_if_lez: /* 0x3d */
8920/* File: arm/alt_stub.S */
8921/*
8922 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8923 * any interesting requests and then jump to the real instruction
8924 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8925 */
8926 .extern MterpCheckBefore
8927 EXPORT_PC
8928 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8929 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8930 mov r0, rSELF
8931 add r1, rFP, #OFF_FP_SHADOWFRAME
8932 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8933
8934/* ------------------------------ */
8935 .balign 128
8936.L_ALT_op_unused_3e: /* 0x3e */
8937/* File: arm/alt_stub.S */
8938/*
8939 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8940 * any interesting requests and then jump to the real instruction
8941 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8942 */
8943 .extern MterpCheckBefore
8944 EXPORT_PC
8945 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8946 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
8947 mov r0, rSELF
8948 add r1, rFP, #OFF_FP_SHADOWFRAME
8949 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8950
8951/* ------------------------------ */
8952 .balign 128
8953.L_ALT_op_unused_3f: /* 0x3f */
8954/* File: arm/alt_stub.S */
8955/*
8956 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8957 * any interesting requests and then jump to the real instruction
8958 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8959 */
8960 .extern MterpCheckBefore
8961 EXPORT_PC
8962 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8963 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
8964 mov r0, rSELF
8965 add r1, rFP, #OFF_FP_SHADOWFRAME
8966 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8967
8968/* ------------------------------ */
8969 .balign 128
8970.L_ALT_op_unused_40: /* 0x40 */
8971/* File: arm/alt_stub.S */
8972/*
8973 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8974 * any interesting requests and then jump to the real instruction
8975 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8976 */
8977 .extern MterpCheckBefore
8978 EXPORT_PC
8979 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8980 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
8981 mov r0, rSELF
8982 add r1, rFP, #OFF_FP_SHADOWFRAME
8983 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8984
8985/* ------------------------------ */
8986 .balign 128
8987.L_ALT_op_unused_41: /* 0x41 */
8988/* File: arm/alt_stub.S */
8989/*
8990 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8991 * any interesting requests and then jump to the real instruction
8992 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8993 */
8994 .extern MterpCheckBefore
8995 EXPORT_PC
8996 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8997 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
8998 mov r0, rSELF
8999 add r1, rFP, #OFF_FP_SHADOWFRAME
9000 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9001
9002/* ------------------------------ */
9003 .balign 128
9004.L_ALT_op_unused_42: /* 0x42 */
9005/* File: arm/alt_stub.S */
9006/*
9007 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9008 * any interesting requests and then jump to the real instruction
9009 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9010 */
9011 .extern MterpCheckBefore
9012 EXPORT_PC
9013 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9014 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
9015 mov r0, rSELF
9016 add r1, rFP, #OFF_FP_SHADOWFRAME
9017 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9018
9019/* ------------------------------ */
9020 .balign 128
9021.L_ALT_op_unused_43: /* 0x43 */
9022/* File: arm/alt_stub.S */
9023/*
9024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9025 * any interesting requests and then jump to the real instruction
9026 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9027 */
9028 .extern MterpCheckBefore
9029 EXPORT_PC
9030 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9031 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
9032 mov r0, rSELF
9033 add r1, rFP, #OFF_FP_SHADOWFRAME
9034 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9035
9036/* ------------------------------ */
9037 .balign 128
9038.L_ALT_op_aget: /* 0x44 */
9039/* File: arm/alt_stub.S */
9040/*
9041 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9042 * any interesting requests and then jump to the real instruction
9043 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9044 */
9045 .extern MterpCheckBefore
9046 EXPORT_PC
9047 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9048 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
9049 mov r0, rSELF
9050 add r1, rFP, #OFF_FP_SHADOWFRAME
9051 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9052
9053/* ------------------------------ */
9054 .balign 128
9055.L_ALT_op_aget_wide: /* 0x45 */
9056/* File: arm/alt_stub.S */
9057/*
9058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9059 * any interesting requests and then jump to the real instruction
9060 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9061 */
9062 .extern MterpCheckBefore
9063 EXPORT_PC
9064 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9065 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
9066 mov r0, rSELF
9067 add r1, rFP, #OFF_FP_SHADOWFRAME
9068 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9069
9070/* ------------------------------ */
9071 .balign 128
9072.L_ALT_op_aget_object: /* 0x46 */
9073/* File: arm/alt_stub.S */
9074/*
9075 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9076 * any interesting requests and then jump to the real instruction
9077 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9078 */
9079 .extern MterpCheckBefore
9080 EXPORT_PC
9081 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9082 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
9083 mov r0, rSELF
9084 add r1, rFP, #OFF_FP_SHADOWFRAME
9085 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9086
9087/* ------------------------------ */
9088 .balign 128
9089.L_ALT_op_aget_boolean: /* 0x47 */
9090/* File: arm/alt_stub.S */
9091/*
9092 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9093 * any interesting requests and then jump to the real instruction
9094 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9095 */
9096 .extern MterpCheckBefore
9097 EXPORT_PC
9098 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9099 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
9100 mov r0, rSELF
9101 add r1, rFP, #OFF_FP_SHADOWFRAME
9102 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9103
9104/* ------------------------------ */
9105 .balign 128
9106.L_ALT_op_aget_byte: /* 0x48 */
9107/* File: arm/alt_stub.S */
9108/*
9109 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9110 * any interesting requests and then jump to the real instruction
9111 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9112 */
9113 .extern MterpCheckBefore
9114 EXPORT_PC
9115 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9116 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
9117 mov r0, rSELF
9118 add r1, rFP, #OFF_FP_SHADOWFRAME
9119 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9120
9121/* ------------------------------ */
9122 .balign 128
9123.L_ALT_op_aget_char: /* 0x49 */
9124/* File: arm/alt_stub.S */
9125/*
9126 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9127 * any interesting requests and then jump to the real instruction
9128 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9129 */
9130 .extern MterpCheckBefore
9131 EXPORT_PC
9132 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9133 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
9134 mov r0, rSELF
9135 add r1, rFP, #OFF_FP_SHADOWFRAME
9136 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9137
9138/* ------------------------------ */
9139 .balign 128
9140.L_ALT_op_aget_short: /* 0x4a */
9141/* File: arm/alt_stub.S */
9142/*
9143 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9144 * any interesting requests and then jump to the real instruction
9145 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9146 */
9147 .extern MterpCheckBefore
9148 EXPORT_PC
9149 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9150 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
9151 mov r0, rSELF
9152 add r1, rFP, #OFF_FP_SHADOWFRAME
9153 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9154
9155/* ------------------------------ */
9156 .balign 128
9157.L_ALT_op_aput: /* 0x4b */
9158/* File: arm/alt_stub.S */
9159/*
9160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9161 * any interesting requests and then jump to the real instruction
9162 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9163 */
9164 .extern MterpCheckBefore
9165 EXPORT_PC
9166 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9167 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
9168 mov r0, rSELF
9169 add r1, rFP, #OFF_FP_SHADOWFRAME
9170 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9171
9172/* ------------------------------ */
9173 .balign 128
9174.L_ALT_op_aput_wide: /* 0x4c */
9175/* File: arm/alt_stub.S */
9176/*
9177 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9178 * any interesting requests and then jump to the real instruction
9179 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9180 */
9181 .extern MterpCheckBefore
9182 EXPORT_PC
9183 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9184 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
9185 mov r0, rSELF
9186 add r1, rFP, #OFF_FP_SHADOWFRAME
9187 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9188
9189/* ------------------------------ */
9190 .balign 128
9191.L_ALT_op_aput_object: /* 0x4d */
9192/* File: arm/alt_stub.S */
9193/*
9194 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9195 * any interesting requests and then jump to the real instruction
9196 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9197 */
9198 .extern MterpCheckBefore
9199 EXPORT_PC
9200 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9201 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
9202 mov r0, rSELF
9203 add r1, rFP, #OFF_FP_SHADOWFRAME
9204 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9205
9206/* ------------------------------ */
9207 .balign 128
9208.L_ALT_op_aput_boolean: /* 0x4e */
9209/* File: arm/alt_stub.S */
9210/*
9211 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9212 * any interesting requests and then jump to the real instruction
9213 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9214 */
9215 .extern MterpCheckBefore
9216 EXPORT_PC
9217 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9218 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9219 mov r0, rSELF
9220 add r1, rFP, #OFF_FP_SHADOWFRAME
9221 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9222
9223/* ------------------------------ */
9224 .balign 128
9225.L_ALT_op_aput_byte: /* 0x4f */
9226/* File: arm/alt_stub.S */
9227/*
9228 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9229 * any interesting requests and then jump to the real instruction
9230 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9231 */
9232 .extern MterpCheckBefore
9233 EXPORT_PC
9234 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9235 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9236 mov r0, rSELF
9237 add r1, rFP, #OFF_FP_SHADOWFRAME
9238 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9239
9240/* ------------------------------ */
9241 .balign 128
9242.L_ALT_op_aput_char: /* 0x50 */
9243/* File: arm/alt_stub.S */
9244/*
9245 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9246 * any interesting requests and then jump to the real instruction
9247 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9248 */
9249 .extern MterpCheckBefore
9250 EXPORT_PC
9251 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9252 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9253 mov r0, rSELF
9254 add r1, rFP, #OFF_FP_SHADOWFRAME
9255 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9256
9257/* ------------------------------ */
9258 .balign 128
9259.L_ALT_op_aput_short: /* 0x51 */
9260/* File: arm/alt_stub.S */
9261/*
9262 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9263 * any interesting requests and then jump to the real instruction
9264 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9265 */
9266 .extern MterpCheckBefore
9267 EXPORT_PC
9268 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9269 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9270 mov r0, rSELF
9271 add r1, rFP, #OFF_FP_SHADOWFRAME
9272 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9273
9274/* ------------------------------ */
9275 .balign 128
9276.L_ALT_op_iget: /* 0x52 */
9277/* File: arm/alt_stub.S */
9278/*
9279 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9280 * any interesting requests and then jump to the real instruction
9281 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9282 */
9283 .extern MterpCheckBefore
9284 EXPORT_PC
9285 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9286 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9287 mov r0, rSELF
9288 add r1, rFP, #OFF_FP_SHADOWFRAME
9289 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9290
9291/* ------------------------------ */
9292 .balign 128
9293.L_ALT_op_iget_wide: /* 0x53 */
9294/* File: arm/alt_stub.S */
9295/*
9296 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9297 * any interesting requests and then jump to the real instruction
9298 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9299 */
9300 .extern MterpCheckBefore
9301 EXPORT_PC
9302 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9303 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9304 mov r0, rSELF
9305 add r1, rFP, #OFF_FP_SHADOWFRAME
9306 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9307
9308/* ------------------------------ */
9309 .balign 128
9310.L_ALT_op_iget_object: /* 0x54 */
9311/* File: arm/alt_stub.S */
9312/*
9313 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9314 * any interesting requests and then jump to the real instruction
9315 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9316 */
9317 .extern MterpCheckBefore
9318 EXPORT_PC
9319 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9320 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9321 mov r0, rSELF
9322 add r1, rFP, #OFF_FP_SHADOWFRAME
9323 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9324
9325/* ------------------------------ */
9326 .balign 128
9327.L_ALT_op_iget_boolean: /* 0x55 */
9328/* File: arm/alt_stub.S */
9329/*
9330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9331 * any interesting requests and then jump to the real instruction
9332 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9333 */
9334 .extern MterpCheckBefore
9335 EXPORT_PC
9336 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9337 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9338 mov r0, rSELF
9339 add r1, rFP, #OFF_FP_SHADOWFRAME
9340 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9341
9342/* ------------------------------ */
9343 .balign 128
9344.L_ALT_op_iget_byte: /* 0x56 */
9345/* File: arm/alt_stub.S */
9346/*
9347 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9348 * any interesting requests and then jump to the real instruction
9349 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9350 */
9351 .extern MterpCheckBefore
9352 EXPORT_PC
9353 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9354 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9355 mov r0, rSELF
9356 add r1, rFP, #OFF_FP_SHADOWFRAME
9357 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9358
9359/* ------------------------------ */
9360 .balign 128
9361.L_ALT_op_iget_char: /* 0x57 */
9362/* File: arm/alt_stub.S */
9363/*
9364 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9365 * any interesting requests and then jump to the real instruction
9366 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9367 */
9368 .extern MterpCheckBefore
9369 EXPORT_PC
9370 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9371 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9372 mov r0, rSELF
9373 add r1, rFP, #OFF_FP_SHADOWFRAME
9374 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9375
9376/* ------------------------------ */
9377 .balign 128
9378.L_ALT_op_iget_short: /* 0x58 */
9379/* File: arm/alt_stub.S */
9380/*
9381 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9382 * any interesting requests and then jump to the real instruction
9383 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9384 */
9385 .extern MterpCheckBefore
9386 EXPORT_PC
9387 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9388 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9389 mov r0, rSELF
9390 add r1, rFP, #OFF_FP_SHADOWFRAME
9391 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9392
9393/* ------------------------------ */
9394 .balign 128
9395.L_ALT_op_iput: /* 0x59 */
9396/* File: arm/alt_stub.S */
9397/*
9398 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9399 * any interesting requests and then jump to the real instruction
9400 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9401 */
9402 .extern MterpCheckBefore
9403 EXPORT_PC
9404 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9405 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9406 mov r0, rSELF
9407 add r1, rFP, #OFF_FP_SHADOWFRAME
9408 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9409
9410/* ------------------------------ */
9411 .balign 128
9412.L_ALT_op_iput_wide: /* 0x5a */
9413/* File: arm/alt_stub.S */
9414/*
9415 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9416 * any interesting requests and then jump to the real instruction
9417 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9418 */
9419 .extern MterpCheckBefore
9420 EXPORT_PC
9421 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9422 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9423 mov r0, rSELF
9424 add r1, rFP, #OFF_FP_SHADOWFRAME
9425 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9426
9427/* ------------------------------ */
9428 .balign 128
9429.L_ALT_op_iput_object: /* 0x5b */
9430/* File: arm/alt_stub.S */
9431/*
9432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9433 * any interesting requests and then jump to the real instruction
9434 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9435 */
9436 .extern MterpCheckBefore
9437 EXPORT_PC
9438 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9439 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9440 mov r0, rSELF
9441 add r1, rFP, #OFF_FP_SHADOWFRAME
9442 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9443
9444/* ------------------------------ */
9445 .balign 128
9446.L_ALT_op_iput_boolean: /* 0x5c */
9447/* File: arm/alt_stub.S */
9448/*
9449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9450 * any interesting requests and then jump to the real instruction
9451 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9452 */
9453 .extern MterpCheckBefore
9454 EXPORT_PC
9455 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9456 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9457 mov r0, rSELF
9458 add r1, rFP, #OFF_FP_SHADOWFRAME
9459 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9460
9461/* ------------------------------ */
9462 .balign 128
9463.L_ALT_op_iput_byte: /* 0x5d */
9464/* File: arm/alt_stub.S */
9465/*
9466 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9467 * any interesting requests and then jump to the real instruction
9468 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9469 */
9470 .extern MterpCheckBefore
9471 EXPORT_PC
9472 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9473 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9474 mov r0, rSELF
9475 add r1, rFP, #OFF_FP_SHADOWFRAME
9476 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9477
9478/* ------------------------------ */
9479 .balign 128
9480.L_ALT_op_iput_char: /* 0x5e */
9481/* File: arm/alt_stub.S */
9482/*
9483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9484 * any interesting requests and then jump to the real instruction
9485 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9486 */
9487 .extern MterpCheckBefore
9488 EXPORT_PC
9489 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9490 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9491 mov r0, rSELF
9492 add r1, rFP, #OFF_FP_SHADOWFRAME
9493 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9494
9495/* ------------------------------ */
9496 .balign 128
9497.L_ALT_op_iput_short: /* 0x5f */
9498/* File: arm/alt_stub.S */
9499/*
9500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9501 * any interesting requests and then jump to the real instruction
9502 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9503 */
9504 .extern MterpCheckBefore
9505 EXPORT_PC
9506 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9507 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9508 mov r0, rSELF
9509 add r1, rFP, #OFF_FP_SHADOWFRAME
9510 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9511
9512/* ------------------------------ */
9513 .balign 128
9514.L_ALT_op_sget: /* 0x60 */
9515/* File: arm/alt_stub.S */
9516/*
9517 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9518 * any interesting requests and then jump to the real instruction
9519 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9520 */
9521 .extern MterpCheckBefore
9522 EXPORT_PC
9523 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9524 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9525 mov r0, rSELF
9526 add r1, rFP, #OFF_FP_SHADOWFRAME
9527 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9528
9529/* ------------------------------ */
9530 .balign 128
9531.L_ALT_op_sget_wide: /* 0x61 */
9532/* File: arm/alt_stub.S */
9533/*
9534 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9535 * any interesting requests and then jump to the real instruction
9536 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9537 */
9538 .extern MterpCheckBefore
9539 EXPORT_PC
9540 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9541 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9542 mov r0, rSELF
9543 add r1, rFP, #OFF_FP_SHADOWFRAME
9544 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9545
9546/* ------------------------------ */
9547 .balign 128
9548.L_ALT_op_sget_object: /* 0x62 */
9549/* File: arm/alt_stub.S */
9550/*
9551 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9552 * any interesting requests and then jump to the real instruction
9553 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9554 */
9555 .extern MterpCheckBefore
9556 EXPORT_PC
9557 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9558 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9559 mov r0, rSELF
9560 add r1, rFP, #OFF_FP_SHADOWFRAME
9561 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9562
9563/* ------------------------------ */
9564 .balign 128
9565.L_ALT_op_sget_boolean: /* 0x63 */
9566/* File: arm/alt_stub.S */
9567/*
9568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9569 * any interesting requests and then jump to the real instruction
9570 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9571 */
9572 .extern MterpCheckBefore
9573 EXPORT_PC
9574 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9575 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9576 mov r0, rSELF
9577 add r1, rFP, #OFF_FP_SHADOWFRAME
9578 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9579
9580/* ------------------------------ */
9581 .balign 128
9582.L_ALT_op_sget_byte: /* 0x64 */
9583/* File: arm/alt_stub.S */
9584/*
9585 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9586 * any interesting requests and then jump to the real instruction
9587 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9588 */
9589 .extern MterpCheckBefore
9590 EXPORT_PC
9591 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9592 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9593 mov r0, rSELF
9594 add r1, rFP, #OFF_FP_SHADOWFRAME
9595 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9596
9597/* ------------------------------ */
9598 .balign 128
9599.L_ALT_op_sget_char: /* 0x65 */
9600/* File: arm/alt_stub.S */
9601/*
9602 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9603 * any interesting requests and then jump to the real instruction
9604 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9605 */
9606 .extern MterpCheckBefore
9607 EXPORT_PC
9608 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9609 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9610 mov r0, rSELF
9611 add r1, rFP, #OFF_FP_SHADOWFRAME
9612 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9613
9614/* ------------------------------ */
9615 .balign 128
9616.L_ALT_op_sget_short: /* 0x66 */
9617/* File: arm/alt_stub.S */
9618/*
9619 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9620 * any interesting requests and then jump to the real instruction
9621 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9622 */
9623 .extern MterpCheckBefore
9624 EXPORT_PC
9625 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9626 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9627 mov r0, rSELF
9628 add r1, rFP, #OFF_FP_SHADOWFRAME
9629 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9630
9631/* ------------------------------ */
9632 .balign 128
9633.L_ALT_op_sput: /* 0x67 */
9634/* File: arm/alt_stub.S */
9635/*
9636 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9637 * any interesting requests and then jump to the real instruction
9638 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9639 */
9640 .extern MterpCheckBefore
9641 EXPORT_PC
9642 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9643 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9644 mov r0, rSELF
9645 add r1, rFP, #OFF_FP_SHADOWFRAME
9646 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9647
9648/* ------------------------------ */
9649 .balign 128
9650.L_ALT_op_sput_wide: /* 0x68 */
9651/* File: arm/alt_stub.S */
9652/*
9653 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9654 * any interesting requests and then jump to the real instruction
9655 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9656 */
9657 .extern MterpCheckBefore
9658 EXPORT_PC
9659 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9660 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9661 mov r0, rSELF
9662 add r1, rFP, #OFF_FP_SHADOWFRAME
9663 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9664
9665/* ------------------------------ */
9666 .balign 128
9667.L_ALT_op_sput_object: /* 0x69 */
9668/* File: arm/alt_stub.S */
9669/*
9670 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9671 * any interesting requests and then jump to the real instruction
9672 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9673 */
9674 .extern MterpCheckBefore
9675 EXPORT_PC
9676 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9677 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9678 mov r0, rSELF
9679 add r1, rFP, #OFF_FP_SHADOWFRAME
9680 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9681
9682/* ------------------------------ */
9683 .balign 128
9684.L_ALT_op_sput_boolean: /* 0x6a */
9685/* File: arm/alt_stub.S */
9686/*
9687 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9688 * any interesting requests and then jump to the real instruction
9689 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9690 */
9691 .extern MterpCheckBefore
9692 EXPORT_PC
9693 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9694 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9695 mov r0, rSELF
9696 add r1, rFP, #OFF_FP_SHADOWFRAME
9697 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9698
9699/* ------------------------------ */
9700 .balign 128
9701.L_ALT_op_sput_byte: /* 0x6b */
9702/* File: arm/alt_stub.S */
9703/*
9704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9705 * any interesting requests and then jump to the real instruction
9706 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9707 */
9708 .extern MterpCheckBefore
9709 EXPORT_PC
9710 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9711 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9712 mov r0, rSELF
9713 add r1, rFP, #OFF_FP_SHADOWFRAME
9714 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9715
9716/* ------------------------------ */
9717 .balign 128
9718.L_ALT_op_sput_char: /* 0x6c */
9719/* File: arm/alt_stub.S */
9720/*
9721 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9722 * any interesting requests and then jump to the real instruction
9723 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9724 */
9725 .extern MterpCheckBefore
9726 EXPORT_PC
9727 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9728 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9729 mov r0, rSELF
9730 add r1, rFP, #OFF_FP_SHADOWFRAME
9731 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9732
9733/* ------------------------------ */
9734 .balign 128
9735.L_ALT_op_sput_short: /* 0x6d */
9736/* File: arm/alt_stub.S */
9737/*
9738 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9739 * any interesting requests and then jump to the real instruction
9740 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9741 */
9742 .extern MterpCheckBefore
9743 EXPORT_PC
9744 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9745 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9746 mov r0, rSELF
9747 add r1, rFP, #OFF_FP_SHADOWFRAME
9748 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9749
9750/* ------------------------------ */
9751 .balign 128
9752.L_ALT_op_invoke_virtual: /* 0x6e */
9753/* File: arm/alt_stub.S */
9754/*
9755 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9756 * any interesting requests and then jump to the real instruction
9757 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9758 */
9759 .extern MterpCheckBefore
9760 EXPORT_PC
9761 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9762 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9763 mov r0, rSELF
9764 add r1, rFP, #OFF_FP_SHADOWFRAME
9765 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9766
9767/* ------------------------------ */
9768 .balign 128
9769.L_ALT_op_invoke_super: /* 0x6f */
9770/* File: arm/alt_stub.S */
9771/*
9772 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9773 * any interesting requests and then jump to the real instruction
9774 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9775 */
9776 .extern MterpCheckBefore
9777 EXPORT_PC
9778 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9779 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9780 mov r0, rSELF
9781 add r1, rFP, #OFF_FP_SHADOWFRAME
9782 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9783
9784/* ------------------------------ */
9785 .balign 128
9786.L_ALT_op_invoke_direct: /* 0x70 */
9787/* File: arm/alt_stub.S */
9788/*
9789 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9790 * any interesting requests and then jump to the real instruction
9791 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9792 */
9793 .extern MterpCheckBefore
9794 EXPORT_PC
9795 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9796 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9797 mov r0, rSELF
9798 add r1, rFP, #OFF_FP_SHADOWFRAME
9799 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9800
9801/* ------------------------------ */
9802 .balign 128
9803.L_ALT_op_invoke_static: /* 0x71 */
9804/* File: arm/alt_stub.S */
9805/*
9806 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9807 * any interesting requests and then jump to the real instruction
9808 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9809 */
9810 .extern MterpCheckBefore
9811 EXPORT_PC
9812 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9813 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9814 mov r0, rSELF
9815 add r1, rFP, #OFF_FP_SHADOWFRAME
9816 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9817
9818/* ------------------------------ */
9819 .balign 128
9820.L_ALT_op_invoke_interface: /* 0x72 */
9821/* File: arm/alt_stub.S */
9822/*
9823 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9824 * any interesting requests and then jump to the real instruction
9825 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9826 */
9827 .extern MterpCheckBefore
9828 EXPORT_PC
9829 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9830 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9831 mov r0, rSELF
9832 add r1, rFP, #OFF_FP_SHADOWFRAME
9833 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9834
9835/* ------------------------------ */
9836 .balign 128
9837.L_ALT_op_return_void_no_barrier: /* 0x73 */
9838/* File: arm/alt_stub.S */
9839/*
9840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9841 * any interesting requests and then jump to the real instruction
9842 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9843 */
9844 .extern MterpCheckBefore
9845 EXPORT_PC
9846 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9847 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9848 mov r0, rSELF
9849 add r1, rFP, #OFF_FP_SHADOWFRAME
9850 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9851
9852/* ------------------------------ */
9853 .balign 128
9854.L_ALT_op_invoke_virtual_range: /* 0x74 */
9855/* File: arm/alt_stub.S */
9856/*
9857 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9858 * any interesting requests and then jump to the real instruction
9859 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9860 */
9861 .extern MterpCheckBefore
9862 EXPORT_PC
9863 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9864 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9865 mov r0, rSELF
9866 add r1, rFP, #OFF_FP_SHADOWFRAME
9867 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9868
9869/* ------------------------------ */
9870 .balign 128
9871.L_ALT_op_invoke_super_range: /* 0x75 */
9872/* File: arm/alt_stub.S */
9873/*
9874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9875 * any interesting requests and then jump to the real instruction
9876 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9877 */
9878 .extern MterpCheckBefore
9879 EXPORT_PC
9880 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9881 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9882 mov r0, rSELF
9883 add r1, rFP, #OFF_FP_SHADOWFRAME
9884 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9885
9886/* ------------------------------ */
9887 .balign 128
9888.L_ALT_op_invoke_direct_range: /* 0x76 */
9889/* File: arm/alt_stub.S */
9890/*
9891 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9892 * any interesting requests and then jump to the real instruction
9893 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9894 */
9895 .extern MterpCheckBefore
9896 EXPORT_PC
9897 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9898 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9899 mov r0, rSELF
9900 add r1, rFP, #OFF_FP_SHADOWFRAME
9901 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9902
9903/* ------------------------------ */
9904 .balign 128
9905.L_ALT_op_invoke_static_range: /* 0x77 */
9906/* File: arm/alt_stub.S */
9907/*
9908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9909 * any interesting requests and then jump to the real instruction
9910 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9911 */
9912 .extern MterpCheckBefore
9913 EXPORT_PC
9914 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9915 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9916 mov r0, rSELF
9917 add r1, rFP, #OFF_FP_SHADOWFRAME
9918 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9919
9920/* ------------------------------ */
9921 .balign 128
9922.L_ALT_op_invoke_interface_range: /* 0x78 */
9923/* File: arm/alt_stub.S */
9924/*
9925 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9926 * any interesting requests and then jump to the real instruction
9927 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9928 */
9929 .extern MterpCheckBefore
9930 EXPORT_PC
9931 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9932 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
9933 mov r0, rSELF
9934 add r1, rFP, #OFF_FP_SHADOWFRAME
9935 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9936
9937/* ------------------------------ */
9938 .balign 128
9939.L_ALT_op_unused_79: /* 0x79 */
9940/* File: arm/alt_stub.S */
9941/*
9942 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9943 * any interesting requests and then jump to the real instruction
9944 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9945 */
9946 .extern MterpCheckBefore
9947 EXPORT_PC
9948 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9949 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
9950 mov r0, rSELF
9951 add r1, rFP, #OFF_FP_SHADOWFRAME
9952 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9953
9954/* ------------------------------ */
9955 .balign 128
9956.L_ALT_op_unused_7a: /* 0x7a */
9957/* File: arm/alt_stub.S */
9958/*
9959 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9960 * any interesting requests and then jump to the real instruction
9961 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9962 */
9963 .extern MterpCheckBefore
9964 EXPORT_PC
9965 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9966 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
9967 mov r0, rSELF
9968 add r1, rFP, #OFF_FP_SHADOWFRAME
9969 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9970
9971/* ------------------------------ */
9972 .balign 128
9973.L_ALT_op_neg_int: /* 0x7b */
9974/* File: arm/alt_stub.S */
9975/*
9976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9977 * any interesting requests and then jump to the real instruction
9978 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9979 */
9980 .extern MterpCheckBefore
9981 EXPORT_PC
9982 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9983 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
9984 mov r0, rSELF
9985 add r1, rFP, #OFF_FP_SHADOWFRAME
9986 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9987
9988/* ------------------------------ */
9989 .balign 128
9990.L_ALT_op_not_int: /* 0x7c */
9991/* File: arm/alt_stub.S */
9992/*
9993 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9994 * any interesting requests and then jump to the real instruction
9995 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9996 */
9997 .extern MterpCheckBefore
9998 EXPORT_PC
9999 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10000 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
10001 mov r0, rSELF
10002 add r1, rFP, #OFF_FP_SHADOWFRAME
10003 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10004
10005/* ------------------------------ */
10006 .balign 128
10007.L_ALT_op_neg_long: /* 0x7d */
10008/* File: arm/alt_stub.S */
10009/*
10010 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10011 * any interesting requests and then jump to the real instruction
10012 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10013 */
10014 .extern MterpCheckBefore
10015 EXPORT_PC
10016 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10017 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
10018 mov r0, rSELF
10019 add r1, rFP, #OFF_FP_SHADOWFRAME
10020 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10021
10022/* ------------------------------ */
10023 .balign 128
10024.L_ALT_op_not_long: /* 0x7e */
10025/* File: arm/alt_stub.S */
10026/*
10027 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10028 * any interesting requests and then jump to the real instruction
10029 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10030 */
10031 .extern MterpCheckBefore
10032 EXPORT_PC
10033 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10034 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
10035 mov r0, rSELF
10036 add r1, rFP, #OFF_FP_SHADOWFRAME
10037 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10038
10039/* ------------------------------ */
10040 .balign 128
10041.L_ALT_op_neg_float: /* 0x7f */
10042/* File: arm/alt_stub.S */
10043/*
10044 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10045 * any interesting requests and then jump to the real instruction
10046 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10047 */
10048 .extern MterpCheckBefore
10049 EXPORT_PC
10050 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10051 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
10052 mov r0, rSELF
10053 add r1, rFP, #OFF_FP_SHADOWFRAME
10054 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10055
10056/* ------------------------------ */
10057 .balign 128
10058.L_ALT_op_neg_double: /* 0x80 */
10059/* File: arm/alt_stub.S */
10060/*
10061 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10062 * any interesting requests and then jump to the real instruction
10063 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10064 */
10065 .extern MterpCheckBefore
10066 EXPORT_PC
10067 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10068 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
10069 mov r0, rSELF
10070 add r1, rFP, #OFF_FP_SHADOWFRAME
10071 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10072
10073/* ------------------------------ */
10074 .balign 128
10075.L_ALT_op_int_to_long: /* 0x81 */
10076/* File: arm/alt_stub.S */
10077/*
10078 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10079 * any interesting requests and then jump to the real instruction
10080 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10081 */
10082 .extern MterpCheckBefore
10083 EXPORT_PC
10084 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10085 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
10086 mov r0, rSELF
10087 add r1, rFP, #OFF_FP_SHADOWFRAME
10088 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10089
10090/* ------------------------------ */
10091 .balign 128
10092.L_ALT_op_int_to_float: /* 0x82 */
10093/* File: arm/alt_stub.S */
10094/*
10095 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10096 * any interesting requests and then jump to the real instruction
10097 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10098 */
10099 .extern MterpCheckBefore
10100 EXPORT_PC
10101 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10102 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
10103 mov r0, rSELF
10104 add r1, rFP, #OFF_FP_SHADOWFRAME
10105 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10106
10107/* ------------------------------ */
10108 .balign 128
10109.L_ALT_op_int_to_double: /* 0x83 */
10110/* File: arm/alt_stub.S */
10111/*
10112 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10113 * any interesting requests and then jump to the real instruction
10114 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10115 */
10116 .extern MterpCheckBefore
10117 EXPORT_PC
10118 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10119 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
10120 mov r0, rSELF
10121 add r1, rFP, #OFF_FP_SHADOWFRAME
10122 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10123
10124/* ------------------------------ */
10125 .balign 128
10126.L_ALT_op_long_to_int: /* 0x84 */
10127/* File: arm/alt_stub.S */
10128/*
10129 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10130 * any interesting requests and then jump to the real instruction
10131 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10132 */
10133 .extern MterpCheckBefore
10134 EXPORT_PC
10135 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10136 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
10137 mov r0, rSELF
10138 add r1, rFP, #OFF_FP_SHADOWFRAME
10139 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10140
10141/* ------------------------------ */
10142 .balign 128
10143.L_ALT_op_long_to_float: /* 0x85 */
10144/* File: arm/alt_stub.S */
10145/*
10146 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10147 * any interesting requests and then jump to the real instruction
10148 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10149 */
10150 .extern MterpCheckBefore
10151 EXPORT_PC
10152 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10153 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
10154 mov r0, rSELF
10155 add r1, rFP, #OFF_FP_SHADOWFRAME
10156 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10157
10158/* ------------------------------ */
10159 .balign 128
10160.L_ALT_op_long_to_double: /* 0x86 */
10161/* File: arm/alt_stub.S */
10162/*
10163 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10164 * any interesting requests and then jump to the real instruction
10165 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10166 */
10167 .extern MterpCheckBefore
10168 EXPORT_PC
10169 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10170 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
10171 mov r0, rSELF
10172 add r1, rFP, #OFF_FP_SHADOWFRAME
10173 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10174
10175/* ------------------------------ */
10176 .balign 128
10177.L_ALT_op_float_to_int: /* 0x87 */
10178/* File: arm/alt_stub.S */
10179/*
10180 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10181 * any interesting requests and then jump to the real instruction
10182 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10183 */
10184 .extern MterpCheckBefore
10185 EXPORT_PC
10186 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10187 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
10188 mov r0, rSELF
10189 add r1, rFP, #OFF_FP_SHADOWFRAME
10190 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10191
10192/* ------------------------------ */
10193 .balign 128
10194.L_ALT_op_float_to_long: /* 0x88 */
10195/* File: arm/alt_stub.S */
10196/*
10197 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10198 * any interesting requests and then jump to the real instruction
10199 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10200 */
10201 .extern MterpCheckBefore
10202 EXPORT_PC
10203 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10204 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10205 mov r0, rSELF
10206 add r1, rFP, #OFF_FP_SHADOWFRAME
10207 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10208
10209/* ------------------------------ */
10210 .balign 128
10211.L_ALT_op_float_to_double: /* 0x89 */
10212/* File: arm/alt_stub.S */
10213/*
10214 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10215 * any interesting requests and then jump to the real instruction
10216 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10217 */
10218 .extern MterpCheckBefore
10219 EXPORT_PC
10220 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10221 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10222 mov r0, rSELF
10223 add r1, rFP, #OFF_FP_SHADOWFRAME
10224 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10225
10226/* ------------------------------ */
10227 .balign 128
10228.L_ALT_op_double_to_int: /* 0x8a */
10229/* File: arm/alt_stub.S */
10230/*
10231 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10232 * any interesting requests and then jump to the real instruction
10233 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10234 */
10235 .extern MterpCheckBefore
10236 EXPORT_PC
10237 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10238 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10239 mov r0, rSELF
10240 add r1, rFP, #OFF_FP_SHADOWFRAME
10241 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10242
10243/* ------------------------------ */
10244 .balign 128
10245.L_ALT_op_double_to_long: /* 0x8b */
10246/* File: arm/alt_stub.S */
10247/*
10248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10249 * any interesting requests and then jump to the real instruction
10250 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10251 */
10252 .extern MterpCheckBefore
10253 EXPORT_PC
10254 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10255 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10256 mov r0, rSELF
10257 add r1, rFP, #OFF_FP_SHADOWFRAME
10258 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10259
10260/* ------------------------------ */
10261 .balign 128
10262.L_ALT_op_double_to_float: /* 0x8c */
10263/* File: arm/alt_stub.S */
10264/*
10265 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10266 * any interesting requests and then jump to the real instruction
10267 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10268 */
10269 .extern MterpCheckBefore
10270 EXPORT_PC
10271 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10272 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10273 mov r0, rSELF
10274 add r1, rFP, #OFF_FP_SHADOWFRAME
10275 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10276
10277/* ------------------------------ */
10278 .balign 128
10279.L_ALT_op_int_to_byte: /* 0x8d */
10280/* File: arm/alt_stub.S */
10281/*
10282 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10283 * any interesting requests and then jump to the real instruction
10284 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10285 */
10286 .extern MterpCheckBefore
10287 EXPORT_PC
10288 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10289 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10290 mov r0, rSELF
10291 add r1, rFP, #OFF_FP_SHADOWFRAME
10292 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10293
10294/* ------------------------------ */
10295 .balign 128
10296.L_ALT_op_int_to_char: /* 0x8e */
10297/* File: arm/alt_stub.S */
10298/*
10299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10300 * any interesting requests and then jump to the real instruction
10301 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10302 */
10303 .extern MterpCheckBefore
10304 EXPORT_PC
10305 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10306 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10307 mov r0, rSELF
10308 add r1, rFP, #OFF_FP_SHADOWFRAME
10309 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10310
10311/* ------------------------------ */
10312 .balign 128
10313.L_ALT_op_int_to_short: /* 0x8f */
10314/* File: arm/alt_stub.S */
10315/*
10316 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10317 * any interesting requests and then jump to the real instruction
10318 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10319 */
10320 .extern MterpCheckBefore
10321 EXPORT_PC
10322 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10323 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10324 mov r0, rSELF
10325 add r1, rFP, #OFF_FP_SHADOWFRAME
10326 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10327
10328/* ------------------------------ */
10329 .balign 128
10330.L_ALT_op_add_int: /* 0x90 */
10331/* File: arm/alt_stub.S */
10332/*
10333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10334 * any interesting requests and then jump to the real instruction
10335 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10336 */
10337 .extern MterpCheckBefore
10338 EXPORT_PC
10339 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10340 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10341 mov r0, rSELF
10342 add r1, rFP, #OFF_FP_SHADOWFRAME
10343 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10344
10345/* ------------------------------ */
10346 .balign 128
10347.L_ALT_op_sub_int: /* 0x91 */
10348/* File: arm/alt_stub.S */
10349/*
10350 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10351 * any interesting requests and then jump to the real instruction
10352 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10353 */
10354 .extern MterpCheckBefore
10355 EXPORT_PC
10356 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10357 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10358 mov r0, rSELF
10359 add r1, rFP, #OFF_FP_SHADOWFRAME
10360 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10361
10362/* ------------------------------ */
10363 .balign 128
10364.L_ALT_op_mul_int: /* 0x92 */
10365/* File: arm/alt_stub.S */
10366/*
10367 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10368 * any interesting requests and then jump to the real instruction
10369 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10370 */
10371 .extern MterpCheckBefore
10372 EXPORT_PC
10373 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10374 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10375 mov r0, rSELF
10376 add r1, rFP, #OFF_FP_SHADOWFRAME
10377 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10378
10379/* ------------------------------ */
10380 .balign 128
10381.L_ALT_op_div_int: /* 0x93 */
10382/* File: arm/alt_stub.S */
10383/*
10384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10385 * any interesting requests and then jump to the real instruction
10386 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10387 */
10388 .extern MterpCheckBefore
10389 EXPORT_PC
10390 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10391 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10392 mov r0, rSELF
10393 add r1, rFP, #OFF_FP_SHADOWFRAME
10394 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10395
10396/* ------------------------------ */
10397 .balign 128
10398.L_ALT_op_rem_int: /* 0x94 */
10399/* File: arm/alt_stub.S */
10400/*
10401 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10402 * any interesting requests and then jump to the real instruction
10403 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10404 */
10405 .extern MterpCheckBefore
10406 EXPORT_PC
10407 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10408 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10409 mov r0, rSELF
10410 add r1, rFP, #OFF_FP_SHADOWFRAME
10411 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10412
10413/* ------------------------------ */
10414 .balign 128
10415.L_ALT_op_and_int: /* 0x95 */
10416/* File: arm/alt_stub.S */
10417/*
10418 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10419 * any interesting requests and then jump to the real instruction
10420 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10421 */
10422 .extern MterpCheckBefore
10423 EXPORT_PC
10424 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10425 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10426 mov r0, rSELF
10427 add r1, rFP, #OFF_FP_SHADOWFRAME
10428 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10429
10430/* ------------------------------ */
10431 .balign 128
10432.L_ALT_op_or_int: /* 0x96 */
10433/* File: arm/alt_stub.S */
10434/*
10435 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10436 * any interesting requests and then jump to the real instruction
10437 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10438 */
10439 .extern MterpCheckBefore
10440 EXPORT_PC
10441 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10442 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10443 mov r0, rSELF
10444 add r1, rFP, #OFF_FP_SHADOWFRAME
10445 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10446
10447/* ------------------------------ */
10448 .balign 128
10449.L_ALT_op_xor_int: /* 0x97 */
10450/* File: arm/alt_stub.S */
10451/*
10452 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10453 * any interesting requests and then jump to the real instruction
10454 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10455 */
10456 .extern MterpCheckBefore
10457 EXPORT_PC
10458 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10459 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10460 mov r0, rSELF
10461 add r1, rFP, #OFF_FP_SHADOWFRAME
10462 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10463
10464/* ------------------------------ */
10465 .balign 128
10466.L_ALT_op_shl_int: /* 0x98 */
10467/* File: arm/alt_stub.S */
10468/*
10469 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10470 * any interesting requests and then jump to the real instruction
10471 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10472 */
10473 .extern MterpCheckBefore
10474 EXPORT_PC
10475 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10476 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10477 mov r0, rSELF
10478 add r1, rFP, #OFF_FP_SHADOWFRAME
10479 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10480
10481/* ------------------------------ */
10482 .balign 128
10483.L_ALT_op_shr_int: /* 0x99 */
10484/* File: arm/alt_stub.S */
10485/*
10486 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10487 * any interesting requests and then jump to the real instruction
10488 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10489 */
10490 .extern MterpCheckBefore
10491 EXPORT_PC
10492 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10493 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10494 mov r0, rSELF
10495 add r1, rFP, #OFF_FP_SHADOWFRAME
10496 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10497
10498/* ------------------------------ */
10499 .balign 128
10500.L_ALT_op_ushr_int: /* 0x9a */
10501/* File: arm/alt_stub.S */
10502/*
10503 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10504 * any interesting requests and then jump to the real instruction
10505 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10506 */
10507 .extern MterpCheckBefore
10508 EXPORT_PC
10509 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10510 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10511 mov r0, rSELF
10512 add r1, rFP, #OFF_FP_SHADOWFRAME
10513 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10514
10515/* ------------------------------ */
10516 .balign 128
10517.L_ALT_op_add_long: /* 0x9b */
10518/* File: arm/alt_stub.S */
10519/*
10520 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10521 * any interesting requests and then jump to the real instruction
10522 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10523 */
10524 .extern MterpCheckBefore
10525 EXPORT_PC
10526 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10527 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10528 mov r0, rSELF
10529 add r1, rFP, #OFF_FP_SHADOWFRAME
10530 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10531
10532/* ------------------------------ */
10533 .balign 128
10534.L_ALT_op_sub_long: /* 0x9c */
10535/* File: arm/alt_stub.S */
10536/*
10537 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10538 * any interesting requests and then jump to the real instruction
10539 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10540 */
10541 .extern MterpCheckBefore
10542 EXPORT_PC
10543 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10544 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10545 mov r0, rSELF
10546 add r1, rFP, #OFF_FP_SHADOWFRAME
10547 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10548
10549/* ------------------------------ */
10550 .balign 128
10551.L_ALT_op_mul_long: /* 0x9d */
10552/* File: arm/alt_stub.S */
10553/*
10554 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10555 * any interesting requests and then jump to the real instruction
10556 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10557 */
10558 .extern MterpCheckBefore
10559 EXPORT_PC
10560 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10561 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10562 mov r0, rSELF
10563 add r1, rFP, #OFF_FP_SHADOWFRAME
10564 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10565
10566/* ------------------------------ */
10567 .balign 128
10568.L_ALT_op_div_long: /* 0x9e */
10569/* File: arm/alt_stub.S */
10570/*
10571 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10572 * any interesting requests and then jump to the real instruction
10573 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10574 */
10575 .extern MterpCheckBefore
10576 EXPORT_PC
10577 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10578 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10579 mov r0, rSELF
10580 add r1, rFP, #OFF_FP_SHADOWFRAME
10581 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10582
10583/* ------------------------------ */
10584 .balign 128
10585.L_ALT_op_rem_long: /* 0x9f */
10586/* File: arm/alt_stub.S */
10587/*
10588 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10589 * any interesting requests and then jump to the real instruction
10590 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10591 */
10592 .extern MterpCheckBefore
10593 EXPORT_PC
10594 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10595 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10596 mov r0, rSELF
10597 add r1, rFP, #OFF_FP_SHADOWFRAME
10598 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10599
10600/* ------------------------------ */
10601 .balign 128
10602.L_ALT_op_and_long: /* 0xa0 */
10603/* File: arm/alt_stub.S */
10604/*
10605 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10606 * any interesting requests and then jump to the real instruction
10607 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10608 */
10609 .extern MterpCheckBefore
10610 EXPORT_PC
10611 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10612 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10613 mov r0, rSELF
10614 add r1, rFP, #OFF_FP_SHADOWFRAME
10615 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10616
10617/* ------------------------------ */
10618 .balign 128
10619.L_ALT_op_or_long: /* 0xa1 */
10620/* File: arm/alt_stub.S */
10621/*
10622 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10623 * any interesting requests and then jump to the real instruction
10624 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10625 */
10626 .extern MterpCheckBefore
10627 EXPORT_PC
10628 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10629 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10630 mov r0, rSELF
10631 add r1, rFP, #OFF_FP_SHADOWFRAME
10632 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10633
10634/* ------------------------------ */
10635 .balign 128
10636.L_ALT_op_xor_long: /* 0xa2 */
10637/* File: arm/alt_stub.S */
10638/*
10639 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10640 * any interesting requests and then jump to the real instruction
10641 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10642 */
10643 .extern MterpCheckBefore
10644 EXPORT_PC
10645 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10646 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10647 mov r0, rSELF
10648 add r1, rFP, #OFF_FP_SHADOWFRAME
10649 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10650
10651/* ------------------------------ */
10652 .balign 128
10653.L_ALT_op_shl_long: /* 0xa3 */
10654/* File: arm/alt_stub.S */
10655/*
10656 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10657 * any interesting requests and then jump to the real instruction
10658 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10659 */
10660 .extern MterpCheckBefore
10661 EXPORT_PC
10662 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10663 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10664 mov r0, rSELF
10665 add r1, rFP, #OFF_FP_SHADOWFRAME
10666 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10667
10668/* ------------------------------ */
10669 .balign 128
10670.L_ALT_op_shr_long: /* 0xa4 */
10671/* File: arm/alt_stub.S */
10672/*
10673 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10674 * any interesting requests and then jump to the real instruction
10675 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10676 */
10677 .extern MterpCheckBefore
10678 EXPORT_PC
10679 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10680 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10681 mov r0, rSELF
10682 add r1, rFP, #OFF_FP_SHADOWFRAME
10683 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10684
10685/* ------------------------------ */
10686 .balign 128
10687.L_ALT_op_ushr_long: /* 0xa5 */
10688/* File: arm/alt_stub.S */
10689/*
10690 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10691 * any interesting requests and then jump to the real instruction
10692 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10693 */
10694 .extern MterpCheckBefore
10695 EXPORT_PC
10696 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10697 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10698 mov r0, rSELF
10699 add r1, rFP, #OFF_FP_SHADOWFRAME
10700 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10701
10702/* ------------------------------ */
10703 .balign 128
10704.L_ALT_op_add_float: /* 0xa6 */
10705/* File: arm/alt_stub.S */
10706/*
10707 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10708 * any interesting requests and then jump to the real instruction
10709 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10710 */
10711 .extern MterpCheckBefore
10712 EXPORT_PC
10713 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10714 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10715 mov r0, rSELF
10716 add r1, rFP, #OFF_FP_SHADOWFRAME
10717 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10718
10719/* ------------------------------ */
10720 .balign 128
10721.L_ALT_op_sub_float: /* 0xa7 */
10722/* File: arm/alt_stub.S */
10723/*
10724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10725 * any interesting requests and then jump to the real instruction
10726 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10727 */
10728 .extern MterpCheckBefore
10729 EXPORT_PC
10730 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10731 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10732 mov r0, rSELF
10733 add r1, rFP, #OFF_FP_SHADOWFRAME
10734 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10735
10736/* ------------------------------ */
10737 .balign 128
10738.L_ALT_op_mul_float: /* 0xa8 */
10739/* File: arm/alt_stub.S */
10740/*
10741 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10742 * any interesting requests and then jump to the real instruction
10743 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10744 */
10745 .extern MterpCheckBefore
10746 EXPORT_PC
10747 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10748 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10749 mov r0, rSELF
10750 add r1, rFP, #OFF_FP_SHADOWFRAME
10751 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10752
10753/* ------------------------------ */
10754 .balign 128
10755.L_ALT_op_div_float: /* 0xa9 */
10756/* File: arm/alt_stub.S */
10757/*
10758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10759 * any interesting requests and then jump to the real instruction
10760 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10761 */
10762 .extern MterpCheckBefore
10763 EXPORT_PC
10764 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10765 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10766 mov r0, rSELF
10767 add r1, rFP, #OFF_FP_SHADOWFRAME
10768 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10769
10770/* ------------------------------ */
10771 .balign 128
10772.L_ALT_op_rem_float: /* 0xaa */
10773/* File: arm/alt_stub.S */
10774/*
10775 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10776 * any interesting requests and then jump to the real instruction
10777 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10778 */
10779 .extern MterpCheckBefore
10780 EXPORT_PC
10781 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10782 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10783 mov r0, rSELF
10784 add r1, rFP, #OFF_FP_SHADOWFRAME
10785 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10786
10787/* ------------------------------ */
10788 .balign 128
10789.L_ALT_op_add_double: /* 0xab */
10790/* File: arm/alt_stub.S */
10791/*
10792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10793 * any interesting requests and then jump to the real instruction
10794 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10795 */
10796 .extern MterpCheckBefore
10797 EXPORT_PC
10798 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10799 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10800 mov r0, rSELF
10801 add r1, rFP, #OFF_FP_SHADOWFRAME
10802 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10803
10804/* ------------------------------ */
10805 .balign 128
10806.L_ALT_op_sub_double: /* 0xac */
10807/* File: arm/alt_stub.S */
10808/*
10809 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10810 * any interesting requests and then jump to the real instruction
10811 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10812 */
10813 .extern MterpCheckBefore
10814 EXPORT_PC
10815 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10816 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10817 mov r0, rSELF
10818 add r1, rFP, #OFF_FP_SHADOWFRAME
10819 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10820
10821/* ------------------------------ */
10822 .balign 128
10823.L_ALT_op_mul_double: /* 0xad */
10824/* File: arm/alt_stub.S */
10825/*
10826 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10827 * any interesting requests and then jump to the real instruction
10828 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10829 */
10830 .extern MterpCheckBefore
10831 EXPORT_PC
10832 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10833 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10834 mov r0, rSELF
10835 add r1, rFP, #OFF_FP_SHADOWFRAME
10836 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10837
10838/* ------------------------------ */
10839 .balign 128
10840.L_ALT_op_div_double: /* 0xae */
10841/* File: arm/alt_stub.S */
10842/*
10843 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10844 * any interesting requests and then jump to the real instruction
10845 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10846 */
10847 .extern MterpCheckBefore
10848 EXPORT_PC
10849 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10850 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10851 mov r0, rSELF
10852 add r1, rFP, #OFF_FP_SHADOWFRAME
10853 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10854
10855/* ------------------------------ */
10856 .balign 128
10857.L_ALT_op_rem_double: /* 0xaf */
10858/* File: arm/alt_stub.S */
10859/*
10860 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10861 * any interesting requests and then jump to the real instruction
10862 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10863 */
10864 .extern MterpCheckBefore
10865 EXPORT_PC
10866 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10867 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10868 mov r0, rSELF
10869 add r1, rFP, #OFF_FP_SHADOWFRAME
10870 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10871
10872/* ------------------------------ */
10873 .balign 128
10874.L_ALT_op_add_int_2addr: /* 0xb0 */
10875/* File: arm/alt_stub.S */
10876/*
10877 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10878 * any interesting requests and then jump to the real instruction
10879 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10880 */
10881 .extern MterpCheckBefore
10882 EXPORT_PC
10883 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10884 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10885 mov r0, rSELF
10886 add r1, rFP, #OFF_FP_SHADOWFRAME
10887 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10888
10889/* ------------------------------ */
10890 .balign 128
10891.L_ALT_op_sub_int_2addr: /* 0xb1 */
10892/* File: arm/alt_stub.S */
10893/*
10894 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10895 * any interesting requests and then jump to the real instruction
10896 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10897 */
10898 .extern MterpCheckBefore
10899 EXPORT_PC
10900 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10901 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10902 mov r0, rSELF
10903 add r1, rFP, #OFF_FP_SHADOWFRAME
10904 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10905
10906/* ------------------------------ */
10907 .balign 128
10908.L_ALT_op_mul_int_2addr: /* 0xb2 */
10909/* File: arm/alt_stub.S */
10910/*
10911 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10912 * any interesting requests and then jump to the real instruction
10913 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10914 */
10915 .extern MterpCheckBefore
10916 EXPORT_PC
10917 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10918 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10919 mov r0, rSELF
10920 add r1, rFP, #OFF_FP_SHADOWFRAME
10921 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10922
10923/* ------------------------------ */
10924 .balign 128
10925.L_ALT_op_div_int_2addr: /* 0xb3 */
10926/* File: arm/alt_stub.S */
10927/*
10928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10929 * any interesting requests and then jump to the real instruction
10930 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10931 */
10932 .extern MterpCheckBefore
10933 EXPORT_PC
10934 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10935 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
10936 mov r0, rSELF
10937 add r1, rFP, #OFF_FP_SHADOWFRAME
10938 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10939
10940/* ------------------------------ */
10941 .balign 128
10942.L_ALT_op_rem_int_2addr: /* 0xb4 */
10943/* File: arm/alt_stub.S */
10944/*
10945 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10946 * any interesting requests and then jump to the real instruction
10947 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10948 */
10949 .extern MterpCheckBefore
10950 EXPORT_PC
10951 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10952 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
10953 mov r0, rSELF
10954 add r1, rFP, #OFF_FP_SHADOWFRAME
10955 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10956
10957/* ------------------------------ */
10958 .balign 128
10959.L_ALT_op_and_int_2addr: /* 0xb5 */
10960/* File: arm/alt_stub.S */
10961/*
10962 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10963 * any interesting requests and then jump to the real instruction
10964 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10965 */
10966 .extern MterpCheckBefore
10967 EXPORT_PC
10968 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10969 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
10970 mov r0, rSELF
10971 add r1, rFP, #OFF_FP_SHADOWFRAME
10972 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10973
10974/* ------------------------------ */
10975 .balign 128
10976.L_ALT_op_or_int_2addr: /* 0xb6 */
10977/* File: arm/alt_stub.S */
10978/*
10979 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10980 * any interesting requests and then jump to the real instruction
10981 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10982 */
10983 .extern MterpCheckBefore
10984 EXPORT_PC
10985 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10986 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
10987 mov r0, rSELF
10988 add r1, rFP, #OFF_FP_SHADOWFRAME
10989 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10990
10991/* ------------------------------ */
10992 .balign 128
10993.L_ALT_op_xor_int_2addr: /* 0xb7 */
10994/* File: arm/alt_stub.S */
10995/*
10996 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10997 * any interesting requests and then jump to the real instruction
10998 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10999 */
11000 .extern MterpCheckBefore
11001 EXPORT_PC
11002 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11003 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
11004 mov r0, rSELF
11005 add r1, rFP, #OFF_FP_SHADOWFRAME
11006 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11007
11008/* ------------------------------ */
11009 .balign 128
11010.L_ALT_op_shl_int_2addr: /* 0xb8 */
11011/* File: arm/alt_stub.S */
11012/*
11013 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11014 * any interesting requests and then jump to the real instruction
11015 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11016 */
11017 .extern MterpCheckBefore
11018 EXPORT_PC
11019 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11020 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
11021 mov r0, rSELF
11022 add r1, rFP, #OFF_FP_SHADOWFRAME
11023 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11024
11025/* ------------------------------ */
11026 .balign 128
11027.L_ALT_op_shr_int_2addr: /* 0xb9 */
11028/* File: arm/alt_stub.S */
11029/*
11030 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11031 * any interesting requests and then jump to the real instruction
11032 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11033 */
11034 .extern MterpCheckBefore
11035 EXPORT_PC
11036 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11037 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
11038 mov r0, rSELF
11039 add r1, rFP, #OFF_FP_SHADOWFRAME
11040 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11041
11042/* ------------------------------ */
11043 .balign 128
11044.L_ALT_op_ushr_int_2addr: /* 0xba */
11045/* File: arm/alt_stub.S */
11046/*
11047 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11048 * any interesting requests and then jump to the real instruction
11049 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11050 */
11051 .extern MterpCheckBefore
11052 EXPORT_PC
11053 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11054 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
11055 mov r0, rSELF
11056 add r1, rFP, #OFF_FP_SHADOWFRAME
11057 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11058
11059/* ------------------------------ */
11060 .balign 128
11061.L_ALT_op_add_long_2addr: /* 0xbb */
11062/* File: arm/alt_stub.S */
11063/*
11064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11065 * any interesting requests and then jump to the real instruction
11066 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11067 */
11068 .extern MterpCheckBefore
11069 EXPORT_PC
11070 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11071 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
11072 mov r0, rSELF
11073 add r1, rFP, #OFF_FP_SHADOWFRAME
11074 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11075
11076/* ------------------------------ */
11077 .balign 128
11078.L_ALT_op_sub_long_2addr: /* 0xbc */
11079/* File: arm/alt_stub.S */
11080/*
11081 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11082 * any interesting requests and then jump to the real instruction
11083 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11084 */
11085 .extern MterpCheckBefore
11086 EXPORT_PC
11087 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11088 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
11089 mov r0, rSELF
11090 add r1, rFP, #OFF_FP_SHADOWFRAME
11091 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11092
11093/* ------------------------------ */
11094 .balign 128
11095.L_ALT_op_mul_long_2addr: /* 0xbd */
11096/* File: arm/alt_stub.S */
11097/*
11098 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11099 * any interesting requests and then jump to the real instruction
11100 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11101 */
11102 .extern MterpCheckBefore
11103 EXPORT_PC
11104 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11105 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
11106 mov r0, rSELF
11107 add r1, rFP, #OFF_FP_SHADOWFRAME
11108 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11109
11110/* ------------------------------ */
11111 .balign 128
11112.L_ALT_op_div_long_2addr: /* 0xbe */
11113/* File: arm/alt_stub.S */
11114/*
11115 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11116 * any interesting requests and then jump to the real instruction
11117 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11118 */
11119 .extern MterpCheckBefore
11120 EXPORT_PC
11121 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11122 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
11123 mov r0, rSELF
11124 add r1, rFP, #OFF_FP_SHADOWFRAME
11125 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11126
11127/* ------------------------------ */
11128 .balign 128
11129.L_ALT_op_rem_long_2addr: /* 0xbf */
11130/* File: arm/alt_stub.S */
11131/*
11132 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11133 * any interesting requests and then jump to the real instruction
11134 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11135 */
11136 .extern MterpCheckBefore
11137 EXPORT_PC
11138 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11139 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
11140 mov r0, rSELF
11141 add r1, rFP, #OFF_FP_SHADOWFRAME
11142 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11143
11144/* ------------------------------ */
11145 .balign 128
11146.L_ALT_op_and_long_2addr: /* 0xc0 */
11147/* File: arm/alt_stub.S */
11148/*
11149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11150 * any interesting requests and then jump to the real instruction
11151 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11152 */
11153 .extern MterpCheckBefore
11154 EXPORT_PC
11155 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11156 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
11157 mov r0, rSELF
11158 add r1, rFP, #OFF_FP_SHADOWFRAME
11159 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11160
11161/* ------------------------------ */
11162 .balign 128
11163.L_ALT_op_or_long_2addr: /* 0xc1 */
11164/* File: arm/alt_stub.S */
11165/*
11166 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11167 * any interesting requests and then jump to the real instruction
11168 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11169 */
11170 .extern MterpCheckBefore
11171 EXPORT_PC
11172 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11173 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
11174 mov r0, rSELF
11175 add r1, rFP, #OFF_FP_SHADOWFRAME
11176 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11177
11178/* ------------------------------ */
11179 .balign 128
11180.L_ALT_op_xor_long_2addr: /* 0xc2 */
11181/* File: arm/alt_stub.S */
11182/*
11183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11184 * any interesting requests and then jump to the real instruction
11185 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11186 */
11187 .extern MterpCheckBefore
11188 EXPORT_PC
11189 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11190 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
11191 mov r0, rSELF
11192 add r1, rFP, #OFF_FP_SHADOWFRAME
11193 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11194
11195/* ------------------------------ */
11196 .balign 128
11197.L_ALT_op_shl_long_2addr: /* 0xc3 */
11198/* File: arm/alt_stub.S */
11199/*
11200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11201 * any interesting requests and then jump to the real instruction
11202 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11203 */
11204 .extern MterpCheckBefore
11205 EXPORT_PC
11206 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11207 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11208 mov r0, rSELF
11209 add r1, rFP, #OFF_FP_SHADOWFRAME
11210 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11211
11212/* ------------------------------ */
11213 .balign 128
11214.L_ALT_op_shr_long_2addr: /* 0xc4 */
11215/* File: arm/alt_stub.S */
11216/*
11217 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11218 * any interesting requests and then jump to the real instruction
11219 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11220 */
11221 .extern MterpCheckBefore
11222 EXPORT_PC
11223 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11224 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11225 mov r0, rSELF
11226 add r1, rFP, #OFF_FP_SHADOWFRAME
11227 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11228
11229/* ------------------------------ */
11230 .balign 128
11231.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11232/* File: arm/alt_stub.S */
11233/*
11234 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11235 * any interesting requests and then jump to the real instruction
11236 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11237 */
11238 .extern MterpCheckBefore
11239 EXPORT_PC
11240 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11241 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11242 mov r0, rSELF
11243 add r1, rFP, #OFF_FP_SHADOWFRAME
11244 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11245
11246/* ------------------------------ */
11247 .balign 128
11248.L_ALT_op_add_float_2addr: /* 0xc6 */
11249/* File: arm/alt_stub.S */
11250/*
11251 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11252 * any interesting requests and then jump to the real instruction
11253 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11254 */
11255 .extern MterpCheckBefore
11256 EXPORT_PC
11257 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11258 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11259 mov r0, rSELF
11260 add r1, rFP, #OFF_FP_SHADOWFRAME
11261 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11262
11263/* ------------------------------ */
11264 .balign 128
11265.L_ALT_op_sub_float_2addr: /* 0xc7 */
11266/* File: arm/alt_stub.S */
11267/*
11268 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11269 * any interesting requests and then jump to the real instruction
11270 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11271 */
11272 .extern MterpCheckBefore
11273 EXPORT_PC
11274 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11275 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11276 mov r0, rSELF
11277 add r1, rFP, #OFF_FP_SHADOWFRAME
11278 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11279
11280/* ------------------------------ */
11281 .balign 128
11282.L_ALT_op_mul_float_2addr: /* 0xc8 */
11283/* File: arm/alt_stub.S */
11284/*
11285 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11286 * any interesting requests and then jump to the real instruction
11287 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11288 */
11289 .extern MterpCheckBefore
11290 EXPORT_PC
11291 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11292 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11293 mov r0, rSELF
11294 add r1, rFP, #OFF_FP_SHADOWFRAME
11295 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11296
11297/* ------------------------------ */
11298 .balign 128
11299.L_ALT_op_div_float_2addr: /* 0xc9 */
11300/* File: arm/alt_stub.S */
11301/*
11302 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11303 * any interesting requests and then jump to the real instruction
11304 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11305 */
11306 .extern MterpCheckBefore
11307 EXPORT_PC
11308 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11309 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11310 mov r0, rSELF
11311 add r1, rFP, #OFF_FP_SHADOWFRAME
11312 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11313
11314/* ------------------------------ */
11315 .balign 128
11316.L_ALT_op_rem_float_2addr: /* 0xca */
11317/* File: arm/alt_stub.S */
11318/*
11319 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11320 * any interesting requests and then jump to the real instruction
11321 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11322 */
11323 .extern MterpCheckBefore
11324 EXPORT_PC
11325 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11326 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11327 mov r0, rSELF
11328 add r1, rFP, #OFF_FP_SHADOWFRAME
11329 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11330
11331/* ------------------------------ */
11332 .balign 128
11333.L_ALT_op_add_double_2addr: /* 0xcb */
11334/* File: arm/alt_stub.S */
11335/*
11336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11337 * any interesting requests and then jump to the real instruction
11338 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11339 */
11340 .extern MterpCheckBefore
11341 EXPORT_PC
11342 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11343 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11344 mov r0, rSELF
11345 add r1, rFP, #OFF_FP_SHADOWFRAME
11346 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11347
11348/* ------------------------------ */
11349 .balign 128
11350.L_ALT_op_sub_double_2addr: /* 0xcc */
11351/* File: arm/alt_stub.S */
11352/*
11353 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11354 * any interesting requests and then jump to the real instruction
11355 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11356 */
11357 .extern MterpCheckBefore
11358 EXPORT_PC
11359 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11360 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11361 mov r0, rSELF
11362 add r1, rFP, #OFF_FP_SHADOWFRAME
11363 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11364
11365/* ------------------------------ */
11366 .balign 128
11367.L_ALT_op_mul_double_2addr: /* 0xcd */
11368/* File: arm/alt_stub.S */
11369/*
11370 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11371 * any interesting requests and then jump to the real instruction
11372 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11373 */
11374 .extern MterpCheckBefore
11375 EXPORT_PC
11376 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11377 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11378 mov r0, rSELF
11379 add r1, rFP, #OFF_FP_SHADOWFRAME
11380 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11381
11382/* ------------------------------ */
11383 .balign 128
11384.L_ALT_op_div_double_2addr: /* 0xce */
11385/* File: arm/alt_stub.S */
11386/*
11387 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11388 * any interesting requests and then jump to the real instruction
11389 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11390 */
11391 .extern MterpCheckBefore
11392 EXPORT_PC
11393 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11394 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11395 mov r0, rSELF
11396 add r1, rFP, #OFF_FP_SHADOWFRAME
11397 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11398
11399/* ------------------------------ */
11400 .balign 128
11401.L_ALT_op_rem_double_2addr: /* 0xcf */
11402/* File: arm/alt_stub.S */
11403/*
11404 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11405 * any interesting requests and then jump to the real instruction
11406 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11407 */
11408 .extern MterpCheckBefore
11409 EXPORT_PC
11410 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11411 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11412 mov r0, rSELF
11413 add r1, rFP, #OFF_FP_SHADOWFRAME
11414 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11415
11416/* ------------------------------ */
11417 .balign 128
11418.L_ALT_op_add_int_lit16: /* 0xd0 */
11419/* File: arm/alt_stub.S */
11420/*
11421 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11422 * any interesting requests and then jump to the real instruction
11423 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11424 */
11425 .extern MterpCheckBefore
11426 EXPORT_PC
11427 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11428 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11429 mov r0, rSELF
11430 add r1, rFP, #OFF_FP_SHADOWFRAME
11431 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11432
11433/* ------------------------------ */
11434 .balign 128
11435.L_ALT_op_rsub_int: /* 0xd1 */
11436/* File: arm/alt_stub.S */
11437/*
11438 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11439 * any interesting requests and then jump to the real instruction
11440 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11441 */
11442 .extern MterpCheckBefore
11443 EXPORT_PC
11444 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11445 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11446 mov r0, rSELF
11447 add r1, rFP, #OFF_FP_SHADOWFRAME
11448 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11449
11450/* ------------------------------ */
11451 .balign 128
11452.L_ALT_op_mul_int_lit16: /* 0xd2 */
11453/* File: arm/alt_stub.S */
11454/*
11455 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11456 * any interesting requests and then jump to the real instruction
11457 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11458 */
11459 .extern MterpCheckBefore
11460 EXPORT_PC
11461 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11462 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11463 mov r0, rSELF
11464 add r1, rFP, #OFF_FP_SHADOWFRAME
11465 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11466
11467/* ------------------------------ */
11468 .balign 128
11469.L_ALT_op_div_int_lit16: /* 0xd3 */
11470/* File: arm/alt_stub.S */
11471/*
11472 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11473 * any interesting requests and then jump to the real instruction
11474 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11475 */
11476 .extern MterpCheckBefore
11477 EXPORT_PC
11478 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11479 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11480 mov r0, rSELF
11481 add r1, rFP, #OFF_FP_SHADOWFRAME
11482 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11483
11484/* ------------------------------ */
11485 .balign 128
11486.L_ALT_op_rem_int_lit16: /* 0xd4 */
11487/* File: arm/alt_stub.S */
11488/*
11489 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11490 * any interesting requests and then jump to the real instruction
11491 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11492 */
11493 .extern MterpCheckBefore
11494 EXPORT_PC
11495 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11496 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11497 mov r0, rSELF
11498 add r1, rFP, #OFF_FP_SHADOWFRAME
11499 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11500
11501/* ------------------------------ */
11502 .balign 128
11503.L_ALT_op_and_int_lit16: /* 0xd5 */
11504/* File: arm/alt_stub.S */
11505/*
11506 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11507 * any interesting requests and then jump to the real instruction
11508 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11509 */
11510 .extern MterpCheckBefore
11511 EXPORT_PC
11512 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11513 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11514 mov r0, rSELF
11515 add r1, rFP, #OFF_FP_SHADOWFRAME
11516 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11517
11518/* ------------------------------ */
11519 .balign 128
11520.L_ALT_op_or_int_lit16: /* 0xd6 */
11521/* File: arm/alt_stub.S */
11522/*
11523 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11524 * any interesting requests and then jump to the real instruction
11525 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11526 */
11527 .extern MterpCheckBefore
11528 EXPORT_PC
11529 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11530 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11531 mov r0, rSELF
11532 add r1, rFP, #OFF_FP_SHADOWFRAME
11533 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11534
11535/* ------------------------------ */
11536 .balign 128
11537.L_ALT_op_xor_int_lit16: /* 0xd7 */
11538/* File: arm/alt_stub.S */
11539/*
11540 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11541 * any interesting requests and then jump to the real instruction
11542 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11543 */
11544 .extern MterpCheckBefore
11545 EXPORT_PC
11546 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11547 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11548 mov r0, rSELF
11549 add r1, rFP, #OFF_FP_SHADOWFRAME
11550 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11551
11552/* ------------------------------ */
11553 .balign 128
11554.L_ALT_op_add_int_lit8: /* 0xd8 */
11555/* File: arm/alt_stub.S */
11556/*
11557 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11558 * any interesting requests and then jump to the real instruction
11559 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11560 */
11561 .extern MterpCheckBefore
11562 EXPORT_PC
11563 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11564 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11565 mov r0, rSELF
11566 add r1, rFP, #OFF_FP_SHADOWFRAME
11567 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11568
11569/* ------------------------------ */
11570 .balign 128
11571.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11572/* File: arm/alt_stub.S */
11573/*
11574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11575 * any interesting requests and then jump to the real instruction
11576 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11577 */
11578 .extern MterpCheckBefore
11579 EXPORT_PC
11580 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11581 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11582 mov r0, rSELF
11583 add r1, rFP, #OFF_FP_SHADOWFRAME
11584 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11585
11586/* ------------------------------ */
11587 .balign 128
11588.L_ALT_op_mul_int_lit8: /* 0xda */
11589/* File: arm/alt_stub.S */
11590/*
11591 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11592 * any interesting requests and then jump to the real instruction
11593 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11594 */
11595 .extern MterpCheckBefore
11596 EXPORT_PC
11597 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11598 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11599 mov r0, rSELF
11600 add r1, rFP, #OFF_FP_SHADOWFRAME
11601 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11602
11603/* ------------------------------ */
11604 .balign 128
11605.L_ALT_op_div_int_lit8: /* 0xdb */
11606/* File: arm/alt_stub.S */
11607/*
11608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11609 * any interesting requests and then jump to the real instruction
11610 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11611 */
11612 .extern MterpCheckBefore
11613 EXPORT_PC
11614 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11615 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11616 mov r0, rSELF
11617 add r1, rFP, #OFF_FP_SHADOWFRAME
11618 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11619
11620/* ------------------------------ */
11621 .balign 128
11622.L_ALT_op_rem_int_lit8: /* 0xdc */
11623/* File: arm/alt_stub.S */
11624/*
11625 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11626 * any interesting requests and then jump to the real instruction
11627 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11628 */
11629 .extern MterpCheckBefore
11630 EXPORT_PC
11631 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11632 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11633 mov r0, rSELF
11634 add r1, rFP, #OFF_FP_SHADOWFRAME
11635 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11636
11637/* ------------------------------ */
11638 .balign 128
11639.L_ALT_op_and_int_lit8: /* 0xdd */
11640/* File: arm/alt_stub.S */
11641/*
11642 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11643 * any interesting requests and then jump to the real instruction
11644 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11645 */
11646 .extern MterpCheckBefore
11647 EXPORT_PC
11648 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11649 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11650 mov r0, rSELF
11651 add r1, rFP, #OFF_FP_SHADOWFRAME
11652 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11653
11654/* ------------------------------ */
11655 .balign 128
11656.L_ALT_op_or_int_lit8: /* 0xde */
11657/* File: arm/alt_stub.S */
11658/*
11659 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11660 * any interesting requests and then jump to the real instruction
11661 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11662 */
11663 .extern MterpCheckBefore
11664 EXPORT_PC
11665 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11666 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11667 mov r0, rSELF
11668 add r1, rFP, #OFF_FP_SHADOWFRAME
11669 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11670
11671/* ------------------------------ */
11672 .balign 128
11673.L_ALT_op_xor_int_lit8: /* 0xdf */
11674/* File: arm/alt_stub.S */
11675/*
11676 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11677 * any interesting requests and then jump to the real instruction
11678 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11679 */
11680 .extern MterpCheckBefore
11681 EXPORT_PC
11682 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11683 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11684 mov r0, rSELF
11685 add r1, rFP, #OFF_FP_SHADOWFRAME
11686 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11687
11688/* ------------------------------ */
11689 .balign 128
11690.L_ALT_op_shl_int_lit8: /* 0xe0 */
11691/* File: arm/alt_stub.S */
11692/*
11693 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11694 * any interesting requests and then jump to the real instruction
11695 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11696 */
11697 .extern MterpCheckBefore
11698 EXPORT_PC
11699 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11700 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11701 mov r0, rSELF
11702 add r1, rFP, #OFF_FP_SHADOWFRAME
11703 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11704
11705/* ------------------------------ */
11706 .balign 128
11707.L_ALT_op_shr_int_lit8: /* 0xe1 */
11708/* File: arm/alt_stub.S */
11709/*
11710 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11711 * any interesting requests and then jump to the real instruction
11712 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11713 */
11714 .extern MterpCheckBefore
11715 EXPORT_PC
11716 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11717 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11718 mov r0, rSELF
11719 add r1, rFP, #OFF_FP_SHADOWFRAME
11720 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11721
11722/* ------------------------------ */
11723 .balign 128
11724.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11725/* File: arm/alt_stub.S */
11726/*
11727 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11728 * any interesting requests and then jump to the real instruction
11729 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11730 */
11731 .extern MterpCheckBefore
11732 EXPORT_PC
11733 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11734 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11735 mov r0, rSELF
11736 add r1, rFP, #OFF_FP_SHADOWFRAME
11737 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11738
11739/* ------------------------------ */
11740 .balign 128
11741.L_ALT_op_iget_quick: /* 0xe3 */
11742/* File: arm/alt_stub.S */
11743/*
11744 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11745 * any interesting requests and then jump to the real instruction
11746 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11747 */
11748 .extern MterpCheckBefore
11749 EXPORT_PC
11750 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11751 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11752 mov r0, rSELF
11753 add r1, rFP, #OFF_FP_SHADOWFRAME
11754 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11755
11756/* ------------------------------ */
11757 .balign 128
11758.L_ALT_op_iget_wide_quick: /* 0xe4 */
11759/* File: arm/alt_stub.S */
11760/*
11761 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11762 * any interesting requests and then jump to the real instruction
11763 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11764 */
11765 .extern MterpCheckBefore
11766 EXPORT_PC
11767 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11768 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11769 mov r0, rSELF
11770 add r1, rFP, #OFF_FP_SHADOWFRAME
11771 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11772
11773/* ------------------------------ */
11774 .balign 128
11775.L_ALT_op_iget_object_quick: /* 0xe5 */
11776/* File: arm/alt_stub.S */
11777/*
11778 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11779 * any interesting requests and then jump to the real instruction
11780 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11781 */
11782 .extern MterpCheckBefore
11783 EXPORT_PC
11784 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11785 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11786 mov r0, rSELF
11787 add r1, rFP, #OFF_FP_SHADOWFRAME
11788 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11789
11790/* ------------------------------ */
11791 .balign 128
11792.L_ALT_op_iput_quick: /* 0xe6 */
11793/* File: arm/alt_stub.S */
11794/*
11795 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11796 * any interesting requests and then jump to the real instruction
11797 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11798 */
11799 .extern MterpCheckBefore
11800 EXPORT_PC
11801 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11802 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11803 mov r0, rSELF
11804 add r1, rFP, #OFF_FP_SHADOWFRAME
11805 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11806
11807/* ------------------------------ */
11808 .balign 128
11809.L_ALT_op_iput_wide_quick: /* 0xe7 */
11810/* File: arm/alt_stub.S */
11811/*
11812 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11813 * any interesting requests and then jump to the real instruction
11814 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11815 */
11816 .extern MterpCheckBefore
11817 EXPORT_PC
11818 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11819 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11820 mov r0, rSELF
11821 add r1, rFP, #OFF_FP_SHADOWFRAME
11822 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11823
11824/* ------------------------------ */
11825 .balign 128
11826.L_ALT_op_iput_object_quick: /* 0xe8 */
11827/* File: arm/alt_stub.S */
11828/*
11829 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11830 * any interesting requests and then jump to the real instruction
11831 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11832 */
11833 .extern MterpCheckBefore
11834 EXPORT_PC
11835 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11836 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11837 mov r0, rSELF
11838 add r1, rFP, #OFF_FP_SHADOWFRAME
11839 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11840
11841/* ------------------------------ */
11842 .balign 128
11843.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11844/* File: arm/alt_stub.S */
11845/*
11846 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11847 * any interesting requests and then jump to the real instruction
11848 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11849 */
11850 .extern MterpCheckBefore
11851 EXPORT_PC
11852 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11853 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11854 mov r0, rSELF
11855 add r1, rFP, #OFF_FP_SHADOWFRAME
11856 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11857
11858/* ------------------------------ */
11859 .balign 128
11860.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11861/* File: arm/alt_stub.S */
11862/*
11863 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11864 * any interesting requests and then jump to the real instruction
11865 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11866 */
11867 .extern MterpCheckBefore
11868 EXPORT_PC
11869 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11870 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11871 mov r0, rSELF
11872 add r1, rFP, #OFF_FP_SHADOWFRAME
11873 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11874
11875/* ------------------------------ */
11876 .balign 128
11877.L_ALT_op_iput_boolean_quick: /* 0xeb */
11878/* File: arm/alt_stub.S */
11879/*
11880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11881 * any interesting requests and then jump to the real instruction
11882 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11883 */
11884 .extern MterpCheckBefore
11885 EXPORT_PC
11886 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11887 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11888 mov r0, rSELF
11889 add r1, rFP, #OFF_FP_SHADOWFRAME
11890 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11891
11892/* ------------------------------ */
11893 .balign 128
11894.L_ALT_op_iput_byte_quick: /* 0xec */
11895/* File: arm/alt_stub.S */
11896/*
11897 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11898 * any interesting requests and then jump to the real instruction
11899 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11900 */
11901 .extern MterpCheckBefore
11902 EXPORT_PC
11903 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11904 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11905 mov r0, rSELF
11906 add r1, rFP, #OFF_FP_SHADOWFRAME
11907 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11908
11909/* ------------------------------ */
11910 .balign 128
11911.L_ALT_op_iput_char_quick: /* 0xed */
11912/* File: arm/alt_stub.S */
11913/*
11914 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11915 * any interesting requests and then jump to the real instruction
11916 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11917 */
11918 .extern MterpCheckBefore
11919 EXPORT_PC
11920 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11921 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11922 mov r0, rSELF
11923 add r1, rFP, #OFF_FP_SHADOWFRAME
11924 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11925
11926/* ------------------------------ */
11927 .balign 128
11928.L_ALT_op_iput_short_quick: /* 0xee */
11929/* File: arm/alt_stub.S */
11930/*
11931 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11932 * any interesting requests and then jump to the real instruction
11933 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11934 */
11935 .extern MterpCheckBefore
11936 EXPORT_PC
11937 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11938 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
11939 mov r0, rSELF
11940 add r1, rFP, #OFF_FP_SHADOWFRAME
11941 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11942
11943/* ------------------------------ */
11944 .balign 128
11945.L_ALT_op_iget_boolean_quick: /* 0xef */
11946/* File: arm/alt_stub.S */
11947/*
11948 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11949 * any interesting requests and then jump to the real instruction
11950 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11951 */
11952 .extern MterpCheckBefore
11953 EXPORT_PC
11954 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11955 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
11956 mov r0, rSELF
11957 add r1, rFP, #OFF_FP_SHADOWFRAME
11958 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11959
11960/* ------------------------------ */
11961 .balign 128
11962.L_ALT_op_iget_byte_quick: /* 0xf0 */
11963/* File: arm/alt_stub.S */
11964/*
11965 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11966 * any interesting requests and then jump to the real instruction
11967 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11968 */
11969 .extern MterpCheckBefore
11970 EXPORT_PC
11971 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11972 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
11973 mov r0, rSELF
11974 add r1, rFP, #OFF_FP_SHADOWFRAME
11975 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11976
11977/* ------------------------------ */
11978 .balign 128
11979.L_ALT_op_iget_char_quick: /* 0xf1 */
11980/* File: arm/alt_stub.S */
11981/*
11982 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11983 * any interesting requests and then jump to the real instruction
11984 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11985 */
11986 .extern MterpCheckBefore
11987 EXPORT_PC
11988 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11989 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
11990 mov r0, rSELF
11991 add r1, rFP, #OFF_FP_SHADOWFRAME
11992 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11993
11994/* ------------------------------ */
11995 .balign 128
11996.L_ALT_op_iget_short_quick: /* 0xf2 */
11997/* File: arm/alt_stub.S */
11998/*
11999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12000 * any interesting requests and then jump to the real instruction
12001 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12002 */
12003 .extern MterpCheckBefore
12004 EXPORT_PC
12005 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12006 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
12007 mov r0, rSELF
12008 add r1, rFP, #OFF_FP_SHADOWFRAME
12009 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12010
12011/* ------------------------------ */
12012 .balign 128
12013.L_ALT_op_invoke_lambda: /* 0xf3 */
12014/* File: arm/alt_stub.S */
12015/*
12016 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12017 * any interesting requests and then jump to the real instruction
12018 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12019 */
12020 .extern MterpCheckBefore
12021 EXPORT_PC
12022 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12023 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
12024 mov r0, rSELF
12025 add r1, rFP, #OFF_FP_SHADOWFRAME
12026 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12027
12028/* ------------------------------ */
12029 .balign 128
12030.L_ALT_op_unused_f4: /* 0xf4 */
12031/* File: arm/alt_stub.S */
12032/*
12033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12034 * any interesting requests and then jump to the real instruction
12035 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12036 */
12037 .extern MterpCheckBefore
12038 EXPORT_PC
12039 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12040 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
12041 mov r0, rSELF
12042 add r1, rFP, #OFF_FP_SHADOWFRAME
12043 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12044
12045/* ------------------------------ */
12046 .balign 128
12047.L_ALT_op_capture_variable: /* 0xf5 */
12048/* File: arm/alt_stub.S */
12049/*
12050 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12051 * any interesting requests and then jump to the real instruction
12052 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12053 */
12054 .extern MterpCheckBefore
12055 EXPORT_PC
12056 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12057 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
12058 mov r0, rSELF
12059 add r1, rFP, #OFF_FP_SHADOWFRAME
12060 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12061
12062/* ------------------------------ */
12063 .balign 128
12064.L_ALT_op_create_lambda: /* 0xf6 */
12065/* File: arm/alt_stub.S */
12066/*
12067 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12068 * any interesting requests and then jump to the real instruction
12069 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12070 */
12071 .extern MterpCheckBefore
12072 EXPORT_PC
12073 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12074 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
12075 mov r0, rSELF
12076 add r1, rFP, #OFF_FP_SHADOWFRAME
12077 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12078
12079/* ------------------------------ */
12080 .balign 128
12081.L_ALT_op_liberate_variable: /* 0xf7 */
12082/* File: arm/alt_stub.S */
12083/*
12084 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12085 * any interesting requests and then jump to the real instruction
12086 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12087 */
12088 .extern MterpCheckBefore
12089 EXPORT_PC
12090 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12091 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
12092 mov r0, rSELF
12093 add r1, rFP, #OFF_FP_SHADOWFRAME
12094 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12095
12096/* ------------------------------ */
12097 .balign 128
12098.L_ALT_op_box_lambda: /* 0xf8 */
12099/* File: arm/alt_stub.S */
12100/*
12101 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12102 * any interesting requests and then jump to the real instruction
12103 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12104 */
12105 .extern MterpCheckBefore
12106 EXPORT_PC
12107 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12108 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
12109 mov r0, rSELF
12110 add r1, rFP, #OFF_FP_SHADOWFRAME
12111 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12112
12113/* ------------------------------ */
12114 .balign 128
12115.L_ALT_op_unbox_lambda: /* 0xf9 */
12116/* File: arm/alt_stub.S */
12117/*
12118 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12119 * any interesting requests and then jump to the real instruction
12120 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12121 */
12122 .extern MterpCheckBefore
12123 EXPORT_PC
12124 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12125 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
12126 mov r0, rSELF
12127 add r1, rFP, #OFF_FP_SHADOWFRAME
12128 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12129
12130/* ------------------------------ */
12131 .balign 128
12132.L_ALT_op_unused_fa: /* 0xfa */
12133/* File: arm/alt_stub.S */
12134/*
12135 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12136 * any interesting requests and then jump to the real instruction
12137 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12138 */
12139 .extern MterpCheckBefore
12140 EXPORT_PC
12141 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12142 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
12143 mov r0, rSELF
12144 add r1, rFP, #OFF_FP_SHADOWFRAME
12145 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12146
12147/* ------------------------------ */
12148 .balign 128
12149.L_ALT_op_unused_fb: /* 0xfb */
12150/* File: arm/alt_stub.S */
12151/*
12152 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12153 * any interesting requests and then jump to the real instruction
12154 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12155 */
12156 .extern MterpCheckBefore
12157 EXPORT_PC
12158 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12159 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
12160 mov r0, rSELF
12161 add r1, rFP, #OFF_FP_SHADOWFRAME
12162 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12163
12164/* ------------------------------ */
12165 .balign 128
12166.L_ALT_op_unused_fc: /* 0xfc */
12167/* File: arm/alt_stub.S */
12168/*
12169 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12170 * any interesting requests and then jump to the real instruction
12171 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12172 */
12173 .extern MterpCheckBefore
12174 EXPORT_PC
12175 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12176 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
12177 mov r0, rSELF
12178 add r1, rFP, #OFF_FP_SHADOWFRAME
12179 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12180
12181/* ------------------------------ */
12182 .balign 128
12183.L_ALT_op_unused_fd: /* 0xfd */
12184/* File: arm/alt_stub.S */
12185/*
12186 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12187 * any interesting requests and then jump to the real instruction
12188 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12189 */
12190 .extern MterpCheckBefore
12191 EXPORT_PC
12192 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12193 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
12194 mov r0, rSELF
12195 add r1, rFP, #OFF_FP_SHADOWFRAME
12196 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12197
12198/* ------------------------------ */
12199 .balign 128
12200.L_ALT_op_unused_fe: /* 0xfe */
12201/* File: arm/alt_stub.S */
12202/*
12203 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12204 * any interesting requests and then jump to the real instruction
12205 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12206 */
12207 .extern MterpCheckBefore
12208 EXPORT_PC
12209 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12210 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12211 mov r0, rSELF
12212 add r1, rFP, #OFF_FP_SHADOWFRAME
12213 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12214
12215/* ------------------------------ */
12216 .balign 128
12217.L_ALT_op_unused_ff: /* 0xff */
12218/* File: arm/alt_stub.S */
12219/*
12220 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12221 * any interesting requests and then jump to the real instruction
12222 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12223 */
12224 .extern MterpCheckBefore
12225 EXPORT_PC
12226 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12227 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12228 mov r0, rSELF
12229 add r1, rFP, #OFF_FP_SHADOWFRAME
12230 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12231
12232 .balign 128
12233 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12234 .global artMterpAsmAltInstructionEnd
12235artMterpAsmAltInstructionEnd:
12236/* File: arm/footer.S */
12237/*
12238 * ===========================================================================
12239 * Common subroutines and data
12240 * ===========================================================================
12241 */
12242
12243 .text
12244 .align 2
12245
12246/*
12247 * We've detected a condition that will result in an exception, but the exception
12248 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12249 * TUNING: for consistency, we may want to just go ahead and handle these here.
12250 */
buzbee1452bee2015-03-06 14:43:04 -080012251common_errDivideByZero:
12252 EXPORT_PC
12253#if MTERP_LOGGING
12254 mov r0, rSELF
12255 add r1, rFP, #OFF_FP_SHADOWFRAME
12256 bl MterpLogDivideByZeroException
12257#endif
12258 b MterpCommonFallback
12259
12260common_errArrayIndex:
12261 EXPORT_PC
12262#if MTERP_LOGGING
12263 mov r0, rSELF
12264 add r1, rFP, #OFF_FP_SHADOWFRAME
12265 bl MterpLogArrayIndexException
12266#endif
12267 b MterpCommonFallback
12268
12269common_errNegativeArraySize:
12270 EXPORT_PC
12271#if MTERP_LOGGING
12272 mov r0, rSELF
12273 add r1, rFP, #OFF_FP_SHADOWFRAME
12274 bl MterpLogNegativeArraySizeException
12275#endif
12276 b MterpCommonFallback
12277
12278common_errNoSuchMethod:
12279 EXPORT_PC
12280#if MTERP_LOGGING
12281 mov r0, rSELF
12282 add r1, rFP, #OFF_FP_SHADOWFRAME
12283 bl MterpLogNoSuchMethodException
12284#endif
12285 b MterpCommonFallback
12286
12287common_errNullObject:
12288 EXPORT_PC
12289#if MTERP_LOGGING
12290 mov r0, rSELF
12291 add r1, rFP, #OFF_FP_SHADOWFRAME
12292 bl MterpLogNullObjectException
12293#endif
12294 b MterpCommonFallback
12295
12296common_exceptionThrown:
12297 EXPORT_PC
12298#if MTERP_LOGGING
12299 mov r0, rSELF
12300 add r1, rFP, #OFF_FP_SHADOWFRAME
12301 bl MterpLogExceptionThrownException
12302#endif
12303 b MterpCommonFallback
12304
12305MterpSuspendFallback:
12306 EXPORT_PC
12307#if MTERP_LOGGING
12308 mov r0, rSELF
12309 add r1, rFP, #OFF_FP_SHADOWFRAME
12310 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12311 bl MterpLogSuspendFallback
12312#endif
12313 b MterpCommonFallback
12314
12315/*
12316 * If we're here, something is out of the ordinary. If there is a pending
12317 * exception, handle it. Otherwise, roll back and retry with the reference
12318 * interpreter.
12319 */
12320MterpPossibleException:
12321 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12322 cmp r0, #0 @ Exception pending?
12323 beq MterpFallback @ If not, fall back to reference interpreter.
12324 /* intentional fallthrough - handle pending exception. */
12325/*
12326 * On return from a runtime helper routine, we've found a pending exception.
12327 * Can we handle it here - or need to bail out to caller?
12328 *
12329 */
12330MterpException:
12331 mov r0, rSELF
12332 add r1, rFP, #OFF_FP_SHADOWFRAME
12333 bl MterpHandleException @ (self, shadow_frame)
12334 cmp r0, #0
12335 beq MterpExceptionReturn @ no local catch, back to caller.
12336 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12337 ldr r1, [rFP, #OFF_FP_DEX_PC]
12338 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12339 add rPC, r0, #CODEITEM_INSNS_OFFSET
12340 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
12341 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
12342 /* resume execution at catch block */
12343 FETCH_INST
12344 GET_INST_OPCODE ip
12345 GOTO_OPCODE ip
12346 /* NOTE: no fallthrough */
12347
12348/*
12349 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12350 * still needs to get the opcode and branch to it, and flags are in lr.
12351 */
12352MterpCheckSuspendAndContinue:
12353 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
12354 EXPORT_PC
12355 mov r0, rSELF
12356 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12357 blne MterpSuspendCheck @ (self)
12358 GET_INST_OPCODE ip @ extract opcode from rINST
12359 GOTO_OPCODE ip @ jump to next instruction
12360
12361/*
Bill Buzbee9687f242016-02-05 14:08:10 +000012362 * On-stack replacement pending.
12363 * Branch offset in rINST on entry.
12364 */
12365MterpOnStackReplacement:
12366#if MTERP_LOGGING
12367 mov r0, rSELF
12368 add r1, rFP, #OFF_FP_SHADOWFRAME
12369 mov r2, rINST
12370 bl MterpLogOSR
12371#endif
12372 b MterpFallback @ Let the reference interpreter deal with it.
12373/*
buzbee1452bee2015-03-06 14:43:04 -080012374 * Bail out to reference interpreter.
12375 */
12376MterpFallback:
12377 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -080012378#if MTERP_LOGGING
buzbee1452bee2015-03-06 14:43:04 -080012379 mov r0, rSELF
12380 add r1, rFP, #OFF_FP_SHADOWFRAME
12381 bl MterpLogFallback
buzbee76833da2016-01-13 13:06:22 -080012382#endif
buzbee1452bee2015-03-06 14:43:04 -080012383MterpCommonFallback:
12384 mov r0, #0 @ signal retry with reference interpreter.
12385 b MterpDone
12386
12387/*
12388 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12389 * SP and LR. Here we restore SP, restore the registers, and then restore
12390 * LR to PC.
12391 *
12392 * On entry:
12393 * uint32_t* rFP (should still be live, pointer to base of vregs)
12394 */
12395MterpExceptionReturn:
buzbee1452bee2015-03-06 14:43:04 -080012396 mov r0, #1 @ signal return to caller.
12397 b MterpDone
12398MterpReturn:
12399 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
buzbee1452bee2015-03-06 14:43:04 -080012400 str r0, [r2]
12401 str r1, [r2, #4]
buzbee1452bee2015-03-06 14:43:04 -080012402 mov r0, #1 @ signal return to caller.
12403MterpDone:
12404 add sp, sp, #4 @ un-align 64
12405 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12406
12407
12408 .fnend
12409 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12410
12411