blob: 78c784b773e515bda6c305c21246e7d60ab07e4c [file] [log] [blame]
buzbee1452bee2015-03-06 14:43:04 -08001/*
2 * This file was generated automatically by gen-mterp.py for 'arm'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: arm/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 Art assembly interpreter notes:
26
27 First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28 handle invoke, allows higher-level code to create frame & shadow frame.
29
30 Once that's working, support direct entry code & eliminate shadow frame (and
31 excess locals allocation.
32
33 Some (hopefully) temporary ugliness. We'll treat rFP as pointing to the
34 base of the vreg array within the shadow frame. Access the other fields,
35 dex_pc_, method_ and number_of_vregs_ via negative offsets. For now, we'll continue
36 the shadow frame mechanism of double-storing object references - via rFP &
37 number_of_vregs_.
38
39 */
40
41/*
42ARM EABI general notes:
43
44r0-r3 hold first 4 args to a method; they are not preserved across method calls
45r4-r8 are available for general use
46r9 is given special treatment in some situations, but not for us
47r10 (sl) seems to be generally available
48r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
49r12 (ip) is scratch -- not preserved across method calls
50r13 (sp) should be managed carefully in case a signal arrives
51r14 (lr) must be preserved
52r15 (pc) can be tinkered with directly
53
54r0 holds returns of <= 4 bytes
55r0-r1 hold returns of 8 bytes, low word in r0
56
57Callee must save/restore r4+ (except r12) if it modifies them. If VFP
58is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
59s0-s15 (d0-d7, q0-a3) do not need to be.
60
61Stack is "full descending". Only the arguments that don't fit in the first 4
62registers are placed on the stack. "sp" points at the first stacked argument
63(i.e. the 5th arg).
64
65VFP: single-precision results in s0, double-precision results in d0.
66
67In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
6864-bit quantities (long long, double) must be 64-bit aligned.
69*/
70
71/*
72Mterp and ARM notes:
73
74The following registers have fixed assignments:
75
76 reg nick purpose
77 r4 rPC interpreted program counter, used for fetching instructions
78 r5 rFP interpreted frame pointer, used for accessing locals and args
79 r6 rSELF self (Thread) pointer
80 r7 rINST first 16-bit code unit of current instruction
81 r8 rIBASE interpreted instruction base pointer, used for computed goto
82 r11 rREFS base of object references in shadow frame (ideally, we'll get rid of this later).
83
84Macros are provided for common operations. Each macro MUST emit only
85one instruction to make instruction-counting easier. They MUST NOT alter
86unspecified registers or condition codes.
87*/
88
89/*
90 * This is a #include, not a %include, because we want the C pre-processor
91 * to expand the macros into assembler assignment statements.
92 */
93#include "asm_support.h"
94
95/* During bringup, we'll use the shadow frame model instead of rFP */
96/* single-purpose registers, given names for clarity */
97#define rPC r4
98#define rFP r5
99#define rSELF r6
100#define rINST r7
101#define rIBASE r8
102#define rREFS r11
103
104/*
105 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So,
106 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
107 */
108#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
109#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
110#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
111#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
112#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
113#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
114#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
115#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
116#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
117
118/*
Nicolas Geoffray5d033172016-02-11 11:39:37 +0000119 *
120 * The reference interpreter performs explicit suspect checks, which is somewhat wasteful.
121 * Dalvik's interpreter folded suspend checks into the jump table mechanism, and eventually
122 * mterp should do so as well.
123 */
124#define MTERP_SUSPEND 0
125
126/*
buzbee1452bee2015-03-06 14:43:04 -0800127 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
128 * be done *before* something throws.
129 *
130 * It's okay to do this more than once.
131 *
132 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
133 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
134 * offset into the code_items_[] array. For effiency, we will "export" the
135 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
136 * to convert to a dex pc when needed.
137 */
138.macro EXPORT_PC
139 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
140.endm
141
142.macro EXPORT_DEX_PC tmp
143 ldr \tmp, [rFP, #OFF_FP_CODE_ITEM]
144 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
145 add \tmp, #CODEITEM_INSNS_OFFSET
146 sub \tmp, rPC, \tmp
147 asr \tmp, #1
148 str \tmp, [rFP, #OFF_FP_DEX_PC]
149.endm
150
151/*
152 * Fetch the next instruction from rPC into rINST. Does not advance rPC.
153 */
154.macro FETCH_INST
155 ldrh rINST, [rPC]
156.endm
157
158/*
159 * Fetch the next instruction from the specified offset. Advances rPC
160 * to point to the next instruction. "_count" is in 16-bit code units.
161 *
162 * Because of the limited size of immediate constants on ARM, this is only
163 * suitable for small forward movements (i.e. don't try to implement "goto"
164 * with this).
165 *
166 * This must come AFTER anything that can throw an exception, or the
167 * exception catch may miss. (This also implies that it must come after
168 * EXPORT_PC.)
169 */
170.macro FETCH_ADVANCE_INST count
171 ldrh rINST, [rPC, #((\count)*2)]!
172.endm
173
174/*
175 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
176 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
177 */
178.macro PREFETCH_ADVANCE_INST dreg, sreg, count
179 ldrh \dreg, [\sreg, #((\count)*2)]!
180.endm
181
182/*
183 * Similar to FETCH_ADVANCE_INST, but does not update rPC. Used to load
184 * rINST ahead of possible exception point. Be sure to manually advance rPC
185 * later.
186 */
187.macro PREFETCH_INST count
188 ldrh rINST, [rPC, #((\count)*2)]
189.endm
190
191/* Advance rPC by some number of code units. */
192.macro ADVANCE count
193 add rPC, #((\count)*2)
194.endm
195
196/*
197 * Fetch the next instruction from an offset specified by _reg. Updates
198 * rPC to point to the next instruction. "_reg" must specify the distance
199 * in bytes, *not* 16-bit code units, and may be a signed value.
200 *
201 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
202 * bits that hold the shift distance are used for the half/byte/sign flags.
203 * In some cases we can pre-double _reg for free, so we require a byte offset
204 * here.
205 */
206.macro FETCH_ADVANCE_INST_RB reg
207 ldrh rINST, [rPC, \reg]!
208.endm
209
210/*
211 * Fetch a half-word code unit from an offset past the current PC. The
212 * "_count" value is in 16-bit code units. Does not advance rPC.
213 *
214 * The "_S" variant works the same but treats the value as signed.
215 */
216.macro FETCH reg, count
217 ldrh \reg, [rPC, #((\count)*2)]
218.endm
219
220.macro FETCH_S reg, count
221 ldrsh \reg, [rPC, #((\count)*2)]
222.endm
223
224/*
225 * Fetch one byte from an offset past the current PC. Pass in the same
226 * "_count" as you would for FETCH, and an additional 0/1 indicating which
227 * byte of the halfword you want (lo/hi).
228 */
229.macro FETCH_B reg, count, byte
230 ldrb \reg, [rPC, #((\count)*2+(\byte))]
231.endm
232
233/*
234 * Put the instruction's opcode field into the specified register.
235 */
236.macro GET_INST_OPCODE reg
237 and \reg, rINST, #255
238.endm
239
240/*
241 * Put the prefetched instruction's opcode field into the specified register.
242 */
243.macro GET_PREFETCHED_OPCODE oreg, ireg
244 and \oreg, \ireg, #255
245.endm
246
247/*
248 * Begin executing the opcode in _reg. Because this only jumps within the
249 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
250 */
251.macro GOTO_OPCODE reg
252 add pc, rIBASE, \reg, lsl #7
253.endm
254.macro GOTO_OPCODE_BASE base,reg
255 add pc, \base, \reg, lsl #7
256.endm
257
258/*
259 * Get/set the 32-bit value from a Dalvik register.
260 */
261.macro GET_VREG reg, vreg
262 ldr \reg, [rFP, \vreg, lsl #2]
263.endm
264.macro SET_VREG reg, vreg
265 str \reg, [rFP, \vreg, lsl #2]
266 mov \reg, #0
267 str \reg, [rREFS, \vreg, lsl #2]
268.endm
269.macro SET_VREG_OBJECT reg, vreg, tmpreg
270 str \reg, [rFP, \vreg, lsl #2]
271 str \reg, [rREFS, \vreg, lsl #2]
272.endm
273
274/*
275 * Convert a virtual register index into an address.
276 */
277.macro VREG_INDEX_TO_ADDR reg, vreg
278 add \reg, rFP, \vreg, lsl #2 /* WARNING/FIXME: handle shadow frame vreg zero if store */
279.endm
280
281/*
282 * Refresh handler table.
283 */
284.macro REFRESH_IBASE
285 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
286.endm
287
288/* File: arm/entry.S */
289/*
290 * Copyright (C) 2016 The Android Open Source Project
291 *
292 * Licensed under the Apache License, Version 2.0 (the "License");
293 * you may not use this file except in compliance with the License.
294 * You may obtain a copy of the License at
295 *
296 * http://www.apache.org/licenses/LICENSE-2.0
297 *
298 * Unless required by applicable law or agreed to in writing, software
299 * distributed under the License is distributed on an "AS IS" BASIS,
300 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
301 * See the License for the specific language governing permissions and
302 * limitations under the License.
303 */
304/*
305 * Interpreter entry point.
306 */
307
308 .text
309 .align 2
310 .global ExecuteMterpImpl
311 .type ExecuteMterpImpl, %function
312
313/*
314 * On entry:
315 * r0 Thread* self/
316 * r1 code_item
317 * r2 ShadowFrame
318 * r3 JValue* result_register
319 *
320 */
321
322ExecuteMterpImpl:
323 .fnstart
324 .save {r4-r10,fp,lr}
325 stmfd sp!, {r4-r10,fp,lr} @ save 9 regs
326 .pad #4
327 sub sp, sp, #4 @ align 64
328
329 /* Remember the return register */
330 str r3, [r2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
331
332 /* Remember the code_item */
333 str r1, [r2, #SHADOWFRAME_CODE_ITEM_OFFSET]
334
335 /* set up "named" registers */
336 mov rSELF, r0
337 ldr r0, [r2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
338 add rFP, r2, #SHADOWFRAME_VREGS_OFFSET @ point to insns[] (i.e. - the dalivk byte code).
339 add rREFS, rFP, r0, lsl #2 @ point to reference array in shadow frame
340 ldr r0, [r2, #SHADOWFRAME_DEX_PC_OFFSET] @ Get starting dex_pc.
341 add rPC, r1, #CODEITEM_INSNS_OFFSET @ Point to base of insns[]
342 add rPC, rPC, r0, lsl #1 @ Create direct pointer to 1st dex opcode
343 EXPORT_PC
344
345 /* Starting ibase */
346 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
347
348 /* start executing the instruction at rPC */
349 FETCH_INST @ load rINST from rPC
350 GET_INST_OPCODE ip @ extract opcode from rINST
351 GOTO_OPCODE ip @ jump to next instruction
352 /* NOTE: no fallthrough */
353
354
355 .global artMterpAsmInstructionStart
356 .type artMterpAsmInstructionStart, %function
357artMterpAsmInstructionStart = .L_op_nop
358 .text
359
360/* ------------------------------ */
361 .balign 128
362.L_op_nop: /* 0x00 */
363/* File: arm/op_nop.S */
364 FETCH_ADVANCE_INST 1 @ advance to next instr, load rINST
365 GET_INST_OPCODE ip @ ip<- opcode from rINST
366 GOTO_OPCODE ip @ execute it
367
368/* ------------------------------ */
369 .balign 128
370.L_op_move: /* 0x01 */
371/* File: arm/op_move.S */
372 /* for move, move-object, long-to-int */
373 /* op vA, vB */
374 mov r1, rINST, lsr #12 @ r1<- B from 15:12
375 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
376 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
377 GET_VREG r2, r1 @ r2<- fp[B]
378 GET_INST_OPCODE ip @ ip<- opcode from rINST
379 .if 0
380 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
381 .else
382 SET_VREG r2, r0 @ fp[A]<- r2
383 .endif
384 GOTO_OPCODE ip @ execute next instruction
385
386/* ------------------------------ */
387 .balign 128
388.L_op_move_from16: /* 0x02 */
389/* File: arm/op_move_from16.S */
390 /* for: move/from16, move-object/from16 */
391 /* op vAA, vBBBB */
392 FETCH r1, 1 @ r1<- BBBB
393 mov r0, rINST, lsr #8 @ r0<- AA
394 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
395 GET_VREG r2, r1 @ r2<- fp[BBBB]
396 GET_INST_OPCODE ip @ extract opcode from rINST
397 .if 0
398 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
399 .else
400 SET_VREG r2, r0 @ fp[AA]<- r2
401 .endif
402 GOTO_OPCODE ip @ jump to next instruction
403
404/* ------------------------------ */
405 .balign 128
406.L_op_move_16: /* 0x03 */
407/* File: arm/op_move_16.S */
408 /* for: move/16, move-object/16 */
409 /* op vAAAA, vBBBB */
410 FETCH r1, 2 @ r1<- BBBB
411 FETCH r0, 1 @ r0<- AAAA
412 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
413 GET_VREG r2, r1 @ r2<- fp[BBBB]
414 GET_INST_OPCODE ip @ extract opcode from rINST
415 .if 0
416 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
417 .else
418 SET_VREG r2, r0 @ fp[AAAA]<- r2
419 .endif
420 GOTO_OPCODE ip @ jump to next instruction
421
422/* ------------------------------ */
423 .balign 128
424.L_op_move_wide: /* 0x04 */
425/* File: arm/op_move_wide.S */
426 /* move-wide vA, vB */
427 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
428 mov r3, rINST, lsr #12 @ r3<- B
429 ubfx r2, rINST, #8, #4 @ r2<- A
430 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
431 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
432 ldmia r3, {r0-r1} @ r0/r1<- fp[B]
433 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
434 GET_INST_OPCODE ip @ extract opcode from rINST
435 stmia r2, {r0-r1} @ fp[A]<- r0/r1
436 GOTO_OPCODE ip @ jump to next instruction
437
438/* ------------------------------ */
439 .balign 128
440.L_op_move_wide_from16: /* 0x05 */
441/* File: arm/op_move_wide_from16.S */
442 /* move-wide/from16 vAA, vBBBB */
443 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
444 FETCH r3, 1 @ r3<- BBBB
445 mov r2, rINST, lsr #8 @ r2<- AA
446 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
447 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
448 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
449 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
450 GET_INST_OPCODE ip @ extract opcode from rINST
451 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
452 GOTO_OPCODE ip @ jump to next instruction
453
454/* ------------------------------ */
455 .balign 128
456.L_op_move_wide_16: /* 0x06 */
457/* File: arm/op_move_wide_16.S */
458 /* move-wide/16 vAAAA, vBBBB */
459 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
460 FETCH r3, 2 @ r3<- BBBB
461 FETCH r2, 1 @ r2<- AAAA
462 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
463 add r2, rFP, r2, lsl #2 @ r2<- &fp[AAAA]
464 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
465 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
466 stmia r2, {r0-r1} @ fp[AAAA]<- r0/r1
467 GET_INST_OPCODE ip @ extract opcode from rINST
468 GOTO_OPCODE ip @ jump to next instruction
469
470/* ------------------------------ */
471 .balign 128
472.L_op_move_object: /* 0x07 */
473/* File: arm/op_move_object.S */
474/* File: arm/op_move.S */
475 /* for move, move-object, long-to-int */
476 /* op vA, vB */
477 mov r1, rINST, lsr #12 @ r1<- B from 15:12
478 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
479 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
480 GET_VREG r2, r1 @ r2<- fp[B]
481 GET_INST_OPCODE ip @ ip<- opcode from rINST
482 .if 1
483 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
484 .else
485 SET_VREG r2, r0 @ fp[A]<- r2
486 .endif
487 GOTO_OPCODE ip @ execute next instruction
488
489
490/* ------------------------------ */
491 .balign 128
492.L_op_move_object_from16: /* 0x08 */
493/* File: arm/op_move_object_from16.S */
494/* File: arm/op_move_from16.S */
495 /* for: move/from16, move-object/from16 */
496 /* op vAA, vBBBB */
497 FETCH r1, 1 @ r1<- BBBB
498 mov r0, rINST, lsr #8 @ r0<- AA
499 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
500 GET_VREG r2, r1 @ r2<- fp[BBBB]
501 GET_INST_OPCODE ip @ extract opcode from rINST
502 .if 1
503 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
504 .else
505 SET_VREG r2, r0 @ fp[AA]<- r2
506 .endif
507 GOTO_OPCODE ip @ jump to next instruction
508
509
510/* ------------------------------ */
511 .balign 128
512.L_op_move_object_16: /* 0x09 */
513/* File: arm/op_move_object_16.S */
514/* File: arm/op_move_16.S */
515 /* for: move/16, move-object/16 */
516 /* op vAAAA, vBBBB */
517 FETCH r1, 2 @ r1<- BBBB
518 FETCH r0, 1 @ r0<- AAAA
519 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
520 GET_VREG r2, r1 @ r2<- fp[BBBB]
521 GET_INST_OPCODE ip @ extract opcode from rINST
522 .if 1
523 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
524 .else
525 SET_VREG r2, r0 @ fp[AAAA]<- r2
526 .endif
527 GOTO_OPCODE ip @ jump to next instruction
528
529
530/* ------------------------------ */
531 .balign 128
532.L_op_move_result: /* 0x0a */
533/* File: arm/op_move_result.S */
534 /* for: move-result, move-result-object */
535 /* op vAA */
536 mov r2, rINST, lsr #8 @ r2<- AA
537 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
538 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
539 ldr r0, [r0] @ r0 <- result.i.
540 GET_INST_OPCODE ip @ extract opcode from rINST
541 .if 0
542 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
543 .else
544 SET_VREG r0, r2 @ fp[AA]<- r0
545 .endif
546 GOTO_OPCODE ip @ jump to next instruction
547
548/* ------------------------------ */
549 .balign 128
550.L_op_move_result_wide: /* 0x0b */
551/* File: arm/op_move_result_wide.S */
552 /* move-result-wide vAA */
553 mov r2, rINST, lsr #8 @ r2<- AA
554 ldr r3, [rFP, #OFF_FP_RESULT_REGISTER]
555 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
556 ldmia r3, {r0-r1} @ r0/r1<- retval.j
557 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
558 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
559 GET_INST_OPCODE ip @ extract opcode from rINST
560 GOTO_OPCODE ip @ jump to next instruction
561
562/* ------------------------------ */
563 .balign 128
564.L_op_move_result_object: /* 0x0c */
565/* File: arm/op_move_result_object.S */
566/* File: arm/op_move_result.S */
567 /* for: move-result, move-result-object */
568 /* op vAA */
569 mov r2, rINST, lsr #8 @ r2<- AA
570 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
571 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
572 ldr r0, [r0] @ r0 <- result.i.
573 GET_INST_OPCODE ip @ extract opcode from rINST
574 .if 1
575 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
576 .else
577 SET_VREG r0, r2 @ fp[AA]<- r0
578 .endif
579 GOTO_OPCODE ip @ jump to next instruction
580
581
582/* ------------------------------ */
583 .balign 128
584.L_op_move_exception: /* 0x0d */
585/* File: arm/op_move_exception.S */
586 /* move-exception vAA */
587 mov r2, rINST, lsr #8 @ r2<- AA
588 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
589 mov r1, #0 @ r1<- 0
590 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
591 SET_VREG_OBJECT r3, r2 @ fp[AA]<- exception obj
592 GET_INST_OPCODE ip @ extract opcode from rINST
593 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ clear exception
594 GOTO_OPCODE ip @ jump to next instruction
595
596/* ------------------------------ */
597 .balign 128
598.L_op_return_void: /* 0x0e */
599/* File: arm/op_return_void.S */
600 .extern MterpThreadFenceForConstructor
601 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800602 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
603 mov r0, rSELF
604 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
605 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800606 mov r0, #0
607 mov r1, #0
608 b MterpReturn
609
610/* ------------------------------ */
611 .balign 128
612.L_op_return: /* 0x0f */
613/* File: arm/op_return.S */
614 /*
615 * Return a 32-bit value.
616 *
617 * for: return, return-object
618 */
619 /* op vAA */
620 .extern MterpThreadFenceForConstructor
621 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800622 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
623 mov r0, rSELF
624 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
625 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800626 mov r2, rINST, lsr #8 @ r2<- AA
627 GET_VREG r0, r2 @ r0<- vAA
628 mov r1, #0
629 b MterpReturn
630
631/* ------------------------------ */
632 .balign 128
633.L_op_return_wide: /* 0x10 */
634/* File: arm/op_return_wide.S */
635 /*
636 * Return a 64-bit value.
637 */
638 /* return-wide vAA */
639 .extern MterpThreadFenceForConstructor
640 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800641 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
642 mov r0, rSELF
643 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
644 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800645 mov r2, rINST, lsr #8 @ r2<- AA
646 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
647 ldmia r2, {r0-r1} @ r0/r1 <- vAA/vAA+1
648 b MterpReturn
649
650/* ------------------------------ */
651 .balign 128
652.L_op_return_object: /* 0x11 */
653/* File: arm/op_return_object.S */
654/* File: arm/op_return.S */
655 /*
656 * Return a 32-bit value.
657 *
658 * for: return, return-object
659 */
660 /* op vAA */
661 .extern MterpThreadFenceForConstructor
662 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800663 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
664 mov r0, rSELF
665 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
666 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800667 mov r2, rINST, lsr #8 @ r2<- AA
668 GET_VREG r0, r2 @ r0<- vAA
669 mov r1, #0
670 b MterpReturn
671
672
673/* ------------------------------ */
674 .balign 128
675.L_op_const_4: /* 0x12 */
676/* File: arm/op_const_4.S */
677 /* const/4 vA, #+B */
678 mov r1, rINST, lsl #16 @ r1<- Bxxx0000
679 ubfx r0, rINST, #8, #4 @ r0<- A
680 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
681 mov r1, r1, asr #28 @ r1<- sssssssB (sign-extended)
682 GET_INST_OPCODE ip @ ip<- opcode from rINST
683 SET_VREG r1, r0 @ fp[A]<- r1
684 GOTO_OPCODE ip @ execute next instruction
685
686/* ------------------------------ */
687 .balign 128
688.L_op_const_16: /* 0x13 */
689/* File: arm/op_const_16.S */
690 /* const/16 vAA, #+BBBB */
691 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
692 mov r3, rINST, lsr #8 @ r3<- AA
693 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
694 SET_VREG r0, r3 @ vAA<- r0
695 GET_INST_OPCODE ip @ extract opcode from rINST
696 GOTO_OPCODE ip @ jump to next instruction
697
698/* ------------------------------ */
699 .balign 128
700.L_op_const: /* 0x14 */
701/* File: arm/op_const.S */
702 /* const vAA, #+BBBBbbbb */
703 mov r3, rINST, lsr #8 @ r3<- AA
704 FETCH r0, 1 @ r0<- bbbb (low
705 FETCH r1, 2 @ r1<- BBBB (high
706 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
707 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
708 GET_INST_OPCODE ip @ extract opcode from rINST
709 SET_VREG r0, r3 @ vAA<- r0
710 GOTO_OPCODE ip @ jump to next instruction
711
712/* ------------------------------ */
713 .balign 128
714.L_op_const_high16: /* 0x15 */
715/* File: arm/op_const_high16.S */
716 /* const/high16 vAA, #+BBBB0000 */
717 FETCH r0, 1 @ r0<- 0000BBBB (zero-extended
718 mov r3, rINST, lsr #8 @ r3<- AA
719 mov r0, r0, lsl #16 @ r0<- BBBB0000
720 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
721 SET_VREG r0, r3 @ vAA<- r0
722 GET_INST_OPCODE ip @ extract opcode from rINST
723 GOTO_OPCODE ip @ jump to next instruction
724
725/* ------------------------------ */
726 .balign 128
727.L_op_const_wide_16: /* 0x16 */
728/* File: arm/op_const_wide_16.S */
729 /* const-wide/16 vAA, #+BBBB */
730 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
731 mov r3, rINST, lsr #8 @ r3<- AA
732 mov r1, r0, asr #31 @ r1<- ssssssss
733 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
734 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
735 GET_INST_OPCODE ip @ extract opcode from rINST
736 stmia r3, {r0-r1} @ vAA<- r0/r1
737 GOTO_OPCODE ip @ jump to next instruction
738
739/* ------------------------------ */
740 .balign 128
741.L_op_const_wide_32: /* 0x17 */
742/* File: arm/op_const_wide_32.S */
743 /* const-wide/32 vAA, #+BBBBbbbb */
744 FETCH r0, 1 @ r0<- 0000bbbb (low)
745 mov r3, rINST, lsr #8 @ r3<- AA
746 FETCH_S r2, 2 @ r2<- ssssBBBB (high)
747 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
748 orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb
749 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
750 mov r1, r0, asr #31 @ r1<- ssssssss
751 GET_INST_OPCODE ip @ extract opcode from rINST
752 stmia r3, {r0-r1} @ vAA<- r0/r1
753 GOTO_OPCODE ip @ jump to next instruction
754
755/* ------------------------------ */
756 .balign 128
757.L_op_const_wide: /* 0x18 */
758/* File: arm/op_const_wide.S */
759 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
760 FETCH r0, 1 @ r0<- bbbb (low)
761 FETCH r1, 2 @ r1<- BBBB (low middle)
762 FETCH r2, 3 @ r2<- hhhh (high middle)
763 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word)
764 FETCH r3, 4 @ r3<- HHHH (high)
765 mov r9, rINST, lsr #8 @ r9<- AA
766 orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word)
767 FETCH_ADVANCE_INST 5 @ advance rPC, load rINST
768 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
769 GET_INST_OPCODE ip @ extract opcode from rINST
770 stmia r9, {r0-r1} @ vAA<- r0/r1
771 GOTO_OPCODE ip @ jump to next instruction
772
773/* ------------------------------ */
774 .balign 128
775.L_op_const_wide_high16: /* 0x19 */
776/* File: arm/op_const_wide_high16.S */
777 /* const-wide/high16 vAA, #+BBBB000000000000 */
778 FETCH r1, 1 @ r1<- 0000BBBB (zero-extended)
779 mov r3, rINST, lsr #8 @ r3<- AA
780 mov r0, #0 @ r0<- 00000000
781 mov r1, r1, lsl #16 @ r1<- BBBB0000
782 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
783 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
784 GET_INST_OPCODE ip @ extract opcode from rINST
785 stmia r3, {r0-r1} @ vAA<- r0/r1
786 GOTO_OPCODE ip @ jump to next instruction
787
788/* ------------------------------ */
789 .balign 128
790.L_op_const_string: /* 0x1a */
791/* File: arm/op_const_string.S */
792 /* const/string vAA, String@BBBB */
793 EXPORT_PC
794 FETCH r0, 1 @ r0<- BBBB
795 mov r1, rINST, lsr #8 @ r1<- AA
796 add r2, rFP, #OFF_FP_SHADOWFRAME
797 mov r3, rSELF
798 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
799 PREFETCH_INST 2 @ load rINST
800 cmp r0, #0 @ fail?
801 bne MterpPossibleException @ let reference interpreter deal with it.
802 ADVANCE 2 @ advance rPC
803 GET_INST_OPCODE ip @ extract opcode from rINST
804 GOTO_OPCODE ip @ jump to next instruction
805
806/* ------------------------------ */
807 .balign 128
808.L_op_const_string_jumbo: /* 0x1b */
809/* File: arm/op_const_string_jumbo.S */
810 /* const/string vAA, String@BBBBBBBB */
811 EXPORT_PC
812 FETCH r0, 1 @ r0<- bbbb (low
813 FETCH r2, 2 @ r2<- BBBB (high
814 mov r1, rINST, lsr #8 @ r1<- AA
815 orr r0, r0, r2, lsl #16 @ r1<- BBBBbbbb
816 add r2, rFP, #OFF_FP_SHADOWFRAME
817 mov r3, rSELF
818 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
819 PREFETCH_INST 3 @ advance rPC
820 cmp r0, #0 @ fail?
821 bne MterpPossibleException @ let reference interpreter deal with it.
822 ADVANCE 3 @ advance rPC
823 GET_INST_OPCODE ip @ extract opcode from rINST
824 GOTO_OPCODE ip @ jump to next instruction
825
826/* ------------------------------ */
827 .balign 128
828.L_op_const_class: /* 0x1c */
829/* File: arm/op_const_class.S */
830 /* const/class vAA, Class@BBBB */
831 EXPORT_PC
832 FETCH r0, 1 @ r0<- BBBB
833 mov r1, rINST, lsr #8 @ r1<- AA
834 add r2, rFP, #OFF_FP_SHADOWFRAME
835 mov r3, rSELF
836 bl MterpConstClass @ (index, tgt_reg, shadow_frame, self)
837 PREFETCH_INST 2
838 cmp r0, #0
839 bne MterpPossibleException
840 ADVANCE 2
841 GET_INST_OPCODE ip @ extract opcode from rINST
842 GOTO_OPCODE ip @ jump to next instruction
843
844/* ------------------------------ */
845 .balign 128
846.L_op_monitor_enter: /* 0x1d */
847/* File: arm/op_monitor_enter.S */
848 /*
849 * Synchronize on an object.
850 */
851 /* monitor-enter vAA */
852 EXPORT_PC
853 mov r2, rINST, lsr #8 @ r2<- AA
854 GET_VREG r0, r2 @ r0<- vAA (object)
855 mov r1, rSELF @ r1<- self
856 bl artLockObjectFromCode
857 cmp r0, #0
858 bne MterpException
859 FETCH_ADVANCE_INST 1
860 GET_INST_OPCODE ip @ extract opcode from rINST
861 GOTO_OPCODE ip @ jump to next instruction
862
863/* ------------------------------ */
864 .balign 128
865.L_op_monitor_exit: /* 0x1e */
866/* File: arm/op_monitor_exit.S */
867 /*
868 * Unlock an object.
869 *
870 * Exceptions that occur when unlocking a monitor need to appear as
871 * if they happened at the following instruction. See the Dalvik
872 * instruction spec.
873 */
874 /* monitor-exit vAA */
875 EXPORT_PC
876 mov r2, rINST, lsr #8 @ r2<- AA
877 GET_VREG r0, r2 @ r0<- vAA (object)
878 mov r1, rSELF @ r0<- self
879 bl artUnlockObjectFromCode @ r0<- success for unlock(self, obj)
880 cmp r0, #0 @ failed?
881 bne MterpException
882 FETCH_ADVANCE_INST 1 @ before throw: advance rPC, load rINST
883 GET_INST_OPCODE ip @ extract opcode from rINST
884 GOTO_OPCODE ip @ jump to next instruction
885
886/* ------------------------------ */
887 .balign 128
888.L_op_check_cast: /* 0x1f */
889/* File: arm/op_check_cast.S */
890 /*
891 * Check to see if a cast from one class to another is allowed.
892 */
893 /* check-cast vAA, class@BBBB */
894 EXPORT_PC
895 FETCH r0, 1 @ r0<- BBBB
896 mov r1, rINST, lsr #8 @ r1<- AA
buzbeea2c97a92016-01-25 15:41:24 -0800897 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800898 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
899 mov r3, rSELF @ r3<- self
buzbeea2c97a92016-01-25 15:41:24 -0800900 bl MterpCheckCast @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800901 PREFETCH_INST 2
902 cmp r0, #0
903 bne MterpPossibleException
904 ADVANCE 2
905 GET_INST_OPCODE ip @ extract opcode from rINST
906 GOTO_OPCODE ip @ jump to next instruction
907
908/* ------------------------------ */
909 .balign 128
910.L_op_instance_of: /* 0x20 */
911/* File: arm/op_instance_of.S */
912 /*
913 * Check to see if an object reference is an instance of a class.
914 *
915 * Most common situation is a non-null object, being compared against
916 * an already-resolved class.
917 */
918 /* instance-of vA, vB, class@CCCC */
919 EXPORT_PC
920 FETCH r0, 1 @ r0<- CCCC
921 mov r1, rINST, lsr #12 @ r1<- B
buzbeea2c97a92016-01-25 15:41:24 -0800922 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800923 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
924 mov r3, rSELF @ r3<- self
925 mov r9, rINST, lsr #8 @ r9<- A+
926 and r9, r9, #15 @ r9<- A
buzbeea2c97a92016-01-25 15:41:24 -0800927 bl MterpInstanceOf @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800928 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
929 PREFETCH_INST 2
930 cmp r1, #0 @ exception pending?
931 bne MterpException
932 ADVANCE 2 @ advance rPC
933 SET_VREG r0, r9 @ vA<- r0
934 GET_INST_OPCODE ip @ extract opcode from rINST
935 GOTO_OPCODE ip @ jump to next instruction
936
937/* ------------------------------ */
938 .balign 128
939.L_op_array_length: /* 0x21 */
940/* File: arm/op_array_length.S */
941 /*
942 * Return the length of an array.
943 */
944 mov r1, rINST, lsr #12 @ r1<- B
945 ubfx r2, rINST, #8, #4 @ r2<- A
946 GET_VREG r0, r1 @ r0<- vB (object ref)
947 cmp r0, #0 @ is object null?
948 beq common_errNullObject @ yup, fail
949 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
950 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- array length
951 GET_INST_OPCODE ip @ extract opcode from rINST
952 SET_VREG r3, r2 @ vB<- length
953 GOTO_OPCODE ip @ jump to next instruction
954
955/* ------------------------------ */
956 .balign 128
957.L_op_new_instance: /* 0x22 */
958/* File: arm/op_new_instance.S */
959 /*
960 * Create a new instance of a class.
961 */
962 /* new-instance vAA, class@BBBB */
963 EXPORT_PC
964 add r0, rFP, #OFF_FP_SHADOWFRAME
965 mov r1, rSELF
966 mov r2, rINST
967 bl MterpNewInstance @ (shadow_frame, self, inst_data)
968 cmp r0, #0
969 beq MterpPossibleException
970 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
971 GET_INST_OPCODE ip @ extract opcode from rINST
972 GOTO_OPCODE ip @ jump to next instruction
973
974/* ------------------------------ */
975 .balign 128
976.L_op_new_array: /* 0x23 */
977/* File: arm/op_new_array.S */
978 /*
979 * Allocate an array of objects, specified with the array class
980 * and a count.
981 *
982 * The verifier guarantees that this is an array class, so we don't
983 * check for it here.
984 */
985 /* new-array vA, vB, class@CCCC */
986 EXPORT_PC
987 add r0, rFP, #OFF_FP_SHADOWFRAME
988 mov r1, rPC
989 mov r2, rINST
990 mov r3, rSELF
991 bl MterpNewArray
992 cmp r0, #0
993 beq MterpPossibleException
994 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
995 GET_INST_OPCODE ip @ extract opcode from rINST
996 GOTO_OPCODE ip @ jump to next instruction
997
998/* ------------------------------ */
999 .balign 128
1000.L_op_filled_new_array: /* 0x24 */
1001/* File: arm/op_filled_new_array.S */
1002 /*
1003 * Create a new array with elements filled from registers.
1004 *
1005 * for: filled-new-array, filled-new-array/range
1006 */
1007 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1008 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1009 .extern MterpFilledNewArray
1010 EXPORT_PC
1011 add r0, rFP, #OFF_FP_SHADOWFRAME
1012 mov r1, rPC
1013 mov r2, rSELF
1014 bl MterpFilledNewArray
1015 cmp r0, #0
1016 beq MterpPossibleException
1017 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1018 GET_INST_OPCODE ip @ extract opcode from rINST
1019 GOTO_OPCODE ip @ jump to next instruction
1020
1021/* ------------------------------ */
1022 .balign 128
1023.L_op_filled_new_array_range: /* 0x25 */
1024/* File: arm/op_filled_new_array_range.S */
1025/* File: arm/op_filled_new_array.S */
1026 /*
1027 * Create a new array with elements filled from registers.
1028 *
1029 * for: filled-new-array, filled-new-array/range
1030 */
1031 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1032 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1033 .extern MterpFilledNewArrayRange
1034 EXPORT_PC
1035 add r0, rFP, #OFF_FP_SHADOWFRAME
1036 mov r1, rPC
1037 mov r2, rSELF
1038 bl MterpFilledNewArrayRange
1039 cmp r0, #0
1040 beq MterpPossibleException
1041 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1042 GET_INST_OPCODE ip @ extract opcode from rINST
1043 GOTO_OPCODE ip @ jump to next instruction
1044
1045
1046/* ------------------------------ */
1047 .balign 128
1048.L_op_fill_array_data: /* 0x26 */
1049/* File: arm/op_fill_array_data.S */
1050 /* fill-array-data vAA, +BBBBBBBB */
1051 EXPORT_PC
1052 FETCH r0, 1 @ r0<- bbbb (lo)
1053 FETCH r1, 2 @ r1<- BBBB (hi)
1054 mov r3, rINST, lsr #8 @ r3<- AA
1055 orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb
1056 GET_VREG r0, r3 @ r0<- vAA (array object)
1057 add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.)
1058 bl MterpFillArrayData @ (obj, payload)
1059 cmp r0, #0 @ 0 means an exception is thrown
1060 beq MterpPossibleException @ exception?
1061 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1062 GET_INST_OPCODE ip @ extract opcode from rINST
1063 GOTO_OPCODE ip @ jump to next instruction
1064
1065/* ------------------------------ */
1066 .balign 128
1067.L_op_throw: /* 0x27 */
1068/* File: arm/op_throw.S */
1069 /*
1070 * Throw an exception object in the current thread.
1071 */
1072 /* throw vAA */
1073 EXPORT_PC
1074 mov r2, rINST, lsr #8 @ r2<- AA
1075 GET_VREG r1, r2 @ r1<- vAA (exception object)
1076 cmp r1, #0 @ null object?
1077 beq common_errNullObject @ yes, throw an NPE instead
1078 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ thread->exception<- obj
1079 b MterpException
1080
1081/* ------------------------------ */
1082 .balign 128
1083.L_op_goto: /* 0x28 */
1084/* File: arm/op_goto.S */
1085 /*
1086 * Unconditional branch, 8-bit offset.
1087 *
1088 * The branch distance is a signed code-unit offset, which we need to
1089 * double to get a byte offset.
1090 */
1091 /* goto +AA */
1092 /* tuning: use sbfx for 6t2+ targets */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001093#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001094 mov r0, rINST, lsl #16 @ r0<- AAxx0000
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001095 movs r1, r0, asr #24 @ r1<- ssssssAA (sign-extended)
1096 add r2, r1, r1 @ r2<- byte offset, set flags
Bill Buzbee9687f242016-02-05 14:08:10 +00001097 @ If backwards branch refresh rIBASE
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001098 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1099 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001100 GET_INST_OPCODE ip @ extract opcode from rINST
1101 GOTO_OPCODE ip @ jump to next instruction
1102#else
Bill Buzbee9687f242016-02-05 14:08:10 +00001103 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001104 mov r0, rINST, lsl #16 @ r0<- AAxx0000
1105 movs r1, r0, asr #24 @ r1<- ssssssAA (sign-extended)
1106 add r2, r1, r1 @ r2<- byte offset, set flags
buzbee1452bee2015-03-06 14:43:04 -08001107 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1108 @ If backwards branch refresh rIBASE
1109 bmi MterpCheckSuspendAndContinue
1110 GET_INST_OPCODE ip @ extract opcode from rINST
1111 GOTO_OPCODE ip @ jump to next instruction
1112#endif
1113
1114/* ------------------------------ */
1115 .balign 128
1116.L_op_goto_16: /* 0x29 */
1117/* File: arm/op_goto_16.S */
1118 /*
1119 * Unconditional branch, 16-bit offset.
1120 *
1121 * The branch distance is a signed code-unit offset, which we need to
1122 * double to get a byte offset.
1123 */
1124 /* goto/16 +AAAA */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001125#if MTERP_SUSPEND
1126 FETCH_S r0, 1 @ r0<- ssssAAAA (sign-extended)
1127 adds r1, r0, r0 @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001128 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001129 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
buzbee1452bee2015-03-06 14:43:04 -08001130 GET_INST_OPCODE ip @ extract opcode from rINST
1131 GOTO_OPCODE ip @ jump to next instruction
1132#else
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001133 FETCH_S r0, 1 @ r0<- ssssAAAA (sign-extended)
buzbee1452bee2015-03-06 14:43:04 -08001134 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001135 adds r1, r0, r0 @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001136 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1137 bmi MterpCheckSuspendAndContinue
1138 GET_INST_OPCODE ip @ extract opcode from rINST
1139 GOTO_OPCODE ip @ jump to next instruction
1140#endif
1141
1142/* ------------------------------ */
1143 .balign 128
1144.L_op_goto_32: /* 0x2a */
1145/* File: arm/op_goto_32.S */
1146 /*
1147 * Unconditional branch, 32-bit offset.
1148 *
1149 * The branch distance is a signed code-unit offset, which we need to
1150 * double to get a byte offset.
1151 *
1152 * Unlike most opcodes, this one is allowed to branch to itself, so
1153 * our "backward branch" test must be "<=0" instead of "<0". Because
1154 * we need the V bit set, we'll use an adds to convert from Dalvik
1155 * offset to byte offset.
1156 */
1157 /* goto/32 +AAAAAAAA */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001158#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001159 FETCH r0, 1 @ r0<- aaaa (lo)
1160 FETCH r1, 2 @ r1<- AAAA (hi)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001161 orr r0, r0, r1, lsl #16 @ r0<- AAAAaaaa
1162 adds r1, r0, r0 @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001163 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001164 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
buzbee1452bee2015-03-06 14:43:04 -08001165 GET_INST_OPCODE ip @ extract opcode from rINST
1166 GOTO_OPCODE ip @ jump to next instruction
1167#else
1168 FETCH r0, 1 @ r0<- aaaa (lo)
1169 FETCH r1, 2 @ r1<- AAAA (hi)
1170 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001171 orr r0, r0, r1, lsl #16 @ r0<- AAAAaaaa
1172 adds r1, r0, r0 @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001173 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1174 ble MterpCheckSuspendAndContinue
1175 GET_INST_OPCODE ip @ extract opcode from rINST
1176 GOTO_OPCODE ip @ jump to next instruction
1177#endif
1178
1179/* ------------------------------ */
1180 .balign 128
1181.L_op_packed_switch: /* 0x2b */
1182/* File: arm/op_packed_switch.S */
1183 /*
1184 * Handle a packed-switch or sparse-switch instruction. In both cases
1185 * we decode it and hand it off to a helper function.
1186 *
1187 * We don't really expect backward branches in a switch statement, but
1188 * they're perfectly legal, so we check for them here.
1189 *
1190 * for: packed-switch, sparse-switch
1191 */
1192 /* op vAA, +BBBB */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001193#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001194 FETCH r0, 1 @ r0<- bbbb (lo)
1195 FETCH r1, 2 @ r1<- BBBB (hi)
1196 mov r3, rINST, lsr #8 @ r3<- AA
1197 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1198 GET_VREG r1, r3 @ r1<- vAA
1199 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1200 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001201 adds r1, r0, r0 @ r1<- byte offset; clear V
1202 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
buzbee1452bee2015-03-06 14:43:04 -08001203 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1204 GET_INST_OPCODE ip @ extract opcode from rINST
1205 GOTO_OPCODE ip @ jump to next instruction
1206#else
1207 FETCH r0, 1 @ r0<- bbbb (lo)
1208 FETCH r1, 2 @ r1<- BBBB (hi)
1209 mov r3, rINST, lsr #8 @ r3<- AA
1210 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1211 GET_VREG r1, r3 @ r1<- vAA
1212 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1213 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
1214 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001215 adds r1, r0, r0 @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001216 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1217 ble MterpCheckSuspendAndContinue
1218 GET_INST_OPCODE ip @ extract opcode from rINST
1219 GOTO_OPCODE ip @ jump to next instruction
1220#endif
1221
1222/* ------------------------------ */
1223 .balign 128
1224.L_op_sparse_switch: /* 0x2c */
1225/* File: arm/op_sparse_switch.S */
1226/* File: arm/op_packed_switch.S */
1227 /*
1228 * Handle a packed-switch or sparse-switch instruction. In both cases
1229 * we decode it and hand it off to a helper function.
1230 *
1231 * We don't really expect backward branches in a switch statement, but
1232 * they're perfectly legal, so we check for them here.
1233 *
1234 * for: packed-switch, sparse-switch
1235 */
1236 /* op vAA, +BBBB */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001237#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001238 FETCH r0, 1 @ r0<- bbbb (lo)
1239 FETCH r1, 2 @ r1<- BBBB (hi)
1240 mov r3, rINST, lsr #8 @ r3<- AA
1241 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1242 GET_VREG r1, r3 @ r1<- vAA
1243 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1244 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001245 adds r1, r0, r0 @ r1<- byte offset; clear V
1246 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
buzbee1452bee2015-03-06 14:43:04 -08001247 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1248 GET_INST_OPCODE ip @ extract opcode from rINST
1249 GOTO_OPCODE ip @ jump to next instruction
1250#else
1251 FETCH r0, 1 @ r0<- bbbb (lo)
1252 FETCH r1, 2 @ r1<- BBBB (hi)
1253 mov r3, rINST, lsr #8 @ r3<- AA
1254 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1255 GET_VREG r1, r3 @ r1<- vAA
1256 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1257 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
1258 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001259 adds r1, r0, r0 @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001260 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1261 ble MterpCheckSuspendAndContinue
1262 GET_INST_OPCODE ip @ extract opcode from rINST
1263 GOTO_OPCODE ip @ jump to next instruction
1264#endif
1265
1266
1267/* ------------------------------ */
1268 .balign 128
1269.L_op_cmpl_float: /* 0x2d */
1270/* File: arm/op_cmpl_float.S */
1271 /*
1272 * Compare two floating-point values. Puts 0, 1, or -1 into the
1273 * destination register based on the results of the comparison.
1274 *
1275 * int compare(x, y) {
1276 * if (x == y) {
1277 * return 0;
1278 * } else if (x > y) {
1279 * return 1;
1280 * } else if (x < y) {
1281 * return -1;
1282 * } else {
1283 * return -1;
1284 * }
1285 * }
1286 */
1287 /* op vAA, vBB, vCC */
1288 FETCH r0, 1 @ r0<- CCBB
1289 mov r9, rINST, lsr #8 @ r9<- AA
1290 and r2, r0, #255 @ r2<- BB
1291 mov r3, r0, lsr #8 @ r3<- CC
1292 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1293 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1294 flds s0, [r2] @ s0<- vBB
1295 flds s1, [r3] @ s1<- vCC
1296 fcmpes s0, s1 @ compare (vBB, vCC)
1297 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1298 mvn r0, #0 @ r0<- -1 (default)
1299 GET_INST_OPCODE ip @ extract opcode from rINST
1300 fmstat @ export status flags
1301 movgt r0, #1 @ (greater than) r1<- 1
1302 moveq r0, #0 @ (equal) r1<- 0
1303 SET_VREG r0, r9 @ vAA<- r0
1304 GOTO_OPCODE ip @ jump to next instruction
1305
1306/* ------------------------------ */
1307 .balign 128
1308.L_op_cmpg_float: /* 0x2e */
1309/* File: arm/op_cmpg_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 mov r0, #1 @ r0<- 1 (default)
1338 GET_INST_OPCODE ip @ extract opcode from rINST
1339 fmstat @ export status flags
1340 mvnmi r0, #0 @ (less 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_cmpl_double: /* 0x2f */
1348/* File: arm/op_cmpl_double.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 fldd d0, [r2] @ d0<- vBB
1373 fldd d1, [r3] @ d1<- vCC
1374 fcmped d0, d1 @ compare (vBB, vCC)
1375 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1376 mvn r0, #0 @ r0<- -1 (default)
1377 GET_INST_OPCODE ip @ extract opcode from rINST
1378 fmstat @ export status flags
1379 movgt r0, #1 @ (greater 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_cmpg_double: /* 0x30 */
1387/* File: arm/op_cmpg_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 mov r0, #1 @ r0<- 1 (default)
1416 GET_INST_OPCODE ip @ extract opcode from rINST
1417 fmstat @ export status flags
1418 mvnmi r0, #0 @ (less 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_cmp_long: /* 0x31 */
1426/* File: arm/op_cmp_long.S */
1427 /*
1428 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination
1429 * register based on the results of the comparison.
1430 *
1431 * We load the full values with LDM, but in practice many values could
1432 * be resolved by only looking at the high word. This could be made
1433 * faster or slower by splitting the LDM into a pair of LDRs.
1434 *
1435 * If we just wanted to set condition flags, we could do this:
1436 * subs ip, r0, r2
1437 * sbcs ip, r1, r3
1438 * subeqs ip, r0, r2
1439 * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific
1440 * integer value, which we can do with 2 conditional mov/mvn instructions
1441 * (set 1, set -1; if they're equal we already have 0 in ip), giving
1442 * us a constant 5-cycle path plus a branch at the end to the
1443 * instruction epilogue code. The multi-compare approach below needs
1444 * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1445 * in the worst case (the 64-bit values are equal).
1446 */
1447 /* cmp-long vAA, vBB, vCC */
1448 FETCH r0, 1 @ r0<- CCBB
1449 mov r9, rINST, lsr #8 @ r9<- AA
1450 and r2, r0, #255 @ r2<- BB
1451 mov r3, r0, lsr #8 @ r3<- CC
1452 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
1453 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
1454 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
1455 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
1456 cmp r1, r3 @ compare (vBB+1, vCC+1)
1457 blt .Lop_cmp_long_less @ signed compare on high part
1458 bgt .Lop_cmp_long_greater
1459 subs r1, r0, r2 @ r1<- r0 - r2
1460 bhi .Lop_cmp_long_greater @ unsigned compare on low part
1461 bne .Lop_cmp_long_less
1462 b .Lop_cmp_long_finish @ equal; r1 already holds 0
1463
1464/* ------------------------------ */
1465 .balign 128
1466.L_op_if_eq: /* 0x32 */
1467/* File: arm/op_if_eq.S */
1468/* File: arm/bincmp.S */
1469 /*
1470 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1471 * fragment that specifies the *reverse* comparison to perform, e.g.
1472 * for "if-le" you would use "gt".
1473 *
1474 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1475 */
1476 /* if-cmp vA, vB, +CCCC */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001477#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001478 mov r1, rINST, lsr #12 @ r1<- B
1479 ubfx r0, rINST, #8, #4 @ r0<- A
1480 GET_VREG r3, r1 @ r3<- vB
1481 GET_VREG r2, r0 @ r2<- vA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001482 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001483 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001484 movne r1, #2 @ r1<- BYTE branch dist for not-taken
1485 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001486 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001487 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -08001488 GET_INST_OPCODE ip @ extract opcode from rINST
1489 GOTO_OPCODE ip @ jump to next instruction
1490#else
1491 mov r1, rINST, lsr #12 @ r1<- B
1492 ubfx r0, rINST, #8, #4 @ r0<- A
1493 GET_VREG r3, r1 @ r3<- vB
1494 GET_VREG r2, r0 @ r2<- vA
1495 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001496 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001497 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001498 movne r1, #2 @ r1<- BYTE branch dist for not-taken
1499 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001500 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1501 bmi MterpCheckSuspendAndContinue
1502 GET_INST_OPCODE ip @ extract opcode from rINST
1503 GOTO_OPCODE ip @ jump to next instruction
1504#endif
1505
1506
1507/* ------------------------------ */
1508 .balign 128
1509.L_op_if_ne: /* 0x33 */
1510/* File: arm/op_if_ne.S */
1511/* File: arm/bincmp.S */
1512 /*
1513 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1514 * fragment that specifies the *reverse* comparison to perform, e.g.
1515 * for "if-le" you would use "gt".
1516 *
1517 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1518 */
1519 /* if-cmp vA, vB, +CCCC */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001520#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001521 mov r1, rINST, lsr #12 @ r1<- B
1522 ubfx r0, rINST, #8, #4 @ r0<- A
1523 GET_VREG r3, r1 @ r3<- vB
1524 GET_VREG r2, r0 @ r2<- vA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001525 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001526 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001527 moveq r1, #2 @ r1<- BYTE branch dist for not-taken
1528 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001529 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001530 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -08001531 GET_INST_OPCODE ip @ extract opcode from rINST
1532 GOTO_OPCODE ip @ jump to next instruction
1533#else
1534 mov r1, rINST, lsr #12 @ r1<- B
1535 ubfx r0, rINST, #8, #4 @ r0<- A
1536 GET_VREG r3, r1 @ r3<- vB
1537 GET_VREG r2, r0 @ r2<- vA
1538 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001539 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001540 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001541 moveq r1, #2 @ r1<- BYTE branch dist for not-taken
1542 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001543 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1544 bmi MterpCheckSuspendAndContinue
1545 GET_INST_OPCODE ip @ extract opcode from rINST
1546 GOTO_OPCODE ip @ jump to next instruction
1547#endif
1548
1549
1550/* ------------------------------ */
1551 .balign 128
1552.L_op_if_lt: /* 0x34 */
1553/* File: arm/op_if_lt.S */
1554/* File: arm/bincmp.S */
1555 /*
1556 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1557 * fragment that specifies the *reverse* comparison to perform, e.g.
1558 * for "if-le" you would use "gt".
1559 *
1560 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1561 */
1562 /* if-cmp vA, vB, +CCCC */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001563#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001564 mov r1, rINST, lsr #12 @ r1<- B
1565 ubfx r0, rINST, #8, #4 @ r0<- A
1566 GET_VREG r3, r1 @ r3<- vB
1567 GET_VREG r2, r0 @ r2<- vA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001568 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001569 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001570 movge r1, #2 @ r1<- BYTE branch dist for not-taken
1571 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001572 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001573 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -08001574 GET_INST_OPCODE ip @ extract opcode from rINST
1575 GOTO_OPCODE ip @ jump to next instruction
1576#else
1577 mov r1, rINST, lsr #12 @ r1<- B
1578 ubfx r0, rINST, #8, #4 @ r0<- A
1579 GET_VREG r3, r1 @ r3<- vB
1580 GET_VREG r2, r0 @ r2<- vA
1581 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001582 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001583 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001584 movge r1, #2 @ r1<- BYTE branch dist for not-taken
1585 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001586 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1587 bmi MterpCheckSuspendAndContinue
1588 GET_INST_OPCODE ip @ extract opcode from rINST
1589 GOTO_OPCODE ip @ jump to next instruction
1590#endif
1591
1592
1593/* ------------------------------ */
1594 .balign 128
1595.L_op_if_ge: /* 0x35 */
1596/* File: arm/op_if_ge.S */
1597/* File: arm/bincmp.S */
1598 /*
1599 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1600 * fragment that specifies the *reverse* comparison to perform, e.g.
1601 * for "if-le" you would use "gt".
1602 *
1603 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1604 */
1605 /* if-cmp vA, vB, +CCCC */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001606#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001607 mov r1, rINST, lsr #12 @ r1<- B
1608 ubfx r0, rINST, #8, #4 @ r0<- A
1609 GET_VREG r3, r1 @ r3<- vB
1610 GET_VREG r2, r0 @ r2<- vA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001611 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001612 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001613 movlt r1, #2 @ r1<- BYTE branch dist for not-taken
1614 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001615 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001616 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -08001617 GET_INST_OPCODE ip @ extract opcode from rINST
1618 GOTO_OPCODE ip @ jump to next instruction
1619#else
1620 mov r1, rINST, lsr #12 @ r1<- B
1621 ubfx r0, rINST, #8, #4 @ r0<- A
1622 GET_VREG r3, r1 @ r3<- vB
1623 GET_VREG r2, r0 @ r2<- vA
1624 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001625 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001626 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001627 movlt r1, #2 @ r1<- BYTE branch dist for not-taken
1628 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001629 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1630 bmi MterpCheckSuspendAndContinue
1631 GET_INST_OPCODE ip @ extract opcode from rINST
1632 GOTO_OPCODE ip @ jump to next instruction
1633#endif
1634
1635
1636/* ------------------------------ */
1637 .balign 128
1638.L_op_if_gt: /* 0x36 */
1639/* File: arm/op_if_gt.S */
1640/* File: arm/bincmp.S */
1641 /*
1642 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1643 * fragment that specifies the *reverse* comparison to perform, e.g.
1644 * for "if-le" you would use "gt".
1645 *
1646 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1647 */
1648 /* if-cmp vA, vB, +CCCC */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001649#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001650 mov r1, rINST, lsr #12 @ r1<- B
1651 ubfx r0, rINST, #8, #4 @ r0<- A
1652 GET_VREG r3, r1 @ r3<- vB
1653 GET_VREG r2, r0 @ r2<- vA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001654 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001655 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001656 movle r1, #2 @ r1<- BYTE branch dist for not-taken
1657 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001658 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001659 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -08001660 GET_INST_OPCODE ip @ extract opcode from rINST
1661 GOTO_OPCODE ip @ jump to next instruction
1662#else
1663 mov r1, rINST, lsr #12 @ r1<- B
1664 ubfx r0, rINST, #8, #4 @ r0<- A
1665 GET_VREG r3, r1 @ r3<- vB
1666 GET_VREG r2, r0 @ r2<- vA
1667 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001668 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001669 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001670 movle r1, #2 @ r1<- BYTE branch dist for not-taken
1671 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001672 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1673 bmi MterpCheckSuspendAndContinue
1674 GET_INST_OPCODE ip @ extract opcode from rINST
1675 GOTO_OPCODE ip @ jump to next instruction
1676#endif
1677
1678
1679/* ------------------------------ */
1680 .balign 128
1681.L_op_if_le: /* 0x37 */
1682/* File: arm/op_if_le.S */
1683/* File: arm/bincmp.S */
1684 /*
1685 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1686 * fragment that specifies the *reverse* comparison to perform, e.g.
1687 * for "if-le" you would use "gt".
1688 *
1689 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1690 */
1691 /* if-cmp vA, vB, +CCCC */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001692#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001693 mov r1, rINST, lsr #12 @ r1<- B
1694 ubfx r0, rINST, #8, #4 @ r0<- A
1695 GET_VREG r3, r1 @ r3<- vB
1696 GET_VREG r2, r0 @ r2<- vA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001697 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001698 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001699 movgt r1, #2 @ r1<- BYTE branch dist for not-taken
1700 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001701 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001702 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -08001703 GET_INST_OPCODE ip @ extract opcode from rINST
1704 GOTO_OPCODE ip @ jump to next instruction
1705#else
1706 mov r1, rINST, lsr #12 @ r1<- B
1707 ubfx r0, rINST, #8, #4 @ r0<- A
1708 GET_VREG r3, r1 @ r3<- vB
1709 GET_VREG r2, r0 @ r2<- vA
1710 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001711 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001712 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001713 movgt r1, #2 @ r1<- BYTE branch dist for not-taken
1714 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001715 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1716 bmi MterpCheckSuspendAndContinue
1717 GET_INST_OPCODE ip @ extract opcode from rINST
1718 GOTO_OPCODE ip @ jump to next instruction
1719#endif
1720
1721
1722/* ------------------------------ */
1723 .balign 128
1724.L_op_if_eqz: /* 0x38 */
1725/* File: arm/op_if_eqz.S */
1726/* File: arm/zcmp.S */
1727 /*
1728 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1729 * fragment that specifies the *reverse* comparison to perform, e.g.
1730 * for "if-le" you would use "gt".
1731 *
1732 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1733 */
1734 /* if-cmp vAA, +BBBB */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001735#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001736 mov r0, rINST, lsr #8 @ r0<- AA
1737 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001738 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001739 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001740 movne r1, #2 @ r1<- inst branch dist for not-taken
1741 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001742 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001743 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
buzbee1452bee2015-03-06 14:43:04 -08001744 GET_INST_OPCODE ip @ extract opcode from rINST
1745 GOTO_OPCODE ip @ jump to next instruction
1746#else
1747 mov r0, rINST, lsr #8 @ r0<- AA
1748 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001749 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001750 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1751 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001752 movne r1, #2 @ r1<- inst branch dist for not-taken
1753 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001754 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1755 bmi MterpCheckSuspendAndContinue
1756 GET_INST_OPCODE ip @ extract opcode from rINST
1757 GOTO_OPCODE ip @ jump to next instruction
1758#endif
1759
1760
1761/* ------------------------------ */
1762 .balign 128
1763.L_op_if_nez: /* 0x39 */
1764/* File: arm/op_if_nez.S */
1765/* File: arm/zcmp.S */
1766 /*
1767 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1768 * fragment that specifies the *reverse* comparison to perform, e.g.
1769 * for "if-le" you would use "gt".
1770 *
1771 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1772 */
1773 /* if-cmp vAA, +BBBB */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001774#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001775 mov r0, rINST, lsr #8 @ r0<- AA
1776 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001777 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001778 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001779 moveq r1, #2 @ r1<- inst branch dist for not-taken
1780 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001781 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001782 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
buzbee1452bee2015-03-06 14:43:04 -08001783 GET_INST_OPCODE ip @ extract opcode from rINST
1784 GOTO_OPCODE ip @ jump to next instruction
1785#else
1786 mov r0, rINST, lsr #8 @ r0<- AA
1787 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001788 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001789 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1790 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001791 moveq r1, #2 @ r1<- inst branch dist for not-taken
1792 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001793 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1794 bmi MterpCheckSuspendAndContinue
1795 GET_INST_OPCODE ip @ extract opcode from rINST
1796 GOTO_OPCODE ip @ jump to next instruction
1797#endif
1798
1799
1800/* ------------------------------ */
1801 .balign 128
1802.L_op_if_ltz: /* 0x3a */
1803/* File: arm/op_if_ltz.S */
1804/* File: arm/zcmp.S */
1805 /*
1806 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1807 * fragment that specifies the *reverse* comparison to perform, e.g.
1808 * for "if-le" you would use "gt".
1809 *
1810 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1811 */
1812 /* if-cmp vAA, +BBBB */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001813#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001814 mov r0, rINST, lsr #8 @ r0<- AA
1815 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001816 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001817 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001818 movge r1, #2 @ r1<- inst branch dist for not-taken
1819 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001820 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001821 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
buzbee1452bee2015-03-06 14:43:04 -08001822 GET_INST_OPCODE ip @ extract opcode from rINST
1823 GOTO_OPCODE ip @ jump to next instruction
1824#else
1825 mov r0, rINST, lsr #8 @ r0<- AA
1826 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001827 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001828 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1829 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001830 movge r1, #2 @ r1<- inst branch dist for not-taken
1831 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001832 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1833 bmi MterpCheckSuspendAndContinue
1834 GET_INST_OPCODE ip @ extract opcode from rINST
1835 GOTO_OPCODE ip @ jump to next instruction
1836#endif
1837
1838
1839/* ------------------------------ */
1840 .balign 128
1841.L_op_if_gez: /* 0x3b */
1842/* File: arm/op_if_gez.S */
1843/* File: arm/zcmp.S */
1844 /*
1845 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1846 * fragment that specifies the *reverse* comparison to perform, e.g.
1847 * for "if-le" you would use "gt".
1848 *
1849 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1850 */
1851 /* if-cmp vAA, +BBBB */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001852#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001853 mov r0, rINST, lsr #8 @ r0<- AA
1854 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001855 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001856 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001857 movlt r1, #2 @ r1<- inst branch dist for not-taken
1858 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001859 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001860 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
buzbee1452bee2015-03-06 14:43:04 -08001861 GET_INST_OPCODE ip @ extract opcode from rINST
1862 GOTO_OPCODE ip @ jump to next instruction
1863#else
1864 mov r0, rINST, lsr #8 @ r0<- AA
1865 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001866 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001867 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1868 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001869 movlt r1, #2 @ r1<- inst branch dist for not-taken
1870 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001871 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1872 bmi MterpCheckSuspendAndContinue
1873 GET_INST_OPCODE ip @ extract opcode from rINST
1874 GOTO_OPCODE ip @ jump to next instruction
1875#endif
1876
1877
1878/* ------------------------------ */
1879 .balign 128
1880.L_op_if_gtz: /* 0x3c */
1881/* File: arm/op_if_gtz.S */
1882/* File: arm/zcmp.S */
1883 /*
1884 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1885 * fragment that specifies the *reverse* comparison to perform, e.g.
1886 * for "if-le" you would use "gt".
1887 *
1888 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1889 */
1890 /* if-cmp vAA, +BBBB */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001891#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001892 mov r0, rINST, lsr #8 @ r0<- AA
1893 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001894 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001895 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001896 movle r1, #2 @ r1<- inst branch dist for not-taken
1897 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001898 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001899 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
buzbee1452bee2015-03-06 14:43:04 -08001900 GET_INST_OPCODE ip @ extract opcode from rINST
1901 GOTO_OPCODE ip @ jump to next instruction
1902#else
1903 mov r0, rINST, lsr #8 @ r0<- AA
1904 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001905 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001906 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1907 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001908 movle r1, #2 @ r1<- inst branch dist for not-taken
1909 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001910 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1911 bmi MterpCheckSuspendAndContinue
1912 GET_INST_OPCODE ip @ extract opcode from rINST
1913 GOTO_OPCODE ip @ jump to next instruction
1914#endif
1915
1916
1917/* ------------------------------ */
1918 .balign 128
1919.L_op_if_lez: /* 0x3d */
1920/* File: arm/op_if_lez.S */
1921/* File: arm/zcmp.S */
1922 /*
1923 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1924 * fragment that specifies the *reverse* comparison to perform, e.g.
1925 * for "if-le" you would use "gt".
1926 *
1927 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1928 */
1929 /* if-cmp vAA, +BBBB */
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001930#if MTERP_SUSPEND
buzbee1452bee2015-03-06 14:43:04 -08001931 mov r0, rINST, lsr #8 @ r0<- AA
1932 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001933 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001934 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001935 movgt r1, #2 @ r1<- inst branch dist for not-taken
1936 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001937 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001938 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
buzbee1452bee2015-03-06 14:43:04 -08001939 GET_INST_OPCODE ip @ extract opcode from rINST
1940 GOTO_OPCODE ip @ jump to next instruction
1941#else
1942 mov r0, rINST, lsr #8 @ r0<- AA
1943 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001944 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001945 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1946 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001947 movgt r1, #2 @ r1<- inst branch dist for not-taken
1948 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001949 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1950 bmi MterpCheckSuspendAndContinue
1951 GET_INST_OPCODE ip @ extract opcode from rINST
1952 GOTO_OPCODE ip @ jump to next instruction
1953#endif
1954
1955
1956/* ------------------------------ */
1957 .balign 128
1958.L_op_unused_3e: /* 0x3e */
1959/* File: arm/op_unused_3e.S */
1960/* File: arm/unused.S */
1961/*
1962 * Bail to reference interpreter to throw.
1963 */
1964 b MterpFallback
1965
1966
1967/* ------------------------------ */
1968 .balign 128
1969.L_op_unused_3f: /* 0x3f */
1970/* File: arm/op_unused_3f.S */
1971/* File: arm/unused.S */
1972/*
1973 * Bail to reference interpreter to throw.
1974 */
1975 b MterpFallback
1976
1977
1978/* ------------------------------ */
1979 .balign 128
1980.L_op_unused_40: /* 0x40 */
1981/* File: arm/op_unused_40.S */
1982/* File: arm/unused.S */
1983/*
1984 * Bail to reference interpreter to throw.
1985 */
1986 b MterpFallback
1987
1988
1989/* ------------------------------ */
1990 .balign 128
1991.L_op_unused_41: /* 0x41 */
1992/* File: arm/op_unused_41.S */
1993/* File: arm/unused.S */
1994/*
1995 * Bail to reference interpreter to throw.
1996 */
1997 b MterpFallback
1998
1999
2000/* ------------------------------ */
2001 .balign 128
2002.L_op_unused_42: /* 0x42 */
2003/* File: arm/op_unused_42.S */
2004/* File: arm/unused.S */
2005/*
2006 * Bail to reference interpreter to throw.
2007 */
2008 b MterpFallback
2009
2010
2011/* ------------------------------ */
2012 .balign 128
2013.L_op_unused_43: /* 0x43 */
2014/* File: arm/op_unused_43.S */
2015/* File: arm/unused.S */
2016/*
2017 * Bail to reference interpreter to throw.
2018 */
2019 b MterpFallback
2020
2021
2022/* ------------------------------ */
2023 .balign 128
2024.L_op_aget: /* 0x44 */
2025/* File: arm/op_aget.S */
2026 /*
2027 * Array get, 32 bits or less. vAA <- vBB[vCC].
2028 *
2029 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2030 * instructions. We use a pair of FETCH_Bs instead.
2031 *
buzbee76833da2016-01-13 13:06:22 -08002032 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002033 *
2034 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2035 * If this changes, specialize.
2036 */
2037 /* op vAA, vBB, vCC */
2038 FETCH_B r2, 1, 0 @ r2<- BB
2039 mov r9, rINST, lsr #8 @ r9<- AA
2040 FETCH_B r3, 1, 1 @ r3<- CC
2041 GET_VREG r0, r2 @ r0<- vBB (array object)
2042 GET_VREG r1, r3 @ r1<- vCC (requested index)
2043 cmp r0, #0 @ null array object?
2044 beq common_errNullObject @ yes, bail
2045 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2046 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2047 cmp r1, r3 @ compare unsigned index, length
2048 bcs common_errArrayIndex @ index >= length, bail
2049 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2050 ldr r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2051 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002052 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002053 GOTO_OPCODE ip @ jump to next instruction
2054
2055/* ------------------------------ */
2056 .balign 128
2057.L_op_aget_wide: /* 0x45 */
2058/* File: arm/op_aget_wide.S */
2059 /*
2060 * Array get, 64 bits. vAA <- vBB[vCC].
2061 *
2062 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2063 */
2064 /* aget-wide vAA, vBB, vCC */
2065 FETCH r0, 1 @ r0<- CCBB
2066 mov r9, rINST, lsr #8 @ r9<- AA
2067 and r2, r0, #255 @ r2<- BB
2068 mov r3, r0, lsr #8 @ r3<- CC
2069 GET_VREG r0, r2 @ r0<- vBB (array object)
2070 GET_VREG r1, r3 @ r1<- vCC (requested index)
2071 cmp r0, #0 @ null array object?
2072 beq common_errNullObject @ yes, bail
2073 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2074 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2075 cmp r1, r3 @ compare unsigned index, length
2076 bcs common_errArrayIndex @ index >= length, bail
2077 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2078 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2079 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2080 GET_INST_OPCODE ip @ extract opcode from rINST
2081 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3
2082 GOTO_OPCODE ip @ jump to next instruction
2083
2084/* ------------------------------ */
2085 .balign 128
2086.L_op_aget_object: /* 0x46 */
2087/* File: arm/op_aget_object.S */
2088 /*
2089 * Array object get. vAA <- vBB[vCC].
2090 *
2091 * for: aget-object
2092 */
2093 /* op vAA, vBB, vCC */
2094 FETCH_B r2, 1, 0 @ r2<- BB
2095 mov r9, rINST, lsr #8 @ r9<- AA
2096 FETCH_B r3, 1, 1 @ r3<- CC
2097 EXPORT_PC
2098 GET_VREG r0, r2 @ r0<- vBB (array object)
2099 GET_VREG r1, r3 @ r1<- vCC (requested index)
2100 bl artAGetObjectFromMterp @ (array, index)
2101 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
2102 PREFETCH_INST 2
2103 cmp r1, #0
2104 bne MterpException
2105 SET_VREG_OBJECT r0, r9
2106 ADVANCE 2
2107 GET_INST_OPCODE ip
2108 GOTO_OPCODE ip @ jump to next instruction
2109
2110/* ------------------------------ */
2111 .balign 128
2112.L_op_aget_boolean: /* 0x47 */
2113/* File: arm/op_aget_boolean.S */
2114/* File: arm/op_aget.S */
2115 /*
2116 * Array get, 32 bits or less. vAA <- vBB[vCC].
2117 *
2118 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2119 * instructions. We use a pair of FETCH_Bs instead.
2120 *
buzbee76833da2016-01-13 13:06:22 -08002121 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002122 *
2123 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2124 * If this changes, specialize.
2125 */
2126 /* op vAA, vBB, vCC */
2127 FETCH_B r2, 1, 0 @ r2<- BB
2128 mov r9, rINST, lsr #8 @ r9<- AA
2129 FETCH_B r3, 1, 1 @ r3<- CC
2130 GET_VREG r0, r2 @ r0<- vBB (array object)
2131 GET_VREG r1, r3 @ r1<- vCC (requested index)
2132 cmp r0, #0 @ null array object?
2133 beq common_errNullObject @ yes, bail
2134 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2135 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2136 cmp r1, r3 @ compare unsigned index, length
2137 bcs common_errArrayIndex @ index >= length, bail
2138 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2139 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2140 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002141 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002142 GOTO_OPCODE ip @ jump to next instruction
2143
2144
2145/* ------------------------------ */
2146 .balign 128
2147.L_op_aget_byte: /* 0x48 */
2148/* File: arm/op_aget_byte.S */
2149/* File: arm/op_aget.S */
2150 /*
2151 * Array get, 32 bits or less. vAA <- vBB[vCC].
2152 *
2153 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2154 * instructions. We use a pair of FETCH_Bs instead.
2155 *
buzbee76833da2016-01-13 13:06:22 -08002156 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002157 *
2158 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2159 * If this changes, specialize.
2160 */
2161 /* op vAA, vBB, vCC */
2162 FETCH_B r2, 1, 0 @ r2<- BB
2163 mov r9, rINST, lsr #8 @ r9<- AA
2164 FETCH_B r3, 1, 1 @ r3<- CC
2165 GET_VREG r0, r2 @ r0<- vBB (array object)
2166 GET_VREG r1, r3 @ r1<- vCC (requested index)
2167 cmp r0, #0 @ null array object?
2168 beq common_errNullObject @ yes, bail
2169 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2170 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2171 cmp r1, r3 @ compare unsigned index, length
2172 bcs common_errArrayIndex @ index >= length, bail
2173 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2174 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2175 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002176 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002177 GOTO_OPCODE ip @ jump to next instruction
2178
2179
2180/* ------------------------------ */
2181 .balign 128
2182.L_op_aget_char: /* 0x49 */
2183/* File: arm/op_aget_char.S */
2184/* File: arm/op_aget.S */
2185 /*
2186 * Array get, 32 bits or less. vAA <- vBB[vCC].
2187 *
2188 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2189 * instructions. We use a pair of FETCH_Bs instead.
2190 *
buzbee76833da2016-01-13 13:06:22 -08002191 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002192 *
2193 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2194 * If this changes, specialize.
2195 */
2196 /* op vAA, vBB, vCC */
2197 FETCH_B r2, 1, 0 @ r2<- BB
2198 mov r9, rINST, lsr #8 @ r9<- AA
2199 FETCH_B r3, 1, 1 @ r3<- CC
2200 GET_VREG r0, r2 @ r0<- vBB (array object)
2201 GET_VREG r1, r3 @ r1<- vCC (requested index)
2202 cmp r0, #0 @ null array object?
2203 beq common_errNullObject @ yes, bail
2204 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2205 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2206 cmp r1, r3 @ compare unsigned index, length
2207 bcs common_errArrayIndex @ index >= length, bail
2208 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2209 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2210 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002211 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002212 GOTO_OPCODE ip @ jump to next instruction
2213
2214
2215/* ------------------------------ */
2216 .balign 128
2217.L_op_aget_short: /* 0x4a */
2218/* File: arm/op_aget_short.S */
2219/* File: arm/op_aget.S */
2220 /*
2221 * Array get, 32 bits or less. vAA <- vBB[vCC].
2222 *
2223 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2224 * instructions. We use a pair of FETCH_Bs instead.
2225 *
buzbee76833da2016-01-13 13:06:22 -08002226 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002227 *
2228 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2229 * If this changes, specialize.
2230 */
2231 /* op vAA, vBB, vCC */
2232 FETCH_B r2, 1, 0 @ r2<- BB
2233 mov r9, rINST, lsr #8 @ r9<- AA
2234 FETCH_B r3, 1, 1 @ r3<- CC
2235 GET_VREG r0, r2 @ r0<- vBB (array object)
2236 GET_VREG r1, r3 @ r1<- vCC (requested index)
2237 cmp r0, #0 @ null array object?
2238 beq common_errNullObject @ yes, bail
2239 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2240 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2241 cmp r1, r3 @ compare unsigned index, length
2242 bcs common_errArrayIndex @ index >= length, bail
2243 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2244 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2245 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002246 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002247 GOTO_OPCODE ip @ jump to next instruction
2248
2249
2250/* ------------------------------ */
2251 .balign 128
2252.L_op_aput: /* 0x4b */
2253/* File: arm/op_aput.S */
2254 /*
2255 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2256 *
2257 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2258 * instructions. We use a pair of FETCH_Bs instead.
2259 *
2260 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2261 *
2262 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2263 * If this changes, specialize.
2264 */
2265 /* op vAA, vBB, vCC */
2266 FETCH_B r2, 1, 0 @ r2<- BB
2267 mov r9, rINST, lsr #8 @ r9<- AA
2268 FETCH_B r3, 1, 1 @ r3<- CC
2269 GET_VREG r0, r2 @ r0<- vBB (array object)
2270 GET_VREG r1, r3 @ r1<- vCC (requested index)
2271 cmp r0, #0 @ null array object?
2272 beq common_errNullObject @ yes, bail
2273 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2274 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2275 cmp r1, r3 @ compare unsigned index, length
2276 bcs common_errArrayIndex @ index >= length, bail
2277 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2278 GET_VREG r2, r9 @ r2<- vAA
2279 GET_INST_OPCODE ip @ extract opcode from rINST
2280 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2281 GOTO_OPCODE ip @ jump to next instruction
2282
2283/* ------------------------------ */
2284 .balign 128
2285.L_op_aput_wide: /* 0x4c */
2286/* File: arm/op_aput_wide.S */
2287 /*
2288 * Array put, 64 bits. vBB[vCC] <- vAA.
2289 *
2290 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2291 */
2292 /* aput-wide vAA, vBB, vCC */
2293 FETCH r0, 1 @ r0<- CCBB
2294 mov r9, rINST, lsr #8 @ r9<- AA
2295 and r2, r0, #255 @ r2<- BB
2296 mov r3, r0, lsr #8 @ r3<- CC
2297 GET_VREG r0, r2 @ r0<- vBB (array object)
2298 GET_VREG r1, r3 @ r1<- vCC (requested index)
2299 cmp r0, #0 @ null array object?
2300 beq common_errNullObject @ yes, bail
2301 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2302 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2303 cmp r1, r3 @ compare unsigned index, length
2304 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2305 bcs common_errArrayIndex @ index >= length, bail
2306 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2307 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1
2308 GET_INST_OPCODE ip @ extract opcode from rINST
2309 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2310 GOTO_OPCODE ip @ jump to next instruction
2311
2312/* ------------------------------ */
2313 .balign 128
2314.L_op_aput_object: /* 0x4d */
2315/* File: arm/op_aput_object.S */
2316 /*
2317 * Store an object into an array. vBB[vCC] <- vAA.
2318 */
2319 /* op vAA, vBB, vCC */
2320 EXPORT_PC
2321 add r0, rFP, #OFF_FP_SHADOWFRAME
2322 mov r1, rPC
2323 mov r2, rINST
2324 bl MterpAputObject
2325 cmp r0, #0
2326 beq MterpPossibleException
2327 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2328 GET_INST_OPCODE ip @ extract opcode from rINST
2329 GOTO_OPCODE ip @ jump to next instruction
2330
2331/* ------------------------------ */
2332 .balign 128
2333.L_op_aput_boolean: /* 0x4e */
2334/* File: arm/op_aput_boolean.S */
2335/* File: arm/op_aput.S */
2336 /*
2337 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2338 *
2339 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2340 * instructions. We use a pair of FETCH_Bs instead.
2341 *
2342 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2343 *
2344 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2345 * If this changes, specialize.
2346 */
2347 /* op vAA, vBB, vCC */
2348 FETCH_B r2, 1, 0 @ r2<- BB
2349 mov r9, rINST, lsr #8 @ r9<- AA
2350 FETCH_B r3, 1, 1 @ r3<- CC
2351 GET_VREG r0, r2 @ r0<- vBB (array object)
2352 GET_VREG r1, r3 @ r1<- vCC (requested index)
2353 cmp r0, #0 @ null array object?
2354 beq common_errNullObject @ yes, bail
2355 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2356 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2357 cmp r1, r3 @ compare unsigned index, length
2358 bcs common_errArrayIndex @ index >= length, bail
2359 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2360 GET_VREG r2, r9 @ r2<- vAA
2361 GET_INST_OPCODE ip @ extract opcode from rINST
2362 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2363 GOTO_OPCODE ip @ jump to next instruction
2364
2365
2366/* ------------------------------ */
2367 .balign 128
2368.L_op_aput_byte: /* 0x4f */
2369/* File: arm/op_aput_byte.S */
2370/* File: arm/op_aput.S */
2371 /*
2372 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2373 *
2374 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2375 * instructions. We use a pair of FETCH_Bs instead.
2376 *
2377 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2378 *
2379 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2380 * If this changes, specialize.
2381 */
2382 /* op vAA, vBB, vCC */
2383 FETCH_B r2, 1, 0 @ r2<- BB
2384 mov r9, rINST, lsr #8 @ r9<- AA
2385 FETCH_B r3, 1, 1 @ r3<- CC
2386 GET_VREG r0, r2 @ r0<- vBB (array object)
2387 GET_VREG r1, r3 @ r1<- vCC (requested index)
2388 cmp r0, #0 @ null array object?
2389 beq common_errNullObject @ yes, bail
2390 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2391 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2392 cmp r1, r3 @ compare unsigned index, length
2393 bcs common_errArrayIndex @ index >= length, bail
2394 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2395 GET_VREG r2, r9 @ r2<- vAA
2396 GET_INST_OPCODE ip @ extract opcode from rINST
2397 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2398 GOTO_OPCODE ip @ jump to next instruction
2399
2400
2401/* ------------------------------ */
2402 .balign 128
2403.L_op_aput_char: /* 0x50 */
2404/* File: arm/op_aput_char.S */
2405/* File: arm/op_aput.S */
2406 /*
2407 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2408 *
2409 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2410 * instructions. We use a pair of FETCH_Bs instead.
2411 *
2412 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2413 *
2414 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2415 * If this changes, specialize.
2416 */
2417 /* op vAA, vBB, vCC */
2418 FETCH_B r2, 1, 0 @ r2<- BB
2419 mov r9, rINST, lsr #8 @ r9<- AA
2420 FETCH_B r3, 1, 1 @ r3<- CC
2421 GET_VREG r0, r2 @ r0<- vBB (array object)
2422 GET_VREG r1, r3 @ r1<- vCC (requested index)
2423 cmp r0, #0 @ null array object?
2424 beq common_errNullObject @ yes, bail
2425 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2426 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2427 cmp r1, r3 @ compare unsigned index, length
2428 bcs common_errArrayIndex @ index >= length, bail
2429 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2430 GET_VREG r2, r9 @ r2<- vAA
2431 GET_INST_OPCODE ip @ extract opcode from rINST
2432 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2433 GOTO_OPCODE ip @ jump to next instruction
2434
2435
2436/* ------------------------------ */
2437 .balign 128
2438.L_op_aput_short: /* 0x51 */
2439/* File: arm/op_aput_short.S */
2440/* File: arm/op_aput.S */
2441 /*
2442 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2443 *
2444 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2445 * instructions. We use a pair of FETCH_Bs instead.
2446 *
2447 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2448 *
2449 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2450 * If this changes, specialize.
2451 */
2452 /* op vAA, vBB, vCC */
2453 FETCH_B r2, 1, 0 @ r2<- BB
2454 mov r9, rINST, lsr #8 @ r9<- AA
2455 FETCH_B r3, 1, 1 @ r3<- CC
2456 GET_VREG r0, r2 @ r0<- vBB (array object)
2457 GET_VREG r1, r3 @ r1<- vCC (requested index)
2458 cmp r0, #0 @ null array object?
2459 beq common_errNullObject @ yes, bail
2460 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2461 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2462 cmp r1, r3 @ compare unsigned index, length
2463 bcs common_errArrayIndex @ index >= length, bail
2464 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2465 GET_VREG r2, r9 @ r2<- vAA
2466 GET_INST_OPCODE ip @ extract opcode from rINST
2467 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2468 GOTO_OPCODE ip @ jump to next instruction
2469
2470
2471/* ------------------------------ */
2472 .balign 128
2473.L_op_iget: /* 0x52 */
2474/* File: arm/op_iget.S */
2475 /*
2476 * General instance field get.
2477 *
2478 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2479 */
2480 EXPORT_PC
2481 FETCH r0, 1 @ r0<- field ref CCCC
2482 mov r1, rINST, lsr #12 @ r1<- B
2483 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2484 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2485 mov r3, rSELF @ r3<- self
2486 bl artGet32InstanceFromCode
2487 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2488 ubfx r2, rINST, #8, #4 @ r2<- A
2489 PREFETCH_INST 2
2490 cmp r3, #0
2491 bne MterpPossibleException @ bail out
2492 .if 0
2493 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2494 .else
2495 SET_VREG r0, r2 @ fp[A]<- r0
2496 .endif
2497 ADVANCE 2
2498 GET_INST_OPCODE ip @ extract opcode from rINST
2499 GOTO_OPCODE ip @ jump to next instruction
2500
2501/* ------------------------------ */
2502 .balign 128
2503.L_op_iget_wide: /* 0x53 */
2504/* File: arm/op_iget_wide.S */
2505 /*
2506 * 64-bit instance field get.
2507 *
2508 * for: iget-wide
2509 */
2510 EXPORT_PC
2511 FETCH r0, 1 @ r0<- field ref CCCC
2512 mov r1, rINST, lsr #12 @ r1<- B
2513 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2514 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2515 mov r3, rSELF @ r3<- self
2516 bl artGet64InstanceFromCode
2517 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2518 ubfx r2, rINST, #8, #4 @ r2<- A
2519 PREFETCH_INST 2
2520 cmp r3, #0
2521 bne MterpException @ bail out
2522 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
2523 stmia r3, {r0-r1} @ fp[A]<- r0/r1
2524 ADVANCE 2
2525 GET_INST_OPCODE ip @ extract opcode from rINST
2526 GOTO_OPCODE ip @ jump to next instruction
2527
2528/* ------------------------------ */
2529 .balign 128
2530.L_op_iget_object: /* 0x54 */
2531/* File: arm/op_iget_object.S */
2532/* File: arm/op_iget.S */
2533 /*
2534 * General instance field get.
2535 *
2536 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2537 */
2538 EXPORT_PC
2539 FETCH r0, 1 @ r0<- field ref CCCC
2540 mov r1, rINST, lsr #12 @ r1<- B
2541 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2542 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2543 mov r3, rSELF @ r3<- self
2544 bl artGetObjInstanceFromCode
2545 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2546 ubfx r2, rINST, #8, #4 @ r2<- A
2547 PREFETCH_INST 2
2548 cmp r3, #0
2549 bne MterpPossibleException @ bail out
2550 .if 1
2551 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2552 .else
2553 SET_VREG r0, r2 @ fp[A]<- r0
2554 .endif
2555 ADVANCE 2
2556 GET_INST_OPCODE ip @ extract opcode from rINST
2557 GOTO_OPCODE ip @ jump to next instruction
2558
2559
2560/* ------------------------------ */
2561 .balign 128
2562.L_op_iget_boolean: /* 0x55 */
2563/* File: arm/op_iget_boolean.S */
2564/* File: arm/op_iget.S */
2565 /*
2566 * General instance field get.
2567 *
2568 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2569 */
2570 EXPORT_PC
2571 FETCH r0, 1 @ r0<- field ref CCCC
2572 mov r1, rINST, lsr #12 @ r1<- B
2573 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2574 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2575 mov r3, rSELF @ r3<- self
2576 bl artGetBooleanInstanceFromCode
2577 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2578 ubfx r2, rINST, #8, #4 @ r2<- A
2579 PREFETCH_INST 2
2580 cmp r3, #0
2581 bne MterpPossibleException @ bail out
2582 .if 0
2583 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2584 .else
2585 SET_VREG r0, r2 @ fp[A]<- r0
2586 .endif
2587 ADVANCE 2
2588 GET_INST_OPCODE ip @ extract opcode from rINST
2589 GOTO_OPCODE ip @ jump to next instruction
2590
2591
2592/* ------------------------------ */
2593 .balign 128
2594.L_op_iget_byte: /* 0x56 */
2595/* File: arm/op_iget_byte.S */
2596/* File: arm/op_iget.S */
2597 /*
2598 * General instance field get.
2599 *
2600 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2601 */
2602 EXPORT_PC
2603 FETCH r0, 1 @ r0<- field ref CCCC
2604 mov r1, rINST, lsr #12 @ r1<- B
2605 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2606 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2607 mov r3, rSELF @ r3<- self
2608 bl artGetByteInstanceFromCode
2609 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2610 ubfx r2, rINST, #8, #4 @ r2<- A
2611 PREFETCH_INST 2
2612 cmp r3, #0
2613 bne MterpPossibleException @ bail out
2614 .if 0
2615 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2616 .else
2617 SET_VREG r0, r2 @ fp[A]<- r0
2618 .endif
2619 ADVANCE 2
2620 GET_INST_OPCODE ip @ extract opcode from rINST
2621 GOTO_OPCODE ip @ jump to next instruction
2622
2623
2624/* ------------------------------ */
2625 .balign 128
2626.L_op_iget_char: /* 0x57 */
2627/* File: arm/op_iget_char.S */
2628/* File: arm/op_iget.S */
2629 /*
2630 * General instance field get.
2631 *
2632 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2633 */
2634 EXPORT_PC
2635 FETCH r0, 1 @ r0<- field ref CCCC
2636 mov r1, rINST, lsr #12 @ r1<- B
2637 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2638 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2639 mov r3, rSELF @ r3<- self
2640 bl artGetCharInstanceFromCode
2641 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2642 ubfx r2, rINST, #8, #4 @ r2<- A
2643 PREFETCH_INST 2
2644 cmp r3, #0
2645 bne MterpPossibleException @ bail out
2646 .if 0
2647 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2648 .else
2649 SET_VREG r0, r2 @ fp[A]<- r0
2650 .endif
2651 ADVANCE 2
2652 GET_INST_OPCODE ip @ extract opcode from rINST
2653 GOTO_OPCODE ip @ jump to next instruction
2654
2655
2656/* ------------------------------ */
2657 .balign 128
2658.L_op_iget_short: /* 0x58 */
2659/* File: arm/op_iget_short.S */
2660/* File: arm/op_iget.S */
2661 /*
2662 * General instance field get.
2663 *
2664 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2665 */
2666 EXPORT_PC
2667 FETCH r0, 1 @ r0<- field ref CCCC
2668 mov r1, rINST, lsr #12 @ r1<- B
2669 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2670 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2671 mov r3, rSELF @ r3<- self
2672 bl artGetShortInstanceFromCode
2673 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2674 ubfx r2, rINST, #8, #4 @ r2<- A
2675 PREFETCH_INST 2
2676 cmp r3, #0
2677 bne MterpPossibleException @ bail out
2678 .if 0
2679 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2680 .else
2681 SET_VREG r0, r2 @ fp[A]<- r0
2682 .endif
2683 ADVANCE 2
2684 GET_INST_OPCODE ip @ extract opcode from rINST
2685 GOTO_OPCODE ip @ jump to next instruction
2686
2687
2688/* ------------------------------ */
2689 .balign 128
2690.L_op_iput: /* 0x59 */
2691/* File: arm/op_iput.S */
2692 /*
2693 * General 32-bit instance field put.
2694 *
2695 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2696 */
2697 /* op vA, vB, field@CCCC */
2698 .extern artSet32InstanceFromMterp
2699 EXPORT_PC
2700 FETCH r0, 1 @ r0<- field ref CCCC
2701 mov r1, rINST, lsr #12 @ r1<- B
2702 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2703 ubfx r2, rINST, #8, #4 @ r2<- A
2704 GET_VREG r2, r2 @ r2<- fp[A]
2705 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2706 PREFETCH_INST 2
2707 bl artSet32InstanceFromMterp
2708 cmp r0, #0
2709 bne MterpPossibleException
2710 ADVANCE 2 @ advance rPC
2711 GET_INST_OPCODE ip @ extract opcode from rINST
2712 GOTO_OPCODE ip @ jump to next instruction
2713
2714/* ------------------------------ */
2715 .balign 128
2716.L_op_iput_wide: /* 0x5a */
2717/* File: arm/op_iput_wide.S */
2718 /* iput-wide vA, vB, field@CCCC */
2719 .extern artSet64InstanceFromMterp
2720 EXPORT_PC
2721 FETCH r0, 1 @ r0<- field ref CCCC
2722 mov r1, rINST, lsr #12 @ r1<- B
2723 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2724 ubfx r2, rINST, #8, #4 @ r2<- A
2725 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
2726 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2727 PREFETCH_INST 2
2728 bl artSet64InstanceFromMterp
2729 cmp r0, #0
2730 bne MterpPossibleException
2731 ADVANCE 2 @ advance rPC
2732 GET_INST_OPCODE ip @ extract opcode from rINST
2733 GOTO_OPCODE ip @ jump to next instruction
2734
2735/* ------------------------------ */
2736 .balign 128
2737.L_op_iput_object: /* 0x5b */
2738/* File: arm/op_iput_object.S */
2739 EXPORT_PC
2740 add r0, rFP, #OFF_FP_SHADOWFRAME
2741 mov r1, rPC
2742 mov r2, rINST
2743 mov r3, rSELF
2744 bl MterpIputObject
2745 cmp r0, #0
2746 beq MterpException
2747 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2748 GET_INST_OPCODE ip @ extract opcode from rINST
2749 GOTO_OPCODE ip @ jump to next instruction
2750
2751/* ------------------------------ */
2752 .balign 128
2753.L_op_iput_boolean: /* 0x5c */
2754/* File: arm/op_iput_boolean.S */
2755/* File: arm/op_iput.S */
2756 /*
2757 * General 32-bit instance field put.
2758 *
2759 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2760 */
2761 /* op vA, vB, field@CCCC */
2762 .extern artSet8InstanceFromMterp
2763 EXPORT_PC
2764 FETCH r0, 1 @ r0<- field ref CCCC
2765 mov r1, rINST, lsr #12 @ r1<- B
2766 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2767 ubfx r2, rINST, #8, #4 @ r2<- A
2768 GET_VREG r2, r2 @ r2<- fp[A]
2769 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2770 PREFETCH_INST 2
2771 bl artSet8InstanceFromMterp
2772 cmp r0, #0
2773 bne MterpPossibleException
2774 ADVANCE 2 @ advance rPC
2775 GET_INST_OPCODE ip @ extract opcode from rINST
2776 GOTO_OPCODE ip @ jump to next instruction
2777
2778
2779/* ------------------------------ */
2780 .balign 128
2781.L_op_iput_byte: /* 0x5d */
2782/* File: arm/op_iput_byte.S */
2783/* File: arm/op_iput.S */
2784 /*
2785 * General 32-bit instance field put.
2786 *
2787 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2788 */
2789 /* op vA, vB, field@CCCC */
2790 .extern artSet8InstanceFromMterp
2791 EXPORT_PC
2792 FETCH r0, 1 @ r0<- field ref CCCC
2793 mov r1, rINST, lsr #12 @ r1<- B
2794 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2795 ubfx r2, rINST, #8, #4 @ r2<- A
2796 GET_VREG r2, r2 @ r2<- fp[A]
2797 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2798 PREFETCH_INST 2
2799 bl artSet8InstanceFromMterp
2800 cmp r0, #0
2801 bne MterpPossibleException
2802 ADVANCE 2 @ advance rPC
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_iput_char: /* 0x5e */
2810/* File: arm/op_iput_char.S */
2811/* File: arm/op_iput.S */
2812 /*
2813 * General 32-bit instance field put.
2814 *
2815 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2816 */
2817 /* op vA, vB, field@CCCC */
2818 .extern artSet16InstanceFromMterp
2819 EXPORT_PC
2820 FETCH r0, 1 @ r0<- field ref CCCC
2821 mov r1, rINST, lsr #12 @ r1<- B
2822 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2823 ubfx r2, rINST, #8, #4 @ r2<- A
2824 GET_VREG r2, r2 @ r2<- fp[A]
2825 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2826 PREFETCH_INST 2
2827 bl artSet16InstanceFromMterp
2828 cmp r0, #0
2829 bne MterpPossibleException
2830 ADVANCE 2 @ advance rPC
2831 GET_INST_OPCODE ip @ extract opcode from rINST
2832 GOTO_OPCODE ip @ jump to next instruction
2833
2834
2835/* ------------------------------ */
2836 .balign 128
2837.L_op_iput_short: /* 0x5f */
2838/* File: arm/op_iput_short.S */
2839/* File: arm/op_iput.S */
2840 /*
2841 * General 32-bit instance field put.
2842 *
2843 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2844 */
2845 /* op vA, vB, field@CCCC */
2846 .extern artSet16InstanceFromMterp
2847 EXPORT_PC
2848 FETCH r0, 1 @ r0<- field ref CCCC
2849 mov r1, rINST, lsr #12 @ r1<- B
2850 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2851 ubfx r2, rINST, #8, #4 @ r2<- A
2852 GET_VREG r2, r2 @ r2<- fp[A]
2853 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2854 PREFETCH_INST 2
2855 bl artSet16InstanceFromMterp
2856 cmp r0, #0
2857 bne MterpPossibleException
2858 ADVANCE 2 @ advance rPC
2859 GET_INST_OPCODE ip @ extract opcode from rINST
2860 GOTO_OPCODE ip @ jump to next instruction
2861
2862
2863/* ------------------------------ */
2864 .balign 128
2865.L_op_sget: /* 0x60 */
2866/* File: arm/op_sget.S */
2867 /*
2868 * General SGET handler wrapper.
2869 *
2870 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2871 */
2872 /* op vAA, field@BBBB */
2873
2874 .extern artGet32StaticFromCode
2875 EXPORT_PC
2876 FETCH r0, 1 @ r0<- field ref BBBB
2877 ldr r1, [rFP, #OFF_FP_METHOD]
2878 mov r2, rSELF
2879 bl artGet32StaticFromCode
2880 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2881 mov r2, rINST, lsr #8 @ r2<- AA
2882 PREFETCH_INST 2
2883 cmp r3, #0 @ Fail to resolve?
2884 bne MterpException @ bail out
2885.if 0
2886 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2887.else
2888 SET_VREG r0, r2 @ fp[AA]<- r0
2889.endif
2890 ADVANCE 2
2891 GET_INST_OPCODE ip @ extract opcode from rINST
2892 GOTO_OPCODE ip
2893
2894/* ------------------------------ */
2895 .balign 128
2896.L_op_sget_wide: /* 0x61 */
2897/* File: arm/op_sget_wide.S */
2898 /*
2899 * SGET_WIDE handler wrapper.
2900 *
2901 */
2902 /* sget-wide vAA, field@BBBB */
2903
2904 .extern artGet64StaticFromCode
2905 EXPORT_PC
2906 FETCH r0, 1 @ r0<- field ref BBBB
2907 ldr r1, [rFP, #OFF_FP_METHOD]
2908 mov r2, rSELF
2909 bl artGet64StaticFromCode
2910 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2911 mov r9, rINST, lsr #8 @ r9<- AA
2912 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2913 cmp r3, #0 @ Fail to resolve?
2914 bne MterpException @ bail out
2915 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2916 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
2917 GET_INST_OPCODE ip @ extract opcode from rINST
2918 GOTO_OPCODE ip @ jump to next instruction
2919
2920/* ------------------------------ */
2921 .balign 128
2922.L_op_sget_object: /* 0x62 */
2923/* File: arm/op_sget_object.S */
2924/* File: arm/op_sget.S */
2925 /*
2926 * General SGET handler wrapper.
2927 *
2928 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2929 */
2930 /* op vAA, field@BBBB */
2931
2932 .extern artGetObjStaticFromCode
2933 EXPORT_PC
2934 FETCH r0, 1 @ r0<- field ref BBBB
2935 ldr r1, [rFP, #OFF_FP_METHOD]
2936 mov r2, rSELF
2937 bl artGetObjStaticFromCode
2938 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2939 mov r2, rINST, lsr #8 @ r2<- AA
2940 PREFETCH_INST 2
2941 cmp r3, #0 @ Fail to resolve?
2942 bne MterpException @ bail out
2943.if 1
2944 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2945.else
2946 SET_VREG r0, r2 @ fp[AA]<- r0
2947.endif
2948 ADVANCE 2
2949 GET_INST_OPCODE ip @ extract opcode from rINST
2950 GOTO_OPCODE ip
2951
2952
2953/* ------------------------------ */
2954 .balign 128
2955.L_op_sget_boolean: /* 0x63 */
2956/* File: arm/op_sget_boolean.S */
2957/* File: arm/op_sget.S */
2958 /*
2959 * General SGET handler wrapper.
2960 *
2961 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2962 */
2963 /* op vAA, field@BBBB */
2964
2965 .extern artGetBooleanStaticFromCode
2966 EXPORT_PC
2967 FETCH r0, 1 @ r0<- field ref BBBB
2968 ldr r1, [rFP, #OFF_FP_METHOD]
2969 mov r2, rSELF
2970 bl artGetBooleanStaticFromCode
2971 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2972 mov r2, rINST, lsr #8 @ r2<- AA
2973 PREFETCH_INST 2
2974 cmp r3, #0 @ Fail to resolve?
2975 bne MterpException @ bail out
2976.if 0
2977 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2978.else
2979 SET_VREG r0, r2 @ fp[AA]<- r0
2980.endif
2981 ADVANCE 2
2982 GET_INST_OPCODE ip @ extract opcode from rINST
2983 GOTO_OPCODE ip
2984
2985
2986/* ------------------------------ */
2987 .balign 128
2988.L_op_sget_byte: /* 0x64 */
2989/* File: arm/op_sget_byte.S */
2990/* File: arm/op_sget.S */
2991 /*
2992 * General SGET handler wrapper.
2993 *
2994 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2995 */
2996 /* op vAA, field@BBBB */
2997
2998 .extern artGetByteStaticFromCode
2999 EXPORT_PC
3000 FETCH r0, 1 @ r0<- field ref BBBB
3001 ldr r1, [rFP, #OFF_FP_METHOD]
3002 mov r2, rSELF
3003 bl artGetByteStaticFromCode
3004 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3005 mov r2, rINST, lsr #8 @ r2<- AA
3006 PREFETCH_INST 2
3007 cmp r3, #0 @ Fail to resolve?
3008 bne MterpException @ bail out
3009.if 0
3010 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3011.else
3012 SET_VREG r0, r2 @ fp[AA]<- r0
3013.endif
3014 ADVANCE 2
3015 GET_INST_OPCODE ip @ extract opcode from rINST
3016 GOTO_OPCODE ip
3017
3018
3019/* ------------------------------ */
3020 .balign 128
3021.L_op_sget_char: /* 0x65 */
3022/* File: arm/op_sget_char.S */
3023/* File: arm/op_sget.S */
3024 /*
3025 * General SGET handler wrapper.
3026 *
3027 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3028 */
3029 /* op vAA, field@BBBB */
3030
3031 .extern artGetCharStaticFromCode
3032 EXPORT_PC
3033 FETCH r0, 1 @ r0<- field ref BBBB
3034 ldr r1, [rFP, #OFF_FP_METHOD]
3035 mov r2, rSELF
3036 bl artGetCharStaticFromCode
3037 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3038 mov r2, rINST, lsr #8 @ r2<- AA
3039 PREFETCH_INST 2
3040 cmp r3, #0 @ Fail to resolve?
3041 bne MterpException @ bail out
3042.if 0
3043 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3044.else
3045 SET_VREG r0, r2 @ fp[AA]<- r0
3046.endif
3047 ADVANCE 2
3048 GET_INST_OPCODE ip @ extract opcode from rINST
3049 GOTO_OPCODE ip
3050
3051
3052/* ------------------------------ */
3053 .balign 128
3054.L_op_sget_short: /* 0x66 */
3055/* File: arm/op_sget_short.S */
3056/* File: arm/op_sget.S */
3057 /*
3058 * General SGET handler wrapper.
3059 *
3060 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3061 */
3062 /* op vAA, field@BBBB */
3063
3064 .extern artGetShortStaticFromCode
3065 EXPORT_PC
3066 FETCH r0, 1 @ r0<- field ref BBBB
3067 ldr r1, [rFP, #OFF_FP_METHOD]
3068 mov r2, rSELF
3069 bl artGetShortStaticFromCode
3070 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3071 mov r2, rINST, lsr #8 @ r2<- AA
3072 PREFETCH_INST 2
3073 cmp r3, #0 @ Fail to resolve?
3074 bne MterpException @ bail out
3075.if 0
3076 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3077.else
3078 SET_VREG r0, r2 @ fp[AA]<- r0
3079.endif
3080 ADVANCE 2
3081 GET_INST_OPCODE ip @ extract opcode from rINST
3082 GOTO_OPCODE ip
3083
3084
3085/* ------------------------------ */
3086 .balign 128
3087.L_op_sput: /* 0x67 */
3088/* File: arm/op_sput.S */
3089 /*
3090 * General SPUT handler wrapper.
3091 *
3092 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3093 */
3094 /* op vAA, field@BBBB */
3095 EXPORT_PC
3096 FETCH r0, 1 @ r0<- field ref BBBB
3097 mov r3, rINST, lsr #8 @ r3<- AA
3098 GET_VREG r1, r3 @ r1<= fp[AA]
3099 ldr r2, [rFP, #OFF_FP_METHOD]
3100 mov r3, rSELF
3101 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3102 bl artSet32StaticFromCode
3103 cmp r0, #0 @ 0 on success, -1 on failure
3104 bne MterpException
3105 ADVANCE 2 @ Past exception point - now advance rPC
3106 GET_INST_OPCODE ip @ extract opcode from rINST
3107 GOTO_OPCODE ip @ jump to next instruction
3108
3109/* ------------------------------ */
3110 .balign 128
3111.L_op_sput_wide: /* 0x68 */
3112/* File: arm/op_sput_wide.S */
3113 /*
3114 * SPUT_WIDE handler wrapper.
3115 *
3116 */
3117 /* sput-wide vAA, field@BBBB */
3118 .extern artSet64IndirectStaticFromMterp
3119 EXPORT_PC
3120 FETCH r0, 1 @ r0<- field ref BBBB
3121 ldr r1, [rFP, #OFF_FP_METHOD]
3122 mov r2, rINST, lsr #8 @ r3<- AA
3123 add r2, rFP, r2, lsl #2
3124 mov r3, rSELF
3125 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3126 bl artSet64IndirectStaticFromMterp
3127 cmp r0, #0 @ 0 on success, -1 on failure
3128 bne MterpException
3129 ADVANCE 2 @ Past exception point - now advance rPC
3130 GET_INST_OPCODE ip @ extract opcode from rINST
3131 GOTO_OPCODE ip @ jump to next instruction
3132
3133/* ------------------------------ */
3134 .balign 128
3135.L_op_sput_object: /* 0x69 */
3136/* File: arm/op_sput_object.S */
3137 EXPORT_PC
3138 add r0, rFP, #OFF_FP_SHADOWFRAME
3139 mov r1, rPC
3140 mov r2, rINST
3141 mov r3, rSELF
3142 bl MterpSputObject
3143 cmp r0, #0
3144 beq MterpException
3145 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3146 GET_INST_OPCODE ip @ extract opcode from rINST
3147 GOTO_OPCODE ip @ jump to next instruction
3148
3149/* ------------------------------ */
3150 .balign 128
3151.L_op_sput_boolean: /* 0x6a */
3152/* File: arm/op_sput_boolean.S */
3153/* File: arm/op_sput.S */
3154 /*
3155 * General SPUT handler wrapper.
3156 *
3157 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3158 */
3159 /* op vAA, field@BBBB */
3160 EXPORT_PC
3161 FETCH r0, 1 @ r0<- field ref BBBB
3162 mov r3, rINST, lsr #8 @ r3<- AA
3163 GET_VREG r1, r3 @ r1<= fp[AA]
3164 ldr r2, [rFP, #OFF_FP_METHOD]
3165 mov r3, rSELF
3166 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3167 bl artSet8StaticFromCode
3168 cmp r0, #0 @ 0 on success, -1 on failure
3169 bne MterpException
3170 ADVANCE 2 @ Past exception point - now advance rPC
3171 GET_INST_OPCODE ip @ extract opcode from rINST
3172 GOTO_OPCODE ip @ jump to next instruction
3173
3174
3175/* ------------------------------ */
3176 .balign 128
3177.L_op_sput_byte: /* 0x6b */
3178/* File: arm/op_sput_byte.S */
3179/* File: arm/op_sput.S */
3180 /*
3181 * General SPUT handler wrapper.
3182 *
3183 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3184 */
3185 /* op vAA, field@BBBB */
3186 EXPORT_PC
3187 FETCH r0, 1 @ r0<- field ref BBBB
3188 mov r3, rINST, lsr #8 @ r3<- AA
3189 GET_VREG r1, r3 @ r1<= fp[AA]
3190 ldr r2, [rFP, #OFF_FP_METHOD]
3191 mov r3, rSELF
3192 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3193 bl artSet8StaticFromCode
3194 cmp r0, #0 @ 0 on success, -1 on failure
3195 bne MterpException
3196 ADVANCE 2 @ Past exception point - now advance rPC
3197 GET_INST_OPCODE ip @ extract opcode from rINST
3198 GOTO_OPCODE ip @ jump to next instruction
3199
3200
3201/* ------------------------------ */
3202 .balign 128
3203.L_op_sput_char: /* 0x6c */
3204/* File: arm/op_sput_char.S */
3205/* File: arm/op_sput.S */
3206 /*
3207 * General SPUT handler wrapper.
3208 *
3209 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3210 */
3211 /* op vAA, field@BBBB */
3212 EXPORT_PC
3213 FETCH r0, 1 @ r0<- field ref BBBB
3214 mov r3, rINST, lsr #8 @ r3<- AA
3215 GET_VREG r1, r3 @ r1<= fp[AA]
3216 ldr r2, [rFP, #OFF_FP_METHOD]
3217 mov r3, rSELF
3218 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3219 bl artSet16StaticFromCode
3220 cmp r0, #0 @ 0 on success, -1 on failure
3221 bne MterpException
3222 ADVANCE 2 @ Past exception point - now advance rPC
3223 GET_INST_OPCODE ip @ extract opcode from rINST
3224 GOTO_OPCODE ip @ jump to next instruction
3225
3226
3227/* ------------------------------ */
3228 .balign 128
3229.L_op_sput_short: /* 0x6d */
3230/* File: arm/op_sput_short.S */
3231/* File: arm/op_sput.S */
3232 /*
3233 * General SPUT handler wrapper.
3234 *
3235 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3236 */
3237 /* op vAA, field@BBBB */
3238 EXPORT_PC
3239 FETCH r0, 1 @ r0<- field ref BBBB
3240 mov r3, rINST, lsr #8 @ r3<- AA
3241 GET_VREG r1, r3 @ r1<= fp[AA]
3242 ldr r2, [rFP, #OFF_FP_METHOD]
3243 mov r3, rSELF
3244 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3245 bl artSet16StaticFromCode
3246 cmp r0, #0 @ 0 on success, -1 on failure
3247 bne MterpException
3248 ADVANCE 2 @ Past exception point - now advance rPC
3249 GET_INST_OPCODE ip @ extract opcode from rINST
3250 GOTO_OPCODE ip @ jump to next instruction
3251
3252
3253/* ------------------------------ */
3254 .balign 128
3255.L_op_invoke_virtual: /* 0x6e */
3256/* File: arm/op_invoke_virtual.S */
3257/* File: arm/invoke.S */
3258 /*
3259 * Generic invoke handler wrapper.
3260 */
3261 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3262 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3263 .extern MterpInvokeVirtual
3264 EXPORT_PC
3265 mov r0, rSELF
3266 add r1, rFP, #OFF_FP_SHADOWFRAME
3267 mov r2, rPC
3268 mov r3, rINST
3269 bl MterpInvokeVirtual
3270 cmp r0, #0
3271 beq MterpException
3272 FETCH_ADVANCE_INST 3
3273 GET_INST_OPCODE ip
3274 GOTO_OPCODE ip
3275
3276
3277 /*
3278 * Handle a virtual method call.
3279 *
3280 * for: invoke-virtual, invoke-virtual/range
3281 */
3282 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3283 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3284
3285/* ------------------------------ */
3286 .balign 128
3287.L_op_invoke_super: /* 0x6f */
3288/* File: arm/op_invoke_super.S */
3289/* File: arm/invoke.S */
3290 /*
3291 * Generic invoke handler wrapper.
3292 */
3293 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3294 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3295 .extern MterpInvokeSuper
3296 EXPORT_PC
3297 mov r0, rSELF
3298 add r1, rFP, #OFF_FP_SHADOWFRAME
3299 mov r2, rPC
3300 mov r3, rINST
3301 bl MterpInvokeSuper
3302 cmp r0, #0
3303 beq MterpException
3304 FETCH_ADVANCE_INST 3
3305 GET_INST_OPCODE ip
3306 GOTO_OPCODE ip
3307
3308
3309 /*
3310 * Handle a "super" method call.
3311 *
3312 * for: invoke-super, invoke-super/range
3313 */
3314 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3315 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3316
3317/* ------------------------------ */
3318 .balign 128
3319.L_op_invoke_direct: /* 0x70 */
3320/* File: arm/op_invoke_direct.S */
3321/* File: arm/invoke.S */
3322 /*
3323 * Generic invoke handler wrapper.
3324 */
3325 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3326 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3327 .extern MterpInvokeDirect
3328 EXPORT_PC
3329 mov r0, rSELF
3330 add r1, rFP, #OFF_FP_SHADOWFRAME
3331 mov r2, rPC
3332 mov r3, rINST
3333 bl MterpInvokeDirect
3334 cmp r0, #0
3335 beq MterpException
3336 FETCH_ADVANCE_INST 3
3337 GET_INST_OPCODE ip
3338 GOTO_OPCODE ip
3339
3340
3341
3342/* ------------------------------ */
3343 .balign 128
3344.L_op_invoke_static: /* 0x71 */
3345/* File: arm/op_invoke_static.S */
3346/* File: arm/invoke.S */
3347 /*
3348 * Generic invoke handler wrapper.
3349 */
3350 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3351 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3352 .extern MterpInvokeStatic
3353 EXPORT_PC
3354 mov r0, rSELF
3355 add r1, rFP, #OFF_FP_SHADOWFRAME
3356 mov r2, rPC
3357 mov r3, rINST
3358 bl MterpInvokeStatic
3359 cmp r0, #0
3360 beq MterpException
3361 FETCH_ADVANCE_INST 3
3362 GET_INST_OPCODE ip
3363 GOTO_OPCODE ip
3364
3365
3366
3367
3368/* ------------------------------ */
3369 .balign 128
3370.L_op_invoke_interface: /* 0x72 */
3371/* File: arm/op_invoke_interface.S */
3372/* File: arm/invoke.S */
3373 /*
3374 * Generic invoke handler wrapper.
3375 */
3376 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3377 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3378 .extern MterpInvokeInterface
3379 EXPORT_PC
3380 mov r0, rSELF
3381 add r1, rFP, #OFF_FP_SHADOWFRAME
3382 mov r2, rPC
3383 mov r3, rINST
3384 bl MterpInvokeInterface
3385 cmp r0, #0
3386 beq MterpException
3387 FETCH_ADVANCE_INST 3
3388 GET_INST_OPCODE ip
3389 GOTO_OPCODE ip
3390
3391
3392 /*
3393 * Handle an interface method call.
3394 *
3395 * for: invoke-interface, invoke-interface/range
3396 */
3397 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3398 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3399
3400/* ------------------------------ */
3401 .balign 128
3402.L_op_return_void_no_barrier: /* 0x73 */
3403/* File: arm/op_return_void_no_barrier.S */
buzbeea2c97a92016-01-25 15:41:24 -08003404 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
3405 mov r0, rSELF
3406 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3407 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -08003408 mov r0, #0
3409 mov r1, #0
3410 b MterpReturn
3411
3412/* ------------------------------ */
3413 .balign 128
3414.L_op_invoke_virtual_range: /* 0x74 */
3415/* File: arm/op_invoke_virtual_range.S */
3416/* File: arm/invoke.S */
3417 /*
3418 * Generic invoke handler wrapper.
3419 */
3420 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3421 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3422 .extern MterpInvokeVirtualRange
3423 EXPORT_PC
3424 mov r0, rSELF
3425 add r1, rFP, #OFF_FP_SHADOWFRAME
3426 mov r2, rPC
3427 mov r3, rINST
3428 bl MterpInvokeVirtualRange
3429 cmp r0, #0
3430 beq MterpException
3431 FETCH_ADVANCE_INST 3
3432 GET_INST_OPCODE ip
3433 GOTO_OPCODE ip
3434
3435
3436
3437/* ------------------------------ */
3438 .balign 128
3439.L_op_invoke_super_range: /* 0x75 */
3440/* File: arm/op_invoke_super_range.S */
3441/* File: arm/invoke.S */
3442 /*
3443 * Generic invoke handler wrapper.
3444 */
3445 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3446 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3447 .extern MterpInvokeSuperRange
3448 EXPORT_PC
3449 mov r0, rSELF
3450 add r1, rFP, #OFF_FP_SHADOWFRAME
3451 mov r2, rPC
3452 mov r3, rINST
3453 bl MterpInvokeSuperRange
3454 cmp r0, #0
3455 beq MterpException
3456 FETCH_ADVANCE_INST 3
3457 GET_INST_OPCODE ip
3458 GOTO_OPCODE ip
3459
3460
3461
3462/* ------------------------------ */
3463 .balign 128
3464.L_op_invoke_direct_range: /* 0x76 */
3465/* File: arm/op_invoke_direct_range.S */
3466/* File: arm/invoke.S */
3467 /*
3468 * Generic invoke handler wrapper.
3469 */
3470 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3471 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3472 .extern MterpInvokeDirectRange
3473 EXPORT_PC
3474 mov r0, rSELF
3475 add r1, rFP, #OFF_FP_SHADOWFRAME
3476 mov r2, rPC
3477 mov r3, rINST
3478 bl MterpInvokeDirectRange
3479 cmp r0, #0
3480 beq MterpException
3481 FETCH_ADVANCE_INST 3
3482 GET_INST_OPCODE ip
3483 GOTO_OPCODE ip
3484
3485
3486
3487/* ------------------------------ */
3488 .balign 128
3489.L_op_invoke_static_range: /* 0x77 */
3490/* File: arm/op_invoke_static_range.S */
3491/* File: arm/invoke.S */
3492 /*
3493 * Generic invoke handler wrapper.
3494 */
3495 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3496 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3497 .extern MterpInvokeStaticRange
3498 EXPORT_PC
3499 mov r0, rSELF
3500 add r1, rFP, #OFF_FP_SHADOWFRAME
3501 mov r2, rPC
3502 mov r3, rINST
3503 bl MterpInvokeStaticRange
3504 cmp r0, #0
3505 beq MterpException
3506 FETCH_ADVANCE_INST 3
3507 GET_INST_OPCODE ip
3508 GOTO_OPCODE ip
3509
3510
3511
3512/* ------------------------------ */
3513 .balign 128
3514.L_op_invoke_interface_range: /* 0x78 */
3515/* File: arm/op_invoke_interface_range.S */
3516/* File: arm/invoke.S */
3517 /*
3518 * Generic invoke handler wrapper.
3519 */
3520 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3521 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3522 .extern MterpInvokeInterfaceRange
3523 EXPORT_PC
3524 mov r0, rSELF
3525 add r1, rFP, #OFF_FP_SHADOWFRAME
3526 mov r2, rPC
3527 mov r3, rINST
3528 bl MterpInvokeInterfaceRange
3529 cmp r0, #0
3530 beq MterpException
3531 FETCH_ADVANCE_INST 3
3532 GET_INST_OPCODE ip
3533 GOTO_OPCODE ip
3534
3535
3536
3537/* ------------------------------ */
3538 .balign 128
3539.L_op_unused_79: /* 0x79 */
3540/* File: arm/op_unused_79.S */
3541/* File: arm/unused.S */
3542/*
3543 * Bail to reference interpreter to throw.
3544 */
3545 b MterpFallback
3546
3547
3548/* ------------------------------ */
3549 .balign 128
3550.L_op_unused_7a: /* 0x7a */
3551/* File: arm/op_unused_7a.S */
3552/* File: arm/unused.S */
3553/*
3554 * Bail to reference interpreter to throw.
3555 */
3556 b MterpFallback
3557
3558
3559/* ------------------------------ */
3560 .balign 128
3561.L_op_neg_int: /* 0x7b */
3562/* File: arm/op_neg_int.S */
3563/* File: arm/unop.S */
3564 /*
3565 * Generic 32-bit unary operation. Provide an "instr" line that
3566 * specifies an instruction that performs "result = op r0".
3567 * This could be an ARM instruction or a function call.
3568 *
3569 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3570 * int-to-byte, int-to-char, int-to-short
3571 */
3572 /* unop vA, vB */
3573 mov r3, rINST, lsr #12 @ r3<- B
3574 ubfx r9, rINST, #8, #4 @ r9<- A
3575 GET_VREG r0, r3 @ r0<- vB
3576 @ optional op; may set condition codes
3577 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3578 rsb r0, r0, #0 @ r0<- op, r0-r3 changed
3579 GET_INST_OPCODE ip @ extract opcode from rINST
3580 SET_VREG r0, r9 @ vAA<- r0
3581 GOTO_OPCODE ip @ jump to next instruction
3582 /* 8-9 instructions */
3583
3584
3585/* ------------------------------ */
3586 .balign 128
3587.L_op_not_int: /* 0x7c */
3588/* File: arm/op_not_int.S */
3589/* File: arm/unop.S */
3590 /*
3591 * Generic 32-bit unary operation. Provide an "instr" line that
3592 * specifies an instruction that performs "result = op r0".
3593 * This could be an ARM instruction or a function call.
3594 *
3595 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3596 * int-to-byte, int-to-char, int-to-short
3597 */
3598 /* unop vA, vB */
3599 mov r3, rINST, lsr #12 @ r3<- B
3600 ubfx r9, rINST, #8, #4 @ r9<- A
3601 GET_VREG r0, r3 @ r0<- vB
3602 @ optional op; may set condition codes
3603 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3604 mvn r0, r0 @ r0<- op, r0-r3 changed
3605 GET_INST_OPCODE ip @ extract opcode from rINST
3606 SET_VREG r0, r9 @ vAA<- r0
3607 GOTO_OPCODE ip @ jump to next instruction
3608 /* 8-9 instructions */
3609
3610
3611/* ------------------------------ */
3612 .balign 128
3613.L_op_neg_long: /* 0x7d */
3614/* File: arm/op_neg_long.S */
3615/* File: arm/unopWide.S */
3616 /*
3617 * Generic 64-bit unary operation. Provide an "instr" line that
3618 * specifies an instruction that performs "result = op r0/r1".
3619 * This could be an ARM instruction or a function call.
3620 *
3621 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3622 */
3623 /* unop vA, vB */
3624 mov r3, rINST, lsr #12 @ r3<- B
3625 ubfx r9, rINST, #8, #4 @ r9<- A
3626 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3627 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3628 ldmia r3, {r0-r1} @ r0/r1<- vAA
3629 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3630 rsbs r0, r0, #0 @ optional op; may set condition codes
3631 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed
3632 GET_INST_OPCODE ip @ extract opcode from rINST
3633 stmia r9, {r0-r1} @ vAA<- r0/r1
3634 GOTO_OPCODE ip @ jump to next instruction
3635 /* 10-11 instructions */
3636
3637
3638/* ------------------------------ */
3639 .balign 128
3640.L_op_not_long: /* 0x7e */
3641/* File: arm/op_not_long.S */
3642/* File: arm/unopWide.S */
3643 /*
3644 * Generic 64-bit unary operation. Provide an "instr" line that
3645 * specifies an instruction that performs "result = op r0/r1".
3646 * This could be an ARM instruction or a function call.
3647 *
3648 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3649 */
3650 /* unop vA, vB */
3651 mov r3, rINST, lsr #12 @ r3<- B
3652 ubfx r9, rINST, #8, #4 @ r9<- A
3653 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3654 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3655 ldmia r3, {r0-r1} @ r0/r1<- vAA
3656 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3657 mvn r0, r0 @ optional op; may set condition codes
3658 mvn r1, r1 @ r0/r1<- op, r2-r3 changed
3659 GET_INST_OPCODE ip @ extract opcode from rINST
3660 stmia r9, {r0-r1} @ vAA<- r0/r1
3661 GOTO_OPCODE ip @ jump to next instruction
3662 /* 10-11 instructions */
3663
3664
3665/* ------------------------------ */
3666 .balign 128
3667.L_op_neg_float: /* 0x7f */
3668/* File: arm/op_neg_float.S */
3669/* File: arm/unop.S */
3670 /*
3671 * Generic 32-bit unary operation. Provide an "instr" line that
3672 * specifies an instruction that performs "result = op r0".
3673 * This could be an ARM instruction or a function call.
3674 *
3675 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3676 * int-to-byte, int-to-char, int-to-short
3677 */
3678 /* unop vA, vB */
3679 mov r3, rINST, lsr #12 @ r3<- B
3680 ubfx r9, rINST, #8, #4 @ r9<- A
3681 GET_VREG r0, r3 @ r0<- vB
3682 @ optional op; may set condition codes
3683 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3684 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed
3685 GET_INST_OPCODE ip @ extract opcode from rINST
3686 SET_VREG r0, r9 @ vAA<- r0
3687 GOTO_OPCODE ip @ jump to next instruction
3688 /* 8-9 instructions */
3689
3690
3691/* ------------------------------ */
3692 .balign 128
3693.L_op_neg_double: /* 0x80 */
3694/* File: arm/op_neg_double.S */
3695/* File: arm/unopWide.S */
3696 /*
3697 * Generic 64-bit unary operation. Provide an "instr" line that
3698 * specifies an instruction that performs "result = op r0/r1".
3699 * This could be an ARM instruction or a function call.
3700 *
3701 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3702 */
3703 /* unop vA, vB */
3704 mov r3, rINST, lsr #12 @ r3<- B
3705 ubfx r9, rINST, #8, #4 @ r9<- A
3706 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3707 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3708 ldmia r3, {r0-r1} @ r0/r1<- vAA
3709 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3710 @ optional op; may set condition codes
3711 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed
3712 GET_INST_OPCODE ip @ extract opcode from rINST
3713 stmia r9, {r0-r1} @ vAA<- r0/r1
3714 GOTO_OPCODE ip @ jump to next instruction
3715 /* 10-11 instructions */
3716
3717
3718/* ------------------------------ */
3719 .balign 128
3720.L_op_int_to_long: /* 0x81 */
3721/* File: arm/op_int_to_long.S */
3722/* File: arm/unopWider.S */
3723 /*
3724 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3725 * that specifies an instruction that performs "result = op r0", where
3726 * "result" is a 64-bit quantity in r0/r1.
3727 *
3728 * For: int-to-long, int-to-double, float-to-long, float-to-double
3729 */
3730 /* unop vA, vB */
3731 mov r3, rINST, lsr #12 @ r3<- B
3732 ubfx r9, rINST, #8, #4 @ r9<- A
3733 GET_VREG r0, r3 @ r0<- vB
3734 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3735 @ optional op; may set condition codes
3736 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3737 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed
3738 GET_INST_OPCODE ip @ extract opcode from rINST
3739 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3740 GOTO_OPCODE ip @ jump to next instruction
3741 /* 9-10 instructions */
3742
3743
3744/* ------------------------------ */
3745 .balign 128
3746.L_op_int_to_float: /* 0x82 */
3747/* File: arm/op_int_to_float.S */
3748/* File: arm/funop.S */
3749 /*
3750 * Generic 32-bit unary floating-point operation. Provide an "instr"
3751 * line that specifies an instruction that performs "s1 = op s0".
3752 *
3753 * for: int-to-float, float-to-int
3754 */
3755 /* unop vA, vB */
3756 mov r3, rINST, lsr #12 @ r3<- B
3757 mov r9, rINST, lsr #8 @ r9<- A+
3758 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3759 flds s0, [r3] @ s0<- vB
3760 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3761 and r9, r9, #15 @ r9<- A
3762 fsitos s1, s0 @ s1<- op
3763 GET_INST_OPCODE ip @ extract opcode from rINST
3764 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3765 fsts s1, [r9] @ vA<- s1
3766 GOTO_OPCODE ip @ jump to next instruction
3767
3768
3769/* ------------------------------ */
3770 .balign 128
3771.L_op_int_to_double: /* 0x83 */
3772/* File: arm/op_int_to_double.S */
3773/* File: arm/funopWider.S */
3774 /*
3775 * Generic 32bit-to-64bit floating point unary operation. Provide an
3776 * "instr" line that specifies an instruction that performs "d0 = op s0".
3777 *
3778 * For: int-to-double, float-to-double
3779 */
3780 /* unop vA, vB */
3781 mov r3, rINST, lsr #12 @ r3<- B
3782 mov r9, rINST, lsr #8 @ r9<- A+
3783 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3784 flds s0, [r3] @ s0<- vB
3785 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3786 and r9, r9, #15 @ r9<- A
3787 fsitod d0, s0 @ d0<- op
3788 GET_INST_OPCODE ip @ extract opcode from rINST
3789 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3790 fstd d0, [r9] @ vA<- d0
3791 GOTO_OPCODE ip @ jump to next instruction
3792
3793
3794/* ------------------------------ */
3795 .balign 128
3796.L_op_long_to_int: /* 0x84 */
3797/* File: arm/op_long_to_int.S */
3798/* we ignore the high word, making this equivalent to a 32-bit reg move */
3799/* File: arm/op_move.S */
3800 /* for move, move-object, long-to-int */
3801 /* op vA, vB */
3802 mov r1, rINST, lsr #12 @ r1<- B from 15:12
3803 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
3804 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3805 GET_VREG r2, r1 @ r2<- fp[B]
3806 GET_INST_OPCODE ip @ ip<- opcode from rINST
3807 .if 0
3808 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
3809 .else
3810 SET_VREG r2, r0 @ fp[A]<- r2
3811 .endif
3812 GOTO_OPCODE ip @ execute next instruction
3813
3814
3815/* ------------------------------ */
3816 .balign 128
3817.L_op_long_to_float: /* 0x85 */
3818/* File: arm/op_long_to_float.S */
3819/* File: arm/unopNarrower.S */
3820 /*
3821 * Generic 64bit-to-32bit unary operation. Provide an "instr" line
3822 * that specifies an instruction that performs "result = op r0/r1", where
3823 * "result" is a 32-bit quantity in r0.
3824 *
3825 * For: long-to-float, double-to-int, double-to-float
3826 *
3827 * (This would work for long-to-int, but that instruction is actually
3828 * an exact match for op_move.)
3829 */
3830 /* unop vA, vB */
3831 mov r3, rINST, lsr #12 @ r3<- B
3832 ubfx r9, rINST, #8, #4 @ r9<- A
3833 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3834 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1
3835 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3836 @ optional op; may set condition codes
3837 bl __aeabi_l2f @ r0<- op, r0-r3 changed
3838 GET_INST_OPCODE ip @ extract opcode from rINST
3839 SET_VREG r0, r9 @ vA<- r0
3840 GOTO_OPCODE ip @ jump to next instruction
3841 /* 9-10 instructions */
3842
3843
3844/* ------------------------------ */
3845 .balign 128
3846.L_op_long_to_double: /* 0x86 */
3847/* File: arm/op_long_to_double.S */
3848 /*
3849 * Specialised 64-bit floating point operation.
3850 *
3851 * Note: The result will be returned in d2.
3852 *
3853 * For: long-to-double
3854 */
3855 mov r3, rINST, lsr #12 @ r3<- B
3856 ubfx r9, rINST, #8, #4 @ r9<- A
3857 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3858 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3859 vldr d0, [r3] @ d0<- vAA
3860 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3861
3862 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh)
3863 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl)
3864 vldr d3, constvalop_long_to_double
3865 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl
3866
3867 GET_INST_OPCODE ip @ extract opcode from rINST
3868 vstr.64 d2, [r9] @ vAA<- d2
3869 GOTO_OPCODE ip @ jump to next instruction
3870
3871 /* literal pool helper */
3872constvalop_long_to_double:
3873 .8byte 0x41f0000000000000
3874
3875/* ------------------------------ */
3876 .balign 128
3877.L_op_float_to_int: /* 0x87 */
3878/* File: arm/op_float_to_int.S */
3879/* File: arm/funop.S */
3880 /*
3881 * Generic 32-bit unary floating-point operation. Provide an "instr"
3882 * line that specifies an instruction that performs "s1 = op s0".
3883 *
3884 * for: int-to-float, float-to-int
3885 */
3886 /* unop vA, vB */
3887 mov r3, rINST, lsr #12 @ r3<- B
3888 mov r9, rINST, lsr #8 @ r9<- A+
3889 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3890 flds s0, [r3] @ s0<- vB
3891 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3892 and r9, r9, #15 @ r9<- A
3893 ftosizs s1, s0 @ s1<- op
3894 GET_INST_OPCODE ip @ extract opcode from rINST
3895 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3896 fsts s1, [r9] @ vA<- s1
3897 GOTO_OPCODE ip @ jump to next instruction
3898
3899
3900/* ------------------------------ */
3901 .balign 128
3902.L_op_float_to_long: /* 0x88 */
3903/* File: arm/op_float_to_long.S */
3904@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"}
3905/* File: arm/unopWider.S */
3906 /*
3907 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3908 * that specifies an instruction that performs "result = op r0", where
3909 * "result" is a 64-bit quantity in r0/r1.
3910 *
3911 * For: int-to-long, int-to-double, float-to-long, float-to-double
3912 */
3913 /* unop vA, vB */
3914 mov r3, rINST, lsr #12 @ r3<- B
3915 ubfx r9, rINST, #8, #4 @ r9<- A
3916 GET_VREG r0, r3 @ r0<- vB
3917 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3918 @ optional op; may set condition codes
3919 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3920 bl f2l_doconv @ r0<- op, r0-r3 changed
3921 GET_INST_OPCODE ip @ extract opcode from rINST
3922 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3923 GOTO_OPCODE ip @ jump to next instruction
3924 /* 9-10 instructions */
3925
3926
3927
3928/* ------------------------------ */
3929 .balign 128
3930.L_op_float_to_double: /* 0x89 */
3931/* File: arm/op_float_to_double.S */
3932/* File: arm/funopWider.S */
3933 /*
3934 * Generic 32bit-to-64bit floating point unary operation. Provide an
3935 * "instr" line that specifies an instruction that performs "d0 = op s0".
3936 *
3937 * For: int-to-double, float-to-double
3938 */
3939 /* unop vA, vB */
3940 mov r3, rINST, lsr #12 @ r3<- B
3941 mov r9, rINST, lsr #8 @ r9<- A+
3942 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3943 flds s0, [r3] @ s0<- vB
3944 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3945 and r9, r9, #15 @ r9<- A
3946 fcvtds d0, s0 @ d0<- op
3947 GET_INST_OPCODE ip @ extract opcode from rINST
3948 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3949 fstd d0, [r9] @ vA<- d0
3950 GOTO_OPCODE ip @ jump to next instruction
3951
3952
3953/* ------------------------------ */
3954 .balign 128
3955.L_op_double_to_int: /* 0x8a */
3956/* File: arm/op_double_to_int.S */
3957/* File: arm/funopNarrower.S */
3958 /*
3959 * Generic 64bit-to-32bit unary floating point operation. Provide an
3960 * "instr" line that specifies an instruction that performs "s0 = op d0".
3961 *
3962 * For: double-to-int, double-to-float
3963 */
3964 /* unop vA, vB */
3965 mov r3, rINST, lsr #12 @ r3<- B
3966 mov r9, rINST, lsr #8 @ r9<- A+
3967 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3968 fldd d0, [r3] @ d0<- vB
3969 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3970 and r9, r9, #15 @ r9<- A
3971 ftosizd s0, d0 @ s0<- op
3972 GET_INST_OPCODE ip @ extract opcode from rINST
3973 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3974 fsts s0, [r9] @ vA<- s0
3975 GOTO_OPCODE ip @ jump to next instruction
3976
3977
3978/* ------------------------------ */
3979 .balign 128
3980.L_op_double_to_long: /* 0x8b */
3981/* File: arm/op_double_to_long.S */
3982@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"}
3983/* File: arm/unopWide.S */
3984 /*
3985 * Generic 64-bit unary operation. Provide an "instr" line that
3986 * specifies an instruction that performs "result = op r0/r1".
3987 * This could be an ARM instruction or a function call.
3988 *
3989 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3990 */
3991 /* unop vA, vB */
3992 mov r3, rINST, lsr #12 @ r3<- B
3993 ubfx r9, rINST, #8, #4 @ r9<- A
3994 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3995 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3996 ldmia r3, {r0-r1} @ r0/r1<- vAA
3997 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3998 @ optional op; may set condition codes
3999 bl d2l_doconv @ r0/r1<- op, r2-r3 changed
4000 GET_INST_OPCODE ip @ extract opcode from rINST
4001 stmia r9, {r0-r1} @ vAA<- r0/r1
4002 GOTO_OPCODE ip @ jump to next instruction
4003 /* 10-11 instructions */
4004
4005
4006
4007/* ------------------------------ */
4008 .balign 128
4009.L_op_double_to_float: /* 0x8c */
4010/* File: arm/op_double_to_float.S */
4011/* File: arm/funopNarrower.S */
4012 /*
4013 * Generic 64bit-to-32bit unary floating point operation. Provide an
4014 * "instr" line that specifies an instruction that performs "s0 = op d0".
4015 *
4016 * For: double-to-int, double-to-float
4017 */
4018 /* unop vA, vB */
4019 mov r3, rINST, lsr #12 @ r3<- B
4020 mov r9, rINST, lsr #8 @ r9<- A+
4021 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4022 fldd d0, [r3] @ d0<- vB
4023 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4024 and r9, r9, #15 @ r9<- A
4025 fcvtsd s0, d0 @ s0<- op
4026 GET_INST_OPCODE ip @ extract opcode from rINST
4027 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4028 fsts s0, [r9] @ vA<- s0
4029 GOTO_OPCODE ip @ jump to next instruction
4030
4031
4032/* ------------------------------ */
4033 .balign 128
4034.L_op_int_to_byte: /* 0x8d */
4035/* File: arm/op_int_to_byte.S */
4036/* File: arm/unop.S */
4037 /*
4038 * Generic 32-bit unary operation. Provide an "instr" line that
4039 * specifies an instruction that performs "result = op r0".
4040 * This could be an ARM instruction or a function call.
4041 *
4042 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4043 * int-to-byte, int-to-char, int-to-short
4044 */
4045 /* unop vA, vB */
4046 mov r3, rINST, lsr #12 @ r3<- B
4047 ubfx r9, rINST, #8, #4 @ r9<- A
4048 GET_VREG r0, r3 @ r0<- vB
4049 @ optional op; may set condition codes
4050 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4051 sxtb r0, r0 @ r0<- op, r0-r3 changed
4052 GET_INST_OPCODE ip @ extract opcode from rINST
4053 SET_VREG r0, r9 @ vAA<- r0
4054 GOTO_OPCODE ip @ jump to next instruction
4055 /* 8-9 instructions */
4056
4057
4058/* ------------------------------ */
4059 .balign 128
4060.L_op_int_to_char: /* 0x8e */
4061/* File: arm/op_int_to_char.S */
4062/* File: arm/unop.S */
4063 /*
4064 * Generic 32-bit unary operation. Provide an "instr" line that
4065 * specifies an instruction that performs "result = op r0".
4066 * This could be an ARM instruction or a function call.
4067 *
4068 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4069 * int-to-byte, int-to-char, int-to-short
4070 */
4071 /* unop vA, vB */
4072 mov r3, rINST, lsr #12 @ r3<- B
4073 ubfx r9, rINST, #8, #4 @ r9<- A
4074 GET_VREG r0, r3 @ r0<- vB
4075 @ optional op; may set condition codes
4076 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4077 uxth r0, r0 @ r0<- op, r0-r3 changed
4078 GET_INST_OPCODE ip @ extract opcode from rINST
4079 SET_VREG r0, r9 @ vAA<- r0
4080 GOTO_OPCODE ip @ jump to next instruction
4081 /* 8-9 instructions */
4082
4083
4084/* ------------------------------ */
4085 .balign 128
4086.L_op_int_to_short: /* 0x8f */
4087/* File: arm/op_int_to_short.S */
4088/* File: arm/unop.S */
4089 /*
4090 * Generic 32-bit unary operation. Provide an "instr" line that
4091 * specifies an instruction that performs "result = op r0".
4092 * This could be an ARM instruction or a function call.
4093 *
4094 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4095 * int-to-byte, int-to-char, int-to-short
4096 */
4097 /* unop vA, vB */
4098 mov r3, rINST, lsr #12 @ r3<- B
4099 ubfx r9, rINST, #8, #4 @ r9<- A
4100 GET_VREG r0, r3 @ r0<- vB
4101 @ optional op; may set condition codes
4102 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4103 sxth r0, r0 @ r0<- op, r0-r3 changed
4104 GET_INST_OPCODE ip @ extract opcode from rINST
4105 SET_VREG r0, r9 @ vAA<- r0
4106 GOTO_OPCODE ip @ jump to next instruction
4107 /* 8-9 instructions */
4108
4109
4110/* ------------------------------ */
4111 .balign 128
4112.L_op_add_int: /* 0x90 */
4113/* File: arm/op_add_int.S */
4114/* File: arm/binop.S */
4115 /*
4116 * Generic 32-bit binary operation. Provide an "instr" line that
4117 * specifies an instruction that performs "result = r0 op r1".
4118 * This could be an ARM instruction or a function call. (If the result
4119 * comes back in a register other than r0, you can override "result".)
4120 *
4121 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4122 * vCC (r1). Useful for integer division and modulus. Note that we
4123 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4124 * handles it correctly.
4125 *
4126 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4127 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4128 * mul-float, div-float, rem-float
4129 */
4130 /* binop vAA, vBB, vCC */
4131 FETCH r0, 1 @ r0<- CCBB
4132 mov r9, rINST, lsr #8 @ r9<- AA
4133 mov r3, r0, lsr #8 @ r3<- CC
4134 and r2, r0, #255 @ r2<- BB
4135 GET_VREG r1, r3 @ r1<- vCC
4136 GET_VREG r0, r2 @ r0<- vBB
4137 .if 0
4138 cmp r1, #0 @ is second operand zero?
4139 beq common_errDivideByZero
4140 .endif
4141
4142 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4143 @ optional op; may set condition codes
4144 add r0, r0, r1 @ r0<- op, r0-r3 changed
4145 GET_INST_OPCODE ip @ extract opcode from rINST
4146 SET_VREG r0, r9 @ vAA<- r0
4147 GOTO_OPCODE ip @ jump to next instruction
4148 /* 11-14 instructions */
4149
4150
4151/* ------------------------------ */
4152 .balign 128
4153.L_op_sub_int: /* 0x91 */
4154/* File: arm/op_sub_int.S */
4155/* File: arm/binop.S */
4156 /*
4157 * Generic 32-bit binary operation. Provide an "instr" line that
4158 * specifies an instruction that performs "result = r0 op r1".
4159 * This could be an ARM instruction or a function call. (If the result
4160 * comes back in a register other than r0, you can override "result".)
4161 *
4162 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4163 * vCC (r1). Useful for integer division and modulus. Note that we
4164 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4165 * handles it correctly.
4166 *
4167 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4168 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4169 * mul-float, div-float, rem-float
4170 */
4171 /* binop vAA, vBB, vCC */
4172 FETCH r0, 1 @ r0<- CCBB
4173 mov r9, rINST, lsr #8 @ r9<- AA
4174 mov r3, r0, lsr #8 @ r3<- CC
4175 and r2, r0, #255 @ r2<- BB
4176 GET_VREG r1, r3 @ r1<- vCC
4177 GET_VREG r0, r2 @ r0<- vBB
4178 .if 0
4179 cmp r1, #0 @ is second operand zero?
4180 beq common_errDivideByZero
4181 .endif
4182
4183 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4184 @ optional op; may set condition codes
4185 sub r0, r0, r1 @ r0<- op, r0-r3 changed
4186 GET_INST_OPCODE ip @ extract opcode from rINST
4187 SET_VREG r0, r9 @ vAA<- r0
4188 GOTO_OPCODE ip @ jump to next instruction
4189 /* 11-14 instructions */
4190
4191
4192/* ------------------------------ */
4193 .balign 128
4194.L_op_mul_int: /* 0x92 */
4195/* File: arm/op_mul_int.S */
4196/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4197/* File: arm/binop.S */
4198 /*
4199 * Generic 32-bit binary operation. Provide an "instr" line that
4200 * specifies an instruction that performs "result = r0 op r1".
4201 * This could be an ARM instruction or a function call. (If the result
4202 * comes back in a register other than r0, you can override "result".)
4203 *
4204 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4205 * vCC (r1). Useful for integer division and modulus. Note that we
4206 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4207 * handles it correctly.
4208 *
4209 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4210 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4211 * mul-float, div-float, rem-float
4212 */
4213 /* binop vAA, vBB, vCC */
4214 FETCH r0, 1 @ r0<- CCBB
4215 mov r9, rINST, lsr #8 @ r9<- AA
4216 mov r3, r0, lsr #8 @ r3<- CC
4217 and r2, r0, #255 @ r2<- BB
4218 GET_VREG r1, r3 @ r1<- vCC
4219 GET_VREG r0, r2 @ r0<- vBB
4220 .if 0
4221 cmp r1, #0 @ is second operand zero?
4222 beq common_errDivideByZero
4223 .endif
4224
4225 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4226 @ optional op; may set condition codes
4227 mul r0, r1, r0 @ r0<- op, r0-r3 changed
4228 GET_INST_OPCODE ip @ extract opcode from rINST
4229 SET_VREG r0, r9 @ vAA<- r0
4230 GOTO_OPCODE ip @ jump to next instruction
4231 /* 11-14 instructions */
4232
4233
4234/* ------------------------------ */
4235 .balign 128
4236.L_op_div_int: /* 0x93 */
4237/* File: arm/op_div_int.S */
4238 /*
4239 * Specialized 32-bit binary operation
4240 *
4241 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4242 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4243 * ARMv7 CPUs that have hardware division support).
4244 *
4245 * div-int
4246 *
4247 */
4248 FETCH r0, 1 @ r0<- CCBB
4249 mov r9, rINST, lsr #8 @ r9<- AA
4250 mov r3, r0, lsr #8 @ r3<- CC
4251 and r2, r0, #255 @ r2<- BB
4252 GET_VREG r1, r3 @ r1<- vCC
4253 GET_VREG r0, r2 @ r0<- vBB
4254 cmp r1, #0 @ is second operand zero?
4255 beq common_errDivideByZero
4256
4257 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4258#ifdef __ARM_ARCH_EXT_IDIV__
4259 sdiv r0, r0, r1 @ r0<- op
4260#else
4261 bl __aeabi_idiv @ r0<- op, r0-r3 changed
4262#endif
4263 GET_INST_OPCODE ip @ extract opcode from rINST
4264 SET_VREG r0, r9 @ vAA<- r0
4265 GOTO_OPCODE ip @ jump to next instruction
4266 /* 11-14 instructions */
4267
4268/* ------------------------------ */
4269 .balign 128
4270.L_op_rem_int: /* 0x94 */
4271/* File: arm/op_rem_int.S */
4272 /*
4273 * Specialized 32-bit binary operation
4274 *
4275 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4276 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4277 * ARMv7 CPUs that have hardware division support).
4278 *
4279 * NOTE: idivmod returns quotient in r0 and remainder in r1
4280 *
4281 * rem-int
4282 *
4283 */
4284 FETCH r0, 1 @ r0<- CCBB
4285 mov r9, rINST, lsr #8 @ r9<- AA
4286 mov r3, r0, lsr #8 @ r3<- CC
4287 and r2, r0, #255 @ r2<- BB
4288 GET_VREG r1, r3 @ r1<- vCC
4289 GET_VREG r0, r2 @ r0<- vBB
4290 cmp r1, #0 @ is second operand zero?
4291 beq common_errDivideByZero
4292
4293 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4294#ifdef __ARM_ARCH_EXT_IDIV__
4295 sdiv r2, r0, r1
4296 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed
4297#else
4298 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
4299#endif
4300 GET_INST_OPCODE ip @ extract opcode from rINST
4301 SET_VREG r1, r9 @ vAA<- r1
4302 GOTO_OPCODE ip @ jump to next instruction
4303 /* 11-14 instructions */
4304
4305/* ------------------------------ */
4306 .balign 128
4307.L_op_and_int: /* 0x95 */
4308/* File: arm/op_and_int.S */
4309/* File: arm/binop.S */
4310 /*
4311 * Generic 32-bit binary operation. Provide an "instr" line that
4312 * specifies an instruction that performs "result = r0 op r1".
4313 * This could be an ARM instruction or a function call. (If the result
4314 * comes back in a register other than r0, you can override "result".)
4315 *
4316 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4317 * vCC (r1). Useful for integer division and modulus. Note that we
4318 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4319 * handles it correctly.
4320 *
4321 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4322 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4323 * mul-float, div-float, rem-float
4324 */
4325 /* binop vAA, vBB, vCC */
4326 FETCH r0, 1 @ r0<- CCBB
4327 mov r9, rINST, lsr #8 @ r9<- AA
4328 mov r3, r0, lsr #8 @ r3<- CC
4329 and r2, r0, #255 @ r2<- BB
4330 GET_VREG r1, r3 @ r1<- vCC
4331 GET_VREG r0, r2 @ r0<- vBB
4332 .if 0
4333 cmp r1, #0 @ is second operand zero?
4334 beq common_errDivideByZero
4335 .endif
4336
4337 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4338 @ optional op; may set condition codes
4339 and r0, r0, r1 @ r0<- op, r0-r3 changed
4340 GET_INST_OPCODE ip @ extract opcode from rINST
4341 SET_VREG r0, r9 @ vAA<- r0
4342 GOTO_OPCODE ip @ jump to next instruction
4343 /* 11-14 instructions */
4344
4345
4346/* ------------------------------ */
4347 .balign 128
4348.L_op_or_int: /* 0x96 */
4349/* File: arm/op_or_int.S */
4350/* File: arm/binop.S */
4351 /*
4352 * Generic 32-bit binary operation. Provide an "instr" line that
4353 * specifies an instruction that performs "result = r0 op r1".
4354 * This could be an ARM instruction or a function call. (If the result
4355 * comes back in a register other than r0, you can override "result".)
4356 *
4357 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4358 * vCC (r1). Useful for integer division and modulus. Note that we
4359 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4360 * handles it correctly.
4361 *
4362 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4363 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4364 * mul-float, div-float, rem-float
4365 */
4366 /* binop vAA, vBB, vCC */
4367 FETCH r0, 1 @ r0<- CCBB
4368 mov r9, rINST, lsr #8 @ r9<- AA
4369 mov r3, r0, lsr #8 @ r3<- CC
4370 and r2, r0, #255 @ r2<- BB
4371 GET_VREG r1, r3 @ r1<- vCC
4372 GET_VREG r0, r2 @ r0<- vBB
4373 .if 0
4374 cmp r1, #0 @ is second operand zero?
4375 beq common_errDivideByZero
4376 .endif
4377
4378 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4379 @ optional op; may set condition codes
4380 orr r0, r0, r1 @ r0<- op, r0-r3 changed
4381 GET_INST_OPCODE ip @ extract opcode from rINST
4382 SET_VREG r0, r9 @ vAA<- r0
4383 GOTO_OPCODE ip @ jump to next instruction
4384 /* 11-14 instructions */
4385
4386
4387/* ------------------------------ */
4388 .balign 128
4389.L_op_xor_int: /* 0x97 */
4390/* File: arm/op_xor_int.S */
4391/* File: arm/binop.S */
4392 /*
4393 * Generic 32-bit binary operation. Provide an "instr" line that
4394 * specifies an instruction that performs "result = r0 op r1".
4395 * This could be an ARM instruction or a function call. (If the result
4396 * comes back in a register other than r0, you can override "result".)
4397 *
4398 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4399 * vCC (r1). Useful for integer division and modulus. Note that we
4400 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4401 * handles it correctly.
4402 *
4403 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4404 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4405 * mul-float, div-float, rem-float
4406 */
4407 /* binop vAA, vBB, vCC */
4408 FETCH r0, 1 @ r0<- CCBB
4409 mov r9, rINST, lsr #8 @ r9<- AA
4410 mov r3, r0, lsr #8 @ r3<- CC
4411 and r2, r0, #255 @ r2<- BB
4412 GET_VREG r1, r3 @ r1<- vCC
4413 GET_VREG r0, r2 @ r0<- vBB
4414 .if 0
4415 cmp r1, #0 @ is second operand zero?
4416 beq common_errDivideByZero
4417 .endif
4418
4419 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4420 @ optional op; may set condition codes
4421 eor r0, r0, r1 @ r0<- op, r0-r3 changed
4422 GET_INST_OPCODE ip @ extract opcode from rINST
4423 SET_VREG r0, r9 @ vAA<- r0
4424 GOTO_OPCODE ip @ jump to next instruction
4425 /* 11-14 instructions */
4426
4427
4428/* ------------------------------ */
4429 .balign 128
4430.L_op_shl_int: /* 0x98 */
4431/* File: arm/op_shl_int.S */
4432/* File: arm/binop.S */
4433 /*
4434 * Generic 32-bit binary operation. Provide an "instr" line that
4435 * specifies an instruction that performs "result = r0 op r1".
4436 * This could be an ARM instruction or a function call. (If the result
4437 * comes back in a register other than r0, you can override "result".)
4438 *
4439 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4440 * vCC (r1). Useful for integer division and modulus. Note that we
4441 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4442 * handles it correctly.
4443 *
4444 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4445 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4446 * mul-float, div-float, rem-float
4447 */
4448 /* binop vAA, vBB, vCC */
4449 FETCH r0, 1 @ r0<- CCBB
4450 mov r9, rINST, lsr #8 @ r9<- AA
4451 mov r3, r0, lsr #8 @ r3<- CC
4452 and r2, r0, #255 @ r2<- BB
4453 GET_VREG r1, r3 @ r1<- vCC
4454 GET_VREG r0, r2 @ r0<- vBB
4455 .if 0
4456 cmp r1, #0 @ is second operand zero?
4457 beq common_errDivideByZero
4458 .endif
4459
4460 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4461 and r1, r1, #31 @ optional op; may set condition codes
4462 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
4463 GET_INST_OPCODE ip @ extract opcode from rINST
4464 SET_VREG r0, r9 @ vAA<- r0
4465 GOTO_OPCODE ip @ jump to next instruction
4466 /* 11-14 instructions */
4467
4468
4469/* ------------------------------ */
4470 .balign 128
4471.L_op_shr_int: /* 0x99 */
4472/* File: arm/op_shr_int.S */
4473/* File: arm/binop.S */
4474 /*
4475 * Generic 32-bit binary operation. Provide an "instr" line that
4476 * specifies an instruction that performs "result = r0 op r1".
4477 * This could be an ARM instruction or a function call. (If the result
4478 * comes back in a register other than r0, you can override "result".)
4479 *
4480 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4481 * vCC (r1). Useful for integer division and modulus. Note that we
4482 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4483 * handles it correctly.
4484 *
4485 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4486 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4487 * mul-float, div-float, rem-float
4488 */
4489 /* binop vAA, vBB, vCC */
4490 FETCH r0, 1 @ r0<- CCBB
4491 mov r9, rINST, lsr #8 @ r9<- AA
4492 mov r3, r0, lsr #8 @ r3<- CC
4493 and r2, r0, #255 @ r2<- BB
4494 GET_VREG r1, r3 @ r1<- vCC
4495 GET_VREG r0, r2 @ r0<- vBB
4496 .if 0
4497 cmp r1, #0 @ is second operand zero?
4498 beq common_errDivideByZero
4499 .endif
4500
4501 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4502 and r1, r1, #31 @ optional op; may set condition codes
4503 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
4504 GET_INST_OPCODE ip @ extract opcode from rINST
4505 SET_VREG r0, r9 @ vAA<- r0
4506 GOTO_OPCODE ip @ jump to next instruction
4507 /* 11-14 instructions */
4508
4509
4510/* ------------------------------ */
4511 .balign 128
4512.L_op_ushr_int: /* 0x9a */
4513/* File: arm/op_ushr_int.S */
4514/* File: arm/binop.S */
4515 /*
4516 * Generic 32-bit binary operation. Provide an "instr" line that
4517 * specifies an instruction that performs "result = r0 op r1".
4518 * This could be an ARM instruction or a function call. (If the result
4519 * comes back in a register other than r0, you can override "result".)
4520 *
4521 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4522 * vCC (r1). Useful for integer division and modulus. Note that we
4523 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4524 * handles it correctly.
4525 *
4526 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4527 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4528 * mul-float, div-float, rem-float
4529 */
4530 /* binop vAA, vBB, vCC */
4531 FETCH r0, 1 @ r0<- CCBB
4532 mov r9, rINST, lsr #8 @ r9<- AA
4533 mov r3, r0, lsr #8 @ r3<- CC
4534 and r2, r0, #255 @ r2<- BB
4535 GET_VREG r1, r3 @ r1<- vCC
4536 GET_VREG r0, r2 @ r0<- vBB
4537 .if 0
4538 cmp r1, #0 @ is second operand zero?
4539 beq common_errDivideByZero
4540 .endif
4541
4542 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4543 and r1, r1, #31 @ optional op; may set condition codes
4544 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
4545 GET_INST_OPCODE ip @ extract opcode from rINST
4546 SET_VREG r0, r9 @ vAA<- r0
4547 GOTO_OPCODE ip @ jump to next instruction
4548 /* 11-14 instructions */
4549
4550
4551/* ------------------------------ */
4552 .balign 128
4553.L_op_add_long: /* 0x9b */
4554/* File: arm/op_add_long.S */
4555/* File: arm/binopWide.S */
4556 /*
4557 * Generic 64-bit binary operation. Provide an "instr" line that
4558 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4559 * This could be an ARM instruction or a function call. (If the result
4560 * comes back in a register other than r0, you can override "result".)
4561 *
4562 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4563 * vCC (r1). Useful for integer division and modulus.
4564 *
4565 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4566 * xor-long, add-double, sub-double, mul-double, div-double,
4567 * rem-double
4568 *
4569 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4570 */
4571 /* binop vAA, vBB, vCC */
4572 FETCH r0, 1 @ r0<- CCBB
4573 mov r9, rINST, lsr #8 @ r9<- AA
4574 and r2, r0, #255 @ r2<- BB
4575 mov r3, r0, lsr #8 @ r3<- CC
4576 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4577 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4578 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4579 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4580 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4581 .if 0
4582 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4583 beq common_errDivideByZero
4584 .endif
4585 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4586
4587 adds r0, r0, r2 @ optional op; may set condition codes
4588 adc r1, r1, r3 @ result<- op, r0-r3 changed
4589 GET_INST_OPCODE ip @ extract opcode from rINST
4590 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4591 GOTO_OPCODE ip @ jump to next instruction
4592 /* 14-17 instructions */
4593
4594
4595/* ------------------------------ */
4596 .balign 128
4597.L_op_sub_long: /* 0x9c */
4598/* File: arm/op_sub_long.S */
4599/* File: arm/binopWide.S */
4600 /*
4601 * Generic 64-bit binary operation. Provide an "instr" line that
4602 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4603 * This could be an ARM instruction or a function call. (If the result
4604 * comes back in a register other than r0, you can override "result".)
4605 *
4606 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4607 * vCC (r1). Useful for integer division and modulus.
4608 *
4609 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4610 * xor-long, add-double, sub-double, mul-double, div-double,
4611 * rem-double
4612 *
4613 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4614 */
4615 /* binop vAA, vBB, vCC */
4616 FETCH r0, 1 @ r0<- CCBB
4617 mov r9, rINST, lsr #8 @ r9<- AA
4618 and r2, r0, #255 @ r2<- BB
4619 mov r3, r0, lsr #8 @ r3<- CC
4620 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4621 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4622 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4623 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4624 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4625 .if 0
4626 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4627 beq common_errDivideByZero
4628 .endif
4629 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4630
4631 subs r0, r0, r2 @ optional op; may set condition codes
4632 sbc r1, r1, r3 @ result<- op, r0-r3 changed
4633 GET_INST_OPCODE ip @ extract opcode from rINST
4634 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4635 GOTO_OPCODE ip @ jump to next instruction
4636 /* 14-17 instructions */
4637
4638
4639/* ------------------------------ */
4640 .balign 128
4641.L_op_mul_long: /* 0x9d */
4642/* File: arm/op_mul_long.S */
4643 /*
4644 * Signed 64-bit integer multiply.
4645 *
4646 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4647 * WX
4648 * x YZ
4649 * --------
4650 * ZW ZX
4651 * YW YX
4652 *
4653 * The low word of the result holds ZX, the high word holds
4654 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
4655 * it doesn't fit in the low 64 bits.
4656 *
4657 * Unlike most ARM math operations, multiply instructions have
4658 * restrictions on using the same register more than once (Rd and Rm
4659 * cannot be the same).
4660 */
4661 /* mul-long vAA, vBB, vCC */
4662 FETCH r0, 1 @ r0<- CCBB
4663 and r2, r0, #255 @ r2<- BB
4664 mov r3, r0, lsr #8 @ r3<- CC
4665 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4666 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4667 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4668 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4669 mul ip, r2, r1 @ ip<- ZxW
4670 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
4671 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
4672 mov r0, rINST, lsr #8 @ r0<- AA
4673 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
4674 add r0, rFP, r0, lsl #2 @ r0<- &fp[AA]
4675 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4676 GET_INST_OPCODE ip @ extract opcode from rINST
4677 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
4678 GOTO_OPCODE ip @ jump to next instruction
4679
4680/* ------------------------------ */
4681 .balign 128
4682.L_op_div_long: /* 0x9e */
4683/* File: arm/op_div_long.S */
4684/* File: arm/binopWide.S */
4685 /*
4686 * Generic 64-bit binary operation. Provide an "instr" line that
4687 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4688 * This could be an ARM instruction or a function call. (If the result
4689 * comes back in a register other than r0, you can override "result".)
4690 *
4691 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4692 * vCC (r1). Useful for integer division and modulus.
4693 *
4694 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4695 * xor-long, add-double, sub-double, mul-double, div-double,
4696 * rem-double
4697 *
4698 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4699 */
4700 /* binop vAA, vBB, vCC */
4701 FETCH r0, 1 @ r0<- CCBB
4702 mov r9, rINST, lsr #8 @ r9<- AA
4703 and r2, r0, #255 @ r2<- BB
4704 mov r3, r0, lsr #8 @ r3<- CC
4705 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4706 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4707 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4708 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4709 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4710 .if 1
4711 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4712 beq common_errDivideByZero
4713 .endif
4714 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4715
4716 @ optional op; may set condition codes
4717 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4718 GET_INST_OPCODE ip @ extract opcode from rINST
4719 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4720 GOTO_OPCODE ip @ jump to next instruction
4721 /* 14-17 instructions */
4722
4723
4724/* ------------------------------ */
4725 .balign 128
4726.L_op_rem_long: /* 0x9f */
4727/* File: arm/op_rem_long.S */
4728/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4729/* File: arm/binopWide.S */
4730 /*
4731 * Generic 64-bit binary operation. Provide an "instr" line that
4732 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4733 * This could be an ARM instruction or a function call. (If the result
4734 * comes back in a register other than r0, you can override "result".)
4735 *
4736 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4737 * vCC (r1). Useful for integer division and modulus.
4738 *
4739 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4740 * xor-long, add-double, sub-double, mul-double, div-double,
4741 * rem-double
4742 *
4743 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4744 */
4745 /* binop vAA, vBB, vCC */
4746 FETCH r0, 1 @ r0<- CCBB
4747 mov r9, rINST, lsr #8 @ r9<- AA
4748 and r2, r0, #255 @ r2<- BB
4749 mov r3, r0, lsr #8 @ r3<- CC
4750 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4751 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4752 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4753 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4754 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4755 .if 1
4756 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4757 beq common_errDivideByZero
4758 .endif
4759 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4760
4761 @ optional op; may set condition codes
4762 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4763 GET_INST_OPCODE ip @ extract opcode from rINST
4764 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
4765 GOTO_OPCODE ip @ jump to next instruction
4766 /* 14-17 instructions */
4767
4768
4769/* ------------------------------ */
4770 .balign 128
4771.L_op_and_long: /* 0xa0 */
4772/* File: arm/op_and_long.S */
4773/* File: arm/binopWide.S */
4774 /*
4775 * Generic 64-bit binary operation. Provide an "instr" line that
4776 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4777 * This could be an ARM instruction or a function call. (If the result
4778 * comes back in a register other than r0, you can override "result".)
4779 *
4780 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4781 * vCC (r1). Useful for integer division and modulus.
4782 *
4783 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4784 * xor-long, add-double, sub-double, mul-double, div-double,
4785 * rem-double
4786 *
4787 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4788 */
4789 /* binop vAA, vBB, vCC */
4790 FETCH r0, 1 @ r0<- CCBB
4791 mov r9, rINST, lsr #8 @ r9<- AA
4792 and r2, r0, #255 @ r2<- BB
4793 mov r3, r0, lsr #8 @ r3<- CC
4794 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4795 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4796 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4797 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4798 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4799 .if 0
4800 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4801 beq common_errDivideByZero
4802 .endif
4803 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4804
4805 and r0, r0, r2 @ optional op; may set condition codes
4806 and r1, r1, r3 @ result<- op, r0-r3 changed
4807 GET_INST_OPCODE ip @ extract opcode from rINST
4808 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4809 GOTO_OPCODE ip @ jump to next instruction
4810 /* 14-17 instructions */
4811
4812
4813/* ------------------------------ */
4814 .balign 128
4815.L_op_or_long: /* 0xa1 */
4816/* File: arm/op_or_long.S */
4817/* File: arm/binopWide.S */
4818 /*
4819 * Generic 64-bit binary operation. Provide an "instr" line that
4820 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4821 * This could be an ARM instruction or a function call. (If the result
4822 * comes back in a register other than r0, you can override "result".)
4823 *
4824 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4825 * vCC (r1). Useful for integer division and modulus.
4826 *
4827 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4828 * xor-long, add-double, sub-double, mul-double, div-double,
4829 * rem-double
4830 *
4831 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4832 */
4833 /* binop vAA, vBB, vCC */
4834 FETCH r0, 1 @ r0<- CCBB
4835 mov r9, rINST, lsr #8 @ r9<- AA
4836 and r2, r0, #255 @ r2<- BB
4837 mov r3, r0, lsr #8 @ r3<- CC
4838 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4839 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4840 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4841 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4842 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4843 .if 0
4844 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4845 beq common_errDivideByZero
4846 .endif
4847 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4848
4849 orr r0, r0, r2 @ optional op; may set condition codes
4850 orr r1, r1, r3 @ result<- op, r0-r3 changed
4851 GET_INST_OPCODE ip @ extract opcode from rINST
4852 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4853 GOTO_OPCODE ip @ jump to next instruction
4854 /* 14-17 instructions */
4855
4856
4857/* ------------------------------ */
4858 .balign 128
4859.L_op_xor_long: /* 0xa2 */
4860/* File: arm/op_xor_long.S */
4861/* File: arm/binopWide.S */
4862 /*
4863 * Generic 64-bit binary operation. Provide an "instr" line that
4864 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4865 * This could be an ARM instruction or a function call. (If the result
4866 * comes back in a register other than r0, you can override "result".)
4867 *
4868 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4869 * vCC (r1). Useful for integer division and modulus.
4870 *
4871 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4872 * xor-long, add-double, sub-double, mul-double, div-double,
4873 * rem-double
4874 *
4875 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4876 */
4877 /* binop vAA, vBB, vCC */
4878 FETCH r0, 1 @ r0<- CCBB
4879 mov r9, rINST, lsr #8 @ r9<- AA
4880 and r2, r0, #255 @ r2<- BB
4881 mov r3, r0, lsr #8 @ r3<- CC
4882 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4883 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4884 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4885 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4886 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4887 .if 0
4888 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4889 beq common_errDivideByZero
4890 .endif
4891 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4892
4893 eor r0, r0, r2 @ optional op; may set condition codes
4894 eor r1, r1, r3 @ result<- op, r0-r3 changed
4895 GET_INST_OPCODE ip @ extract opcode from rINST
4896 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4897 GOTO_OPCODE ip @ jump to next instruction
4898 /* 14-17 instructions */
4899
4900
4901/* ------------------------------ */
4902 .balign 128
4903.L_op_shl_long: /* 0xa3 */
4904/* File: arm/op_shl_long.S */
4905 /*
4906 * Long integer shift. This is different from the generic 32/64-bit
4907 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4908 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4909 * 6 bits of the shift distance.
4910 */
4911 /* shl-long vAA, vBB, vCC */
4912 FETCH r0, 1 @ r0<- CCBB
4913 mov r9, rINST, lsr #8 @ r9<- AA
4914 and r3, r0, #255 @ r3<- BB
4915 mov r0, r0, lsr #8 @ r0<- CC
4916 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4917 GET_VREG r2, r0 @ r2<- vCC
4918 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4919 and r2, r2, #63 @ r2<- r2 & 0x3f
4920 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4921
4922 mov r1, r1, asl r2 @ r1<- r1 << r2
4923 rsb r3, r2, #32 @ r3<- 32 - r2
4924 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
4925 subs ip, r2, #32 @ ip<- r2 - 32
4926 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
4927 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4928 mov r0, r0, asl r2 @ r0<- r0 << r2
4929 GET_INST_OPCODE ip @ extract opcode from rINST
4930 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4931 GOTO_OPCODE ip @ jump to next instruction
4932
4933/* ------------------------------ */
4934 .balign 128
4935.L_op_shr_long: /* 0xa4 */
4936/* File: arm/op_shr_long.S */
4937 /*
4938 * Long integer shift. This is different from the generic 32/64-bit
4939 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4940 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4941 * 6 bits of the shift distance.
4942 */
4943 /* shr-long vAA, vBB, vCC */
4944 FETCH r0, 1 @ r0<- CCBB
4945 mov r9, rINST, lsr #8 @ r9<- AA
4946 and r3, r0, #255 @ r3<- BB
4947 mov r0, r0, lsr #8 @ r0<- CC
4948 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4949 GET_VREG r2, r0 @ r2<- vCC
4950 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4951 and r2, r2, #63 @ r0<- r0 & 0x3f
4952 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4953
4954 mov r0, r0, lsr r2 @ r0<- r2 >> r2
4955 rsb r3, r2, #32 @ r3<- 32 - r2
4956 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
4957 subs ip, r2, #32 @ ip<- r2 - 32
4958 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
4959 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4960 mov r1, r1, asr r2 @ r1<- r1 >> r2
4961 GET_INST_OPCODE ip @ extract opcode from rINST
4962 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4963 GOTO_OPCODE ip @ jump to next instruction
4964
4965/* ------------------------------ */
4966 .balign 128
4967.L_op_ushr_long: /* 0xa5 */
4968/* File: arm/op_ushr_long.S */
4969 /*
4970 * Long integer shift. This is different from the generic 32/64-bit
4971 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4972 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4973 * 6 bits of the shift distance.
4974 */
4975 /* ushr-long vAA, vBB, vCC */
4976 FETCH r0, 1 @ r0<- CCBB
4977 mov r9, rINST, lsr #8 @ r9<- AA
4978 and r3, r0, #255 @ r3<- BB
4979 mov r0, r0, lsr #8 @ r0<- CC
4980 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4981 GET_VREG r2, r0 @ r2<- vCC
4982 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4983 and r2, r2, #63 @ r0<- r0 & 0x3f
4984 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4985
4986 mov r0, r0, lsr r2 @ r0<- r2 >> r2
4987 rsb r3, r2, #32 @ r3<- 32 - r2
4988 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
4989 subs ip, r2, #32 @ ip<- r2 - 32
4990 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
4991 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4992 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
4993 GET_INST_OPCODE ip @ extract opcode from rINST
4994 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4995 GOTO_OPCODE ip @ jump to next instruction
4996
4997/* ------------------------------ */
4998 .balign 128
4999.L_op_add_float: /* 0xa6 */
5000/* File: arm/op_add_float.S */
5001/* File: arm/fbinop.S */
5002 /*
5003 * Generic 32-bit floating-point operation. Provide an "instr" line that
5004 * specifies an instruction that performs "s2 = s0 op s1". Because we
5005 * use the "softfp" ABI, this must be an instruction, not a function call.
5006 *
5007 * For: add-float, sub-float, mul-float, div-float
5008 */
5009 /* floatop vAA, vBB, vCC */
5010 FETCH r0, 1 @ r0<- CCBB
5011 mov r9, rINST, lsr #8 @ r9<- AA
5012 mov r3, r0, lsr #8 @ r3<- CC
5013 and r2, r0, #255 @ r2<- BB
5014 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5015 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5016 flds s1, [r3] @ s1<- vCC
5017 flds s0, [r2] @ s0<- vBB
5018
5019 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5020 fadds s2, s0, s1 @ s2<- op
5021 GET_INST_OPCODE ip @ extract opcode from rINST
5022 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5023 fsts s2, [r9] @ vAA<- s2
5024 GOTO_OPCODE ip @ jump to next instruction
5025
5026
5027/* ------------------------------ */
5028 .balign 128
5029.L_op_sub_float: /* 0xa7 */
5030/* File: arm/op_sub_float.S */
5031/* File: arm/fbinop.S */
5032 /*
5033 * Generic 32-bit floating-point operation. Provide an "instr" line that
5034 * specifies an instruction that performs "s2 = s0 op s1". Because we
5035 * use the "softfp" ABI, this must be an instruction, not a function call.
5036 *
5037 * For: add-float, sub-float, mul-float, div-float
5038 */
5039 /* floatop vAA, vBB, vCC */
5040 FETCH r0, 1 @ r0<- CCBB
5041 mov r9, rINST, lsr #8 @ r9<- AA
5042 mov r3, r0, lsr #8 @ r3<- CC
5043 and r2, r0, #255 @ r2<- BB
5044 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5045 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5046 flds s1, [r3] @ s1<- vCC
5047 flds s0, [r2] @ s0<- vBB
5048
5049 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5050 fsubs s2, s0, s1 @ s2<- op
5051 GET_INST_OPCODE ip @ extract opcode from rINST
5052 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5053 fsts s2, [r9] @ vAA<- s2
5054 GOTO_OPCODE ip @ jump to next instruction
5055
5056
5057/* ------------------------------ */
5058 .balign 128
5059.L_op_mul_float: /* 0xa8 */
5060/* File: arm/op_mul_float.S */
5061/* File: arm/fbinop.S */
5062 /*
5063 * Generic 32-bit floating-point operation. Provide an "instr" line that
5064 * specifies an instruction that performs "s2 = s0 op s1". Because we
5065 * use the "softfp" ABI, this must be an instruction, not a function call.
5066 *
5067 * For: add-float, sub-float, mul-float, div-float
5068 */
5069 /* floatop vAA, vBB, vCC */
5070 FETCH r0, 1 @ r0<- CCBB
5071 mov r9, rINST, lsr #8 @ r9<- AA
5072 mov r3, r0, lsr #8 @ r3<- CC
5073 and r2, r0, #255 @ r2<- BB
5074 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5075 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5076 flds s1, [r3] @ s1<- vCC
5077 flds s0, [r2] @ s0<- vBB
5078
5079 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5080 fmuls s2, s0, s1 @ s2<- op
5081 GET_INST_OPCODE ip @ extract opcode from rINST
5082 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5083 fsts s2, [r9] @ vAA<- s2
5084 GOTO_OPCODE ip @ jump to next instruction
5085
5086
5087/* ------------------------------ */
5088 .balign 128
5089.L_op_div_float: /* 0xa9 */
5090/* File: arm/op_div_float.S */
5091/* File: arm/fbinop.S */
5092 /*
5093 * Generic 32-bit floating-point operation. Provide an "instr" line that
5094 * specifies an instruction that performs "s2 = s0 op s1". Because we
5095 * use the "softfp" ABI, this must be an instruction, not a function call.
5096 *
5097 * For: add-float, sub-float, mul-float, div-float
5098 */
5099 /* floatop vAA, vBB, vCC */
5100 FETCH r0, 1 @ r0<- CCBB
5101 mov r9, rINST, lsr #8 @ r9<- AA
5102 mov r3, r0, lsr #8 @ r3<- CC
5103 and r2, r0, #255 @ r2<- BB
5104 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5105 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5106 flds s1, [r3] @ s1<- vCC
5107 flds s0, [r2] @ s0<- vBB
5108
5109 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5110 fdivs s2, s0, s1 @ s2<- op
5111 GET_INST_OPCODE ip @ extract opcode from rINST
5112 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5113 fsts s2, [r9] @ vAA<- s2
5114 GOTO_OPCODE ip @ jump to next instruction
5115
5116
5117/* ------------------------------ */
5118 .balign 128
5119.L_op_rem_float: /* 0xaa */
5120/* File: arm/op_rem_float.S */
5121/* EABI doesn't define a float remainder function, but libm does */
5122/* File: arm/binop.S */
5123 /*
5124 * Generic 32-bit binary operation. Provide an "instr" line that
5125 * specifies an instruction that performs "result = r0 op r1".
5126 * This could be an ARM instruction or a function call. (If the result
5127 * comes back in a register other than r0, you can override "result".)
5128 *
5129 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5130 * vCC (r1). Useful for integer division and modulus. Note that we
5131 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5132 * handles it correctly.
5133 *
5134 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5135 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5136 * mul-float, div-float, rem-float
5137 */
5138 /* binop vAA, vBB, vCC */
5139 FETCH r0, 1 @ r0<- CCBB
5140 mov r9, rINST, lsr #8 @ r9<- AA
5141 mov r3, r0, lsr #8 @ r3<- CC
5142 and r2, r0, #255 @ r2<- BB
5143 GET_VREG r1, r3 @ r1<- vCC
5144 GET_VREG r0, r2 @ r0<- vBB
5145 .if 0
5146 cmp r1, #0 @ is second operand zero?
5147 beq common_errDivideByZero
5148 .endif
5149
5150 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5151 @ optional op; may set condition codes
5152 bl fmodf @ r0<- op, r0-r3 changed
5153 GET_INST_OPCODE ip @ extract opcode from rINST
5154 SET_VREG r0, r9 @ vAA<- r0
5155 GOTO_OPCODE ip @ jump to next instruction
5156 /* 11-14 instructions */
5157
5158
5159/* ------------------------------ */
5160 .balign 128
5161.L_op_add_double: /* 0xab */
5162/* File: arm/op_add_double.S */
5163/* File: arm/fbinopWide.S */
5164 /*
5165 * Generic 64-bit double-precision floating point binary operation.
5166 * Provide an "instr" line that specifies an instruction that performs
5167 * "d2 = d0 op d1".
5168 *
5169 * for: add-double, sub-double, mul-double, div-double
5170 */
5171 /* doubleop vAA, vBB, vCC */
5172 FETCH r0, 1 @ r0<- CCBB
5173 mov r9, rINST, lsr #8 @ r9<- AA
5174 mov r3, r0, lsr #8 @ r3<- CC
5175 and r2, r0, #255 @ r2<- BB
5176 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5177 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5178 fldd d1, [r3] @ d1<- vCC
5179 fldd d0, [r2] @ d0<- vBB
5180
5181 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5182 faddd d2, d0, d1 @ s2<- op
5183 GET_INST_OPCODE ip @ extract opcode from rINST
5184 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5185 fstd d2, [r9] @ vAA<- d2
5186 GOTO_OPCODE ip @ jump to next instruction
5187
5188
5189/* ------------------------------ */
5190 .balign 128
5191.L_op_sub_double: /* 0xac */
5192/* File: arm/op_sub_double.S */
5193/* File: arm/fbinopWide.S */
5194 /*
5195 * Generic 64-bit double-precision floating point binary operation.
5196 * Provide an "instr" line that specifies an instruction that performs
5197 * "d2 = d0 op d1".
5198 *
5199 * for: add-double, sub-double, mul-double, div-double
5200 */
5201 /* doubleop vAA, vBB, vCC */
5202 FETCH r0, 1 @ r0<- CCBB
5203 mov r9, rINST, lsr #8 @ r9<- AA
5204 mov r3, r0, lsr #8 @ r3<- CC
5205 and r2, r0, #255 @ r2<- BB
5206 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5207 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5208 fldd d1, [r3] @ d1<- vCC
5209 fldd d0, [r2] @ d0<- vBB
5210
5211 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5212 fsubd d2, d0, d1 @ s2<- op
5213 GET_INST_OPCODE ip @ extract opcode from rINST
5214 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5215 fstd d2, [r9] @ vAA<- d2
5216 GOTO_OPCODE ip @ jump to next instruction
5217
5218
5219/* ------------------------------ */
5220 .balign 128
5221.L_op_mul_double: /* 0xad */
5222/* File: arm/op_mul_double.S */
5223/* File: arm/fbinopWide.S */
5224 /*
5225 * Generic 64-bit double-precision floating point binary operation.
5226 * Provide an "instr" line that specifies an instruction that performs
5227 * "d2 = d0 op d1".
5228 *
5229 * for: add-double, sub-double, mul-double, div-double
5230 */
5231 /* doubleop vAA, vBB, vCC */
5232 FETCH r0, 1 @ r0<- CCBB
5233 mov r9, rINST, lsr #8 @ r9<- AA
5234 mov r3, r0, lsr #8 @ r3<- CC
5235 and r2, r0, #255 @ r2<- BB
5236 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5237 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5238 fldd d1, [r3] @ d1<- vCC
5239 fldd d0, [r2] @ d0<- vBB
5240
5241 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5242 fmuld d2, d0, d1 @ s2<- op
5243 GET_INST_OPCODE ip @ extract opcode from rINST
5244 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5245 fstd d2, [r9] @ vAA<- d2
5246 GOTO_OPCODE ip @ jump to next instruction
5247
5248
5249/* ------------------------------ */
5250 .balign 128
5251.L_op_div_double: /* 0xae */
5252/* File: arm/op_div_double.S */
5253/* File: arm/fbinopWide.S */
5254 /*
5255 * Generic 64-bit double-precision floating point binary operation.
5256 * Provide an "instr" line that specifies an instruction that performs
5257 * "d2 = d0 op d1".
5258 *
5259 * for: add-double, sub-double, mul-double, div-double
5260 */
5261 /* doubleop vAA, vBB, vCC */
5262 FETCH r0, 1 @ r0<- CCBB
5263 mov r9, rINST, lsr #8 @ r9<- AA
5264 mov r3, r0, lsr #8 @ r3<- CC
5265 and r2, r0, #255 @ r2<- BB
5266 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5267 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5268 fldd d1, [r3] @ d1<- vCC
5269 fldd d0, [r2] @ d0<- vBB
5270
5271 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5272 fdivd d2, d0, d1 @ s2<- op
5273 GET_INST_OPCODE ip @ extract opcode from rINST
5274 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5275 fstd d2, [r9] @ vAA<- d2
5276 GOTO_OPCODE ip @ jump to next instruction
5277
5278
5279/* ------------------------------ */
5280 .balign 128
5281.L_op_rem_double: /* 0xaf */
5282/* File: arm/op_rem_double.S */
5283/* EABI doesn't define a double remainder function, but libm does */
5284/* File: arm/binopWide.S */
5285 /*
5286 * Generic 64-bit binary operation. Provide an "instr" line that
5287 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5288 * This could be an ARM instruction or a function call. (If the result
5289 * comes back in a register other than r0, you can override "result".)
5290 *
5291 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5292 * vCC (r1). Useful for integer division and modulus.
5293 *
5294 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5295 * xor-long, add-double, sub-double, mul-double, div-double,
5296 * rem-double
5297 *
5298 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5299 */
5300 /* binop vAA, vBB, vCC */
5301 FETCH r0, 1 @ r0<- CCBB
5302 mov r9, rINST, lsr #8 @ r9<- AA
5303 and r2, r0, #255 @ r2<- BB
5304 mov r3, r0, lsr #8 @ r3<- CC
5305 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5306 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5307 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5308 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5309 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5310 .if 0
5311 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5312 beq common_errDivideByZero
5313 .endif
5314 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5315
5316 @ optional op; may set condition codes
5317 bl fmod @ result<- op, r0-r3 changed
5318 GET_INST_OPCODE ip @ extract opcode from rINST
5319 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5320 GOTO_OPCODE ip @ jump to next instruction
5321 /* 14-17 instructions */
5322
5323
5324/* ------------------------------ */
5325 .balign 128
5326.L_op_add_int_2addr: /* 0xb0 */
5327/* File: arm/op_add_int_2addr.S */
5328/* File: arm/binop2addr.S */
5329 /*
5330 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5331 * that specifies an instruction that performs "result = r0 op r1".
5332 * This could be an ARM instruction or a function call. (If the result
5333 * comes back in a register other than r0, you can override "result".)
5334 *
5335 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5336 * vCC (r1). Useful for integer division and modulus.
5337 *
5338 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5339 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5340 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5341 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5342 */
5343 /* binop/2addr vA, vB */
5344 mov r3, rINST, lsr #12 @ r3<- B
5345 ubfx r9, rINST, #8, #4 @ r9<- A
5346 GET_VREG r1, r3 @ r1<- vB
5347 GET_VREG r0, r9 @ r0<- vA
5348 .if 0
5349 cmp r1, #0 @ is second operand zero?
5350 beq common_errDivideByZero
5351 .endif
5352 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5353
5354 @ optional op; may set condition codes
5355 add r0, r0, r1 @ r0<- op, r0-r3 changed
5356 GET_INST_OPCODE ip @ extract opcode from rINST
5357 SET_VREG r0, r9 @ vAA<- r0
5358 GOTO_OPCODE ip @ jump to next instruction
5359 /* 10-13 instructions */
5360
5361
5362/* ------------------------------ */
5363 .balign 128
5364.L_op_sub_int_2addr: /* 0xb1 */
5365/* File: arm/op_sub_int_2addr.S */
5366/* File: arm/binop2addr.S */
5367 /*
5368 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5369 * that specifies an instruction that performs "result = r0 op r1".
5370 * This could be an ARM instruction or a function call. (If the result
5371 * comes back in a register other than r0, you can override "result".)
5372 *
5373 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5374 * vCC (r1). Useful for integer division and modulus.
5375 *
5376 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5377 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5378 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5379 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5380 */
5381 /* binop/2addr vA, vB */
5382 mov r3, rINST, lsr #12 @ r3<- B
5383 ubfx r9, rINST, #8, #4 @ r9<- A
5384 GET_VREG r1, r3 @ r1<- vB
5385 GET_VREG r0, r9 @ r0<- vA
5386 .if 0
5387 cmp r1, #0 @ is second operand zero?
5388 beq common_errDivideByZero
5389 .endif
5390 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5391
5392 @ optional op; may set condition codes
5393 sub r0, r0, r1 @ r0<- op, r0-r3 changed
5394 GET_INST_OPCODE ip @ extract opcode from rINST
5395 SET_VREG r0, r9 @ vAA<- r0
5396 GOTO_OPCODE ip @ jump to next instruction
5397 /* 10-13 instructions */
5398
5399
5400/* ------------------------------ */
5401 .balign 128
5402.L_op_mul_int_2addr: /* 0xb2 */
5403/* File: arm/op_mul_int_2addr.S */
5404/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5405/* File: arm/binop2addr.S */
5406 /*
5407 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5408 * that specifies an instruction that performs "result = r0 op r1".
5409 * This could be an ARM instruction or a function call. (If the result
5410 * comes back in a register other than r0, you can override "result".)
5411 *
5412 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5413 * vCC (r1). Useful for integer division and modulus.
5414 *
5415 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5416 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5417 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5418 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5419 */
5420 /* binop/2addr vA, vB */
5421 mov r3, rINST, lsr #12 @ r3<- B
5422 ubfx r9, rINST, #8, #4 @ r9<- A
5423 GET_VREG r1, r3 @ r1<- vB
5424 GET_VREG r0, r9 @ r0<- vA
5425 .if 0
5426 cmp r1, #0 @ is second operand zero?
5427 beq common_errDivideByZero
5428 .endif
5429 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5430
5431 @ optional op; may set condition codes
5432 mul r0, r1, r0 @ r0<- op, r0-r3 changed
5433 GET_INST_OPCODE ip @ extract opcode from rINST
5434 SET_VREG r0, r9 @ vAA<- r0
5435 GOTO_OPCODE ip @ jump to next instruction
5436 /* 10-13 instructions */
5437
5438
5439/* ------------------------------ */
5440 .balign 128
5441.L_op_div_int_2addr: /* 0xb3 */
5442/* File: arm/op_div_int_2addr.S */
5443 /*
5444 * Specialized 32-bit binary operation
5445 *
5446 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5447 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5448 * ARMv7 CPUs that have hardware division support).
5449 *
5450 * div-int/2addr
5451 *
5452 */
5453 mov r3, rINST, lsr #12 @ r3<- B
5454 ubfx r9, rINST, #8, #4 @ r9<- A
5455 GET_VREG r1, r3 @ r1<- vB
5456 GET_VREG r0, r9 @ r0<- vA
5457 cmp r1, #0 @ is second operand zero?
5458 beq common_errDivideByZero
5459 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5460
5461#ifdef __ARM_ARCH_EXT_IDIV__
5462 sdiv r0, r0, r1 @ r0<- op
5463#else
5464 bl __aeabi_idiv @ r0<- op, r0-r3 changed
5465#endif
5466 GET_INST_OPCODE ip @ extract opcode from rINST
5467 SET_VREG r0, r9 @ vAA<- r0
5468 GOTO_OPCODE ip @ jump to next instruction
5469 /* 10-13 instructions */
5470
5471
5472/* ------------------------------ */
5473 .balign 128
5474.L_op_rem_int_2addr: /* 0xb4 */
5475/* File: arm/op_rem_int_2addr.S */
5476 /*
5477 * Specialized 32-bit binary operation
5478 *
5479 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5480 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5481 * ARMv7 CPUs that have hardware division support).
5482 *
5483 * NOTE: idivmod returns quotient in r0 and remainder in r1
5484 *
5485 * rem-int/2addr
5486 *
5487 */
5488 mov r3, rINST, lsr #12 @ r3<- B
5489 ubfx r9, rINST, #8, #4 @ r9<- A
5490 GET_VREG r1, r3 @ r1<- vB
5491 GET_VREG r0, r9 @ r0<- vA
5492 cmp r1, #0 @ is second operand zero?
5493 beq common_errDivideByZero
5494 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5495
5496#ifdef __ARM_ARCH_EXT_IDIV__
5497 sdiv r2, r0, r1
5498 mls r1, r1, r2, r0 @ r1<- op
5499#else
5500 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
5501#endif
5502 GET_INST_OPCODE ip @ extract opcode from rINST
5503 SET_VREG r1, r9 @ vAA<- r1
5504 GOTO_OPCODE ip @ jump to next instruction
5505 /* 10-13 instructions */
5506
5507
5508/* ------------------------------ */
5509 .balign 128
5510.L_op_and_int_2addr: /* 0xb5 */
5511/* File: arm/op_and_int_2addr.S */
5512/* File: arm/binop2addr.S */
5513 /*
5514 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5515 * that specifies an instruction that performs "result = r0 op r1".
5516 * This could be an ARM instruction or a function call. (If the result
5517 * comes back in a register other than r0, you can override "result".)
5518 *
5519 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5520 * vCC (r1). Useful for integer division and modulus.
5521 *
5522 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5523 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5524 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5525 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5526 */
5527 /* binop/2addr vA, vB */
5528 mov r3, rINST, lsr #12 @ r3<- B
5529 ubfx r9, rINST, #8, #4 @ r9<- A
5530 GET_VREG r1, r3 @ r1<- vB
5531 GET_VREG r0, r9 @ r0<- vA
5532 .if 0
5533 cmp r1, #0 @ is second operand zero?
5534 beq common_errDivideByZero
5535 .endif
5536 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5537
5538 @ optional op; may set condition codes
5539 and r0, r0, r1 @ r0<- op, r0-r3 changed
5540 GET_INST_OPCODE ip @ extract opcode from rINST
5541 SET_VREG r0, r9 @ vAA<- r0
5542 GOTO_OPCODE ip @ jump to next instruction
5543 /* 10-13 instructions */
5544
5545
5546/* ------------------------------ */
5547 .balign 128
5548.L_op_or_int_2addr: /* 0xb6 */
5549/* File: arm/op_or_int_2addr.S */
5550/* File: arm/binop2addr.S */
5551 /*
5552 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5553 * that specifies an instruction that performs "result = r0 op r1".
5554 * This could be an ARM instruction or a function call. (If the result
5555 * comes back in a register other than r0, you can override "result".)
5556 *
5557 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5558 * vCC (r1). Useful for integer division and modulus.
5559 *
5560 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5561 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5562 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5563 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5564 */
5565 /* binop/2addr vA, vB */
5566 mov r3, rINST, lsr #12 @ r3<- B
5567 ubfx r9, rINST, #8, #4 @ r9<- A
5568 GET_VREG r1, r3 @ r1<- vB
5569 GET_VREG r0, r9 @ r0<- vA
5570 .if 0
5571 cmp r1, #0 @ is second operand zero?
5572 beq common_errDivideByZero
5573 .endif
5574 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5575
5576 @ optional op; may set condition codes
5577 orr r0, r0, r1 @ r0<- op, r0-r3 changed
5578 GET_INST_OPCODE ip @ extract opcode from rINST
5579 SET_VREG r0, r9 @ vAA<- r0
5580 GOTO_OPCODE ip @ jump to next instruction
5581 /* 10-13 instructions */
5582
5583
5584/* ------------------------------ */
5585 .balign 128
5586.L_op_xor_int_2addr: /* 0xb7 */
5587/* File: arm/op_xor_int_2addr.S */
5588/* File: arm/binop2addr.S */
5589 /*
5590 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5591 * that specifies an instruction that performs "result = r0 op r1".
5592 * This could be an ARM instruction or a function call. (If the result
5593 * comes back in a register other than r0, you can override "result".)
5594 *
5595 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5596 * vCC (r1). Useful for integer division and modulus.
5597 *
5598 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5599 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5600 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5601 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5602 */
5603 /* binop/2addr vA, vB */
5604 mov r3, rINST, lsr #12 @ r3<- B
5605 ubfx r9, rINST, #8, #4 @ r9<- A
5606 GET_VREG r1, r3 @ r1<- vB
5607 GET_VREG r0, r9 @ r0<- vA
5608 .if 0
5609 cmp r1, #0 @ is second operand zero?
5610 beq common_errDivideByZero
5611 .endif
5612 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5613
5614 @ optional op; may set condition codes
5615 eor r0, r0, r1 @ r0<- op, r0-r3 changed
5616 GET_INST_OPCODE ip @ extract opcode from rINST
5617 SET_VREG r0, r9 @ vAA<- r0
5618 GOTO_OPCODE ip @ jump to next instruction
5619 /* 10-13 instructions */
5620
5621
5622/* ------------------------------ */
5623 .balign 128
5624.L_op_shl_int_2addr: /* 0xb8 */
5625/* File: arm/op_shl_int_2addr.S */
5626/* File: arm/binop2addr.S */
5627 /*
5628 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5629 * that specifies an instruction that performs "result = r0 op r1".
5630 * This could be an ARM instruction or a function call. (If the result
5631 * comes back in a register other than r0, you can override "result".)
5632 *
5633 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5634 * vCC (r1). Useful for integer division and modulus.
5635 *
5636 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5637 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5638 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5639 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5640 */
5641 /* binop/2addr vA, vB */
5642 mov r3, rINST, lsr #12 @ r3<- B
5643 ubfx r9, rINST, #8, #4 @ r9<- A
5644 GET_VREG r1, r3 @ r1<- vB
5645 GET_VREG r0, r9 @ r0<- vA
5646 .if 0
5647 cmp r1, #0 @ is second operand zero?
5648 beq common_errDivideByZero
5649 .endif
5650 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5651
5652 and r1, r1, #31 @ optional op; may set condition codes
5653 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
5654 GET_INST_OPCODE ip @ extract opcode from rINST
5655 SET_VREG r0, r9 @ vAA<- r0
5656 GOTO_OPCODE ip @ jump to next instruction
5657 /* 10-13 instructions */
5658
5659
5660/* ------------------------------ */
5661 .balign 128
5662.L_op_shr_int_2addr: /* 0xb9 */
5663/* File: arm/op_shr_int_2addr.S */
5664/* File: arm/binop2addr.S */
5665 /*
5666 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5667 * that specifies an instruction that performs "result = r0 op r1".
5668 * This could be an ARM instruction or a function call. (If the result
5669 * comes back in a register other than r0, you can override "result".)
5670 *
5671 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5672 * vCC (r1). Useful for integer division and modulus.
5673 *
5674 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5675 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5676 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5677 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5678 */
5679 /* binop/2addr vA, vB */
5680 mov r3, rINST, lsr #12 @ r3<- B
5681 ubfx r9, rINST, #8, #4 @ r9<- A
5682 GET_VREG r1, r3 @ r1<- vB
5683 GET_VREG r0, r9 @ r0<- vA
5684 .if 0
5685 cmp r1, #0 @ is second operand zero?
5686 beq common_errDivideByZero
5687 .endif
5688 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5689
5690 and r1, r1, #31 @ optional op; may set condition codes
5691 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
5692 GET_INST_OPCODE ip @ extract opcode from rINST
5693 SET_VREG r0, r9 @ vAA<- r0
5694 GOTO_OPCODE ip @ jump to next instruction
5695 /* 10-13 instructions */
5696
5697
5698/* ------------------------------ */
5699 .balign 128
5700.L_op_ushr_int_2addr: /* 0xba */
5701/* File: arm/op_ushr_int_2addr.S */
5702/* File: arm/binop2addr.S */
5703 /*
5704 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5705 * that specifies an instruction that performs "result = r0 op r1".
5706 * This could be an ARM instruction or a function call. (If the result
5707 * comes back in a register other than r0, you can override "result".)
5708 *
5709 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5710 * vCC (r1). Useful for integer division and modulus.
5711 *
5712 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5713 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5714 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5715 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5716 */
5717 /* binop/2addr vA, vB */
5718 mov r3, rINST, lsr #12 @ r3<- B
5719 ubfx r9, rINST, #8, #4 @ r9<- A
5720 GET_VREG r1, r3 @ r1<- vB
5721 GET_VREG r0, r9 @ r0<- vA
5722 .if 0
5723 cmp r1, #0 @ is second operand zero?
5724 beq common_errDivideByZero
5725 .endif
5726 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5727
5728 and r1, r1, #31 @ optional op; may set condition codes
5729 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
5730 GET_INST_OPCODE ip @ extract opcode from rINST
5731 SET_VREG r0, r9 @ vAA<- r0
5732 GOTO_OPCODE ip @ jump to next instruction
5733 /* 10-13 instructions */
5734
5735
5736/* ------------------------------ */
5737 .balign 128
5738.L_op_add_long_2addr: /* 0xbb */
5739/* File: arm/op_add_long_2addr.S */
5740/* File: arm/binopWide2addr.S */
5741 /*
5742 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5743 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5744 * This could be an ARM instruction or a function call. (If the result
5745 * comes back in a register other than r0, you can override "result".)
5746 *
5747 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5748 * vCC (r1). Useful for integer division and modulus.
5749 *
5750 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5751 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5752 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5753 * rem-double/2addr
5754 */
5755 /* binop/2addr vA, vB */
5756 mov r1, rINST, lsr #12 @ r1<- B
5757 ubfx r9, rINST, #8, #4 @ r9<- A
5758 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5759 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5760 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5761 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5762 .if 0
5763 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5764 beq common_errDivideByZero
5765 .endif
5766 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5767
5768 adds r0, r0, r2 @ optional op; may set condition codes
5769 adc r1, r1, r3 @ result<- op, r0-r3 changed
5770 GET_INST_OPCODE ip @ extract opcode from rINST
5771 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5772 GOTO_OPCODE ip @ jump to next instruction
5773 /* 12-15 instructions */
5774
5775
5776/* ------------------------------ */
5777 .balign 128
5778.L_op_sub_long_2addr: /* 0xbc */
5779/* File: arm/op_sub_long_2addr.S */
5780/* File: arm/binopWide2addr.S */
5781 /*
5782 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5783 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5784 * This could be an ARM instruction or a function call. (If the result
5785 * comes back in a register other than r0, you can override "result".)
5786 *
5787 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5788 * vCC (r1). Useful for integer division and modulus.
5789 *
5790 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5791 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5792 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5793 * rem-double/2addr
5794 */
5795 /* binop/2addr vA, vB */
5796 mov r1, rINST, lsr #12 @ r1<- B
5797 ubfx r9, rINST, #8, #4 @ r9<- A
5798 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5799 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5800 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5801 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5802 .if 0
5803 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5804 beq common_errDivideByZero
5805 .endif
5806 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5807
5808 subs r0, r0, r2 @ optional op; may set condition codes
5809 sbc r1, r1, r3 @ result<- op, r0-r3 changed
5810 GET_INST_OPCODE ip @ extract opcode from rINST
5811 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5812 GOTO_OPCODE ip @ jump to next instruction
5813 /* 12-15 instructions */
5814
5815
5816/* ------------------------------ */
5817 .balign 128
5818.L_op_mul_long_2addr: /* 0xbd */
5819/* File: arm/op_mul_long_2addr.S */
5820 /*
5821 * Signed 64-bit integer multiply, "/2addr" version.
5822 *
5823 * See op_mul_long for an explanation.
5824 *
5825 * We get a little tight on registers, so to avoid looking up &fp[A]
5826 * again we stuff it into rINST.
5827 */
5828 /* mul-long/2addr vA, vB */
5829 mov r1, rINST, lsr #12 @ r1<- B
5830 ubfx r9, rINST, #8, #4 @ r9<- A
5831 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5832 add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A]
5833 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5834 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1
5835 mul ip, r2, r1 @ ip<- ZxW
5836 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
5837 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
5838 mov r0, rINST @ r0<- &fp[A] (free up rINST)
5839 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5840 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
5841 GET_INST_OPCODE ip @ extract opcode from rINST
5842 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
5843 GOTO_OPCODE ip @ jump to next instruction
5844
5845/* ------------------------------ */
5846 .balign 128
5847.L_op_div_long_2addr: /* 0xbe */
5848/* File: arm/op_div_long_2addr.S */
5849/* File: arm/binopWide2addr.S */
5850 /*
5851 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5852 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5853 * This could be an ARM instruction or a function call. (If the result
5854 * comes back in a register other than r0, you can override "result".)
5855 *
5856 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5857 * vCC (r1). Useful for integer division and modulus.
5858 *
5859 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5860 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5861 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5862 * rem-double/2addr
5863 */
5864 /* binop/2addr vA, vB */
5865 mov r1, rINST, lsr #12 @ r1<- B
5866 ubfx r9, rINST, #8, #4 @ r9<- A
5867 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5868 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5869 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5870 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5871 .if 1
5872 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5873 beq common_errDivideByZero
5874 .endif
5875 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5876
5877 @ optional op; may set condition codes
5878 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5879 GET_INST_OPCODE ip @ extract opcode from rINST
5880 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5881 GOTO_OPCODE ip @ jump to next instruction
5882 /* 12-15 instructions */
5883
5884
5885/* ------------------------------ */
5886 .balign 128
5887.L_op_rem_long_2addr: /* 0xbf */
5888/* File: arm/op_rem_long_2addr.S */
5889/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5890/* File: arm/binopWide2addr.S */
5891 /*
5892 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5893 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5894 * This could be an ARM instruction or a function call. (If the result
5895 * comes back in a register other than r0, you can override "result".)
5896 *
5897 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5898 * vCC (r1). Useful for integer division and modulus.
5899 *
5900 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5901 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5902 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5903 * rem-double/2addr
5904 */
5905 /* binop/2addr vA, vB */
5906 mov r1, rINST, lsr #12 @ r1<- B
5907 ubfx r9, rINST, #8, #4 @ r9<- A
5908 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5909 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5910 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5911 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5912 .if 1
5913 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5914 beq common_errDivideByZero
5915 .endif
5916 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5917
5918 @ optional op; may set condition codes
5919 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5920 GET_INST_OPCODE ip @ extract opcode from rINST
5921 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
5922 GOTO_OPCODE ip @ jump to next instruction
5923 /* 12-15 instructions */
5924
5925
5926/* ------------------------------ */
5927 .balign 128
5928.L_op_and_long_2addr: /* 0xc0 */
5929/* File: arm/op_and_long_2addr.S */
5930/* File: arm/binopWide2addr.S */
5931 /*
5932 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5933 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5934 * This could be an ARM instruction or a function call. (If the result
5935 * comes back in a register other than r0, you can override "result".)
5936 *
5937 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5938 * vCC (r1). Useful for integer division and modulus.
5939 *
5940 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5941 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5942 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5943 * rem-double/2addr
5944 */
5945 /* binop/2addr vA, vB */
5946 mov r1, rINST, lsr #12 @ r1<- B
5947 ubfx r9, rINST, #8, #4 @ r9<- A
5948 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5949 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5950 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5951 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5952 .if 0
5953 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5954 beq common_errDivideByZero
5955 .endif
5956 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5957
5958 and r0, r0, r2 @ optional op; may set condition codes
5959 and r1, r1, r3 @ result<- op, r0-r3 changed
5960 GET_INST_OPCODE ip @ extract opcode from rINST
5961 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5962 GOTO_OPCODE ip @ jump to next instruction
5963 /* 12-15 instructions */
5964
5965
5966/* ------------------------------ */
5967 .balign 128
5968.L_op_or_long_2addr: /* 0xc1 */
5969/* File: arm/op_or_long_2addr.S */
5970/* File: arm/binopWide2addr.S */
5971 /*
5972 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5973 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5974 * This could be an ARM instruction or a function call. (If the result
5975 * comes back in a register other than r0, you can override "result".)
5976 *
5977 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5978 * vCC (r1). Useful for integer division and modulus.
5979 *
5980 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5981 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5982 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5983 * rem-double/2addr
5984 */
5985 /* binop/2addr vA, vB */
5986 mov r1, rINST, lsr #12 @ r1<- B
5987 ubfx r9, rINST, #8, #4 @ r9<- A
5988 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5989 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5990 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5991 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5992 .if 0
5993 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5994 beq common_errDivideByZero
5995 .endif
5996 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5997
5998 orr r0, r0, r2 @ optional op; may set condition codes
5999 orr r1, r1, r3 @ result<- op, r0-r3 changed
6000 GET_INST_OPCODE ip @ extract opcode from rINST
6001 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6002 GOTO_OPCODE ip @ jump to next instruction
6003 /* 12-15 instructions */
6004
6005
6006/* ------------------------------ */
6007 .balign 128
6008.L_op_xor_long_2addr: /* 0xc2 */
6009/* File: arm/op_xor_long_2addr.S */
6010/* File: arm/binopWide2addr.S */
6011 /*
6012 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6013 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6014 * This could be an ARM instruction or a function call. (If the result
6015 * comes back in a register other than r0, you can override "result".)
6016 *
6017 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6018 * vCC (r1). Useful for integer division and modulus.
6019 *
6020 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6021 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6022 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6023 * rem-double/2addr
6024 */
6025 /* binop/2addr vA, vB */
6026 mov r1, rINST, lsr #12 @ r1<- B
6027 ubfx r9, rINST, #8, #4 @ r9<- A
6028 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6029 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6030 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6031 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6032 .if 0
6033 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6034 beq common_errDivideByZero
6035 .endif
6036 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6037
6038 eor r0, r0, r2 @ optional op; may set condition codes
6039 eor r1, r1, r3 @ result<- op, r0-r3 changed
6040 GET_INST_OPCODE ip @ extract opcode from rINST
6041 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6042 GOTO_OPCODE ip @ jump to next instruction
6043 /* 12-15 instructions */
6044
6045
6046/* ------------------------------ */
6047 .balign 128
6048.L_op_shl_long_2addr: /* 0xc3 */
6049/* File: arm/op_shl_long_2addr.S */
6050 /*
6051 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6052 * 32-bit shift distance.
6053 */
6054 /* shl-long/2addr vA, vB */
6055 mov r3, rINST, lsr #12 @ r3<- B
6056 ubfx r9, rINST, #8, #4 @ r9<- A
6057 GET_VREG r2, r3 @ r2<- vB
6058 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6059 and r2, r2, #63 @ r2<- r2 & 0x3f
6060 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6061
6062 mov r1, r1, asl r2 @ r1<- r1 << r2
6063 rsb r3, r2, #32 @ r3<- 32 - r2
6064 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
6065 subs ip, r2, #32 @ ip<- r2 - 32
6066 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6067 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
6068 mov r0, r0, asl r2 @ r0<- r0 << r2
6069 GET_INST_OPCODE ip @ extract opcode from rINST
6070 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6071 GOTO_OPCODE ip @ jump to next instruction
6072
6073/* ------------------------------ */
6074 .balign 128
6075.L_op_shr_long_2addr: /* 0xc4 */
6076/* File: arm/op_shr_long_2addr.S */
6077 /*
6078 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6079 * 32-bit shift distance.
6080 */
6081 /* shr-long/2addr vA, vB */
6082 mov r3, rINST, lsr #12 @ r3<- B
6083 ubfx r9, rINST, #8, #4 @ r9<- A
6084 GET_VREG r2, r3 @ r2<- vB
6085 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6086 and r2, r2, #63 @ r2<- r2 & 0x3f
6087 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6088
6089 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6090 rsb r3, r2, #32 @ r3<- 32 - r2
6091 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6092 subs ip, r2, #32 @ ip<- r2 - 32
6093 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6094 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
6095 mov r1, r1, asr r2 @ r1<- r1 >> r2
6096 GET_INST_OPCODE ip @ extract opcode from rINST
6097 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6098 GOTO_OPCODE ip @ jump to next instruction
6099
6100/* ------------------------------ */
6101 .balign 128
6102.L_op_ushr_long_2addr: /* 0xc5 */
6103/* File: arm/op_ushr_long_2addr.S */
6104 /*
6105 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6106 * 32-bit shift distance.
6107 */
6108 /* ushr-long/2addr vA, vB */
6109 mov r3, rINST, lsr #12 @ r3<- B
6110 ubfx r9, rINST, #8, #4 @ r9<- A
6111 GET_VREG r2, r3 @ r2<- vB
6112 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6113 and r2, r2, #63 @ r2<- r2 & 0x3f
6114 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6115
6116 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6117 rsb r3, r2, #32 @ r3<- 32 - r2
6118 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6119 subs ip, r2, #32 @ ip<- r2 - 32
6120 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6121 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
6122 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
6123 GET_INST_OPCODE ip @ extract opcode from rINST
6124 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6125 GOTO_OPCODE ip @ jump to next instruction
6126
6127/* ------------------------------ */
6128 .balign 128
6129.L_op_add_float_2addr: /* 0xc6 */
6130/* File: arm/op_add_float_2addr.S */
6131/* File: arm/fbinop2addr.S */
6132 /*
6133 * Generic 32-bit floating point "/2addr" binary operation. Provide
6134 * an "instr" line that specifies an instruction that performs
6135 * "s2 = s0 op s1".
6136 *
6137 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6138 */
6139 /* binop/2addr vA, vB */
6140 mov r3, rINST, lsr #12 @ r3<- B
6141 mov r9, rINST, lsr #8 @ r9<- A+
6142 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6143 and r9, r9, #15 @ r9<- A
6144 flds s1, [r3] @ s1<- vB
6145 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6146 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6147 flds s0, [r9] @ s0<- vA
6148
6149 fadds s2, s0, s1 @ s2<- op
6150 GET_INST_OPCODE ip @ extract opcode from rINST
6151 fsts s2, [r9] @ vAA<- s2
6152 GOTO_OPCODE ip @ jump to next instruction
6153
6154
6155/* ------------------------------ */
6156 .balign 128
6157.L_op_sub_float_2addr: /* 0xc7 */
6158/* File: arm/op_sub_float_2addr.S */
6159/* File: arm/fbinop2addr.S */
6160 /*
6161 * Generic 32-bit floating point "/2addr" binary operation. Provide
6162 * an "instr" line that specifies an instruction that performs
6163 * "s2 = s0 op s1".
6164 *
6165 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6166 */
6167 /* binop/2addr vA, vB */
6168 mov r3, rINST, lsr #12 @ r3<- B
6169 mov r9, rINST, lsr #8 @ r9<- A+
6170 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6171 and r9, r9, #15 @ r9<- A
6172 flds s1, [r3] @ s1<- vB
6173 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6174 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6175 flds s0, [r9] @ s0<- vA
6176
6177 fsubs s2, s0, s1 @ s2<- op
6178 GET_INST_OPCODE ip @ extract opcode from rINST
6179 fsts s2, [r9] @ vAA<- s2
6180 GOTO_OPCODE ip @ jump to next instruction
6181
6182
6183/* ------------------------------ */
6184 .balign 128
6185.L_op_mul_float_2addr: /* 0xc8 */
6186/* File: arm/op_mul_float_2addr.S */
6187/* File: arm/fbinop2addr.S */
6188 /*
6189 * Generic 32-bit floating point "/2addr" binary operation. Provide
6190 * an "instr" line that specifies an instruction that performs
6191 * "s2 = s0 op s1".
6192 *
6193 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6194 */
6195 /* binop/2addr vA, vB */
6196 mov r3, rINST, lsr #12 @ r3<- B
6197 mov r9, rINST, lsr #8 @ r9<- A+
6198 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6199 and r9, r9, #15 @ r9<- A
6200 flds s1, [r3] @ s1<- vB
6201 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6202 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6203 flds s0, [r9] @ s0<- vA
6204
6205 fmuls s2, s0, s1 @ s2<- op
6206 GET_INST_OPCODE ip @ extract opcode from rINST
6207 fsts s2, [r9] @ vAA<- s2
6208 GOTO_OPCODE ip @ jump to next instruction
6209
6210
6211/* ------------------------------ */
6212 .balign 128
6213.L_op_div_float_2addr: /* 0xc9 */
6214/* File: arm/op_div_float_2addr.S */
6215/* File: arm/fbinop2addr.S */
6216 /*
6217 * Generic 32-bit floating point "/2addr" binary operation. Provide
6218 * an "instr" line that specifies an instruction that performs
6219 * "s2 = s0 op s1".
6220 *
6221 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6222 */
6223 /* binop/2addr vA, vB */
6224 mov r3, rINST, lsr #12 @ r3<- B
6225 mov r9, rINST, lsr #8 @ r9<- A+
6226 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6227 and r9, r9, #15 @ r9<- A
6228 flds s1, [r3] @ s1<- vB
6229 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6230 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6231 flds s0, [r9] @ s0<- vA
6232
6233 fdivs s2, s0, s1 @ s2<- op
6234 GET_INST_OPCODE ip @ extract opcode from rINST
6235 fsts s2, [r9] @ vAA<- s2
6236 GOTO_OPCODE ip @ jump to next instruction
6237
6238
6239/* ------------------------------ */
6240 .balign 128
6241.L_op_rem_float_2addr: /* 0xca */
6242/* File: arm/op_rem_float_2addr.S */
6243/* EABI doesn't define a float remainder function, but libm does */
6244/* File: arm/binop2addr.S */
6245 /*
6246 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
6247 * that specifies an instruction that performs "result = r0 op r1".
6248 * This could be an ARM instruction or a function call. (If the result
6249 * comes back in a register other than r0, you can override "result".)
6250 *
6251 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6252 * vCC (r1). Useful for integer division and modulus.
6253 *
6254 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6255 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6256 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6257 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6258 */
6259 /* binop/2addr vA, vB */
6260 mov r3, rINST, lsr #12 @ r3<- B
6261 ubfx r9, rINST, #8, #4 @ r9<- A
6262 GET_VREG r1, r3 @ r1<- vB
6263 GET_VREG r0, r9 @ r0<- vA
6264 .if 0
6265 cmp r1, #0 @ is second operand zero?
6266 beq common_errDivideByZero
6267 .endif
6268 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6269
6270 @ optional op; may set condition codes
6271 bl fmodf @ r0<- op, r0-r3 changed
6272 GET_INST_OPCODE ip @ extract opcode from rINST
6273 SET_VREG r0, r9 @ vAA<- r0
6274 GOTO_OPCODE ip @ jump to next instruction
6275 /* 10-13 instructions */
6276
6277
6278/* ------------------------------ */
6279 .balign 128
6280.L_op_add_double_2addr: /* 0xcb */
6281/* File: arm/op_add_double_2addr.S */
6282/* File: arm/fbinopWide2addr.S */
6283 /*
6284 * Generic 64-bit floating point "/2addr" binary operation. Provide
6285 * an "instr" line that specifies an instruction that performs
6286 * "d2 = d0 op d1".
6287 *
6288 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6289 * div-double/2addr
6290 */
6291 /* binop/2addr vA, vB */
6292 mov r3, rINST, lsr #12 @ r3<- B
6293 mov r9, rINST, lsr #8 @ r9<- A+
6294 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6295 and r9, r9, #15 @ r9<- A
6296 fldd d1, [r3] @ d1<- vB
6297 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6298 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6299 fldd d0, [r9] @ d0<- vA
6300
6301 faddd d2, d0, d1 @ d2<- op
6302 GET_INST_OPCODE ip @ extract opcode from rINST
6303 fstd d2, [r9] @ vAA<- d2
6304 GOTO_OPCODE ip @ jump to next instruction
6305
6306
6307/* ------------------------------ */
6308 .balign 128
6309.L_op_sub_double_2addr: /* 0xcc */
6310/* File: arm/op_sub_double_2addr.S */
6311/* File: arm/fbinopWide2addr.S */
6312 /*
6313 * Generic 64-bit floating point "/2addr" binary operation. Provide
6314 * an "instr" line that specifies an instruction that performs
6315 * "d2 = d0 op d1".
6316 *
6317 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6318 * div-double/2addr
6319 */
6320 /* binop/2addr vA, vB */
6321 mov r3, rINST, lsr #12 @ r3<- B
6322 mov r9, rINST, lsr #8 @ r9<- A+
6323 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6324 and r9, r9, #15 @ r9<- A
6325 fldd d1, [r3] @ d1<- vB
6326 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6327 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6328 fldd d0, [r9] @ d0<- vA
6329
6330 fsubd d2, d0, d1 @ d2<- op
6331 GET_INST_OPCODE ip @ extract opcode from rINST
6332 fstd d2, [r9] @ vAA<- d2
6333 GOTO_OPCODE ip @ jump to next instruction
6334
6335
6336/* ------------------------------ */
6337 .balign 128
6338.L_op_mul_double_2addr: /* 0xcd */
6339/* File: arm/op_mul_double_2addr.S */
6340/* File: arm/fbinopWide2addr.S */
6341 /*
6342 * Generic 64-bit floating point "/2addr" binary operation. Provide
6343 * an "instr" line that specifies an instruction that performs
6344 * "d2 = d0 op d1".
6345 *
6346 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6347 * div-double/2addr
6348 */
6349 /* binop/2addr vA, vB */
6350 mov r3, rINST, lsr #12 @ r3<- B
6351 mov r9, rINST, lsr #8 @ r9<- A+
6352 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6353 and r9, r9, #15 @ r9<- A
6354 fldd d1, [r3] @ d1<- vB
6355 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6356 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6357 fldd d0, [r9] @ d0<- vA
6358
6359 fmuld d2, d0, d1 @ d2<- op
6360 GET_INST_OPCODE ip @ extract opcode from rINST
6361 fstd d2, [r9] @ vAA<- d2
6362 GOTO_OPCODE ip @ jump to next instruction
6363
6364
6365/* ------------------------------ */
6366 .balign 128
6367.L_op_div_double_2addr: /* 0xce */
6368/* File: arm/op_div_double_2addr.S */
6369/* File: arm/fbinopWide2addr.S */
6370 /*
6371 * Generic 64-bit floating point "/2addr" binary operation. Provide
6372 * an "instr" line that specifies an instruction that performs
6373 * "d2 = d0 op d1".
6374 *
6375 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6376 * div-double/2addr
6377 */
6378 /* binop/2addr vA, vB */
6379 mov r3, rINST, lsr #12 @ r3<- B
6380 mov r9, rINST, lsr #8 @ r9<- A+
6381 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6382 and r9, r9, #15 @ r9<- A
6383 fldd d1, [r3] @ d1<- vB
6384 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6385 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6386 fldd d0, [r9] @ d0<- vA
6387
6388 fdivd d2, d0, d1 @ d2<- op
6389 GET_INST_OPCODE ip @ extract opcode from rINST
6390 fstd d2, [r9] @ vAA<- d2
6391 GOTO_OPCODE ip @ jump to next instruction
6392
6393
6394/* ------------------------------ */
6395 .balign 128
6396.L_op_rem_double_2addr: /* 0xcf */
6397/* File: arm/op_rem_double_2addr.S */
6398/* EABI doesn't define a double remainder function, but libm does */
6399/* File: arm/binopWide2addr.S */
6400 /*
6401 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6402 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6403 * This could be an ARM instruction or a function call. (If the result
6404 * comes back in a register other than r0, you can override "result".)
6405 *
6406 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6407 * vCC (r1). Useful for integer division and modulus.
6408 *
6409 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6410 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6411 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6412 * rem-double/2addr
6413 */
6414 /* binop/2addr vA, vB */
6415 mov r1, rINST, lsr #12 @ r1<- B
6416 ubfx r9, rINST, #8, #4 @ r9<- A
6417 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6418 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6419 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6420 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6421 .if 0
6422 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6423 beq common_errDivideByZero
6424 .endif
6425 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6426
6427 @ optional op; may set condition codes
6428 bl fmod @ result<- op, r0-r3 changed
6429 GET_INST_OPCODE ip @ extract opcode from rINST
6430 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6431 GOTO_OPCODE ip @ jump to next instruction
6432 /* 12-15 instructions */
6433
6434
6435/* ------------------------------ */
6436 .balign 128
6437.L_op_add_int_lit16: /* 0xd0 */
6438/* File: arm/op_add_int_lit16.S */
6439/* File: arm/binopLit16.S */
6440 /*
6441 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6442 * that specifies an instruction that performs "result = r0 op r1".
6443 * This could be an ARM instruction or a function call. (If the result
6444 * comes back in a register other than r0, you can override "result".)
6445 *
6446 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6447 * vCC (r1). Useful for integer division and modulus.
6448 *
6449 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6450 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6451 */
6452 /* binop/lit16 vA, vB, #+CCCC */
6453 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6454 mov r2, rINST, lsr #12 @ r2<- B
6455 ubfx r9, rINST, #8, #4 @ r9<- A
6456 GET_VREG r0, r2 @ r0<- vB
6457 .if 0
6458 cmp r1, #0 @ is second operand zero?
6459 beq common_errDivideByZero
6460 .endif
6461 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6462
6463 add r0, r0, r1 @ r0<- op, r0-r3 changed
6464 GET_INST_OPCODE ip @ extract opcode from rINST
6465 SET_VREG r0, r9 @ vAA<- r0
6466 GOTO_OPCODE ip @ jump to next instruction
6467 /* 10-13 instructions */
6468
6469
6470/* ------------------------------ */
6471 .balign 128
6472.L_op_rsub_int: /* 0xd1 */
6473/* File: arm/op_rsub_int.S */
6474/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6475/* File: arm/binopLit16.S */
6476 /*
6477 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6478 * that specifies an instruction that performs "result = r0 op r1".
6479 * This could be an ARM instruction or a function call. (If the result
6480 * comes back in a register other than r0, you can override "result".)
6481 *
6482 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6483 * vCC (r1). Useful for integer division and modulus.
6484 *
6485 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6486 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6487 */
6488 /* binop/lit16 vA, vB, #+CCCC */
6489 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6490 mov r2, rINST, lsr #12 @ r2<- B
6491 ubfx r9, rINST, #8, #4 @ r9<- A
6492 GET_VREG r0, r2 @ r0<- vB
6493 .if 0
6494 cmp r1, #0 @ is second operand zero?
6495 beq common_errDivideByZero
6496 .endif
6497 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6498
6499 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6500 GET_INST_OPCODE ip @ extract opcode from rINST
6501 SET_VREG r0, r9 @ vAA<- r0
6502 GOTO_OPCODE ip @ jump to next instruction
6503 /* 10-13 instructions */
6504
6505
6506/* ------------------------------ */
6507 .balign 128
6508.L_op_mul_int_lit16: /* 0xd2 */
6509/* File: arm/op_mul_int_lit16.S */
6510/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6511/* File: arm/binopLit16.S */
6512 /*
6513 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6514 * that specifies an instruction that performs "result = r0 op r1".
6515 * This could be an ARM instruction or a function call. (If the result
6516 * comes back in a register other than r0, you can override "result".)
6517 *
6518 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6519 * vCC (r1). Useful for integer division and modulus.
6520 *
6521 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6522 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6523 */
6524 /* binop/lit16 vA, vB, #+CCCC */
6525 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6526 mov r2, rINST, lsr #12 @ r2<- B
6527 ubfx r9, rINST, #8, #4 @ r9<- A
6528 GET_VREG r0, r2 @ r0<- vB
6529 .if 0
6530 cmp r1, #0 @ is second operand zero?
6531 beq common_errDivideByZero
6532 .endif
6533 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6534
6535 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6536 GET_INST_OPCODE ip @ extract opcode from rINST
6537 SET_VREG r0, r9 @ vAA<- r0
6538 GOTO_OPCODE ip @ jump to next instruction
6539 /* 10-13 instructions */
6540
6541
6542/* ------------------------------ */
6543 .balign 128
6544.L_op_div_int_lit16: /* 0xd3 */
6545/* File: arm/op_div_int_lit16.S */
6546 /*
6547 * Specialized 32-bit binary operation
6548 *
6549 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6550 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6551 * ARMv7 CPUs that have hardware division support).
6552 *
6553 * div-int/lit16
6554 *
6555 */
6556 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6557 mov r2, rINST, lsr #12 @ r2<- B
6558 ubfx r9, rINST, #8, #4 @ r9<- A
6559 GET_VREG r0, r2 @ r0<- vB
6560 cmp r1, #0 @ is second operand zero?
6561 beq common_errDivideByZero
6562 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6563
6564#ifdef __ARM_ARCH_EXT_IDIV__
6565 sdiv r0, r0, r1 @ r0<- op
6566#else
6567 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6568#endif
6569 GET_INST_OPCODE ip @ extract opcode from rINST
6570 SET_VREG r0, r9 @ vAA<- r0
6571 GOTO_OPCODE ip @ jump to next instruction
6572 /* 10-13 instructions */
6573
6574/* ------------------------------ */
6575 .balign 128
6576.L_op_rem_int_lit16: /* 0xd4 */
6577/* File: arm/op_rem_int_lit16.S */
6578 /*
6579 * Specialized 32-bit binary operation
6580 *
6581 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6582 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6583 * ARMv7 CPUs that have hardware division support).
6584 *
6585 * NOTE: idivmod returns quotient in r0 and remainder in r1
6586 *
6587 * rem-int/lit16
6588 *
6589 */
6590 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6591 mov r2, rINST, lsr #12 @ r2<- B
6592 ubfx r9, rINST, #8, #4 @ r9<- A
6593 GET_VREG r0, r2 @ r0<- vB
6594 cmp r1, #0 @ is second operand zero?
6595 beq common_errDivideByZero
6596 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6597
6598#ifdef __ARM_ARCH_EXT_IDIV__
6599 sdiv r2, r0, r1
6600 mls r1, r1, r2, r0 @ r1<- op
6601#else
6602 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6603#endif
6604 GET_INST_OPCODE ip @ extract opcode from rINST
6605 SET_VREG r1, r9 @ vAA<- r1
6606 GOTO_OPCODE ip @ jump to next instruction
6607 /* 10-13 instructions */
6608
6609/* ------------------------------ */
6610 .balign 128
6611.L_op_and_int_lit16: /* 0xd5 */
6612/* File: arm/op_and_int_lit16.S */
6613/* File: arm/binopLit16.S */
6614 /*
6615 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6616 * that specifies an instruction that performs "result = r0 op r1".
6617 * This could be an ARM instruction or a function call. (If the result
6618 * comes back in a register other than r0, you can override "result".)
6619 *
6620 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6621 * vCC (r1). Useful for integer division and modulus.
6622 *
6623 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6624 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6625 */
6626 /* binop/lit16 vA, vB, #+CCCC */
6627 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6628 mov r2, rINST, lsr #12 @ r2<- B
6629 ubfx r9, rINST, #8, #4 @ r9<- A
6630 GET_VREG r0, r2 @ r0<- vB
6631 .if 0
6632 cmp r1, #0 @ is second operand zero?
6633 beq common_errDivideByZero
6634 .endif
6635 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6636
6637 and r0, r0, r1 @ r0<- op, r0-r3 changed
6638 GET_INST_OPCODE ip @ extract opcode from rINST
6639 SET_VREG r0, r9 @ vAA<- r0
6640 GOTO_OPCODE ip @ jump to next instruction
6641 /* 10-13 instructions */
6642
6643
6644/* ------------------------------ */
6645 .balign 128
6646.L_op_or_int_lit16: /* 0xd6 */
6647/* File: arm/op_or_int_lit16.S */
6648/* File: arm/binopLit16.S */
6649 /*
6650 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6651 * that specifies an instruction that performs "result = r0 op r1".
6652 * This could be an ARM instruction or a function call. (If the result
6653 * comes back in a register other than r0, you can override "result".)
6654 *
6655 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6656 * vCC (r1). Useful for integer division and modulus.
6657 *
6658 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6659 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6660 */
6661 /* binop/lit16 vA, vB, #+CCCC */
6662 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6663 mov r2, rINST, lsr #12 @ r2<- B
6664 ubfx r9, rINST, #8, #4 @ r9<- A
6665 GET_VREG r0, r2 @ r0<- vB
6666 .if 0
6667 cmp r1, #0 @ is second operand zero?
6668 beq common_errDivideByZero
6669 .endif
6670 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6671
6672 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6673 GET_INST_OPCODE ip @ extract opcode from rINST
6674 SET_VREG r0, r9 @ vAA<- r0
6675 GOTO_OPCODE ip @ jump to next instruction
6676 /* 10-13 instructions */
6677
6678
6679/* ------------------------------ */
6680 .balign 128
6681.L_op_xor_int_lit16: /* 0xd7 */
6682/* File: arm/op_xor_int_lit16.S */
6683/* File: arm/binopLit16.S */
6684 /*
6685 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6686 * that specifies an instruction that performs "result = r0 op r1".
6687 * This could be an ARM instruction or a function call. (If the result
6688 * comes back in a register other than r0, you can override "result".)
6689 *
6690 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6691 * vCC (r1). Useful for integer division and modulus.
6692 *
6693 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6694 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6695 */
6696 /* binop/lit16 vA, vB, #+CCCC */
6697 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6698 mov r2, rINST, lsr #12 @ r2<- B
6699 ubfx r9, rINST, #8, #4 @ r9<- A
6700 GET_VREG r0, r2 @ r0<- vB
6701 .if 0
6702 cmp r1, #0 @ is second operand zero?
6703 beq common_errDivideByZero
6704 .endif
6705 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6706
6707 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6708 GET_INST_OPCODE ip @ extract opcode from rINST
6709 SET_VREG r0, r9 @ vAA<- r0
6710 GOTO_OPCODE ip @ jump to next instruction
6711 /* 10-13 instructions */
6712
6713
6714/* ------------------------------ */
6715 .balign 128
6716.L_op_add_int_lit8: /* 0xd8 */
6717/* File: arm/op_add_int_lit8.S */
6718/* File: arm/binopLit8.S */
6719 /*
6720 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6721 * that specifies an instruction that performs "result = r0 op r1".
6722 * This could be an ARM instruction or a function call. (If the result
6723 * comes back in a register other than r0, you can override "result".)
6724 *
6725 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6726 * vCC (r1). Useful for integer division and modulus.
6727 *
6728 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6729 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6730 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6731 */
6732 /* binop/lit8 vAA, vBB, #+CC */
6733 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6734 mov r9, rINST, lsr #8 @ r9<- AA
6735 and r2, r3, #255 @ r2<- BB
6736 GET_VREG r0, r2 @ r0<- vBB
6737 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6738 .if 0
6739 @cmp r1, #0 @ is second operand zero?
6740 beq common_errDivideByZero
6741 .endif
6742 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6743
6744 @ optional op; may set condition codes
6745 add r0, r0, r1 @ r0<- op, r0-r3 changed
6746 GET_INST_OPCODE ip @ extract opcode from rINST
6747 SET_VREG r0, r9 @ vAA<- r0
6748 GOTO_OPCODE ip @ jump to next instruction
6749 /* 10-12 instructions */
6750
6751
6752/* ------------------------------ */
6753 .balign 128
6754.L_op_rsub_int_lit8: /* 0xd9 */
6755/* File: arm/op_rsub_int_lit8.S */
6756/* File: arm/binopLit8.S */
6757 /*
6758 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6759 * that specifies an instruction that performs "result = r0 op r1".
6760 * This could be an ARM instruction or a function call. (If the result
6761 * comes back in a register other than r0, you can override "result".)
6762 *
6763 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6764 * vCC (r1). Useful for integer division and modulus.
6765 *
6766 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6767 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6768 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6769 */
6770 /* binop/lit8 vAA, vBB, #+CC */
6771 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6772 mov r9, rINST, lsr #8 @ r9<- AA
6773 and r2, r3, #255 @ r2<- BB
6774 GET_VREG r0, r2 @ r0<- vBB
6775 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6776 .if 0
6777 @cmp r1, #0 @ is second operand zero?
6778 beq common_errDivideByZero
6779 .endif
6780 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6781
6782 @ optional op; may set condition codes
6783 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6784 GET_INST_OPCODE ip @ extract opcode from rINST
6785 SET_VREG r0, r9 @ vAA<- r0
6786 GOTO_OPCODE ip @ jump to next instruction
6787 /* 10-12 instructions */
6788
6789
6790/* ------------------------------ */
6791 .balign 128
6792.L_op_mul_int_lit8: /* 0xda */
6793/* File: arm/op_mul_int_lit8.S */
6794/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6795/* File: arm/binopLit8.S */
6796 /*
6797 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6798 * that specifies an instruction that performs "result = r0 op r1".
6799 * This could be an ARM instruction or a function call. (If the result
6800 * comes back in a register other than r0, you can override "result".)
6801 *
6802 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6803 * vCC (r1). Useful for integer division and modulus.
6804 *
6805 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6806 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6807 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6808 */
6809 /* binop/lit8 vAA, vBB, #+CC */
6810 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6811 mov r9, rINST, lsr #8 @ r9<- AA
6812 and r2, r3, #255 @ r2<- BB
6813 GET_VREG r0, r2 @ r0<- vBB
6814 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6815 .if 0
6816 @cmp r1, #0 @ is second operand zero?
6817 beq common_errDivideByZero
6818 .endif
6819 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6820
6821 @ optional op; may set condition codes
6822 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6823 GET_INST_OPCODE ip @ extract opcode from rINST
6824 SET_VREG r0, r9 @ vAA<- r0
6825 GOTO_OPCODE ip @ jump to next instruction
6826 /* 10-12 instructions */
6827
6828
6829/* ------------------------------ */
6830 .balign 128
6831.L_op_div_int_lit8: /* 0xdb */
6832/* File: arm/op_div_int_lit8.S */
6833 /*
6834 * Specialized 32-bit binary operation
6835 *
6836 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6837 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6838 * ARMv7 CPUs that have hardware division support).
6839 *
6840 * div-int/lit8
6841 *
6842 */
6843 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6844 mov r9, rINST, lsr #8 @ r9<- AA
6845 and r2, r3, #255 @ r2<- BB
6846 GET_VREG r0, r2 @ r0<- vBB
6847 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6848 @cmp r1, #0 @ is second operand zero?
6849 beq common_errDivideByZero
6850 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6851
6852#ifdef __ARM_ARCH_EXT_IDIV__
6853 sdiv r0, r0, r1 @ r0<- op
6854#else
6855 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6856#endif
6857 GET_INST_OPCODE ip @ extract opcode from rINST
6858 SET_VREG r0, r9 @ vAA<- r0
6859 GOTO_OPCODE ip @ jump to next instruction
6860 /* 10-12 instructions */
6861
6862/* ------------------------------ */
6863 .balign 128
6864.L_op_rem_int_lit8: /* 0xdc */
6865/* File: arm/op_rem_int_lit8.S */
6866 /*
6867 * Specialized 32-bit binary operation
6868 *
6869 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6870 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6871 * ARMv7 CPUs that have hardware division support).
6872 *
6873 * NOTE: idivmod returns quotient in r0 and remainder in r1
6874 *
6875 * rem-int/lit8
6876 *
6877 */
6878 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
6879 mov r9, rINST, lsr #8 @ r9<- AA
6880 and r2, r3, #255 @ r2<- BB
6881 GET_VREG r0, r2 @ r0<- vBB
6882 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6883 @cmp r1, #0 @ is second operand zero?
6884 beq common_errDivideByZero
6885 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6886
6887#ifdef __ARM_ARCH_EXT_IDIV__
6888 sdiv r2, r0, r1
6889 mls r1, r1, r2, r0 @ r1<- op
6890#else
6891 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6892#endif
6893 GET_INST_OPCODE ip @ extract opcode from rINST
6894 SET_VREG r1, r9 @ vAA<- r1
6895 GOTO_OPCODE ip @ jump to next instruction
6896 /* 10-12 instructions */
6897
6898/* ------------------------------ */
6899 .balign 128
6900.L_op_and_int_lit8: /* 0xdd */
6901/* File: arm/op_and_int_lit8.S */
6902/* File: arm/binopLit8.S */
6903 /*
6904 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6905 * that specifies an instruction that performs "result = r0 op r1".
6906 * This could be an ARM instruction or a function call. (If the result
6907 * comes back in a register other than r0, you can override "result".)
6908 *
6909 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6910 * vCC (r1). Useful for integer division and modulus.
6911 *
6912 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6913 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6914 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6915 */
6916 /* binop/lit8 vAA, vBB, #+CC */
6917 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6918 mov r9, rINST, lsr #8 @ r9<- AA
6919 and r2, r3, #255 @ r2<- BB
6920 GET_VREG r0, r2 @ r0<- vBB
6921 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6922 .if 0
6923 @cmp r1, #0 @ is second operand zero?
6924 beq common_errDivideByZero
6925 .endif
6926 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6927
6928 @ optional op; may set condition codes
6929 and r0, r0, r1 @ r0<- op, r0-r3 changed
6930 GET_INST_OPCODE ip @ extract opcode from rINST
6931 SET_VREG r0, r9 @ vAA<- r0
6932 GOTO_OPCODE ip @ jump to next instruction
6933 /* 10-12 instructions */
6934
6935
6936/* ------------------------------ */
6937 .balign 128
6938.L_op_or_int_lit8: /* 0xde */
6939/* File: arm/op_or_int_lit8.S */
6940/* File: arm/binopLit8.S */
6941 /*
6942 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6943 * that specifies an instruction that performs "result = r0 op r1".
6944 * This could be an ARM instruction or a function call. (If the result
6945 * comes back in a register other than r0, you can override "result".)
6946 *
6947 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6948 * vCC (r1). Useful for integer division and modulus.
6949 *
6950 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6951 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6952 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6953 */
6954 /* binop/lit8 vAA, vBB, #+CC */
6955 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6956 mov r9, rINST, lsr #8 @ r9<- AA
6957 and r2, r3, #255 @ r2<- BB
6958 GET_VREG r0, r2 @ r0<- vBB
6959 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6960 .if 0
6961 @cmp r1, #0 @ is second operand zero?
6962 beq common_errDivideByZero
6963 .endif
6964 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6965
6966 @ optional op; may set condition codes
6967 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6968 GET_INST_OPCODE ip @ extract opcode from rINST
6969 SET_VREG r0, r9 @ vAA<- r0
6970 GOTO_OPCODE ip @ jump to next instruction
6971 /* 10-12 instructions */
6972
6973
6974/* ------------------------------ */
6975 .balign 128
6976.L_op_xor_int_lit8: /* 0xdf */
6977/* File: arm/op_xor_int_lit8.S */
6978/* File: arm/binopLit8.S */
6979 /*
6980 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6981 * that specifies an instruction that performs "result = r0 op r1".
6982 * This could be an ARM instruction or a function call. (If the result
6983 * comes back in a register other than r0, you can override "result".)
6984 *
6985 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6986 * vCC (r1). Useful for integer division and modulus.
6987 *
6988 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6989 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6990 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6991 */
6992 /* binop/lit8 vAA, vBB, #+CC */
6993 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6994 mov r9, rINST, lsr #8 @ r9<- AA
6995 and r2, r3, #255 @ r2<- BB
6996 GET_VREG r0, r2 @ r0<- vBB
6997 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6998 .if 0
6999 @cmp r1, #0 @ is second operand zero?
7000 beq common_errDivideByZero
7001 .endif
7002 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7003
7004 @ optional op; may set condition codes
7005 eor r0, r0, r1 @ r0<- op, r0-r3 changed
7006 GET_INST_OPCODE ip @ extract opcode from rINST
7007 SET_VREG r0, r9 @ vAA<- r0
7008 GOTO_OPCODE ip @ jump to next instruction
7009 /* 10-12 instructions */
7010
7011
7012/* ------------------------------ */
7013 .balign 128
7014.L_op_shl_int_lit8: /* 0xe0 */
7015/* File: arm/op_shl_int_lit8.S */
7016/* File: arm/binopLit8.S */
7017 /*
7018 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7019 * that specifies an instruction that performs "result = r0 op r1".
7020 * This could be an ARM instruction or a function call. (If the result
7021 * comes back in a register other than r0, you can override "result".)
7022 *
7023 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7024 * vCC (r1). Useful for integer division and modulus.
7025 *
7026 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7027 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7028 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7029 */
7030 /* binop/lit8 vAA, vBB, #+CC */
7031 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7032 mov r9, rINST, lsr #8 @ r9<- AA
7033 and r2, r3, #255 @ r2<- BB
7034 GET_VREG r0, r2 @ r0<- vBB
7035 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7036 .if 0
7037 @cmp r1, #0 @ is second operand zero?
7038 beq common_errDivideByZero
7039 .endif
7040 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7041
7042 and r1, r1, #31 @ optional op; may set condition codes
7043 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
7044 GET_INST_OPCODE ip @ extract opcode from rINST
7045 SET_VREG r0, r9 @ vAA<- r0
7046 GOTO_OPCODE ip @ jump to next instruction
7047 /* 10-12 instructions */
7048
7049
7050/* ------------------------------ */
7051 .balign 128
7052.L_op_shr_int_lit8: /* 0xe1 */
7053/* File: arm/op_shr_int_lit8.S */
7054/* File: arm/binopLit8.S */
7055 /*
7056 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7057 * that specifies an instruction that performs "result = r0 op r1".
7058 * This could be an ARM instruction or a function call. (If the result
7059 * comes back in a register other than r0, you can override "result".)
7060 *
7061 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7062 * vCC (r1). Useful for integer division and modulus.
7063 *
7064 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7065 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7066 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7067 */
7068 /* binop/lit8 vAA, vBB, #+CC */
7069 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7070 mov r9, rINST, lsr #8 @ r9<- AA
7071 and r2, r3, #255 @ r2<- BB
7072 GET_VREG r0, r2 @ r0<- vBB
7073 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7074 .if 0
7075 @cmp r1, #0 @ is second operand zero?
7076 beq common_errDivideByZero
7077 .endif
7078 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7079
7080 and r1, r1, #31 @ optional op; may set condition codes
7081 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
7082 GET_INST_OPCODE ip @ extract opcode from rINST
7083 SET_VREG r0, r9 @ vAA<- r0
7084 GOTO_OPCODE ip @ jump to next instruction
7085 /* 10-12 instructions */
7086
7087
7088/* ------------------------------ */
7089 .balign 128
7090.L_op_ushr_int_lit8: /* 0xe2 */
7091/* File: arm/op_ushr_int_lit8.S */
7092/* File: arm/binopLit8.S */
7093 /*
7094 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7095 * that specifies an instruction that performs "result = r0 op r1".
7096 * This could be an ARM instruction or a function call. (If the result
7097 * comes back in a register other than r0, you can override "result".)
7098 *
7099 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7100 * vCC (r1). Useful for integer division and modulus.
7101 *
7102 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7103 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7104 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7105 */
7106 /* binop/lit8 vAA, vBB, #+CC */
7107 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7108 mov r9, rINST, lsr #8 @ r9<- AA
7109 and r2, r3, #255 @ r2<- BB
7110 GET_VREG r0, r2 @ r0<- vBB
7111 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7112 .if 0
7113 @cmp r1, #0 @ is second operand zero?
7114 beq common_errDivideByZero
7115 .endif
7116 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7117
7118 and r1, r1, #31 @ optional op; may set condition codes
7119 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
7120 GET_INST_OPCODE ip @ extract opcode from rINST
7121 SET_VREG r0, r9 @ vAA<- r0
7122 GOTO_OPCODE ip @ jump to next instruction
7123 /* 10-12 instructions */
7124
7125
7126/* ------------------------------ */
7127 .balign 128
7128.L_op_iget_quick: /* 0xe3 */
7129/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007130 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007131 /* op vA, vB, offset@CCCC */
7132 mov r2, rINST, lsr #12 @ r2<- B
7133 FETCH r1, 1 @ r1<- field byte offset
7134 GET_VREG r3, r2 @ r3<- object we're operating on
7135 ubfx r2, rINST, #8, #4 @ r2<- A
7136 cmp r3, #0 @ check object for null
7137 beq common_errNullObject @ object was null
7138 ldr r0, [r3, r1] @ r0<- obj.field
7139 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007140 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007141 GET_INST_OPCODE ip @ extract opcode from rINST
7142 GOTO_OPCODE ip @ jump to next instruction
7143
7144/* ------------------------------ */
7145 .balign 128
7146.L_op_iget_wide_quick: /* 0xe4 */
7147/* File: arm/op_iget_wide_quick.S */
7148 /* iget-wide-quick vA, vB, offset@CCCC */
7149 mov r2, rINST, lsr #12 @ r2<- B
7150 FETCH ip, 1 @ ip<- field byte offset
7151 GET_VREG r3, r2 @ r3<- object we're operating on
7152 ubfx r2, rINST, #8, #4 @ r2<- A
7153 cmp r3, #0 @ check object for null
7154 beq common_errNullObject @ object was null
7155 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
7156 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7157 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
7158 GET_INST_OPCODE ip @ extract opcode from rINST
7159 stmia r3, {r0-r1} @ fp[A]<- r0/r1
7160 GOTO_OPCODE ip @ jump to next instruction
7161
7162/* ------------------------------ */
7163 .balign 128
7164.L_op_iget_object_quick: /* 0xe5 */
7165/* File: arm/op_iget_object_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007166 /* For: iget-object-quick */
buzbee1452bee2015-03-06 14:43:04 -08007167 /* op vA, vB, offset@CCCC */
7168 mov r2, rINST, lsr #12 @ r2<- B
7169 FETCH r1, 1 @ r1<- field byte offset
buzbeebb6e7262016-01-14 05:34:34 -08007170 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -08007171 GET_VREG r0, r2 @ r0<- object we're operating on
buzbee76833da2016-01-13 13:06:22 -08007172 bl artIGetObjectFromMterp @ (obj, offset)
7173 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
7174 ubfx r2, rINST, #8, #4 @ r2<- A
7175 PREFETCH_INST 2
7176 cmp r3, #0
7177 bne MterpPossibleException @ bail out
buzbee1452bee2015-03-06 14:43:04 -08007178 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
buzbee76833da2016-01-13 13:06:22 -08007179 ADVANCE 2 @ advance rPC
buzbee1452bee2015-03-06 14:43:04 -08007180 GET_INST_OPCODE ip @ extract opcode from rINST
7181 GOTO_OPCODE ip @ jump to next instruction
7182
buzbee1452bee2015-03-06 14:43:04 -08007183/* ------------------------------ */
7184 .balign 128
7185.L_op_iput_quick: /* 0xe6 */
7186/* File: arm/op_iput_quick.S */
7187 /* For: iput-quick, iput-object-quick */
7188 /* op vA, vB, offset@CCCC */
7189 mov r2, rINST, lsr #12 @ r2<- B
7190 FETCH r1, 1 @ r1<- field byte offset
7191 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7192 ubfx r2, rINST, #8, #4 @ r2<- A
7193 cmp r3, #0 @ check object for null
7194 beq common_errNullObject @ object was null
7195 GET_VREG r0, r2 @ r0<- fp[A]
7196 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7197 str r0, [r3, r1] @ obj.field<- r0
7198 GET_INST_OPCODE ip @ extract opcode from rINST
7199 GOTO_OPCODE ip @ jump to next instruction
7200
7201/* ------------------------------ */
7202 .balign 128
7203.L_op_iput_wide_quick: /* 0xe7 */
7204/* File: arm/op_iput_wide_quick.S */
7205 /* iput-wide-quick vA, vB, offset@CCCC */
7206 mov r2, rINST, lsr #12 @ r2<- B
7207 FETCH r3, 1 @ r3<- field byte offset
7208 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7209 ubfx r0, rINST, #8, #4 @ r0<- A
7210 cmp r2, #0 @ check object for null
7211 beq common_errNullObject @ object was null
7212 add r0, rFP, r0, lsl #2 @ r0<- &fp[A]
7213 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7214 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7215 strd r0, [r2, r3] @ obj.field<- r0/r1
7216 GET_INST_OPCODE ip @ extract opcode from rINST
7217 GOTO_OPCODE ip @ jump to next instruction
7218
7219/* ------------------------------ */
7220 .balign 128
7221.L_op_iput_object_quick: /* 0xe8 */
7222/* File: arm/op_iput_object_quick.S */
7223 EXPORT_PC
7224 add r0, rFP, #OFF_FP_SHADOWFRAME
7225 mov r1, rPC
7226 mov r2, rINST
7227 bl MterpIputObjectQuick
7228 cmp r0, #0
7229 beq MterpException
7230 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7231 GET_INST_OPCODE ip @ extract opcode from rINST
7232 GOTO_OPCODE ip @ jump to next instruction
7233
7234/* ------------------------------ */
7235 .balign 128
7236.L_op_invoke_virtual_quick: /* 0xe9 */
7237/* File: arm/op_invoke_virtual_quick.S */
7238/* File: arm/invoke.S */
7239 /*
7240 * Generic invoke handler wrapper.
7241 */
7242 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7243 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7244 .extern MterpInvokeVirtualQuick
7245 EXPORT_PC
7246 mov r0, rSELF
7247 add r1, rFP, #OFF_FP_SHADOWFRAME
7248 mov r2, rPC
7249 mov r3, rINST
7250 bl MterpInvokeVirtualQuick
7251 cmp r0, #0
7252 beq MterpException
7253 FETCH_ADVANCE_INST 3
7254 GET_INST_OPCODE ip
7255 GOTO_OPCODE ip
7256
7257
7258
7259/* ------------------------------ */
7260 .balign 128
7261.L_op_invoke_virtual_range_quick: /* 0xea */
7262/* File: arm/op_invoke_virtual_range_quick.S */
7263/* File: arm/invoke.S */
7264 /*
7265 * Generic invoke handler wrapper.
7266 */
7267 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7268 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7269 .extern MterpInvokeVirtualQuickRange
7270 EXPORT_PC
7271 mov r0, rSELF
7272 add r1, rFP, #OFF_FP_SHADOWFRAME
7273 mov r2, rPC
7274 mov r3, rINST
7275 bl MterpInvokeVirtualQuickRange
7276 cmp r0, #0
7277 beq MterpException
7278 FETCH_ADVANCE_INST 3
7279 GET_INST_OPCODE ip
7280 GOTO_OPCODE ip
7281
7282
7283
7284/* ------------------------------ */
7285 .balign 128
7286.L_op_iput_boolean_quick: /* 0xeb */
7287/* File: arm/op_iput_boolean_quick.S */
7288/* File: arm/op_iput_quick.S */
7289 /* For: iput-quick, iput-object-quick */
7290 /* op vA, vB, offset@CCCC */
7291 mov r2, rINST, lsr #12 @ r2<- B
7292 FETCH r1, 1 @ r1<- field byte offset
7293 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7294 ubfx r2, rINST, #8, #4 @ r2<- A
7295 cmp r3, #0 @ check object for null
7296 beq common_errNullObject @ object was null
7297 GET_VREG r0, r2 @ r0<- fp[A]
7298 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7299 strb r0, [r3, r1] @ obj.field<- r0
7300 GET_INST_OPCODE ip @ extract opcode from rINST
7301 GOTO_OPCODE ip @ jump to next instruction
7302
7303
7304/* ------------------------------ */
7305 .balign 128
7306.L_op_iput_byte_quick: /* 0xec */
7307/* File: arm/op_iput_byte_quick.S */
7308/* File: arm/op_iput_quick.S */
7309 /* For: iput-quick, iput-object-quick */
7310 /* op vA, vB, offset@CCCC */
7311 mov r2, rINST, lsr #12 @ r2<- B
7312 FETCH r1, 1 @ r1<- field byte offset
7313 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7314 ubfx r2, rINST, #8, #4 @ r2<- A
7315 cmp r3, #0 @ check object for null
7316 beq common_errNullObject @ object was null
7317 GET_VREG r0, r2 @ r0<- fp[A]
7318 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7319 strb r0, [r3, r1] @ obj.field<- r0
7320 GET_INST_OPCODE ip @ extract opcode from rINST
7321 GOTO_OPCODE ip @ jump to next instruction
7322
7323
7324/* ------------------------------ */
7325 .balign 128
7326.L_op_iput_char_quick: /* 0xed */
7327/* File: arm/op_iput_char_quick.S */
7328/* File: arm/op_iput_quick.S */
7329 /* For: iput-quick, iput-object-quick */
7330 /* op vA, vB, offset@CCCC */
7331 mov r2, rINST, lsr #12 @ r2<- B
7332 FETCH r1, 1 @ r1<- field byte offset
7333 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7334 ubfx r2, rINST, #8, #4 @ r2<- A
7335 cmp r3, #0 @ check object for null
7336 beq common_errNullObject @ object was null
7337 GET_VREG r0, r2 @ r0<- fp[A]
7338 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7339 strh r0, [r3, r1] @ obj.field<- r0
7340 GET_INST_OPCODE ip @ extract opcode from rINST
7341 GOTO_OPCODE ip @ jump to next instruction
7342
7343
7344/* ------------------------------ */
7345 .balign 128
7346.L_op_iput_short_quick: /* 0xee */
7347/* File: arm/op_iput_short_quick.S */
7348/* File: arm/op_iput_quick.S */
7349 /* For: iput-quick, iput-object-quick */
7350 /* op vA, vB, offset@CCCC */
7351 mov r2, rINST, lsr #12 @ r2<- B
7352 FETCH r1, 1 @ r1<- field byte offset
7353 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7354 ubfx r2, rINST, #8, #4 @ r2<- A
7355 cmp r3, #0 @ check object for null
7356 beq common_errNullObject @ object was null
7357 GET_VREG r0, r2 @ r0<- fp[A]
7358 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7359 strh r0, [r3, r1] @ obj.field<- r0
7360 GET_INST_OPCODE ip @ extract opcode from rINST
7361 GOTO_OPCODE ip @ jump to next instruction
7362
7363
7364/* ------------------------------ */
7365 .balign 128
7366.L_op_iget_boolean_quick: /* 0xef */
7367/* File: arm/op_iget_boolean_quick.S */
7368/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007369 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007370 /* op vA, vB, offset@CCCC */
7371 mov r2, rINST, lsr #12 @ r2<- B
7372 FETCH r1, 1 @ r1<- field byte offset
7373 GET_VREG r3, r2 @ r3<- object we're operating on
7374 ubfx r2, rINST, #8, #4 @ r2<- A
7375 cmp r3, #0 @ check object for null
7376 beq common_errNullObject @ object was null
7377 ldrb r0, [r3, r1] @ r0<- obj.field
7378 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007379 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007380 GET_INST_OPCODE ip @ extract opcode from rINST
7381 GOTO_OPCODE ip @ jump to next instruction
7382
7383
7384/* ------------------------------ */
7385 .balign 128
7386.L_op_iget_byte_quick: /* 0xf0 */
7387/* File: arm/op_iget_byte_quick.S */
7388/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007389 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007390 /* op vA, vB, offset@CCCC */
7391 mov r2, rINST, lsr #12 @ r2<- B
7392 FETCH r1, 1 @ r1<- field byte offset
7393 GET_VREG r3, r2 @ r3<- object we're operating on
7394 ubfx r2, rINST, #8, #4 @ r2<- A
7395 cmp r3, #0 @ check object for null
7396 beq common_errNullObject @ object was null
7397 ldrsb r0, [r3, r1] @ r0<- obj.field
7398 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007399 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007400 GET_INST_OPCODE ip @ extract opcode from rINST
7401 GOTO_OPCODE ip @ jump to next instruction
7402
7403
7404/* ------------------------------ */
7405 .balign 128
7406.L_op_iget_char_quick: /* 0xf1 */
7407/* File: arm/op_iget_char_quick.S */
7408/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007409 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007410 /* op vA, vB, offset@CCCC */
7411 mov r2, rINST, lsr #12 @ r2<- B
7412 FETCH r1, 1 @ r1<- field byte offset
7413 GET_VREG r3, r2 @ r3<- object we're operating on
7414 ubfx r2, rINST, #8, #4 @ r2<- A
7415 cmp r3, #0 @ check object for null
7416 beq common_errNullObject @ object was null
7417 ldrh r0, [r3, r1] @ r0<- obj.field
7418 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007419 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007420 GET_INST_OPCODE ip @ extract opcode from rINST
7421 GOTO_OPCODE ip @ jump to next instruction
7422
7423
7424/* ------------------------------ */
7425 .balign 128
7426.L_op_iget_short_quick: /* 0xf2 */
7427/* File: arm/op_iget_short_quick.S */
7428/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007429 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007430 /* op vA, vB, offset@CCCC */
7431 mov r2, rINST, lsr #12 @ r2<- B
7432 FETCH r1, 1 @ r1<- field byte offset
7433 GET_VREG r3, r2 @ r3<- object we're operating on
7434 ubfx r2, rINST, #8, #4 @ r2<- A
7435 cmp r3, #0 @ check object for null
7436 beq common_errNullObject @ object was null
7437 ldrsh r0, [r3, r1] @ r0<- obj.field
7438 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007439 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007440 GET_INST_OPCODE ip @ extract opcode from rINST
7441 GOTO_OPCODE ip @ jump to next instruction
7442
7443
7444/* ------------------------------ */
7445 .balign 128
7446.L_op_invoke_lambda: /* 0xf3 */
7447/* Transfer stub to alternate interpreter */
7448 b MterpFallback
7449
7450
7451/* ------------------------------ */
7452 .balign 128
7453.L_op_unused_f4: /* 0xf4 */
7454/* File: arm/op_unused_f4.S */
7455/* File: arm/unused.S */
7456/*
7457 * Bail to reference interpreter to throw.
7458 */
7459 b MterpFallback
7460
7461
7462/* ------------------------------ */
7463 .balign 128
7464.L_op_capture_variable: /* 0xf5 */
7465/* Transfer stub to alternate interpreter */
7466 b MterpFallback
7467
7468
7469/* ------------------------------ */
7470 .balign 128
7471.L_op_create_lambda: /* 0xf6 */
7472/* Transfer stub to alternate interpreter */
7473 b MterpFallback
7474
7475
7476/* ------------------------------ */
7477 .balign 128
7478.L_op_liberate_variable: /* 0xf7 */
7479/* Transfer stub to alternate interpreter */
7480 b MterpFallback
7481
7482
7483/* ------------------------------ */
7484 .balign 128
7485.L_op_box_lambda: /* 0xf8 */
7486/* Transfer stub to alternate interpreter */
7487 b MterpFallback
7488
7489
7490/* ------------------------------ */
7491 .balign 128
7492.L_op_unbox_lambda: /* 0xf9 */
7493/* Transfer stub to alternate interpreter */
7494 b MterpFallback
7495
7496
7497/* ------------------------------ */
7498 .balign 128
7499.L_op_unused_fa: /* 0xfa */
7500/* File: arm/op_unused_fa.S */
7501/* File: arm/unused.S */
7502/*
7503 * Bail to reference interpreter to throw.
7504 */
7505 b MterpFallback
7506
7507
7508/* ------------------------------ */
7509 .balign 128
7510.L_op_unused_fb: /* 0xfb */
7511/* File: arm/op_unused_fb.S */
7512/* File: arm/unused.S */
7513/*
7514 * Bail to reference interpreter to throw.
7515 */
7516 b MterpFallback
7517
7518
7519/* ------------------------------ */
7520 .balign 128
7521.L_op_unused_fc: /* 0xfc */
7522/* File: arm/op_unused_fc.S */
7523/* File: arm/unused.S */
7524/*
7525 * Bail to reference interpreter to throw.
7526 */
7527 b MterpFallback
7528
7529
7530/* ------------------------------ */
7531 .balign 128
7532.L_op_unused_fd: /* 0xfd */
7533/* File: arm/op_unused_fd.S */
7534/* File: arm/unused.S */
7535/*
7536 * Bail to reference interpreter to throw.
7537 */
7538 b MterpFallback
7539
7540
7541/* ------------------------------ */
7542 .balign 128
7543.L_op_unused_fe: /* 0xfe */
7544/* File: arm/op_unused_fe.S */
7545/* File: arm/unused.S */
7546/*
7547 * Bail to reference interpreter to throw.
7548 */
7549 b MterpFallback
7550
7551
7552/* ------------------------------ */
7553 .balign 128
7554.L_op_unused_ff: /* 0xff */
7555/* File: arm/op_unused_ff.S */
7556/* File: arm/unused.S */
7557/*
7558 * Bail to reference interpreter to throw.
7559 */
7560 b MterpFallback
7561
7562
7563 .balign 128
7564 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7565 .global artMterpAsmInstructionEnd
7566artMterpAsmInstructionEnd:
7567
7568/*
7569 * ===========================================================================
7570 * Sister implementations
7571 * ===========================================================================
7572 */
7573 .global artMterpAsmSisterStart
7574 .type artMterpAsmSisterStart, %function
7575 .text
7576 .balign 4
7577artMterpAsmSisterStart:
7578
7579/* continuation for op_cmp_long */
7580
7581.Lop_cmp_long_less:
7582 mvn r1, #0 @ r1<- -1
7583 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7584 @ instead, we just replicate the tail end.
7585 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7586 SET_VREG r1, r9 @ vAA<- r1
7587 GET_INST_OPCODE ip @ extract opcode from rINST
7588 GOTO_OPCODE ip @ jump to next instruction
7589
7590.Lop_cmp_long_greater:
7591 mov r1, #1 @ r1<- 1
7592 @ fall through to _finish
7593
7594.Lop_cmp_long_finish:
7595 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7596 SET_VREG r1, r9 @ vAA<- r1
7597 GET_INST_OPCODE ip @ extract opcode from rINST
7598 GOTO_OPCODE ip @ jump to next instruction
7599
7600/* continuation for op_float_to_long */
7601/*
7602 * Convert the float in r0 to a long in r0/r1.
7603 *
7604 * We have to clip values to long min/max per the specification. The
7605 * expected common case is a "reasonable" value that converts directly
7606 * to modest integer. The EABI convert function isn't doing this for us.
7607 */
7608f2l_doconv:
7609 stmfd sp!, {r4, lr}
7610 mov r1, #0x5f000000 @ (float)maxlong
7611 mov r4, r0
7612 bl __aeabi_fcmpge @ is arg >= maxlong?
7613 cmp r0, #0 @ nonzero == yes
7614 mvnne r0, #0 @ return maxlong (7fffffff)
7615 mvnne r1, #0x80000000
7616 ldmnefd sp!, {r4, pc}
7617
7618 mov r0, r4 @ recover arg
7619 mov r1, #0xdf000000 @ (float)minlong
7620 bl __aeabi_fcmple @ is arg <= minlong?
7621 cmp r0, #0 @ nonzero == yes
7622 movne r0, #0 @ return minlong (80000000)
7623 movne r1, #0x80000000
7624 ldmnefd sp!, {r4, pc}
7625
7626 mov r0, r4 @ recover arg
7627 mov r1, r4
7628 bl __aeabi_fcmpeq @ is arg == self?
7629 cmp r0, #0 @ zero == no
7630 moveq r1, #0 @ return zero for NaN
7631 ldmeqfd sp!, {r4, pc}
7632
7633 mov r0, r4 @ recover arg
7634 bl __aeabi_f2lz @ convert float to long
7635 ldmfd sp!, {r4, pc}
7636
7637/* continuation for op_double_to_long */
7638/*
7639 * Convert the double in r0/r1 to a long in r0/r1.
7640 *
7641 * We have to clip values to long min/max per the specification. The
7642 * expected common case is a "reasonable" value that converts directly
7643 * to modest integer. The EABI convert function isn't doing this for us.
7644 */
7645d2l_doconv:
7646 stmfd sp!, {r4, r5, lr} @ save regs
7647 mov r3, #0x43000000 @ maxlong, as a double (high word)
7648 add r3, #0x00e00000 @ 0x43e00000
7649 mov r2, #0 @ maxlong, as a double (low word)
7650 sub sp, sp, #4 @ align for EABI
7651 mov r4, r0 @ save a copy of r0
7652 mov r5, r1 @ and r1
7653 bl __aeabi_dcmpge @ is arg >= maxlong?
7654 cmp r0, #0 @ nonzero == yes
7655 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7656 mvnne r1, #0x80000000
7657 bne 1f
7658
7659 mov r0, r4 @ recover arg
7660 mov r1, r5
7661 mov r3, #0xc3000000 @ minlong, as a double (high word)
7662 add r3, #0x00e00000 @ 0xc3e00000
7663 mov r2, #0 @ minlong, as a double (low word)
7664 bl __aeabi_dcmple @ is arg <= minlong?
7665 cmp r0, #0 @ nonzero == yes
7666 movne r0, #0 @ return minlong (8000000000000000)
7667 movne r1, #0x80000000
7668 bne 1f
7669
7670 mov r0, r4 @ recover arg
7671 mov r1, r5
7672 mov r2, r4 @ compare against self
7673 mov r3, r5
7674 bl __aeabi_dcmpeq @ is arg == self?
7675 cmp r0, #0 @ zero == no
7676 moveq r1, #0 @ return zero for NaN
7677 beq 1f
7678
7679 mov r0, r4 @ recover arg
7680 mov r1, r5
7681 bl __aeabi_d2lz @ convert double to long
7682
76831:
7684 add sp, sp, #4
7685 ldmfd sp!, {r4, r5, pc}
7686
7687 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7688 .global artMterpAsmSisterEnd
7689artMterpAsmSisterEnd:
7690
7691
7692 .global artMterpAsmAltInstructionStart
7693 .type artMterpAsmAltInstructionStart, %function
7694 .text
7695
7696artMterpAsmAltInstructionStart = .L_ALT_op_nop
7697/* ------------------------------ */
7698 .balign 128
7699.L_ALT_op_nop: /* 0x00 */
7700/* File: arm/alt_stub.S */
7701/*
7702 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7703 * any interesting requests and then jump to the real instruction
7704 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7705 */
7706 .extern MterpCheckBefore
7707 EXPORT_PC
7708 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7709 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7710 mov r0, rSELF
7711 add r1, rFP, #OFF_FP_SHADOWFRAME
7712 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7713
7714/* ------------------------------ */
7715 .balign 128
7716.L_ALT_op_move: /* 0x01 */
7717/* File: arm/alt_stub.S */
7718/*
7719 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7720 * any interesting requests and then jump to the real instruction
7721 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7722 */
7723 .extern MterpCheckBefore
7724 EXPORT_PC
7725 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7726 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7727 mov r0, rSELF
7728 add r1, rFP, #OFF_FP_SHADOWFRAME
7729 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7730
7731/* ------------------------------ */
7732 .balign 128
7733.L_ALT_op_move_from16: /* 0x02 */
7734/* File: arm/alt_stub.S */
7735/*
7736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7737 * any interesting requests and then jump to the real instruction
7738 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7739 */
7740 .extern MterpCheckBefore
7741 EXPORT_PC
7742 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7743 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7744 mov r0, rSELF
7745 add r1, rFP, #OFF_FP_SHADOWFRAME
7746 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7747
7748/* ------------------------------ */
7749 .balign 128
7750.L_ALT_op_move_16: /* 0x03 */
7751/* File: arm/alt_stub.S */
7752/*
7753 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7754 * any interesting requests and then jump to the real instruction
7755 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7756 */
7757 .extern MterpCheckBefore
7758 EXPORT_PC
7759 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7760 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
7761 mov r0, rSELF
7762 add r1, rFP, #OFF_FP_SHADOWFRAME
7763 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7764
7765/* ------------------------------ */
7766 .balign 128
7767.L_ALT_op_move_wide: /* 0x04 */
7768/* File: arm/alt_stub.S */
7769/*
7770 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7771 * any interesting requests and then jump to the real instruction
7772 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7773 */
7774 .extern MterpCheckBefore
7775 EXPORT_PC
7776 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7777 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
7778 mov r0, rSELF
7779 add r1, rFP, #OFF_FP_SHADOWFRAME
7780 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7781
7782/* ------------------------------ */
7783 .balign 128
7784.L_ALT_op_move_wide_from16: /* 0x05 */
7785/* File: arm/alt_stub.S */
7786/*
7787 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7788 * any interesting requests and then jump to the real instruction
7789 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7790 */
7791 .extern MterpCheckBefore
7792 EXPORT_PC
7793 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7794 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
7795 mov r0, rSELF
7796 add r1, rFP, #OFF_FP_SHADOWFRAME
7797 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7798
7799/* ------------------------------ */
7800 .balign 128
7801.L_ALT_op_move_wide_16: /* 0x06 */
7802/* File: arm/alt_stub.S */
7803/*
7804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7805 * any interesting requests and then jump to the real instruction
7806 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7807 */
7808 .extern MterpCheckBefore
7809 EXPORT_PC
7810 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7811 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
7812 mov r0, rSELF
7813 add r1, rFP, #OFF_FP_SHADOWFRAME
7814 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7815
7816/* ------------------------------ */
7817 .balign 128
7818.L_ALT_op_move_object: /* 0x07 */
7819/* File: arm/alt_stub.S */
7820/*
7821 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7822 * any interesting requests and then jump to the real instruction
7823 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7824 */
7825 .extern MterpCheckBefore
7826 EXPORT_PC
7827 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7828 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
7829 mov r0, rSELF
7830 add r1, rFP, #OFF_FP_SHADOWFRAME
7831 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7832
7833/* ------------------------------ */
7834 .balign 128
7835.L_ALT_op_move_object_from16: /* 0x08 */
7836/* File: arm/alt_stub.S */
7837/*
7838 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7839 * any interesting requests and then jump to the real instruction
7840 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7841 */
7842 .extern MterpCheckBefore
7843 EXPORT_PC
7844 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7845 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
7846 mov r0, rSELF
7847 add r1, rFP, #OFF_FP_SHADOWFRAME
7848 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7849
7850/* ------------------------------ */
7851 .balign 128
7852.L_ALT_op_move_object_16: /* 0x09 */
7853/* File: arm/alt_stub.S */
7854/*
7855 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7856 * any interesting requests and then jump to the real instruction
7857 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7858 */
7859 .extern MterpCheckBefore
7860 EXPORT_PC
7861 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7862 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
7863 mov r0, rSELF
7864 add r1, rFP, #OFF_FP_SHADOWFRAME
7865 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7866
7867/* ------------------------------ */
7868 .balign 128
7869.L_ALT_op_move_result: /* 0x0a */
7870/* File: arm/alt_stub.S */
7871/*
7872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7873 * any interesting requests and then jump to the real instruction
7874 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7875 */
7876 .extern MterpCheckBefore
7877 EXPORT_PC
7878 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7879 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
7880 mov r0, rSELF
7881 add r1, rFP, #OFF_FP_SHADOWFRAME
7882 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7883
7884/* ------------------------------ */
7885 .balign 128
7886.L_ALT_op_move_result_wide: /* 0x0b */
7887/* File: arm/alt_stub.S */
7888/*
7889 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7890 * any interesting requests and then jump to the real instruction
7891 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7892 */
7893 .extern MterpCheckBefore
7894 EXPORT_PC
7895 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7896 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
7897 mov r0, rSELF
7898 add r1, rFP, #OFF_FP_SHADOWFRAME
7899 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7900
7901/* ------------------------------ */
7902 .balign 128
7903.L_ALT_op_move_result_object: /* 0x0c */
7904/* File: arm/alt_stub.S */
7905/*
7906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7907 * any interesting requests and then jump to the real instruction
7908 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7909 */
7910 .extern MterpCheckBefore
7911 EXPORT_PC
7912 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7913 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
7914 mov r0, rSELF
7915 add r1, rFP, #OFF_FP_SHADOWFRAME
7916 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7917
7918/* ------------------------------ */
7919 .balign 128
7920.L_ALT_op_move_exception: /* 0x0d */
7921/* File: arm/alt_stub.S */
7922/*
7923 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7924 * any interesting requests and then jump to the real instruction
7925 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7926 */
7927 .extern MterpCheckBefore
7928 EXPORT_PC
7929 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7930 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
7931 mov r0, rSELF
7932 add r1, rFP, #OFF_FP_SHADOWFRAME
7933 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7934
7935/* ------------------------------ */
7936 .balign 128
7937.L_ALT_op_return_void: /* 0x0e */
7938/* File: arm/alt_stub.S */
7939/*
7940 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7941 * any interesting requests and then jump to the real instruction
7942 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7943 */
7944 .extern MterpCheckBefore
7945 EXPORT_PC
7946 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7947 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
7948 mov r0, rSELF
7949 add r1, rFP, #OFF_FP_SHADOWFRAME
7950 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7951
7952/* ------------------------------ */
7953 .balign 128
7954.L_ALT_op_return: /* 0x0f */
7955/* File: arm/alt_stub.S */
7956/*
7957 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7958 * any interesting requests and then jump to the real instruction
7959 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7960 */
7961 .extern MterpCheckBefore
7962 EXPORT_PC
7963 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7964 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
7965 mov r0, rSELF
7966 add r1, rFP, #OFF_FP_SHADOWFRAME
7967 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7968
7969/* ------------------------------ */
7970 .balign 128
7971.L_ALT_op_return_wide: /* 0x10 */
7972/* File: arm/alt_stub.S */
7973/*
7974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7975 * any interesting requests and then jump to the real instruction
7976 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7977 */
7978 .extern MterpCheckBefore
7979 EXPORT_PC
7980 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7981 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
7982 mov r0, rSELF
7983 add r1, rFP, #OFF_FP_SHADOWFRAME
7984 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7985
7986/* ------------------------------ */
7987 .balign 128
7988.L_ALT_op_return_object: /* 0x11 */
7989/* File: arm/alt_stub.S */
7990/*
7991 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7992 * any interesting requests and then jump to the real instruction
7993 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7994 */
7995 .extern MterpCheckBefore
7996 EXPORT_PC
7997 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7998 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
7999 mov r0, rSELF
8000 add r1, rFP, #OFF_FP_SHADOWFRAME
8001 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8002
8003/* ------------------------------ */
8004 .balign 128
8005.L_ALT_op_const_4: /* 0x12 */
8006/* File: arm/alt_stub.S */
8007/*
8008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8009 * any interesting requests and then jump to the real instruction
8010 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8011 */
8012 .extern MterpCheckBefore
8013 EXPORT_PC
8014 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8015 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
8016 mov r0, rSELF
8017 add r1, rFP, #OFF_FP_SHADOWFRAME
8018 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8019
8020/* ------------------------------ */
8021 .balign 128
8022.L_ALT_op_const_16: /* 0x13 */
8023/* File: arm/alt_stub.S */
8024/*
8025 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8026 * any interesting requests and then jump to the real instruction
8027 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8028 */
8029 .extern MterpCheckBefore
8030 EXPORT_PC
8031 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8032 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8033 mov r0, rSELF
8034 add r1, rFP, #OFF_FP_SHADOWFRAME
8035 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8036
8037/* ------------------------------ */
8038 .balign 128
8039.L_ALT_op_const: /* 0x14 */
8040/* File: arm/alt_stub.S */
8041/*
8042 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8043 * any interesting requests and then jump to the real instruction
8044 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8045 */
8046 .extern MterpCheckBefore
8047 EXPORT_PC
8048 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8049 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8050 mov r0, rSELF
8051 add r1, rFP, #OFF_FP_SHADOWFRAME
8052 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8053
8054/* ------------------------------ */
8055 .balign 128
8056.L_ALT_op_const_high16: /* 0x15 */
8057/* File: arm/alt_stub.S */
8058/*
8059 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8060 * any interesting requests and then jump to the real instruction
8061 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8062 */
8063 .extern MterpCheckBefore
8064 EXPORT_PC
8065 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8066 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8067 mov r0, rSELF
8068 add r1, rFP, #OFF_FP_SHADOWFRAME
8069 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8070
8071/* ------------------------------ */
8072 .balign 128
8073.L_ALT_op_const_wide_16: /* 0x16 */
8074/* File: arm/alt_stub.S */
8075/*
8076 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8077 * any interesting requests and then jump to the real instruction
8078 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8079 */
8080 .extern MterpCheckBefore
8081 EXPORT_PC
8082 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8083 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8084 mov r0, rSELF
8085 add r1, rFP, #OFF_FP_SHADOWFRAME
8086 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8087
8088/* ------------------------------ */
8089 .balign 128
8090.L_ALT_op_const_wide_32: /* 0x17 */
8091/* File: arm/alt_stub.S */
8092/*
8093 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8094 * any interesting requests and then jump to the real instruction
8095 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8096 */
8097 .extern MterpCheckBefore
8098 EXPORT_PC
8099 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8100 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8101 mov r0, rSELF
8102 add r1, rFP, #OFF_FP_SHADOWFRAME
8103 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8104
8105/* ------------------------------ */
8106 .balign 128
8107.L_ALT_op_const_wide: /* 0x18 */
8108/* File: arm/alt_stub.S */
8109/*
8110 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8111 * any interesting requests and then jump to the real instruction
8112 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8113 */
8114 .extern MterpCheckBefore
8115 EXPORT_PC
8116 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8117 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8118 mov r0, rSELF
8119 add r1, rFP, #OFF_FP_SHADOWFRAME
8120 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8121
8122/* ------------------------------ */
8123 .balign 128
8124.L_ALT_op_const_wide_high16: /* 0x19 */
8125/* File: arm/alt_stub.S */
8126/*
8127 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8128 * any interesting requests and then jump to the real instruction
8129 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8130 */
8131 .extern MterpCheckBefore
8132 EXPORT_PC
8133 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8134 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8135 mov r0, rSELF
8136 add r1, rFP, #OFF_FP_SHADOWFRAME
8137 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8138
8139/* ------------------------------ */
8140 .balign 128
8141.L_ALT_op_const_string: /* 0x1a */
8142/* File: arm/alt_stub.S */
8143/*
8144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8145 * any interesting requests and then jump to the real instruction
8146 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8147 */
8148 .extern MterpCheckBefore
8149 EXPORT_PC
8150 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8151 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8152 mov r0, rSELF
8153 add r1, rFP, #OFF_FP_SHADOWFRAME
8154 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8155
8156/* ------------------------------ */
8157 .balign 128
8158.L_ALT_op_const_string_jumbo: /* 0x1b */
8159/* File: arm/alt_stub.S */
8160/*
8161 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8162 * any interesting requests and then jump to the real instruction
8163 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8164 */
8165 .extern MterpCheckBefore
8166 EXPORT_PC
8167 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8168 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8169 mov r0, rSELF
8170 add r1, rFP, #OFF_FP_SHADOWFRAME
8171 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8172
8173/* ------------------------------ */
8174 .balign 128
8175.L_ALT_op_const_class: /* 0x1c */
8176/* File: arm/alt_stub.S */
8177/*
8178 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8179 * any interesting requests and then jump to the real instruction
8180 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8181 */
8182 .extern MterpCheckBefore
8183 EXPORT_PC
8184 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8185 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8186 mov r0, rSELF
8187 add r1, rFP, #OFF_FP_SHADOWFRAME
8188 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8189
8190/* ------------------------------ */
8191 .balign 128
8192.L_ALT_op_monitor_enter: /* 0x1d */
8193/* File: arm/alt_stub.S */
8194/*
8195 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8196 * any interesting requests and then jump to the real instruction
8197 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8198 */
8199 .extern MterpCheckBefore
8200 EXPORT_PC
8201 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8202 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8203 mov r0, rSELF
8204 add r1, rFP, #OFF_FP_SHADOWFRAME
8205 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8206
8207/* ------------------------------ */
8208 .balign 128
8209.L_ALT_op_monitor_exit: /* 0x1e */
8210/* File: arm/alt_stub.S */
8211/*
8212 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8213 * any interesting requests and then jump to the real instruction
8214 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8215 */
8216 .extern MterpCheckBefore
8217 EXPORT_PC
8218 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8219 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8220 mov r0, rSELF
8221 add r1, rFP, #OFF_FP_SHADOWFRAME
8222 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8223
8224/* ------------------------------ */
8225 .balign 128
8226.L_ALT_op_check_cast: /* 0x1f */
8227/* File: arm/alt_stub.S */
8228/*
8229 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8230 * any interesting requests and then jump to the real instruction
8231 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8232 */
8233 .extern MterpCheckBefore
8234 EXPORT_PC
8235 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8236 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8237 mov r0, rSELF
8238 add r1, rFP, #OFF_FP_SHADOWFRAME
8239 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8240
8241/* ------------------------------ */
8242 .balign 128
8243.L_ALT_op_instance_of: /* 0x20 */
8244/* File: arm/alt_stub.S */
8245/*
8246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8247 * any interesting requests and then jump to the real instruction
8248 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8249 */
8250 .extern MterpCheckBefore
8251 EXPORT_PC
8252 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8253 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8254 mov r0, rSELF
8255 add r1, rFP, #OFF_FP_SHADOWFRAME
8256 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8257
8258/* ------------------------------ */
8259 .balign 128
8260.L_ALT_op_array_length: /* 0x21 */
8261/* File: arm/alt_stub.S */
8262/*
8263 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8264 * any interesting requests and then jump to the real instruction
8265 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8266 */
8267 .extern MterpCheckBefore
8268 EXPORT_PC
8269 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8270 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8271 mov r0, rSELF
8272 add r1, rFP, #OFF_FP_SHADOWFRAME
8273 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8274
8275/* ------------------------------ */
8276 .balign 128
8277.L_ALT_op_new_instance: /* 0x22 */
8278/* File: arm/alt_stub.S */
8279/*
8280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8281 * any interesting requests and then jump to the real instruction
8282 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8283 */
8284 .extern MterpCheckBefore
8285 EXPORT_PC
8286 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8287 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8288 mov r0, rSELF
8289 add r1, rFP, #OFF_FP_SHADOWFRAME
8290 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8291
8292/* ------------------------------ */
8293 .balign 128
8294.L_ALT_op_new_array: /* 0x23 */
8295/* File: arm/alt_stub.S */
8296/*
8297 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8298 * any interesting requests and then jump to the real instruction
8299 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8300 */
8301 .extern MterpCheckBefore
8302 EXPORT_PC
8303 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8304 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8305 mov r0, rSELF
8306 add r1, rFP, #OFF_FP_SHADOWFRAME
8307 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8308
8309/* ------------------------------ */
8310 .balign 128
8311.L_ALT_op_filled_new_array: /* 0x24 */
8312/* File: arm/alt_stub.S */
8313/*
8314 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8315 * any interesting requests and then jump to the real instruction
8316 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8317 */
8318 .extern MterpCheckBefore
8319 EXPORT_PC
8320 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8321 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8322 mov r0, rSELF
8323 add r1, rFP, #OFF_FP_SHADOWFRAME
8324 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8325
8326/* ------------------------------ */
8327 .balign 128
8328.L_ALT_op_filled_new_array_range: /* 0x25 */
8329/* File: arm/alt_stub.S */
8330/*
8331 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8332 * any interesting requests and then jump to the real instruction
8333 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8334 */
8335 .extern MterpCheckBefore
8336 EXPORT_PC
8337 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8338 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8339 mov r0, rSELF
8340 add r1, rFP, #OFF_FP_SHADOWFRAME
8341 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8342
8343/* ------------------------------ */
8344 .balign 128
8345.L_ALT_op_fill_array_data: /* 0x26 */
8346/* File: arm/alt_stub.S */
8347/*
8348 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8349 * any interesting requests and then jump to the real instruction
8350 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8351 */
8352 .extern MterpCheckBefore
8353 EXPORT_PC
8354 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8355 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8356 mov r0, rSELF
8357 add r1, rFP, #OFF_FP_SHADOWFRAME
8358 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8359
8360/* ------------------------------ */
8361 .balign 128
8362.L_ALT_op_throw: /* 0x27 */
8363/* File: arm/alt_stub.S */
8364/*
8365 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8366 * any interesting requests and then jump to the real instruction
8367 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8368 */
8369 .extern MterpCheckBefore
8370 EXPORT_PC
8371 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8372 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8373 mov r0, rSELF
8374 add r1, rFP, #OFF_FP_SHADOWFRAME
8375 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8376
8377/* ------------------------------ */
8378 .balign 128
8379.L_ALT_op_goto: /* 0x28 */
8380/* File: arm/alt_stub.S */
8381/*
8382 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8383 * any interesting requests and then jump to the real instruction
8384 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8385 */
8386 .extern MterpCheckBefore
8387 EXPORT_PC
8388 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8389 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8390 mov r0, rSELF
8391 add r1, rFP, #OFF_FP_SHADOWFRAME
8392 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8393
8394/* ------------------------------ */
8395 .balign 128
8396.L_ALT_op_goto_16: /* 0x29 */
8397/* File: arm/alt_stub.S */
8398/*
8399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8400 * any interesting requests and then jump to the real instruction
8401 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8402 */
8403 .extern MterpCheckBefore
8404 EXPORT_PC
8405 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8406 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8407 mov r0, rSELF
8408 add r1, rFP, #OFF_FP_SHADOWFRAME
8409 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8410
8411/* ------------------------------ */
8412 .balign 128
8413.L_ALT_op_goto_32: /* 0x2a */
8414/* File: arm/alt_stub.S */
8415/*
8416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8417 * any interesting requests and then jump to the real instruction
8418 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8419 */
8420 .extern MterpCheckBefore
8421 EXPORT_PC
8422 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8423 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8424 mov r0, rSELF
8425 add r1, rFP, #OFF_FP_SHADOWFRAME
8426 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8427
8428/* ------------------------------ */
8429 .balign 128
8430.L_ALT_op_packed_switch: /* 0x2b */
8431/* File: arm/alt_stub.S */
8432/*
8433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8434 * any interesting requests and then jump to the real instruction
8435 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8436 */
8437 .extern MterpCheckBefore
8438 EXPORT_PC
8439 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8440 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8441 mov r0, rSELF
8442 add r1, rFP, #OFF_FP_SHADOWFRAME
8443 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8444
8445/* ------------------------------ */
8446 .balign 128
8447.L_ALT_op_sparse_switch: /* 0x2c */
8448/* File: arm/alt_stub.S */
8449/*
8450 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8451 * any interesting requests and then jump to the real instruction
8452 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8453 */
8454 .extern MterpCheckBefore
8455 EXPORT_PC
8456 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8457 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8458 mov r0, rSELF
8459 add r1, rFP, #OFF_FP_SHADOWFRAME
8460 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8461
8462/* ------------------------------ */
8463 .balign 128
8464.L_ALT_op_cmpl_float: /* 0x2d */
8465/* File: arm/alt_stub.S */
8466/*
8467 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8468 * any interesting requests and then jump to the real instruction
8469 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8470 */
8471 .extern MterpCheckBefore
8472 EXPORT_PC
8473 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8474 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8475 mov r0, rSELF
8476 add r1, rFP, #OFF_FP_SHADOWFRAME
8477 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8478
8479/* ------------------------------ */
8480 .balign 128
8481.L_ALT_op_cmpg_float: /* 0x2e */
8482/* File: arm/alt_stub.S */
8483/*
8484 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8485 * any interesting requests and then jump to the real instruction
8486 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8487 */
8488 .extern MterpCheckBefore
8489 EXPORT_PC
8490 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8491 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8492 mov r0, rSELF
8493 add r1, rFP, #OFF_FP_SHADOWFRAME
8494 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8495
8496/* ------------------------------ */
8497 .balign 128
8498.L_ALT_op_cmpl_double: /* 0x2f */
8499/* File: arm/alt_stub.S */
8500/*
8501 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8502 * any interesting requests and then jump to the real instruction
8503 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8504 */
8505 .extern MterpCheckBefore
8506 EXPORT_PC
8507 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8508 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8509 mov r0, rSELF
8510 add r1, rFP, #OFF_FP_SHADOWFRAME
8511 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8512
8513/* ------------------------------ */
8514 .balign 128
8515.L_ALT_op_cmpg_double: /* 0x30 */
8516/* File: arm/alt_stub.S */
8517/*
8518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8519 * any interesting requests and then jump to the real instruction
8520 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8521 */
8522 .extern MterpCheckBefore
8523 EXPORT_PC
8524 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8525 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8526 mov r0, rSELF
8527 add r1, rFP, #OFF_FP_SHADOWFRAME
8528 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8529
8530/* ------------------------------ */
8531 .balign 128
8532.L_ALT_op_cmp_long: /* 0x31 */
8533/* File: arm/alt_stub.S */
8534/*
8535 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8536 * any interesting requests and then jump to the real instruction
8537 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8538 */
8539 .extern MterpCheckBefore
8540 EXPORT_PC
8541 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8542 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8543 mov r0, rSELF
8544 add r1, rFP, #OFF_FP_SHADOWFRAME
8545 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8546
8547/* ------------------------------ */
8548 .balign 128
8549.L_ALT_op_if_eq: /* 0x32 */
8550/* File: arm/alt_stub.S */
8551/*
8552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8553 * any interesting requests and then jump to the real instruction
8554 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8555 */
8556 .extern MterpCheckBefore
8557 EXPORT_PC
8558 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8559 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8560 mov r0, rSELF
8561 add r1, rFP, #OFF_FP_SHADOWFRAME
8562 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8563
8564/* ------------------------------ */
8565 .balign 128
8566.L_ALT_op_if_ne: /* 0x33 */
8567/* File: arm/alt_stub.S */
8568/*
8569 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8570 * any interesting requests and then jump to the real instruction
8571 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8572 */
8573 .extern MterpCheckBefore
8574 EXPORT_PC
8575 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8576 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8577 mov r0, rSELF
8578 add r1, rFP, #OFF_FP_SHADOWFRAME
8579 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8580
8581/* ------------------------------ */
8582 .balign 128
8583.L_ALT_op_if_lt: /* 0x34 */
8584/* File: arm/alt_stub.S */
8585/*
8586 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8587 * any interesting requests and then jump to the real instruction
8588 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8589 */
8590 .extern MterpCheckBefore
8591 EXPORT_PC
8592 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8593 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8594 mov r0, rSELF
8595 add r1, rFP, #OFF_FP_SHADOWFRAME
8596 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8597
8598/* ------------------------------ */
8599 .balign 128
8600.L_ALT_op_if_ge: /* 0x35 */
8601/* File: arm/alt_stub.S */
8602/*
8603 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8604 * any interesting requests and then jump to the real instruction
8605 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8606 */
8607 .extern MterpCheckBefore
8608 EXPORT_PC
8609 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8610 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8611 mov r0, rSELF
8612 add r1, rFP, #OFF_FP_SHADOWFRAME
8613 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8614
8615/* ------------------------------ */
8616 .balign 128
8617.L_ALT_op_if_gt: /* 0x36 */
8618/* File: arm/alt_stub.S */
8619/*
8620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8621 * any interesting requests and then jump to the real instruction
8622 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8623 */
8624 .extern MterpCheckBefore
8625 EXPORT_PC
8626 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8627 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8628 mov r0, rSELF
8629 add r1, rFP, #OFF_FP_SHADOWFRAME
8630 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8631
8632/* ------------------------------ */
8633 .balign 128
8634.L_ALT_op_if_le: /* 0x37 */
8635/* File: arm/alt_stub.S */
8636/*
8637 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8638 * any interesting requests and then jump to the real instruction
8639 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8640 */
8641 .extern MterpCheckBefore
8642 EXPORT_PC
8643 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8644 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8645 mov r0, rSELF
8646 add r1, rFP, #OFF_FP_SHADOWFRAME
8647 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8648
8649/* ------------------------------ */
8650 .balign 128
8651.L_ALT_op_if_eqz: /* 0x38 */
8652/* File: arm/alt_stub.S */
8653/*
8654 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8655 * any interesting requests and then jump to the real instruction
8656 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8657 */
8658 .extern MterpCheckBefore
8659 EXPORT_PC
8660 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8661 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8662 mov r0, rSELF
8663 add r1, rFP, #OFF_FP_SHADOWFRAME
8664 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8665
8666/* ------------------------------ */
8667 .balign 128
8668.L_ALT_op_if_nez: /* 0x39 */
8669/* File: arm/alt_stub.S */
8670/*
8671 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8672 * any interesting requests and then jump to the real instruction
8673 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8674 */
8675 .extern MterpCheckBefore
8676 EXPORT_PC
8677 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8678 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8679 mov r0, rSELF
8680 add r1, rFP, #OFF_FP_SHADOWFRAME
8681 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8682
8683/* ------------------------------ */
8684 .balign 128
8685.L_ALT_op_if_ltz: /* 0x3a */
8686/* File: arm/alt_stub.S */
8687/*
8688 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8689 * any interesting requests and then jump to the real instruction
8690 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8691 */
8692 .extern MterpCheckBefore
8693 EXPORT_PC
8694 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8695 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8696 mov r0, rSELF
8697 add r1, rFP, #OFF_FP_SHADOWFRAME
8698 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8699
8700/* ------------------------------ */
8701 .balign 128
8702.L_ALT_op_if_gez: /* 0x3b */
8703/* File: arm/alt_stub.S */
8704/*
8705 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8706 * any interesting requests and then jump to the real instruction
8707 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8708 */
8709 .extern MterpCheckBefore
8710 EXPORT_PC
8711 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8712 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8713 mov r0, rSELF
8714 add r1, rFP, #OFF_FP_SHADOWFRAME
8715 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8716
8717/* ------------------------------ */
8718 .balign 128
8719.L_ALT_op_if_gtz: /* 0x3c */
8720/* File: arm/alt_stub.S */
8721/*
8722 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8723 * any interesting requests and then jump to the real instruction
8724 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8725 */
8726 .extern MterpCheckBefore
8727 EXPORT_PC
8728 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8729 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8730 mov r0, rSELF
8731 add r1, rFP, #OFF_FP_SHADOWFRAME
8732 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8733
8734/* ------------------------------ */
8735 .balign 128
8736.L_ALT_op_if_lez: /* 0x3d */
8737/* File: arm/alt_stub.S */
8738/*
8739 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8740 * any interesting requests and then jump to the real instruction
8741 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8742 */
8743 .extern MterpCheckBefore
8744 EXPORT_PC
8745 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8746 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8747 mov r0, rSELF
8748 add r1, rFP, #OFF_FP_SHADOWFRAME
8749 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8750
8751/* ------------------------------ */
8752 .balign 128
8753.L_ALT_op_unused_3e: /* 0x3e */
8754/* File: arm/alt_stub.S */
8755/*
8756 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8757 * any interesting requests and then jump to the real instruction
8758 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8759 */
8760 .extern MterpCheckBefore
8761 EXPORT_PC
8762 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8763 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
8764 mov r0, rSELF
8765 add r1, rFP, #OFF_FP_SHADOWFRAME
8766 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8767
8768/* ------------------------------ */
8769 .balign 128
8770.L_ALT_op_unused_3f: /* 0x3f */
8771/* File: arm/alt_stub.S */
8772/*
8773 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8774 * any interesting requests and then jump to the real instruction
8775 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8776 */
8777 .extern MterpCheckBefore
8778 EXPORT_PC
8779 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8780 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
8781 mov r0, rSELF
8782 add r1, rFP, #OFF_FP_SHADOWFRAME
8783 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8784
8785/* ------------------------------ */
8786 .balign 128
8787.L_ALT_op_unused_40: /* 0x40 */
8788/* File: arm/alt_stub.S */
8789/*
8790 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8791 * any interesting requests and then jump to the real instruction
8792 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8793 */
8794 .extern MterpCheckBefore
8795 EXPORT_PC
8796 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8797 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
8798 mov r0, rSELF
8799 add r1, rFP, #OFF_FP_SHADOWFRAME
8800 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8801
8802/* ------------------------------ */
8803 .balign 128
8804.L_ALT_op_unused_41: /* 0x41 */
8805/* File: arm/alt_stub.S */
8806/*
8807 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8808 * any interesting requests and then jump to the real instruction
8809 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8810 */
8811 .extern MterpCheckBefore
8812 EXPORT_PC
8813 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8814 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
8815 mov r0, rSELF
8816 add r1, rFP, #OFF_FP_SHADOWFRAME
8817 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8818
8819/* ------------------------------ */
8820 .balign 128
8821.L_ALT_op_unused_42: /* 0x42 */
8822/* File: arm/alt_stub.S */
8823/*
8824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8825 * any interesting requests and then jump to the real instruction
8826 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8827 */
8828 .extern MterpCheckBefore
8829 EXPORT_PC
8830 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8831 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
8832 mov r0, rSELF
8833 add r1, rFP, #OFF_FP_SHADOWFRAME
8834 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8835
8836/* ------------------------------ */
8837 .balign 128
8838.L_ALT_op_unused_43: /* 0x43 */
8839/* File: arm/alt_stub.S */
8840/*
8841 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8842 * any interesting requests and then jump to the real instruction
8843 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8844 */
8845 .extern MterpCheckBefore
8846 EXPORT_PC
8847 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8848 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
8849 mov r0, rSELF
8850 add r1, rFP, #OFF_FP_SHADOWFRAME
8851 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8852
8853/* ------------------------------ */
8854 .balign 128
8855.L_ALT_op_aget: /* 0x44 */
8856/* File: arm/alt_stub.S */
8857/*
8858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8859 * any interesting requests and then jump to the real instruction
8860 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8861 */
8862 .extern MterpCheckBefore
8863 EXPORT_PC
8864 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8865 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
8866 mov r0, rSELF
8867 add r1, rFP, #OFF_FP_SHADOWFRAME
8868 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8869
8870/* ------------------------------ */
8871 .balign 128
8872.L_ALT_op_aget_wide: /* 0x45 */
8873/* File: arm/alt_stub.S */
8874/*
8875 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8876 * any interesting requests and then jump to the real instruction
8877 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8878 */
8879 .extern MterpCheckBefore
8880 EXPORT_PC
8881 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8882 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
8883 mov r0, rSELF
8884 add r1, rFP, #OFF_FP_SHADOWFRAME
8885 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8886
8887/* ------------------------------ */
8888 .balign 128
8889.L_ALT_op_aget_object: /* 0x46 */
8890/* File: arm/alt_stub.S */
8891/*
8892 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8893 * any interesting requests and then jump to the real instruction
8894 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8895 */
8896 .extern MterpCheckBefore
8897 EXPORT_PC
8898 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8899 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
8900 mov r0, rSELF
8901 add r1, rFP, #OFF_FP_SHADOWFRAME
8902 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8903
8904/* ------------------------------ */
8905 .balign 128
8906.L_ALT_op_aget_boolean: /* 0x47 */
8907/* File: arm/alt_stub.S */
8908/*
8909 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8910 * any interesting requests and then jump to the real instruction
8911 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8912 */
8913 .extern MterpCheckBefore
8914 EXPORT_PC
8915 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8916 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
8917 mov r0, rSELF
8918 add r1, rFP, #OFF_FP_SHADOWFRAME
8919 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8920
8921/* ------------------------------ */
8922 .balign 128
8923.L_ALT_op_aget_byte: /* 0x48 */
8924/* File: arm/alt_stub.S */
8925/*
8926 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8927 * any interesting requests and then jump to the real instruction
8928 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8929 */
8930 .extern MterpCheckBefore
8931 EXPORT_PC
8932 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8933 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
8934 mov r0, rSELF
8935 add r1, rFP, #OFF_FP_SHADOWFRAME
8936 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8937
8938/* ------------------------------ */
8939 .balign 128
8940.L_ALT_op_aget_char: /* 0x49 */
8941/* File: arm/alt_stub.S */
8942/*
8943 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8944 * any interesting requests and then jump to the real instruction
8945 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8946 */
8947 .extern MterpCheckBefore
8948 EXPORT_PC
8949 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8950 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
8951 mov r0, rSELF
8952 add r1, rFP, #OFF_FP_SHADOWFRAME
8953 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8954
8955/* ------------------------------ */
8956 .balign 128
8957.L_ALT_op_aget_short: /* 0x4a */
8958/* File: arm/alt_stub.S */
8959/*
8960 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8961 * any interesting requests and then jump to the real instruction
8962 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8963 */
8964 .extern MterpCheckBefore
8965 EXPORT_PC
8966 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8967 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
8968 mov r0, rSELF
8969 add r1, rFP, #OFF_FP_SHADOWFRAME
8970 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8971
8972/* ------------------------------ */
8973 .balign 128
8974.L_ALT_op_aput: /* 0x4b */
8975/* File: arm/alt_stub.S */
8976/*
8977 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8978 * any interesting requests and then jump to the real instruction
8979 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8980 */
8981 .extern MterpCheckBefore
8982 EXPORT_PC
8983 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8984 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
8985 mov r0, rSELF
8986 add r1, rFP, #OFF_FP_SHADOWFRAME
8987 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8988
8989/* ------------------------------ */
8990 .balign 128
8991.L_ALT_op_aput_wide: /* 0x4c */
8992/* File: arm/alt_stub.S */
8993/*
8994 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8995 * any interesting requests and then jump to the real instruction
8996 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8997 */
8998 .extern MterpCheckBefore
8999 EXPORT_PC
9000 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9001 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
9002 mov r0, rSELF
9003 add r1, rFP, #OFF_FP_SHADOWFRAME
9004 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9005
9006/* ------------------------------ */
9007 .balign 128
9008.L_ALT_op_aput_object: /* 0x4d */
9009/* File: arm/alt_stub.S */
9010/*
9011 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9012 * any interesting requests and then jump to the real instruction
9013 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9014 */
9015 .extern MterpCheckBefore
9016 EXPORT_PC
9017 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9018 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
9019 mov r0, rSELF
9020 add r1, rFP, #OFF_FP_SHADOWFRAME
9021 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9022
9023/* ------------------------------ */
9024 .balign 128
9025.L_ALT_op_aput_boolean: /* 0x4e */
9026/* File: arm/alt_stub.S */
9027/*
9028 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9029 * any interesting requests and then jump to the real instruction
9030 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9031 */
9032 .extern MterpCheckBefore
9033 EXPORT_PC
9034 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9035 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9036 mov r0, rSELF
9037 add r1, rFP, #OFF_FP_SHADOWFRAME
9038 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9039
9040/* ------------------------------ */
9041 .balign 128
9042.L_ALT_op_aput_byte: /* 0x4f */
9043/* File: arm/alt_stub.S */
9044/*
9045 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9046 * any interesting requests and then jump to the real instruction
9047 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9048 */
9049 .extern MterpCheckBefore
9050 EXPORT_PC
9051 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9052 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9053 mov r0, rSELF
9054 add r1, rFP, #OFF_FP_SHADOWFRAME
9055 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9056
9057/* ------------------------------ */
9058 .balign 128
9059.L_ALT_op_aput_char: /* 0x50 */
9060/* File: arm/alt_stub.S */
9061/*
9062 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9063 * any interesting requests and then jump to the real instruction
9064 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9065 */
9066 .extern MterpCheckBefore
9067 EXPORT_PC
9068 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9069 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9070 mov r0, rSELF
9071 add r1, rFP, #OFF_FP_SHADOWFRAME
9072 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9073
9074/* ------------------------------ */
9075 .balign 128
9076.L_ALT_op_aput_short: /* 0x51 */
9077/* File: arm/alt_stub.S */
9078/*
9079 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9080 * any interesting requests and then jump to the real instruction
9081 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9082 */
9083 .extern MterpCheckBefore
9084 EXPORT_PC
9085 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9086 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9087 mov r0, rSELF
9088 add r1, rFP, #OFF_FP_SHADOWFRAME
9089 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9090
9091/* ------------------------------ */
9092 .balign 128
9093.L_ALT_op_iget: /* 0x52 */
9094/* File: arm/alt_stub.S */
9095/*
9096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9097 * any interesting requests and then jump to the real instruction
9098 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9099 */
9100 .extern MterpCheckBefore
9101 EXPORT_PC
9102 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9103 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9104 mov r0, rSELF
9105 add r1, rFP, #OFF_FP_SHADOWFRAME
9106 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9107
9108/* ------------------------------ */
9109 .balign 128
9110.L_ALT_op_iget_wide: /* 0x53 */
9111/* File: arm/alt_stub.S */
9112/*
9113 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9114 * any interesting requests and then jump to the real instruction
9115 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9116 */
9117 .extern MterpCheckBefore
9118 EXPORT_PC
9119 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9120 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9121 mov r0, rSELF
9122 add r1, rFP, #OFF_FP_SHADOWFRAME
9123 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9124
9125/* ------------------------------ */
9126 .balign 128
9127.L_ALT_op_iget_object: /* 0x54 */
9128/* File: arm/alt_stub.S */
9129/*
9130 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9131 * any interesting requests and then jump to the real instruction
9132 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9133 */
9134 .extern MterpCheckBefore
9135 EXPORT_PC
9136 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9137 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9138 mov r0, rSELF
9139 add r1, rFP, #OFF_FP_SHADOWFRAME
9140 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9141
9142/* ------------------------------ */
9143 .balign 128
9144.L_ALT_op_iget_boolean: /* 0x55 */
9145/* File: arm/alt_stub.S */
9146/*
9147 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9148 * any interesting requests and then jump to the real instruction
9149 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9150 */
9151 .extern MterpCheckBefore
9152 EXPORT_PC
9153 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9154 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9155 mov r0, rSELF
9156 add r1, rFP, #OFF_FP_SHADOWFRAME
9157 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9158
9159/* ------------------------------ */
9160 .balign 128
9161.L_ALT_op_iget_byte: /* 0x56 */
9162/* File: arm/alt_stub.S */
9163/*
9164 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9165 * any interesting requests and then jump to the real instruction
9166 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9167 */
9168 .extern MterpCheckBefore
9169 EXPORT_PC
9170 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9171 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9172 mov r0, rSELF
9173 add r1, rFP, #OFF_FP_SHADOWFRAME
9174 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9175
9176/* ------------------------------ */
9177 .balign 128
9178.L_ALT_op_iget_char: /* 0x57 */
9179/* File: arm/alt_stub.S */
9180/*
9181 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9182 * any interesting requests and then jump to the real instruction
9183 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9184 */
9185 .extern MterpCheckBefore
9186 EXPORT_PC
9187 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9188 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9189 mov r0, rSELF
9190 add r1, rFP, #OFF_FP_SHADOWFRAME
9191 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9192
9193/* ------------------------------ */
9194 .balign 128
9195.L_ALT_op_iget_short: /* 0x58 */
9196/* File: arm/alt_stub.S */
9197/*
9198 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9199 * any interesting requests and then jump to the real instruction
9200 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9201 */
9202 .extern MterpCheckBefore
9203 EXPORT_PC
9204 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9205 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9206 mov r0, rSELF
9207 add r1, rFP, #OFF_FP_SHADOWFRAME
9208 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9209
9210/* ------------------------------ */
9211 .balign 128
9212.L_ALT_op_iput: /* 0x59 */
9213/* File: arm/alt_stub.S */
9214/*
9215 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9216 * any interesting requests and then jump to the real instruction
9217 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9218 */
9219 .extern MterpCheckBefore
9220 EXPORT_PC
9221 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9222 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9223 mov r0, rSELF
9224 add r1, rFP, #OFF_FP_SHADOWFRAME
9225 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9226
9227/* ------------------------------ */
9228 .balign 128
9229.L_ALT_op_iput_wide: /* 0x5a */
9230/* File: arm/alt_stub.S */
9231/*
9232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9233 * any interesting requests and then jump to the real instruction
9234 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9235 */
9236 .extern MterpCheckBefore
9237 EXPORT_PC
9238 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9239 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9240 mov r0, rSELF
9241 add r1, rFP, #OFF_FP_SHADOWFRAME
9242 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9243
9244/* ------------------------------ */
9245 .balign 128
9246.L_ALT_op_iput_object: /* 0x5b */
9247/* File: arm/alt_stub.S */
9248/*
9249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9250 * any interesting requests and then jump to the real instruction
9251 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9252 */
9253 .extern MterpCheckBefore
9254 EXPORT_PC
9255 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9256 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9257 mov r0, rSELF
9258 add r1, rFP, #OFF_FP_SHADOWFRAME
9259 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9260
9261/* ------------------------------ */
9262 .balign 128
9263.L_ALT_op_iput_boolean: /* 0x5c */
9264/* File: arm/alt_stub.S */
9265/*
9266 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9267 * any interesting requests and then jump to the real instruction
9268 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9269 */
9270 .extern MterpCheckBefore
9271 EXPORT_PC
9272 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9273 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9274 mov r0, rSELF
9275 add r1, rFP, #OFF_FP_SHADOWFRAME
9276 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9277
9278/* ------------------------------ */
9279 .balign 128
9280.L_ALT_op_iput_byte: /* 0x5d */
9281/* File: arm/alt_stub.S */
9282/*
9283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9284 * any interesting requests and then jump to the real instruction
9285 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9286 */
9287 .extern MterpCheckBefore
9288 EXPORT_PC
9289 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9290 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9291 mov r0, rSELF
9292 add r1, rFP, #OFF_FP_SHADOWFRAME
9293 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9294
9295/* ------------------------------ */
9296 .balign 128
9297.L_ALT_op_iput_char: /* 0x5e */
9298/* File: arm/alt_stub.S */
9299/*
9300 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9301 * any interesting requests and then jump to the real instruction
9302 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9303 */
9304 .extern MterpCheckBefore
9305 EXPORT_PC
9306 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9307 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9308 mov r0, rSELF
9309 add r1, rFP, #OFF_FP_SHADOWFRAME
9310 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9311
9312/* ------------------------------ */
9313 .balign 128
9314.L_ALT_op_iput_short: /* 0x5f */
9315/* File: arm/alt_stub.S */
9316/*
9317 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9318 * any interesting requests and then jump to the real instruction
9319 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9320 */
9321 .extern MterpCheckBefore
9322 EXPORT_PC
9323 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9324 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9325 mov r0, rSELF
9326 add r1, rFP, #OFF_FP_SHADOWFRAME
9327 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9328
9329/* ------------------------------ */
9330 .balign 128
9331.L_ALT_op_sget: /* 0x60 */
9332/* File: arm/alt_stub.S */
9333/*
9334 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9335 * any interesting requests and then jump to the real instruction
9336 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9337 */
9338 .extern MterpCheckBefore
9339 EXPORT_PC
9340 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9341 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9342 mov r0, rSELF
9343 add r1, rFP, #OFF_FP_SHADOWFRAME
9344 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9345
9346/* ------------------------------ */
9347 .balign 128
9348.L_ALT_op_sget_wide: /* 0x61 */
9349/* File: arm/alt_stub.S */
9350/*
9351 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9352 * any interesting requests and then jump to the real instruction
9353 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9354 */
9355 .extern MterpCheckBefore
9356 EXPORT_PC
9357 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9358 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9359 mov r0, rSELF
9360 add r1, rFP, #OFF_FP_SHADOWFRAME
9361 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9362
9363/* ------------------------------ */
9364 .balign 128
9365.L_ALT_op_sget_object: /* 0x62 */
9366/* File: arm/alt_stub.S */
9367/*
9368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9369 * any interesting requests and then jump to the real instruction
9370 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9371 */
9372 .extern MterpCheckBefore
9373 EXPORT_PC
9374 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9375 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9376 mov r0, rSELF
9377 add r1, rFP, #OFF_FP_SHADOWFRAME
9378 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9379
9380/* ------------------------------ */
9381 .balign 128
9382.L_ALT_op_sget_boolean: /* 0x63 */
9383/* File: arm/alt_stub.S */
9384/*
9385 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9386 * any interesting requests and then jump to the real instruction
9387 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9388 */
9389 .extern MterpCheckBefore
9390 EXPORT_PC
9391 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9392 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9393 mov r0, rSELF
9394 add r1, rFP, #OFF_FP_SHADOWFRAME
9395 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9396
9397/* ------------------------------ */
9398 .balign 128
9399.L_ALT_op_sget_byte: /* 0x64 */
9400/* File: arm/alt_stub.S */
9401/*
9402 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9403 * any interesting requests and then jump to the real instruction
9404 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9405 */
9406 .extern MterpCheckBefore
9407 EXPORT_PC
9408 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9409 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9410 mov r0, rSELF
9411 add r1, rFP, #OFF_FP_SHADOWFRAME
9412 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9413
9414/* ------------------------------ */
9415 .balign 128
9416.L_ALT_op_sget_char: /* 0x65 */
9417/* File: arm/alt_stub.S */
9418/*
9419 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9420 * any interesting requests and then jump to the real instruction
9421 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9422 */
9423 .extern MterpCheckBefore
9424 EXPORT_PC
9425 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9426 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9427 mov r0, rSELF
9428 add r1, rFP, #OFF_FP_SHADOWFRAME
9429 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9430
9431/* ------------------------------ */
9432 .balign 128
9433.L_ALT_op_sget_short: /* 0x66 */
9434/* File: arm/alt_stub.S */
9435/*
9436 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9437 * any interesting requests and then jump to the real instruction
9438 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9439 */
9440 .extern MterpCheckBefore
9441 EXPORT_PC
9442 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9443 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9444 mov r0, rSELF
9445 add r1, rFP, #OFF_FP_SHADOWFRAME
9446 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9447
9448/* ------------------------------ */
9449 .balign 128
9450.L_ALT_op_sput: /* 0x67 */
9451/* File: arm/alt_stub.S */
9452/*
9453 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9454 * any interesting requests and then jump to the real instruction
9455 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9456 */
9457 .extern MterpCheckBefore
9458 EXPORT_PC
9459 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9460 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9461 mov r0, rSELF
9462 add r1, rFP, #OFF_FP_SHADOWFRAME
9463 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9464
9465/* ------------------------------ */
9466 .balign 128
9467.L_ALT_op_sput_wide: /* 0x68 */
9468/* File: arm/alt_stub.S */
9469/*
9470 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9471 * any interesting requests and then jump to the real instruction
9472 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9473 */
9474 .extern MterpCheckBefore
9475 EXPORT_PC
9476 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9477 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9478 mov r0, rSELF
9479 add r1, rFP, #OFF_FP_SHADOWFRAME
9480 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9481
9482/* ------------------------------ */
9483 .balign 128
9484.L_ALT_op_sput_object: /* 0x69 */
9485/* File: arm/alt_stub.S */
9486/*
9487 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9488 * any interesting requests and then jump to the real instruction
9489 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9490 */
9491 .extern MterpCheckBefore
9492 EXPORT_PC
9493 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9494 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9495 mov r0, rSELF
9496 add r1, rFP, #OFF_FP_SHADOWFRAME
9497 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9498
9499/* ------------------------------ */
9500 .balign 128
9501.L_ALT_op_sput_boolean: /* 0x6a */
9502/* File: arm/alt_stub.S */
9503/*
9504 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9505 * any interesting requests and then jump to the real instruction
9506 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9507 */
9508 .extern MterpCheckBefore
9509 EXPORT_PC
9510 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9511 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9512 mov r0, rSELF
9513 add r1, rFP, #OFF_FP_SHADOWFRAME
9514 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9515
9516/* ------------------------------ */
9517 .balign 128
9518.L_ALT_op_sput_byte: /* 0x6b */
9519/* File: arm/alt_stub.S */
9520/*
9521 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9522 * any interesting requests and then jump to the real instruction
9523 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9524 */
9525 .extern MterpCheckBefore
9526 EXPORT_PC
9527 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9528 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9529 mov r0, rSELF
9530 add r1, rFP, #OFF_FP_SHADOWFRAME
9531 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9532
9533/* ------------------------------ */
9534 .balign 128
9535.L_ALT_op_sput_char: /* 0x6c */
9536/* File: arm/alt_stub.S */
9537/*
9538 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9539 * any interesting requests and then jump to the real instruction
9540 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9541 */
9542 .extern MterpCheckBefore
9543 EXPORT_PC
9544 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9545 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9546 mov r0, rSELF
9547 add r1, rFP, #OFF_FP_SHADOWFRAME
9548 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9549
9550/* ------------------------------ */
9551 .balign 128
9552.L_ALT_op_sput_short: /* 0x6d */
9553/* File: arm/alt_stub.S */
9554/*
9555 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9556 * any interesting requests and then jump to the real instruction
9557 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9558 */
9559 .extern MterpCheckBefore
9560 EXPORT_PC
9561 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9562 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9563 mov r0, rSELF
9564 add r1, rFP, #OFF_FP_SHADOWFRAME
9565 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9566
9567/* ------------------------------ */
9568 .balign 128
9569.L_ALT_op_invoke_virtual: /* 0x6e */
9570/* File: arm/alt_stub.S */
9571/*
9572 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9573 * any interesting requests and then jump to the real instruction
9574 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9575 */
9576 .extern MterpCheckBefore
9577 EXPORT_PC
9578 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9579 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9580 mov r0, rSELF
9581 add r1, rFP, #OFF_FP_SHADOWFRAME
9582 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9583
9584/* ------------------------------ */
9585 .balign 128
9586.L_ALT_op_invoke_super: /* 0x6f */
9587/* File: arm/alt_stub.S */
9588/*
9589 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9590 * any interesting requests and then jump to the real instruction
9591 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9592 */
9593 .extern MterpCheckBefore
9594 EXPORT_PC
9595 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9596 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9597 mov r0, rSELF
9598 add r1, rFP, #OFF_FP_SHADOWFRAME
9599 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9600
9601/* ------------------------------ */
9602 .balign 128
9603.L_ALT_op_invoke_direct: /* 0x70 */
9604/* File: arm/alt_stub.S */
9605/*
9606 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9607 * any interesting requests and then jump to the real instruction
9608 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9609 */
9610 .extern MterpCheckBefore
9611 EXPORT_PC
9612 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9613 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9614 mov r0, rSELF
9615 add r1, rFP, #OFF_FP_SHADOWFRAME
9616 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9617
9618/* ------------------------------ */
9619 .balign 128
9620.L_ALT_op_invoke_static: /* 0x71 */
9621/* File: arm/alt_stub.S */
9622/*
9623 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9624 * any interesting requests and then jump to the real instruction
9625 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9626 */
9627 .extern MterpCheckBefore
9628 EXPORT_PC
9629 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9630 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9631 mov r0, rSELF
9632 add r1, rFP, #OFF_FP_SHADOWFRAME
9633 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9634
9635/* ------------------------------ */
9636 .balign 128
9637.L_ALT_op_invoke_interface: /* 0x72 */
9638/* File: arm/alt_stub.S */
9639/*
9640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9641 * any interesting requests and then jump to the real instruction
9642 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9643 */
9644 .extern MterpCheckBefore
9645 EXPORT_PC
9646 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9647 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9648 mov r0, rSELF
9649 add r1, rFP, #OFF_FP_SHADOWFRAME
9650 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9651
9652/* ------------------------------ */
9653 .balign 128
9654.L_ALT_op_return_void_no_barrier: /* 0x73 */
9655/* File: arm/alt_stub.S */
9656/*
9657 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9658 * any interesting requests and then jump to the real instruction
9659 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9660 */
9661 .extern MterpCheckBefore
9662 EXPORT_PC
9663 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9664 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9665 mov r0, rSELF
9666 add r1, rFP, #OFF_FP_SHADOWFRAME
9667 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9668
9669/* ------------------------------ */
9670 .balign 128
9671.L_ALT_op_invoke_virtual_range: /* 0x74 */
9672/* File: arm/alt_stub.S */
9673/*
9674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9675 * any interesting requests and then jump to the real instruction
9676 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9677 */
9678 .extern MterpCheckBefore
9679 EXPORT_PC
9680 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9681 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9682 mov r0, rSELF
9683 add r1, rFP, #OFF_FP_SHADOWFRAME
9684 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9685
9686/* ------------------------------ */
9687 .balign 128
9688.L_ALT_op_invoke_super_range: /* 0x75 */
9689/* File: arm/alt_stub.S */
9690/*
9691 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9692 * any interesting requests and then jump to the real instruction
9693 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9694 */
9695 .extern MterpCheckBefore
9696 EXPORT_PC
9697 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9698 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9699 mov r0, rSELF
9700 add r1, rFP, #OFF_FP_SHADOWFRAME
9701 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9702
9703/* ------------------------------ */
9704 .balign 128
9705.L_ALT_op_invoke_direct_range: /* 0x76 */
9706/* File: arm/alt_stub.S */
9707/*
9708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9709 * any interesting requests and then jump to the real instruction
9710 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9711 */
9712 .extern MterpCheckBefore
9713 EXPORT_PC
9714 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9715 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9716 mov r0, rSELF
9717 add r1, rFP, #OFF_FP_SHADOWFRAME
9718 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9719
9720/* ------------------------------ */
9721 .balign 128
9722.L_ALT_op_invoke_static_range: /* 0x77 */
9723/* File: arm/alt_stub.S */
9724/*
9725 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9726 * any interesting requests and then jump to the real instruction
9727 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9728 */
9729 .extern MterpCheckBefore
9730 EXPORT_PC
9731 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9732 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9733 mov r0, rSELF
9734 add r1, rFP, #OFF_FP_SHADOWFRAME
9735 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9736
9737/* ------------------------------ */
9738 .balign 128
9739.L_ALT_op_invoke_interface_range: /* 0x78 */
9740/* File: arm/alt_stub.S */
9741/*
9742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9743 * any interesting requests and then jump to the real instruction
9744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9745 */
9746 .extern MterpCheckBefore
9747 EXPORT_PC
9748 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9749 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
9750 mov r0, rSELF
9751 add r1, rFP, #OFF_FP_SHADOWFRAME
9752 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9753
9754/* ------------------------------ */
9755 .balign 128
9756.L_ALT_op_unused_79: /* 0x79 */
9757/* File: arm/alt_stub.S */
9758/*
9759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9760 * any interesting requests and then jump to the real instruction
9761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9762 */
9763 .extern MterpCheckBefore
9764 EXPORT_PC
9765 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9766 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
9767 mov r0, rSELF
9768 add r1, rFP, #OFF_FP_SHADOWFRAME
9769 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9770
9771/* ------------------------------ */
9772 .balign 128
9773.L_ALT_op_unused_7a: /* 0x7a */
9774/* File: arm/alt_stub.S */
9775/*
9776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9777 * any interesting requests and then jump to the real instruction
9778 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9779 */
9780 .extern MterpCheckBefore
9781 EXPORT_PC
9782 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9783 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
9784 mov r0, rSELF
9785 add r1, rFP, #OFF_FP_SHADOWFRAME
9786 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9787
9788/* ------------------------------ */
9789 .balign 128
9790.L_ALT_op_neg_int: /* 0x7b */
9791/* File: arm/alt_stub.S */
9792/*
9793 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9794 * any interesting requests and then jump to the real instruction
9795 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9796 */
9797 .extern MterpCheckBefore
9798 EXPORT_PC
9799 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9800 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
9801 mov r0, rSELF
9802 add r1, rFP, #OFF_FP_SHADOWFRAME
9803 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9804
9805/* ------------------------------ */
9806 .balign 128
9807.L_ALT_op_not_int: /* 0x7c */
9808/* File: arm/alt_stub.S */
9809/*
9810 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9811 * any interesting requests and then jump to the real instruction
9812 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9813 */
9814 .extern MterpCheckBefore
9815 EXPORT_PC
9816 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9817 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
9818 mov r0, rSELF
9819 add r1, rFP, #OFF_FP_SHADOWFRAME
9820 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9821
9822/* ------------------------------ */
9823 .balign 128
9824.L_ALT_op_neg_long: /* 0x7d */
9825/* File: arm/alt_stub.S */
9826/*
9827 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9828 * any interesting requests and then jump to the real instruction
9829 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9830 */
9831 .extern MterpCheckBefore
9832 EXPORT_PC
9833 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9834 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
9835 mov r0, rSELF
9836 add r1, rFP, #OFF_FP_SHADOWFRAME
9837 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9838
9839/* ------------------------------ */
9840 .balign 128
9841.L_ALT_op_not_long: /* 0x7e */
9842/* File: arm/alt_stub.S */
9843/*
9844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9845 * any interesting requests and then jump to the real instruction
9846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9847 */
9848 .extern MterpCheckBefore
9849 EXPORT_PC
9850 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9851 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
9852 mov r0, rSELF
9853 add r1, rFP, #OFF_FP_SHADOWFRAME
9854 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9855
9856/* ------------------------------ */
9857 .balign 128
9858.L_ALT_op_neg_float: /* 0x7f */
9859/* File: arm/alt_stub.S */
9860/*
9861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9862 * any interesting requests and then jump to the real instruction
9863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9864 */
9865 .extern MterpCheckBefore
9866 EXPORT_PC
9867 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9868 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
9869 mov r0, rSELF
9870 add r1, rFP, #OFF_FP_SHADOWFRAME
9871 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9872
9873/* ------------------------------ */
9874 .balign 128
9875.L_ALT_op_neg_double: /* 0x80 */
9876/* File: arm/alt_stub.S */
9877/*
9878 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9879 * any interesting requests and then jump to the real instruction
9880 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9881 */
9882 .extern MterpCheckBefore
9883 EXPORT_PC
9884 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9885 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
9886 mov r0, rSELF
9887 add r1, rFP, #OFF_FP_SHADOWFRAME
9888 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9889
9890/* ------------------------------ */
9891 .balign 128
9892.L_ALT_op_int_to_long: /* 0x81 */
9893/* File: arm/alt_stub.S */
9894/*
9895 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9896 * any interesting requests and then jump to the real instruction
9897 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9898 */
9899 .extern MterpCheckBefore
9900 EXPORT_PC
9901 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9902 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
9903 mov r0, rSELF
9904 add r1, rFP, #OFF_FP_SHADOWFRAME
9905 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9906
9907/* ------------------------------ */
9908 .balign 128
9909.L_ALT_op_int_to_float: /* 0x82 */
9910/* File: arm/alt_stub.S */
9911/*
9912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9913 * any interesting requests and then jump to the real instruction
9914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9915 */
9916 .extern MterpCheckBefore
9917 EXPORT_PC
9918 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9919 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
9920 mov r0, rSELF
9921 add r1, rFP, #OFF_FP_SHADOWFRAME
9922 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9923
9924/* ------------------------------ */
9925 .balign 128
9926.L_ALT_op_int_to_double: /* 0x83 */
9927/* File: arm/alt_stub.S */
9928/*
9929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9930 * any interesting requests and then jump to the real instruction
9931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9932 */
9933 .extern MterpCheckBefore
9934 EXPORT_PC
9935 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9936 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
9937 mov r0, rSELF
9938 add r1, rFP, #OFF_FP_SHADOWFRAME
9939 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9940
9941/* ------------------------------ */
9942 .balign 128
9943.L_ALT_op_long_to_int: /* 0x84 */
9944/* File: arm/alt_stub.S */
9945/*
9946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9947 * any interesting requests and then jump to the real instruction
9948 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9949 */
9950 .extern MterpCheckBefore
9951 EXPORT_PC
9952 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9953 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
9954 mov r0, rSELF
9955 add r1, rFP, #OFF_FP_SHADOWFRAME
9956 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9957
9958/* ------------------------------ */
9959 .balign 128
9960.L_ALT_op_long_to_float: /* 0x85 */
9961/* File: arm/alt_stub.S */
9962/*
9963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9964 * any interesting requests and then jump to the real instruction
9965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9966 */
9967 .extern MterpCheckBefore
9968 EXPORT_PC
9969 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9970 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
9971 mov r0, rSELF
9972 add r1, rFP, #OFF_FP_SHADOWFRAME
9973 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9974
9975/* ------------------------------ */
9976 .balign 128
9977.L_ALT_op_long_to_double: /* 0x86 */
9978/* File: arm/alt_stub.S */
9979/*
9980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9981 * any interesting requests and then jump to the real instruction
9982 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9983 */
9984 .extern MterpCheckBefore
9985 EXPORT_PC
9986 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9987 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
9988 mov r0, rSELF
9989 add r1, rFP, #OFF_FP_SHADOWFRAME
9990 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9991
9992/* ------------------------------ */
9993 .balign 128
9994.L_ALT_op_float_to_int: /* 0x87 */
9995/* File: arm/alt_stub.S */
9996/*
9997 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9998 * any interesting requests and then jump to the real instruction
9999 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10000 */
10001 .extern MterpCheckBefore
10002 EXPORT_PC
10003 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10004 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
10005 mov r0, rSELF
10006 add r1, rFP, #OFF_FP_SHADOWFRAME
10007 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10008
10009/* ------------------------------ */
10010 .balign 128
10011.L_ALT_op_float_to_long: /* 0x88 */
10012/* File: arm/alt_stub.S */
10013/*
10014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10015 * any interesting requests and then jump to the real instruction
10016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10017 */
10018 .extern MterpCheckBefore
10019 EXPORT_PC
10020 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10021 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10022 mov r0, rSELF
10023 add r1, rFP, #OFF_FP_SHADOWFRAME
10024 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10025
10026/* ------------------------------ */
10027 .balign 128
10028.L_ALT_op_float_to_double: /* 0x89 */
10029/* File: arm/alt_stub.S */
10030/*
10031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10032 * any interesting requests and then jump to the real instruction
10033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10034 */
10035 .extern MterpCheckBefore
10036 EXPORT_PC
10037 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10038 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10039 mov r0, rSELF
10040 add r1, rFP, #OFF_FP_SHADOWFRAME
10041 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10042
10043/* ------------------------------ */
10044 .balign 128
10045.L_ALT_op_double_to_int: /* 0x8a */
10046/* File: arm/alt_stub.S */
10047/*
10048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10049 * any interesting requests and then jump to the real instruction
10050 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10051 */
10052 .extern MterpCheckBefore
10053 EXPORT_PC
10054 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10055 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10056 mov r0, rSELF
10057 add r1, rFP, #OFF_FP_SHADOWFRAME
10058 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10059
10060/* ------------------------------ */
10061 .balign 128
10062.L_ALT_op_double_to_long: /* 0x8b */
10063/* File: arm/alt_stub.S */
10064/*
10065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10066 * any interesting requests and then jump to the real instruction
10067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10068 */
10069 .extern MterpCheckBefore
10070 EXPORT_PC
10071 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10072 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10073 mov r0, rSELF
10074 add r1, rFP, #OFF_FP_SHADOWFRAME
10075 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10076
10077/* ------------------------------ */
10078 .balign 128
10079.L_ALT_op_double_to_float: /* 0x8c */
10080/* File: arm/alt_stub.S */
10081/*
10082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10083 * any interesting requests and then jump to the real instruction
10084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10085 */
10086 .extern MterpCheckBefore
10087 EXPORT_PC
10088 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10089 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10090 mov r0, rSELF
10091 add r1, rFP, #OFF_FP_SHADOWFRAME
10092 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10093
10094/* ------------------------------ */
10095 .balign 128
10096.L_ALT_op_int_to_byte: /* 0x8d */
10097/* File: arm/alt_stub.S */
10098/*
10099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10100 * any interesting requests and then jump to the real instruction
10101 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10102 */
10103 .extern MterpCheckBefore
10104 EXPORT_PC
10105 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10106 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10107 mov r0, rSELF
10108 add r1, rFP, #OFF_FP_SHADOWFRAME
10109 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10110
10111/* ------------------------------ */
10112 .balign 128
10113.L_ALT_op_int_to_char: /* 0x8e */
10114/* File: arm/alt_stub.S */
10115/*
10116 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10117 * any interesting requests and then jump to the real instruction
10118 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10119 */
10120 .extern MterpCheckBefore
10121 EXPORT_PC
10122 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10123 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10124 mov r0, rSELF
10125 add r1, rFP, #OFF_FP_SHADOWFRAME
10126 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10127
10128/* ------------------------------ */
10129 .balign 128
10130.L_ALT_op_int_to_short: /* 0x8f */
10131/* File: arm/alt_stub.S */
10132/*
10133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10134 * any interesting requests and then jump to the real instruction
10135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10136 */
10137 .extern MterpCheckBefore
10138 EXPORT_PC
10139 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10140 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10141 mov r0, rSELF
10142 add r1, rFP, #OFF_FP_SHADOWFRAME
10143 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10144
10145/* ------------------------------ */
10146 .balign 128
10147.L_ALT_op_add_int: /* 0x90 */
10148/* File: arm/alt_stub.S */
10149/*
10150 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10151 * any interesting requests and then jump to the real instruction
10152 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10153 */
10154 .extern MterpCheckBefore
10155 EXPORT_PC
10156 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10157 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10158 mov r0, rSELF
10159 add r1, rFP, #OFF_FP_SHADOWFRAME
10160 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10161
10162/* ------------------------------ */
10163 .balign 128
10164.L_ALT_op_sub_int: /* 0x91 */
10165/* File: arm/alt_stub.S */
10166/*
10167 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10168 * any interesting requests and then jump to the real instruction
10169 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10170 */
10171 .extern MterpCheckBefore
10172 EXPORT_PC
10173 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10174 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10175 mov r0, rSELF
10176 add r1, rFP, #OFF_FP_SHADOWFRAME
10177 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10178
10179/* ------------------------------ */
10180 .balign 128
10181.L_ALT_op_mul_int: /* 0x92 */
10182/* File: arm/alt_stub.S */
10183/*
10184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10185 * any interesting requests and then jump to the real instruction
10186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10187 */
10188 .extern MterpCheckBefore
10189 EXPORT_PC
10190 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10191 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10192 mov r0, rSELF
10193 add r1, rFP, #OFF_FP_SHADOWFRAME
10194 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10195
10196/* ------------------------------ */
10197 .balign 128
10198.L_ALT_op_div_int: /* 0x93 */
10199/* File: arm/alt_stub.S */
10200/*
10201 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10202 * any interesting requests and then jump to the real instruction
10203 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10204 */
10205 .extern MterpCheckBefore
10206 EXPORT_PC
10207 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10208 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10209 mov r0, rSELF
10210 add r1, rFP, #OFF_FP_SHADOWFRAME
10211 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10212
10213/* ------------------------------ */
10214 .balign 128
10215.L_ALT_op_rem_int: /* 0x94 */
10216/* File: arm/alt_stub.S */
10217/*
10218 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10219 * any interesting requests and then jump to the real instruction
10220 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10221 */
10222 .extern MterpCheckBefore
10223 EXPORT_PC
10224 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10225 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10226 mov r0, rSELF
10227 add r1, rFP, #OFF_FP_SHADOWFRAME
10228 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10229
10230/* ------------------------------ */
10231 .balign 128
10232.L_ALT_op_and_int: /* 0x95 */
10233/* File: arm/alt_stub.S */
10234/*
10235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10236 * any interesting requests and then jump to the real instruction
10237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10238 */
10239 .extern MterpCheckBefore
10240 EXPORT_PC
10241 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10242 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10243 mov r0, rSELF
10244 add r1, rFP, #OFF_FP_SHADOWFRAME
10245 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10246
10247/* ------------------------------ */
10248 .balign 128
10249.L_ALT_op_or_int: /* 0x96 */
10250/* File: arm/alt_stub.S */
10251/*
10252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10253 * any interesting requests and then jump to the real instruction
10254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10255 */
10256 .extern MterpCheckBefore
10257 EXPORT_PC
10258 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10259 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10260 mov r0, rSELF
10261 add r1, rFP, #OFF_FP_SHADOWFRAME
10262 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10263
10264/* ------------------------------ */
10265 .balign 128
10266.L_ALT_op_xor_int: /* 0x97 */
10267/* File: arm/alt_stub.S */
10268/*
10269 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10270 * any interesting requests and then jump to the real instruction
10271 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10272 */
10273 .extern MterpCheckBefore
10274 EXPORT_PC
10275 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10276 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10277 mov r0, rSELF
10278 add r1, rFP, #OFF_FP_SHADOWFRAME
10279 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10280
10281/* ------------------------------ */
10282 .balign 128
10283.L_ALT_op_shl_int: /* 0x98 */
10284/* File: arm/alt_stub.S */
10285/*
10286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10287 * any interesting requests and then jump to the real instruction
10288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10289 */
10290 .extern MterpCheckBefore
10291 EXPORT_PC
10292 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10293 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10294 mov r0, rSELF
10295 add r1, rFP, #OFF_FP_SHADOWFRAME
10296 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10297
10298/* ------------------------------ */
10299 .balign 128
10300.L_ALT_op_shr_int: /* 0x99 */
10301/* File: arm/alt_stub.S */
10302/*
10303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10304 * any interesting requests and then jump to the real instruction
10305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10306 */
10307 .extern MterpCheckBefore
10308 EXPORT_PC
10309 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10310 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10311 mov r0, rSELF
10312 add r1, rFP, #OFF_FP_SHADOWFRAME
10313 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10314
10315/* ------------------------------ */
10316 .balign 128
10317.L_ALT_op_ushr_int: /* 0x9a */
10318/* File: arm/alt_stub.S */
10319/*
10320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10321 * any interesting requests and then jump to the real instruction
10322 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10323 */
10324 .extern MterpCheckBefore
10325 EXPORT_PC
10326 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10327 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10328 mov r0, rSELF
10329 add r1, rFP, #OFF_FP_SHADOWFRAME
10330 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10331
10332/* ------------------------------ */
10333 .balign 128
10334.L_ALT_op_add_long: /* 0x9b */
10335/* File: arm/alt_stub.S */
10336/*
10337 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10338 * any interesting requests and then jump to the real instruction
10339 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10340 */
10341 .extern MterpCheckBefore
10342 EXPORT_PC
10343 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10344 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10345 mov r0, rSELF
10346 add r1, rFP, #OFF_FP_SHADOWFRAME
10347 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10348
10349/* ------------------------------ */
10350 .balign 128
10351.L_ALT_op_sub_long: /* 0x9c */
10352/* File: arm/alt_stub.S */
10353/*
10354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10355 * any interesting requests and then jump to the real instruction
10356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10357 */
10358 .extern MterpCheckBefore
10359 EXPORT_PC
10360 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10361 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10362 mov r0, rSELF
10363 add r1, rFP, #OFF_FP_SHADOWFRAME
10364 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10365
10366/* ------------------------------ */
10367 .balign 128
10368.L_ALT_op_mul_long: /* 0x9d */
10369/* File: arm/alt_stub.S */
10370/*
10371 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10372 * any interesting requests and then jump to the real instruction
10373 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10374 */
10375 .extern MterpCheckBefore
10376 EXPORT_PC
10377 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10378 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10379 mov r0, rSELF
10380 add r1, rFP, #OFF_FP_SHADOWFRAME
10381 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10382
10383/* ------------------------------ */
10384 .balign 128
10385.L_ALT_op_div_long: /* 0x9e */
10386/* File: arm/alt_stub.S */
10387/*
10388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10389 * any interesting requests and then jump to the real instruction
10390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10391 */
10392 .extern MterpCheckBefore
10393 EXPORT_PC
10394 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10395 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10396 mov r0, rSELF
10397 add r1, rFP, #OFF_FP_SHADOWFRAME
10398 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10399
10400/* ------------------------------ */
10401 .balign 128
10402.L_ALT_op_rem_long: /* 0x9f */
10403/* File: arm/alt_stub.S */
10404/*
10405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10406 * any interesting requests and then jump to the real instruction
10407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10408 */
10409 .extern MterpCheckBefore
10410 EXPORT_PC
10411 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10412 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10413 mov r0, rSELF
10414 add r1, rFP, #OFF_FP_SHADOWFRAME
10415 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10416
10417/* ------------------------------ */
10418 .balign 128
10419.L_ALT_op_and_long: /* 0xa0 */
10420/* File: arm/alt_stub.S */
10421/*
10422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10423 * any interesting requests and then jump to the real instruction
10424 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10425 */
10426 .extern MterpCheckBefore
10427 EXPORT_PC
10428 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10429 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10430 mov r0, rSELF
10431 add r1, rFP, #OFF_FP_SHADOWFRAME
10432 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10433
10434/* ------------------------------ */
10435 .balign 128
10436.L_ALT_op_or_long: /* 0xa1 */
10437/* File: arm/alt_stub.S */
10438/*
10439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10440 * any interesting requests and then jump to the real instruction
10441 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10442 */
10443 .extern MterpCheckBefore
10444 EXPORT_PC
10445 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10446 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10447 mov r0, rSELF
10448 add r1, rFP, #OFF_FP_SHADOWFRAME
10449 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10450
10451/* ------------------------------ */
10452 .balign 128
10453.L_ALT_op_xor_long: /* 0xa2 */
10454/* File: arm/alt_stub.S */
10455/*
10456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10457 * any interesting requests and then jump to the real instruction
10458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10459 */
10460 .extern MterpCheckBefore
10461 EXPORT_PC
10462 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10463 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10464 mov r0, rSELF
10465 add r1, rFP, #OFF_FP_SHADOWFRAME
10466 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10467
10468/* ------------------------------ */
10469 .balign 128
10470.L_ALT_op_shl_long: /* 0xa3 */
10471/* File: arm/alt_stub.S */
10472/*
10473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10474 * any interesting requests and then jump to the real instruction
10475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10476 */
10477 .extern MterpCheckBefore
10478 EXPORT_PC
10479 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10480 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10481 mov r0, rSELF
10482 add r1, rFP, #OFF_FP_SHADOWFRAME
10483 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10484
10485/* ------------------------------ */
10486 .balign 128
10487.L_ALT_op_shr_long: /* 0xa4 */
10488/* File: arm/alt_stub.S */
10489/*
10490 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10491 * any interesting requests and then jump to the real instruction
10492 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10493 */
10494 .extern MterpCheckBefore
10495 EXPORT_PC
10496 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10497 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10498 mov r0, rSELF
10499 add r1, rFP, #OFF_FP_SHADOWFRAME
10500 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10501
10502/* ------------------------------ */
10503 .balign 128
10504.L_ALT_op_ushr_long: /* 0xa5 */
10505/* File: arm/alt_stub.S */
10506/*
10507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10508 * any interesting requests and then jump to the real instruction
10509 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10510 */
10511 .extern MterpCheckBefore
10512 EXPORT_PC
10513 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10514 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10515 mov r0, rSELF
10516 add r1, rFP, #OFF_FP_SHADOWFRAME
10517 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10518
10519/* ------------------------------ */
10520 .balign 128
10521.L_ALT_op_add_float: /* 0xa6 */
10522/* File: arm/alt_stub.S */
10523/*
10524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10525 * any interesting requests and then jump to the real instruction
10526 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10527 */
10528 .extern MterpCheckBefore
10529 EXPORT_PC
10530 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10531 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10532 mov r0, rSELF
10533 add r1, rFP, #OFF_FP_SHADOWFRAME
10534 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10535
10536/* ------------------------------ */
10537 .balign 128
10538.L_ALT_op_sub_float: /* 0xa7 */
10539/* File: arm/alt_stub.S */
10540/*
10541 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10542 * any interesting requests and then jump to the real instruction
10543 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10544 */
10545 .extern MterpCheckBefore
10546 EXPORT_PC
10547 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10548 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10549 mov r0, rSELF
10550 add r1, rFP, #OFF_FP_SHADOWFRAME
10551 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10552
10553/* ------------------------------ */
10554 .balign 128
10555.L_ALT_op_mul_float: /* 0xa8 */
10556/* File: arm/alt_stub.S */
10557/*
10558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10559 * any interesting requests and then jump to the real instruction
10560 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10561 */
10562 .extern MterpCheckBefore
10563 EXPORT_PC
10564 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10565 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10566 mov r0, rSELF
10567 add r1, rFP, #OFF_FP_SHADOWFRAME
10568 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10569
10570/* ------------------------------ */
10571 .balign 128
10572.L_ALT_op_div_float: /* 0xa9 */
10573/* File: arm/alt_stub.S */
10574/*
10575 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10576 * any interesting requests and then jump to the real instruction
10577 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10578 */
10579 .extern MterpCheckBefore
10580 EXPORT_PC
10581 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10582 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10583 mov r0, rSELF
10584 add r1, rFP, #OFF_FP_SHADOWFRAME
10585 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10586
10587/* ------------------------------ */
10588 .balign 128
10589.L_ALT_op_rem_float: /* 0xaa */
10590/* File: arm/alt_stub.S */
10591/*
10592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10593 * any interesting requests and then jump to the real instruction
10594 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10595 */
10596 .extern MterpCheckBefore
10597 EXPORT_PC
10598 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10599 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10600 mov r0, rSELF
10601 add r1, rFP, #OFF_FP_SHADOWFRAME
10602 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10603
10604/* ------------------------------ */
10605 .balign 128
10606.L_ALT_op_add_double: /* 0xab */
10607/* File: arm/alt_stub.S */
10608/*
10609 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10610 * any interesting requests and then jump to the real instruction
10611 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10612 */
10613 .extern MterpCheckBefore
10614 EXPORT_PC
10615 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10616 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10617 mov r0, rSELF
10618 add r1, rFP, #OFF_FP_SHADOWFRAME
10619 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10620
10621/* ------------------------------ */
10622 .balign 128
10623.L_ALT_op_sub_double: /* 0xac */
10624/* File: arm/alt_stub.S */
10625/*
10626 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10627 * any interesting requests and then jump to the real instruction
10628 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10629 */
10630 .extern MterpCheckBefore
10631 EXPORT_PC
10632 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10633 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10634 mov r0, rSELF
10635 add r1, rFP, #OFF_FP_SHADOWFRAME
10636 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10637
10638/* ------------------------------ */
10639 .balign 128
10640.L_ALT_op_mul_double: /* 0xad */
10641/* File: arm/alt_stub.S */
10642/*
10643 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10644 * any interesting requests and then jump to the real instruction
10645 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10646 */
10647 .extern MterpCheckBefore
10648 EXPORT_PC
10649 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10650 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10651 mov r0, rSELF
10652 add r1, rFP, #OFF_FP_SHADOWFRAME
10653 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10654
10655/* ------------------------------ */
10656 .balign 128
10657.L_ALT_op_div_double: /* 0xae */
10658/* File: arm/alt_stub.S */
10659/*
10660 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10661 * any interesting requests and then jump to the real instruction
10662 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10663 */
10664 .extern MterpCheckBefore
10665 EXPORT_PC
10666 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10667 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10668 mov r0, rSELF
10669 add r1, rFP, #OFF_FP_SHADOWFRAME
10670 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10671
10672/* ------------------------------ */
10673 .balign 128
10674.L_ALT_op_rem_double: /* 0xaf */
10675/* File: arm/alt_stub.S */
10676/*
10677 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10678 * any interesting requests and then jump to the real instruction
10679 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10680 */
10681 .extern MterpCheckBefore
10682 EXPORT_PC
10683 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10684 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10685 mov r0, rSELF
10686 add r1, rFP, #OFF_FP_SHADOWFRAME
10687 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10688
10689/* ------------------------------ */
10690 .balign 128
10691.L_ALT_op_add_int_2addr: /* 0xb0 */
10692/* File: arm/alt_stub.S */
10693/*
10694 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10695 * any interesting requests and then jump to the real instruction
10696 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10697 */
10698 .extern MterpCheckBefore
10699 EXPORT_PC
10700 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10701 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10702 mov r0, rSELF
10703 add r1, rFP, #OFF_FP_SHADOWFRAME
10704 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10705
10706/* ------------------------------ */
10707 .balign 128
10708.L_ALT_op_sub_int_2addr: /* 0xb1 */
10709/* File: arm/alt_stub.S */
10710/*
10711 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10712 * any interesting requests and then jump to the real instruction
10713 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10714 */
10715 .extern MterpCheckBefore
10716 EXPORT_PC
10717 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10718 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10719 mov r0, rSELF
10720 add r1, rFP, #OFF_FP_SHADOWFRAME
10721 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10722
10723/* ------------------------------ */
10724 .balign 128
10725.L_ALT_op_mul_int_2addr: /* 0xb2 */
10726/* File: arm/alt_stub.S */
10727/*
10728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10729 * any interesting requests and then jump to the real instruction
10730 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10731 */
10732 .extern MterpCheckBefore
10733 EXPORT_PC
10734 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10735 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10736 mov r0, rSELF
10737 add r1, rFP, #OFF_FP_SHADOWFRAME
10738 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10739
10740/* ------------------------------ */
10741 .balign 128
10742.L_ALT_op_div_int_2addr: /* 0xb3 */
10743/* File: arm/alt_stub.S */
10744/*
10745 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10746 * any interesting requests and then jump to the real instruction
10747 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10748 */
10749 .extern MterpCheckBefore
10750 EXPORT_PC
10751 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10752 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
10753 mov r0, rSELF
10754 add r1, rFP, #OFF_FP_SHADOWFRAME
10755 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10756
10757/* ------------------------------ */
10758 .balign 128
10759.L_ALT_op_rem_int_2addr: /* 0xb4 */
10760/* File: arm/alt_stub.S */
10761/*
10762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10763 * any interesting requests and then jump to the real instruction
10764 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10765 */
10766 .extern MterpCheckBefore
10767 EXPORT_PC
10768 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10769 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
10770 mov r0, rSELF
10771 add r1, rFP, #OFF_FP_SHADOWFRAME
10772 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10773
10774/* ------------------------------ */
10775 .balign 128
10776.L_ALT_op_and_int_2addr: /* 0xb5 */
10777/* File: arm/alt_stub.S */
10778/*
10779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10780 * any interesting requests and then jump to the real instruction
10781 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10782 */
10783 .extern MterpCheckBefore
10784 EXPORT_PC
10785 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10786 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
10787 mov r0, rSELF
10788 add r1, rFP, #OFF_FP_SHADOWFRAME
10789 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10790
10791/* ------------------------------ */
10792 .balign 128
10793.L_ALT_op_or_int_2addr: /* 0xb6 */
10794/* File: arm/alt_stub.S */
10795/*
10796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10797 * any interesting requests and then jump to the real instruction
10798 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10799 */
10800 .extern MterpCheckBefore
10801 EXPORT_PC
10802 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10803 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
10804 mov r0, rSELF
10805 add r1, rFP, #OFF_FP_SHADOWFRAME
10806 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10807
10808/* ------------------------------ */
10809 .balign 128
10810.L_ALT_op_xor_int_2addr: /* 0xb7 */
10811/* File: arm/alt_stub.S */
10812/*
10813 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10814 * any interesting requests and then jump to the real instruction
10815 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10816 */
10817 .extern MterpCheckBefore
10818 EXPORT_PC
10819 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10820 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
10821 mov r0, rSELF
10822 add r1, rFP, #OFF_FP_SHADOWFRAME
10823 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10824
10825/* ------------------------------ */
10826 .balign 128
10827.L_ALT_op_shl_int_2addr: /* 0xb8 */
10828/* File: arm/alt_stub.S */
10829/*
10830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10831 * any interesting requests and then jump to the real instruction
10832 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10833 */
10834 .extern MterpCheckBefore
10835 EXPORT_PC
10836 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10837 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
10838 mov r0, rSELF
10839 add r1, rFP, #OFF_FP_SHADOWFRAME
10840 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10841
10842/* ------------------------------ */
10843 .balign 128
10844.L_ALT_op_shr_int_2addr: /* 0xb9 */
10845/* File: arm/alt_stub.S */
10846/*
10847 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10848 * any interesting requests and then jump to the real instruction
10849 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10850 */
10851 .extern MterpCheckBefore
10852 EXPORT_PC
10853 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10854 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
10855 mov r0, rSELF
10856 add r1, rFP, #OFF_FP_SHADOWFRAME
10857 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10858
10859/* ------------------------------ */
10860 .balign 128
10861.L_ALT_op_ushr_int_2addr: /* 0xba */
10862/* File: arm/alt_stub.S */
10863/*
10864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10865 * any interesting requests and then jump to the real instruction
10866 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10867 */
10868 .extern MterpCheckBefore
10869 EXPORT_PC
10870 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10871 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
10872 mov r0, rSELF
10873 add r1, rFP, #OFF_FP_SHADOWFRAME
10874 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10875
10876/* ------------------------------ */
10877 .balign 128
10878.L_ALT_op_add_long_2addr: /* 0xbb */
10879/* File: arm/alt_stub.S */
10880/*
10881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10882 * any interesting requests and then jump to the real instruction
10883 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10884 */
10885 .extern MterpCheckBefore
10886 EXPORT_PC
10887 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10888 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
10889 mov r0, rSELF
10890 add r1, rFP, #OFF_FP_SHADOWFRAME
10891 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10892
10893/* ------------------------------ */
10894 .balign 128
10895.L_ALT_op_sub_long_2addr: /* 0xbc */
10896/* File: arm/alt_stub.S */
10897/*
10898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10899 * any interesting requests and then jump to the real instruction
10900 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10901 */
10902 .extern MterpCheckBefore
10903 EXPORT_PC
10904 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10905 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
10906 mov r0, rSELF
10907 add r1, rFP, #OFF_FP_SHADOWFRAME
10908 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10909
10910/* ------------------------------ */
10911 .balign 128
10912.L_ALT_op_mul_long_2addr: /* 0xbd */
10913/* File: arm/alt_stub.S */
10914/*
10915 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10916 * any interesting requests and then jump to the real instruction
10917 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10918 */
10919 .extern MterpCheckBefore
10920 EXPORT_PC
10921 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10922 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
10923 mov r0, rSELF
10924 add r1, rFP, #OFF_FP_SHADOWFRAME
10925 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10926
10927/* ------------------------------ */
10928 .balign 128
10929.L_ALT_op_div_long_2addr: /* 0xbe */
10930/* File: arm/alt_stub.S */
10931/*
10932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10933 * any interesting requests and then jump to the real instruction
10934 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10935 */
10936 .extern MterpCheckBefore
10937 EXPORT_PC
10938 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10939 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
10940 mov r0, rSELF
10941 add r1, rFP, #OFF_FP_SHADOWFRAME
10942 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10943
10944/* ------------------------------ */
10945 .balign 128
10946.L_ALT_op_rem_long_2addr: /* 0xbf */
10947/* File: arm/alt_stub.S */
10948/*
10949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10950 * any interesting requests and then jump to the real instruction
10951 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10952 */
10953 .extern MterpCheckBefore
10954 EXPORT_PC
10955 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10956 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
10957 mov r0, rSELF
10958 add r1, rFP, #OFF_FP_SHADOWFRAME
10959 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10960
10961/* ------------------------------ */
10962 .balign 128
10963.L_ALT_op_and_long_2addr: /* 0xc0 */
10964/* File: arm/alt_stub.S */
10965/*
10966 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10967 * any interesting requests and then jump to the real instruction
10968 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10969 */
10970 .extern MterpCheckBefore
10971 EXPORT_PC
10972 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10973 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
10974 mov r0, rSELF
10975 add r1, rFP, #OFF_FP_SHADOWFRAME
10976 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10977
10978/* ------------------------------ */
10979 .balign 128
10980.L_ALT_op_or_long_2addr: /* 0xc1 */
10981/* File: arm/alt_stub.S */
10982/*
10983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10984 * any interesting requests and then jump to the real instruction
10985 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10986 */
10987 .extern MterpCheckBefore
10988 EXPORT_PC
10989 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10990 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
10991 mov r0, rSELF
10992 add r1, rFP, #OFF_FP_SHADOWFRAME
10993 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10994
10995/* ------------------------------ */
10996 .balign 128
10997.L_ALT_op_xor_long_2addr: /* 0xc2 */
10998/* File: arm/alt_stub.S */
10999/*
11000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11001 * any interesting requests and then jump to the real instruction
11002 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11003 */
11004 .extern MterpCheckBefore
11005 EXPORT_PC
11006 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11007 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
11008 mov r0, rSELF
11009 add r1, rFP, #OFF_FP_SHADOWFRAME
11010 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11011
11012/* ------------------------------ */
11013 .balign 128
11014.L_ALT_op_shl_long_2addr: /* 0xc3 */
11015/* File: arm/alt_stub.S */
11016/*
11017 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11018 * any interesting requests and then jump to the real instruction
11019 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11020 */
11021 .extern MterpCheckBefore
11022 EXPORT_PC
11023 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11024 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11025 mov r0, rSELF
11026 add r1, rFP, #OFF_FP_SHADOWFRAME
11027 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11028
11029/* ------------------------------ */
11030 .balign 128
11031.L_ALT_op_shr_long_2addr: /* 0xc4 */
11032/* File: arm/alt_stub.S */
11033/*
11034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11035 * any interesting requests and then jump to the real instruction
11036 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11037 */
11038 .extern MterpCheckBefore
11039 EXPORT_PC
11040 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11041 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11042 mov r0, rSELF
11043 add r1, rFP, #OFF_FP_SHADOWFRAME
11044 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11045
11046/* ------------------------------ */
11047 .balign 128
11048.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11049/* File: arm/alt_stub.S */
11050/*
11051 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11052 * any interesting requests and then jump to the real instruction
11053 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11054 */
11055 .extern MterpCheckBefore
11056 EXPORT_PC
11057 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11058 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11059 mov r0, rSELF
11060 add r1, rFP, #OFF_FP_SHADOWFRAME
11061 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11062
11063/* ------------------------------ */
11064 .balign 128
11065.L_ALT_op_add_float_2addr: /* 0xc6 */
11066/* File: arm/alt_stub.S */
11067/*
11068 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11069 * any interesting requests and then jump to the real instruction
11070 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11071 */
11072 .extern MterpCheckBefore
11073 EXPORT_PC
11074 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11075 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11076 mov r0, rSELF
11077 add r1, rFP, #OFF_FP_SHADOWFRAME
11078 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11079
11080/* ------------------------------ */
11081 .balign 128
11082.L_ALT_op_sub_float_2addr: /* 0xc7 */
11083/* File: arm/alt_stub.S */
11084/*
11085 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11086 * any interesting requests and then jump to the real instruction
11087 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11088 */
11089 .extern MterpCheckBefore
11090 EXPORT_PC
11091 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11092 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11093 mov r0, rSELF
11094 add r1, rFP, #OFF_FP_SHADOWFRAME
11095 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11096
11097/* ------------------------------ */
11098 .balign 128
11099.L_ALT_op_mul_float_2addr: /* 0xc8 */
11100/* File: arm/alt_stub.S */
11101/*
11102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11103 * any interesting requests and then jump to the real instruction
11104 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11105 */
11106 .extern MterpCheckBefore
11107 EXPORT_PC
11108 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11109 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11110 mov r0, rSELF
11111 add r1, rFP, #OFF_FP_SHADOWFRAME
11112 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11113
11114/* ------------------------------ */
11115 .balign 128
11116.L_ALT_op_div_float_2addr: /* 0xc9 */
11117/* File: arm/alt_stub.S */
11118/*
11119 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11120 * any interesting requests and then jump to the real instruction
11121 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11122 */
11123 .extern MterpCheckBefore
11124 EXPORT_PC
11125 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11126 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11127 mov r0, rSELF
11128 add r1, rFP, #OFF_FP_SHADOWFRAME
11129 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11130
11131/* ------------------------------ */
11132 .balign 128
11133.L_ALT_op_rem_float_2addr: /* 0xca */
11134/* File: arm/alt_stub.S */
11135/*
11136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11137 * any interesting requests and then jump to the real instruction
11138 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11139 */
11140 .extern MterpCheckBefore
11141 EXPORT_PC
11142 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11143 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11144 mov r0, rSELF
11145 add r1, rFP, #OFF_FP_SHADOWFRAME
11146 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11147
11148/* ------------------------------ */
11149 .balign 128
11150.L_ALT_op_add_double_2addr: /* 0xcb */
11151/* File: arm/alt_stub.S */
11152/*
11153 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11154 * any interesting requests and then jump to the real instruction
11155 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11156 */
11157 .extern MterpCheckBefore
11158 EXPORT_PC
11159 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11160 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11161 mov r0, rSELF
11162 add r1, rFP, #OFF_FP_SHADOWFRAME
11163 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11164
11165/* ------------------------------ */
11166 .balign 128
11167.L_ALT_op_sub_double_2addr: /* 0xcc */
11168/* File: arm/alt_stub.S */
11169/*
11170 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11171 * any interesting requests and then jump to the real instruction
11172 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11173 */
11174 .extern MterpCheckBefore
11175 EXPORT_PC
11176 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11177 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11178 mov r0, rSELF
11179 add r1, rFP, #OFF_FP_SHADOWFRAME
11180 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11181
11182/* ------------------------------ */
11183 .balign 128
11184.L_ALT_op_mul_double_2addr: /* 0xcd */
11185/* File: arm/alt_stub.S */
11186/*
11187 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11188 * any interesting requests and then jump to the real instruction
11189 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11190 */
11191 .extern MterpCheckBefore
11192 EXPORT_PC
11193 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11194 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11195 mov r0, rSELF
11196 add r1, rFP, #OFF_FP_SHADOWFRAME
11197 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11198
11199/* ------------------------------ */
11200 .balign 128
11201.L_ALT_op_div_double_2addr: /* 0xce */
11202/* File: arm/alt_stub.S */
11203/*
11204 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11205 * any interesting requests and then jump to the real instruction
11206 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11207 */
11208 .extern MterpCheckBefore
11209 EXPORT_PC
11210 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11211 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11212 mov r0, rSELF
11213 add r1, rFP, #OFF_FP_SHADOWFRAME
11214 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11215
11216/* ------------------------------ */
11217 .balign 128
11218.L_ALT_op_rem_double_2addr: /* 0xcf */
11219/* File: arm/alt_stub.S */
11220/*
11221 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11222 * any interesting requests and then jump to the real instruction
11223 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11224 */
11225 .extern MterpCheckBefore
11226 EXPORT_PC
11227 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11228 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11229 mov r0, rSELF
11230 add r1, rFP, #OFF_FP_SHADOWFRAME
11231 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11232
11233/* ------------------------------ */
11234 .balign 128
11235.L_ALT_op_add_int_lit16: /* 0xd0 */
11236/* File: arm/alt_stub.S */
11237/*
11238 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11239 * any interesting requests and then jump to the real instruction
11240 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11241 */
11242 .extern MterpCheckBefore
11243 EXPORT_PC
11244 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11245 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11246 mov r0, rSELF
11247 add r1, rFP, #OFF_FP_SHADOWFRAME
11248 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11249
11250/* ------------------------------ */
11251 .balign 128
11252.L_ALT_op_rsub_int: /* 0xd1 */
11253/* File: arm/alt_stub.S */
11254/*
11255 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11256 * any interesting requests and then jump to the real instruction
11257 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11258 */
11259 .extern MterpCheckBefore
11260 EXPORT_PC
11261 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11262 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11263 mov r0, rSELF
11264 add r1, rFP, #OFF_FP_SHADOWFRAME
11265 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11266
11267/* ------------------------------ */
11268 .balign 128
11269.L_ALT_op_mul_int_lit16: /* 0xd2 */
11270/* File: arm/alt_stub.S */
11271/*
11272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11273 * any interesting requests and then jump to the real instruction
11274 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11275 */
11276 .extern MterpCheckBefore
11277 EXPORT_PC
11278 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11279 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11280 mov r0, rSELF
11281 add r1, rFP, #OFF_FP_SHADOWFRAME
11282 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11283
11284/* ------------------------------ */
11285 .balign 128
11286.L_ALT_op_div_int_lit16: /* 0xd3 */
11287/* File: arm/alt_stub.S */
11288/*
11289 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11290 * any interesting requests and then jump to the real instruction
11291 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11292 */
11293 .extern MterpCheckBefore
11294 EXPORT_PC
11295 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11296 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11297 mov r0, rSELF
11298 add r1, rFP, #OFF_FP_SHADOWFRAME
11299 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11300
11301/* ------------------------------ */
11302 .balign 128
11303.L_ALT_op_rem_int_lit16: /* 0xd4 */
11304/* File: arm/alt_stub.S */
11305/*
11306 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11307 * any interesting requests and then jump to the real instruction
11308 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11309 */
11310 .extern MterpCheckBefore
11311 EXPORT_PC
11312 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11313 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11314 mov r0, rSELF
11315 add r1, rFP, #OFF_FP_SHADOWFRAME
11316 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11317
11318/* ------------------------------ */
11319 .balign 128
11320.L_ALT_op_and_int_lit16: /* 0xd5 */
11321/* File: arm/alt_stub.S */
11322/*
11323 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11324 * any interesting requests and then jump to the real instruction
11325 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11326 */
11327 .extern MterpCheckBefore
11328 EXPORT_PC
11329 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11330 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11331 mov r0, rSELF
11332 add r1, rFP, #OFF_FP_SHADOWFRAME
11333 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11334
11335/* ------------------------------ */
11336 .balign 128
11337.L_ALT_op_or_int_lit16: /* 0xd6 */
11338/* File: arm/alt_stub.S */
11339/*
11340 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11341 * any interesting requests and then jump to the real instruction
11342 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11343 */
11344 .extern MterpCheckBefore
11345 EXPORT_PC
11346 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11347 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11348 mov r0, rSELF
11349 add r1, rFP, #OFF_FP_SHADOWFRAME
11350 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11351
11352/* ------------------------------ */
11353 .balign 128
11354.L_ALT_op_xor_int_lit16: /* 0xd7 */
11355/* File: arm/alt_stub.S */
11356/*
11357 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11358 * any interesting requests and then jump to the real instruction
11359 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11360 */
11361 .extern MterpCheckBefore
11362 EXPORT_PC
11363 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11364 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11365 mov r0, rSELF
11366 add r1, rFP, #OFF_FP_SHADOWFRAME
11367 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11368
11369/* ------------------------------ */
11370 .balign 128
11371.L_ALT_op_add_int_lit8: /* 0xd8 */
11372/* File: arm/alt_stub.S */
11373/*
11374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11375 * any interesting requests and then jump to the real instruction
11376 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11377 */
11378 .extern MterpCheckBefore
11379 EXPORT_PC
11380 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11381 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11382 mov r0, rSELF
11383 add r1, rFP, #OFF_FP_SHADOWFRAME
11384 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11385
11386/* ------------------------------ */
11387 .balign 128
11388.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11389/* File: arm/alt_stub.S */
11390/*
11391 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11392 * any interesting requests and then jump to the real instruction
11393 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11394 */
11395 .extern MterpCheckBefore
11396 EXPORT_PC
11397 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11398 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11399 mov r0, rSELF
11400 add r1, rFP, #OFF_FP_SHADOWFRAME
11401 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11402
11403/* ------------------------------ */
11404 .balign 128
11405.L_ALT_op_mul_int_lit8: /* 0xda */
11406/* File: arm/alt_stub.S */
11407/*
11408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11409 * any interesting requests and then jump to the real instruction
11410 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11411 */
11412 .extern MterpCheckBefore
11413 EXPORT_PC
11414 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11415 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11416 mov r0, rSELF
11417 add r1, rFP, #OFF_FP_SHADOWFRAME
11418 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11419
11420/* ------------------------------ */
11421 .balign 128
11422.L_ALT_op_div_int_lit8: /* 0xdb */
11423/* File: arm/alt_stub.S */
11424/*
11425 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11426 * any interesting requests and then jump to the real instruction
11427 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11428 */
11429 .extern MterpCheckBefore
11430 EXPORT_PC
11431 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11432 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11433 mov r0, rSELF
11434 add r1, rFP, #OFF_FP_SHADOWFRAME
11435 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11436
11437/* ------------------------------ */
11438 .balign 128
11439.L_ALT_op_rem_int_lit8: /* 0xdc */
11440/* File: arm/alt_stub.S */
11441/*
11442 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11443 * any interesting requests and then jump to the real instruction
11444 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11445 */
11446 .extern MterpCheckBefore
11447 EXPORT_PC
11448 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11449 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11450 mov r0, rSELF
11451 add r1, rFP, #OFF_FP_SHADOWFRAME
11452 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11453
11454/* ------------------------------ */
11455 .balign 128
11456.L_ALT_op_and_int_lit8: /* 0xdd */
11457/* File: arm/alt_stub.S */
11458/*
11459 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11460 * any interesting requests and then jump to the real instruction
11461 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11462 */
11463 .extern MterpCheckBefore
11464 EXPORT_PC
11465 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11466 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11467 mov r0, rSELF
11468 add r1, rFP, #OFF_FP_SHADOWFRAME
11469 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11470
11471/* ------------------------------ */
11472 .balign 128
11473.L_ALT_op_or_int_lit8: /* 0xde */
11474/* File: arm/alt_stub.S */
11475/*
11476 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11477 * any interesting requests and then jump to the real instruction
11478 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11479 */
11480 .extern MterpCheckBefore
11481 EXPORT_PC
11482 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11483 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11484 mov r0, rSELF
11485 add r1, rFP, #OFF_FP_SHADOWFRAME
11486 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11487
11488/* ------------------------------ */
11489 .balign 128
11490.L_ALT_op_xor_int_lit8: /* 0xdf */
11491/* File: arm/alt_stub.S */
11492/*
11493 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11494 * any interesting requests and then jump to the real instruction
11495 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11496 */
11497 .extern MterpCheckBefore
11498 EXPORT_PC
11499 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11500 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11501 mov r0, rSELF
11502 add r1, rFP, #OFF_FP_SHADOWFRAME
11503 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11504
11505/* ------------------------------ */
11506 .balign 128
11507.L_ALT_op_shl_int_lit8: /* 0xe0 */
11508/* File: arm/alt_stub.S */
11509/*
11510 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11511 * any interesting requests and then jump to the real instruction
11512 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11513 */
11514 .extern MterpCheckBefore
11515 EXPORT_PC
11516 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11517 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11518 mov r0, rSELF
11519 add r1, rFP, #OFF_FP_SHADOWFRAME
11520 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11521
11522/* ------------------------------ */
11523 .balign 128
11524.L_ALT_op_shr_int_lit8: /* 0xe1 */
11525/* File: arm/alt_stub.S */
11526/*
11527 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11528 * any interesting requests and then jump to the real instruction
11529 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11530 */
11531 .extern MterpCheckBefore
11532 EXPORT_PC
11533 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11534 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11535 mov r0, rSELF
11536 add r1, rFP, #OFF_FP_SHADOWFRAME
11537 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11538
11539/* ------------------------------ */
11540 .balign 128
11541.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11542/* File: arm/alt_stub.S */
11543/*
11544 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11545 * any interesting requests and then jump to the real instruction
11546 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11547 */
11548 .extern MterpCheckBefore
11549 EXPORT_PC
11550 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11551 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11552 mov r0, rSELF
11553 add r1, rFP, #OFF_FP_SHADOWFRAME
11554 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11555
11556/* ------------------------------ */
11557 .balign 128
11558.L_ALT_op_iget_quick: /* 0xe3 */
11559/* File: arm/alt_stub.S */
11560/*
11561 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11562 * any interesting requests and then jump to the real instruction
11563 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11564 */
11565 .extern MterpCheckBefore
11566 EXPORT_PC
11567 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11568 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11569 mov r0, rSELF
11570 add r1, rFP, #OFF_FP_SHADOWFRAME
11571 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11572
11573/* ------------------------------ */
11574 .balign 128
11575.L_ALT_op_iget_wide_quick: /* 0xe4 */
11576/* File: arm/alt_stub.S */
11577/*
11578 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11579 * any interesting requests and then jump to the real instruction
11580 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11581 */
11582 .extern MterpCheckBefore
11583 EXPORT_PC
11584 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11585 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11586 mov r0, rSELF
11587 add r1, rFP, #OFF_FP_SHADOWFRAME
11588 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11589
11590/* ------------------------------ */
11591 .balign 128
11592.L_ALT_op_iget_object_quick: /* 0xe5 */
11593/* File: arm/alt_stub.S */
11594/*
11595 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11596 * any interesting requests and then jump to the real instruction
11597 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11598 */
11599 .extern MterpCheckBefore
11600 EXPORT_PC
11601 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11602 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11603 mov r0, rSELF
11604 add r1, rFP, #OFF_FP_SHADOWFRAME
11605 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11606
11607/* ------------------------------ */
11608 .balign 128
11609.L_ALT_op_iput_quick: /* 0xe6 */
11610/* File: arm/alt_stub.S */
11611/*
11612 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11613 * any interesting requests and then jump to the real instruction
11614 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11615 */
11616 .extern MterpCheckBefore
11617 EXPORT_PC
11618 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11619 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11620 mov r0, rSELF
11621 add r1, rFP, #OFF_FP_SHADOWFRAME
11622 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11623
11624/* ------------------------------ */
11625 .balign 128
11626.L_ALT_op_iput_wide_quick: /* 0xe7 */
11627/* File: arm/alt_stub.S */
11628/*
11629 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11630 * any interesting requests and then jump to the real instruction
11631 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11632 */
11633 .extern MterpCheckBefore
11634 EXPORT_PC
11635 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11636 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11637 mov r0, rSELF
11638 add r1, rFP, #OFF_FP_SHADOWFRAME
11639 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11640
11641/* ------------------------------ */
11642 .balign 128
11643.L_ALT_op_iput_object_quick: /* 0xe8 */
11644/* File: arm/alt_stub.S */
11645/*
11646 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11647 * any interesting requests and then jump to the real instruction
11648 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11649 */
11650 .extern MterpCheckBefore
11651 EXPORT_PC
11652 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11653 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11654 mov r0, rSELF
11655 add r1, rFP, #OFF_FP_SHADOWFRAME
11656 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11657
11658/* ------------------------------ */
11659 .balign 128
11660.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11661/* File: arm/alt_stub.S */
11662/*
11663 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11664 * any interesting requests and then jump to the real instruction
11665 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11666 */
11667 .extern MterpCheckBefore
11668 EXPORT_PC
11669 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11670 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11671 mov r0, rSELF
11672 add r1, rFP, #OFF_FP_SHADOWFRAME
11673 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11674
11675/* ------------------------------ */
11676 .balign 128
11677.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11678/* File: arm/alt_stub.S */
11679/*
11680 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11681 * any interesting requests and then jump to the real instruction
11682 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11683 */
11684 .extern MterpCheckBefore
11685 EXPORT_PC
11686 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11687 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11688 mov r0, rSELF
11689 add r1, rFP, #OFF_FP_SHADOWFRAME
11690 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11691
11692/* ------------------------------ */
11693 .balign 128
11694.L_ALT_op_iput_boolean_quick: /* 0xeb */
11695/* File: arm/alt_stub.S */
11696/*
11697 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11698 * any interesting requests and then jump to the real instruction
11699 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11700 */
11701 .extern MterpCheckBefore
11702 EXPORT_PC
11703 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11704 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11705 mov r0, rSELF
11706 add r1, rFP, #OFF_FP_SHADOWFRAME
11707 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11708
11709/* ------------------------------ */
11710 .balign 128
11711.L_ALT_op_iput_byte_quick: /* 0xec */
11712/* File: arm/alt_stub.S */
11713/*
11714 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11715 * any interesting requests and then jump to the real instruction
11716 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11717 */
11718 .extern MterpCheckBefore
11719 EXPORT_PC
11720 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11721 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11722 mov r0, rSELF
11723 add r1, rFP, #OFF_FP_SHADOWFRAME
11724 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11725
11726/* ------------------------------ */
11727 .balign 128
11728.L_ALT_op_iput_char_quick: /* 0xed */
11729/* File: arm/alt_stub.S */
11730/*
11731 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11732 * any interesting requests and then jump to the real instruction
11733 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11734 */
11735 .extern MterpCheckBefore
11736 EXPORT_PC
11737 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11738 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11739 mov r0, rSELF
11740 add r1, rFP, #OFF_FP_SHADOWFRAME
11741 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11742
11743/* ------------------------------ */
11744 .balign 128
11745.L_ALT_op_iput_short_quick: /* 0xee */
11746/* File: arm/alt_stub.S */
11747/*
11748 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11749 * any interesting requests and then jump to the real instruction
11750 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11751 */
11752 .extern MterpCheckBefore
11753 EXPORT_PC
11754 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11755 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
11756 mov r0, rSELF
11757 add r1, rFP, #OFF_FP_SHADOWFRAME
11758 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11759
11760/* ------------------------------ */
11761 .balign 128
11762.L_ALT_op_iget_boolean_quick: /* 0xef */
11763/* File: arm/alt_stub.S */
11764/*
11765 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11766 * any interesting requests and then jump to the real instruction
11767 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11768 */
11769 .extern MterpCheckBefore
11770 EXPORT_PC
11771 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11772 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
11773 mov r0, rSELF
11774 add r1, rFP, #OFF_FP_SHADOWFRAME
11775 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11776
11777/* ------------------------------ */
11778 .balign 128
11779.L_ALT_op_iget_byte_quick: /* 0xf0 */
11780/* File: arm/alt_stub.S */
11781/*
11782 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11783 * any interesting requests and then jump to the real instruction
11784 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11785 */
11786 .extern MterpCheckBefore
11787 EXPORT_PC
11788 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11789 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
11790 mov r0, rSELF
11791 add r1, rFP, #OFF_FP_SHADOWFRAME
11792 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11793
11794/* ------------------------------ */
11795 .balign 128
11796.L_ALT_op_iget_char_quick: /* 0xf1 */
11797/* File: arm/alt_stub.S */
11798/*
11799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11800 * any interesting requests and then jump to the real instruction
11801 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11802 */
11803 .extern MterpCheckBefore
11804 EXPORT_PC
11805 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11806 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
11807 mov r0, rSELF
11808 add r1, rFP, #OFF_FP_SHADOWFRAME
11809 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11810
11811/* ------------------------------ */
11812 .balign 128
11813.L_ALT_op_iget_short_quick: /* 0xf2 */
11814/* File: arm/alt_stub.S */
11815/*
11816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11817 * any interesting requests and then jump to the real instruction
11818 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11819 */
11820 .extern MterpCheckBefore
11821 EXPORT_PC
11822 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11823 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
11824 mov r0, rSELF
11825 add r1, rFP, #OFF_FP_SHADOWFRAME
11826 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11827
11828/* ------------------------------ */
11829 .balign 128
11830.L_ALT_op_invoke_lambda: /* 0xf3 */
11831/* File: arm/alt_stub.S */
11832/*
11833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11834 * any interesting requests and then jump to the real instruction
11835 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11836 */
11837 .extern MterpCheckBefore
11838 EXPORT_PC
11839 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11840 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
11841 mov r0, rSELF
11842 add r1, rFP, #OFF_FP_SHADOWFRAME
11843 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11844
11845/* ------------------------------ */
11846 .balign 128
11847.L_ALT_op_unused_f4: /* 0xf4 */
11848/* File: arm/alt_stub.S */
11849/*
11850 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11851 * any interesting requests and then jump to the real instruction
11852 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11853 */
11854 .extern MterpCheckBefore
11855 EXPORT_PC
11856 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11857 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
11858 mov r0, rSELF
11859 add r1, rFP, #OFF_FP_SHADOWFRAME
11860 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11861
11862/* ------------------------------ */
11863 .balign 128
11864.L_ALT_op_capture_variable: /* 0xf5 */
11865/* File: arm/alt_stub.S */
11866/*
11867 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11868 * any interesting requests and then jump to the real instruction
11869 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11870 */
11871 .extern MterpCheckBefore
11872 EXPORT_PC
11873 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11874 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
11875 mov r0, rSELF
11876 add r1, rFP, #OFF_FP_SHADOWFRAME
11877 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11878
11879/* ------------------------------ */
11880 .balign 128
11881.L_ALT_op_create_lambda: /* 0xf6 */
11882/* File: arm/alt_stub.S */
11883/*
11884 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11885 * any interesting requests and then jump to the real instruction
11886 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11887 */
11888 .extern MterpCheckBefore
11889 EXPORT_PC
11890 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11891 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
11892 mov r0, rSELF
11893 add r1, rFP, #OFF_FP_SHADOWFRAME
11894 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11895
11896/* ------------------------------ */
11897 .balign 128
11898.L_ALT_op_liberate_variable: /* 0xf7 */
11899/* File: arm/alt_stub.S */
11900/*
11901 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11902 * any interesting requests and then jump to the real instruction
11903 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11904 */
11905 .extern MterpCheckBefore
11906 EXPORT_PC
11907 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11908 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
11909 mov r0, rSELF
11910 add r1, rFP, #OFF_FP_SHADOWFRAME
11911 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11912
11913/* ------------------------------ */
11914 .balign 128
11915.L_ALT_op_box_lambda: /* 0xf8 */
11916/* File: arm/alt_stub.S */
11917/*
11918 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11919 * any interesting requests and then jump to the real instruction
11920 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11921 */
11922 .extern MterpCheckBefore
11923 EXPORT_PC
11924 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11925 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
11926 mov r0, rSELF
11927 add r1, rFP, #OFF_FP_SHADOWFRAME
11928 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11929
11930/* ------------------------------ */
11931 .balign 128
11932.L_ALT_op_unbox_lambda: /* 0xf9 */
11933/* File: arm/alt_stub.S */
11934/*
11935 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11936 * any interesting requests and then jump to the real instruction
11937 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11938 */
11939 .extern MterpCheckBefore
11940 EXPORT_PC
11941 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11942 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
11943 mov r0, rSELF
11944 add r1, rFP, #OFF_FP_SHADOWFRAME
11945 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11946
11947/* ------------------------------ */
11948 .balign 128
11949.L_ALT_op_unused_fa: /* 0xfa */
11950/* File: arm/alt_stub.S */
11951/*
11952 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11953 * any interesting requests and then jump to the real instruction
11954 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11955 */
11956 .extern MterpCheckBefore
11957 EXPORT_PC
11958 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11959 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
11960 mov r0, rSELF
11961 add r1, rFP, #OFF_FP_SHADOWFRAME
11962 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11963
11964/* ------------------------------ */
11965 .balign 128
11966.L_ALT_op_unused_fb: /* 0xfb */
11967/* File: arm/alt_stub.S */
11968/*
11969 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11970 * any interesting requests and then jump to the real instruction
11971 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11972 */
11973 .extern MterpCheckBefore
11974 EXPORT_PC
11975 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11976 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
11977 mov r0, rSELF
11978 add r1, rFP, #OFF_FP_SHADOWFRAME
11979 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11980
11981/* ------------------------------ */
11982 .balign 128
11983.L_ALT_op_unused_fc: /* 0xfc */
11984/* File: arm/alt_stub.S */
11985/*
11986 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11987 * any interesting requests and then jump to the real instruction
11988 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11989 */
11990 .extern MterpCheckBefore
11991 EXPORT_PC
11992 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11993 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
11994 mov r0, rSELF
11995 add r1, rFP, #OFF_FP_SHADOWFRAME
11996 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11997
11998/* ------------------------------ */
11999 .balign 128
12000.L_ALT_op_unused_fd: /* 0xfd */
12001/* File: arm/alt_stub.S */
12002/*
12003 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12004 * any interesting requests and then jump to the real instruction
12005 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12006 */
12007 .extern MterpCheckBefore
12008 EXPORT_PC
12009 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12010 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
12011 mov r0, rSELF
12012 add r1, rFP, #OFF_FP_SHADOWFRAME
12013 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12014
12015/* ------------------------------ */
12016 .balign 128
12017.L_ALT_op_unused_fe: /* 0xfe */
12018/* File: arm/alt_stub.S */
12019/*
12020 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12021 * any interesting requests and then jump to the real instruction
12022 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12023 */
12024 .extern MterpCheckBefore
12025 EXPORT_PC
12026 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12027 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12028 mov r0, rSELF
12029 add r1, rFP, #OFF_FP_SHADOWFRAME
12030 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12031
12032/* ------------------------------ */
12033 .balign 128
12034.L_ALT_op_unused_ff: /* 0xff */
12035/* File: arm/alt_stub.S */
12036/*
12037 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12038 * any interesting requests and then jump to the real instruction
12039 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12040 */
12041 .extern MterpCheckBefore
12042 EXPORT_PC
12043 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12044 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12045 mov r0, rSELF
12046 add r1, rFP, #OFF_FP_SHADOWFRAME
12047 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12048
12049 .balign 128
12050 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12051 .global artMterpAsmAltInstructionEnd
12052artMterpAsmAltInstructionEnd:
12053/* File: arm/footer.S */
12054/*
12055 * ===========================================================================
12056 * Common subroutines and data
12057 * ===========================================================================
12058 */
12059
12060 .text
12061 .align 2
12062
12063/*
12064 * We've detected a condition that will result in an exception, but the exception
12065 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12066 * TUNING: for consistency, we may want to just go ahead and handle these here.
12067 */
Nicolas Geoffray5d033172016-02-11 11:39:37 +000012068#define MTERP_LOGGING 0
buzbee1452bee2015-03-06 14:43:04 -080012069common_errDivideByZero:
12070 EXPORT_PC
12071#if MTERP_LOGGING
12072 mov r0, rSELF
12073 add r1, rFP, #OFF_FP_SHADOWFRAME
12074 bl MterpLogDivideByZeroException
12075#endif
12076 b MterpCommonFallback
12077
12078common_errArrayIndex:
12079 EXPORT_PC
12080#if MTERP_LOGGING
12081 mov r0, rSELF
12082 add r1, rFP, #OFF_FP_SHADOWFRAME
12083 bl MterpLogArrayIndexException
12084#endif
12085 b MterpCommonFallback
12086
12087common_errNegativeArraySize:
12088 EXPORT_PC
12089#if MTERP_LOGGING
12090 mov r0, rSELF
12091 add r1, rFP, #OFF_FP_SHADOWFRAME
12092 bl MterpLogNegativeArraySizeException
12093#endif
12094 b MterpCommonFallback
12095
12096common_errNoSuchMethod:
12097 EXPORT_PC
12098#if MTERP_LOGGING
12099 mov r0, rSELF
12100 add r1, rFP, #OFF_FP_SHADOWFRAME
12101 bl MterpLogNoSuchMethodException
12102#endif
12103 b MterpCommonFallback
12104
12105common_errNullObject:
12106 EXPORT_PC
12107#if MTERP_LOGGING
12108 mov r0, rSELF
12109 add r1, rFP, #OFF_FP_SHADOWFRAME
12110 bl MterpLogNullObjectException
12111#endif
12112 b MterpCommonFallback
12113
12114common_exceptionThrown:
12115 EXPORT_PC
12116#if MTERP_LOGGING
12117 mov r0, rSELF
12118 add r1, rFP, #OFF_FP_SHADOWFRAME
12119 bl MterpLogExceptionThrownException
12120#endif
12121 b MterpCommonFallback
12122
12123MterpSuspendFallback:
12124 EXPORT_PC
12125#if MTERP_LOGGING
12126 mov r0, rSELF
12127 add r1, rFP, #OFF_FP_SHADOWFRAME
12128 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12129 bl MterpLogSuspendFallback
12130#endif
12131 b MterpCommonFallback
12132
12133/*
12134 * If we're here, something is out of the ordinary. If there is a pending
12135 * exception, handle it. Otherwise, roll back and retry with the reference
12136 * interpreter.
12137 */
12138MterpPossibleException:
12139 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12140 cmp r0, #0 @ Exception pending?
12141 beq MterpFallback @ If not, fall back to reference interpreter.
12142 /* intentional fallthrough - handle pending exception. */
12143/*
12144 * On return from a runtime helper routine, we've found a pending exception.
12145 * Can we handle it here - or need to bail out to caller?
12146 *
12147 */
12148MterpException:
12149 mov r0, rSELF
12150 add r1, rFP, #OFF_FP_SHADOWFRAME
12151 bl MterpHandleException @ (self, shadow_frame)
12152 cmp r0, #0
12153 beq MterpExceptionReturn @ no local catch, back to caller.
12154 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12155 ldr r1, [rFP, #OFF_FP_DEX_PC]
12156 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12157 add rPC, r0, #CODEITEM_INSNS_OFFSET
12158 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
12159 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
12160 /* resume execution at catch block */
12161 FETCH_INST
12162 GET_INST_OPCODE ip
12163 GOTO_OPCODE ip
12164 /* NOTE: no fallthrough */
12165
12166/*
12167 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12168 * still needs to get the opcode and branch to it, and flags are in lr.
12169 */
12170MterpCheckSuspendAndContinue:
12171 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
12172 EXPORT_PC
12173 mov r0, rSELF
12174 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12175 blne MterpSuspendCheck @ (self)
12176 GET_INST_OPCODE ip @ extract opcode from rINST
12177 GOTO_OPCODE ip @ jump to next instruction
12178
12179/*
12180 * Bail out to reference interpreter.
12181 */
12182MterpFallback:
12183 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -080012184#if MTERP_LOGGING
buzbee1452bee2015-03-06 14:43:04 -080012185 mov r0, rSELF
12186 add r1, rFP, #OFF_FP_SHADOWFRAME
12187 bl MterpLogFallback
buzbee76833da2016-01-13 13:06:22 -080012188#endif
buzbee1452bee2015-03-06 14:43:04 -080012189MterpCommonFallback:
12190 mov r0, #0 @ signal retry with reference interpreter.
12191 b MterpDone
12192
12193/*
12194 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12195 * SP and LR. Here we restore SP, restore the registers, and then restore
12196 * LR to PC.
12197 *
12198 * On entry:
12199 * uint32_t* rFP (should still be live, pointer to base of vregs)
12200 */
12201MterpExceptionReturn:
buzbee1452bee2015-03-06 14:43:04 -080012202 mov r0, #1 @ signal return to caller.
12203 b MterpDone
12204MterpReturn:
12205 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
buzbee1452bee2015-03-06 14:43:04 -080012206 str r0, [r2]
12207 str r1, [r2, #4]
buzbee1452bee2015-03-06 14:43:04 -080012208 mov r0, #1 @ signal return to caller.
12209MterpDone:
12210 add sp, sp, #4 @ un-align 64
12211 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12212
12213
12214 .fnend
12215 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12216
12217