blob: 94cbd2d10eaff999524f3f51b5914a91fc2d33d9 [file] [log] [blame]
buzbee1452bee2015-03-06 14:43:04 -08001/*
2 * This file was generated automatically by gen-mterp.py for 'arm'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: arm/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 Art assembly interpreter notes:
26
27 First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28 handle invoke, allows higher-level code to create frame & shadow frame.
29
30 Once that's working, support direct entry code & eliminate shadow frame (and
31 excess locals allocation.
32
33 Some (hopefully) temporary ugliness. We'll treat rFP as pointing to the
34 base of the vreg array within the shadow frame. Access the other fields,
35 dex_pc_, method_ and number_of_vregs_ via negative offsets. For now, we'll continue
36 the shadow frame mechanism of double-storing object references - via rFP &
37 number_of_vregs_.
38
39 */
40
41/*
42ARM EABI general notes:
43
44r0-r3 hold first 4 args to a method; they are not preserved across method calls
45r4-r8 are available for general use
46r9 is given special treatment in some situations, but not for us
47r10 (sl) seems to be generally available
48r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
49r12 (ip) is scratch -- not preserved across method calls
50r13 (sp) should be managed carefully in case a signal arrives
51r14 (lr) must be preserved
52r15 (pc) can be tinkered with directly
53
54r0 holds returns of <= 4 bytes
55r0-r1 hold returns of 8 bytes, low word in r0
56
57Callee must save/restore r4+ (except r12) if it modifies them. If VFP
58is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
59s0-s15 (d0-d7, q0-a3) do not need to be.
60
61Stack is "full descending". Only the arguments that don't fit in the first 4
62registers are placed on the stack. "sp" points at the first stacked argument
63(i.e. the 5th arg).
64
65VFP: single-precision results in s0, double-precision results in d0.
66
67In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
6864-bit quantities (long long, double) must be 64-bit aligned.
69*/
70
71/*
72Mterp and ARM notes:
73
74The following registers have fixed assignments:
75
76 reg nick purpose
77 r4 rPC interpreted program counter, used for fetching instructions
78 r5 rFP interpreted frame pointer, used for accessing locals and args
79 r6 rSELF self (Thread) pointer
80 r7 rINST first 16-bit code unit of current instruction
81 r8 rIBASE interpreted instruction base pointer, used for computed goto
82 r11 rREFS base of object references in shadow frame (ideally, we'll get rid of this later).
83
84Macros are provided for common operations. Each macro MUST emit only
85one instruction to make instruction-counting easier. They MUST NOT alter
86unspecified registers or condition codes.
87*/
88
89/*
90 * This is a #include, not a %include, because we want the C pre-processor
91 * to expand the macros into assembler assignment statements.
92 */
93#include "asm_support.h"
94
Bill Buzbeefd522f92016-02-11 22:37:42 +000095#define MTERP_PROFILE_BRANCHES 1
96#define MTERP_LOGGING 0
97
buzbee1452bee2015-03-06 14:43:04 -080098/* During bringup, we'll use the shadow frame model instead of rFP */
99/* single-purpose registers, given names for clarity */
100#define rPC r4
101#define rFP r5
102#define rSELF r6
103#define rINST r7
104#define rIBASE r8
105#define rREFS r11
106
107/*
108 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So,
109 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
110 */
111#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
112#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
113#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
114#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
115#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
116#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
117#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
118#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
119#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
120
121/*
buzbee1452bee2015-03-06 14:43:04 -0800122 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
123 * be done *before* something throws.
124 *
125 * It's okay to do this more than once.
126 *
127 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
128 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
129 * offset into the code_items_[] array. For effiency, we will "export" the
130 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
131 * to convert to a dex pc when needed.
132 */
133.macro EXPORT_PC
134 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
135.endm
136
137.macro EXPORT_DEX_PC tmp
138 ldr \tmp, [rFP, #OFF_FP_CODE_ITEM]
139 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
140 add \tmp, #CODEITEM_INSNS_OFFSET
141 sub \tmp, rPC, \tmp
142 asr \tmp, #1
143 str \tmp, [rFP, #OFF_FP_DEX_PC]
144.endm
145
146/*
147 * Fetch the next instruction from rPC into rINST. Does not advance rPC.
148 */
149.macro FETCH_INST
150 ldrh rINST, [rPC]
151.endm
152
153/*
154 * Fetch the next instruction from the specified offset. Advances rPC
155 * to point to the next instruction. "_count" is in 16-bit code units.
156 *
157 * Because of the limited size of immediate constants on ARM, this is only
158 * suitable for small forward movements (i.e. don't try to implement "goto"
159 * with this).
160 *
161 * This must come AFTER anything that can throw an exception, or the
162 * exception catch may miss. (This also implies that it must come after
163 * EXPORT_PC.)
164 */
165.macro FETCH_ADVANCE_INST count
166 ldrh rINST, [rPC, #((\count)*2)]!
167.endm
168
169/*
170 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
171 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
172 */
173.macro PREFETCH_ADVANCE_INST dreg, sreg, count
174 ldrh \dreg, [\sreg, #((\count)*2)]!
175.endm
176
177/*
178 * Similar to FETCH_ADVANCE_INST, but does not update rPC. Used to load
179 * rINST ahead of possible exception point. Be sure to manually advance rPC
180 * later.
181 */
182.macro PREFETCH_INST count
183 ldrh rINST, [rPC, #((\count)*2)]
184.endm
185
186/* Advance rPC by some number of code units. */
187.macro ADVANCE count
188 add rPC, #((\count)*2)
189.endm
190
191/*
192 * Fetch the next instruction from an offset specified by _reg. Updates
193 * rPC to point to the next instruction. "_reg" must specify the distance
194 * in bytes, *not* 16-bit code units, and may be a signed value.
195 *
196 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
197 * bits that hold the shift distance are used for the half/byte/sign flags.
198 * In some cases we can pre-double _reg for free, so we require a byte offset
199 * here.
200 */
201.macro FETCH_ADVANCE_INST_RB reg
202 ldrh rINST, [rPC, \reg]!
203.endm
204
205/*
206 * Fetch a half-word code unit from an offset past the current PC. The
207 * "_count" value is in 16-bit code units. Does not advance rPC.
208 *
209 * The "_S" variant works the same but treats the value as signed.
210 */
211.macro FETCH reg, count
212 ldrh \reg, [rPC, #((\count)*2)]
213.endm
214
215.macro FETCH_S reg, count
216 ldrsh \reg, [rPC, #((\count)*2)]
217.endm
218
219/*
220 * Fetch one byte from an offset past the current PC. Pass in the same
221 * "_count" as you would for FETCH, and an additional 0/1 indicating which
222 * byte of the halfword you want (lo/hi).
223 */
224.macro FETCH_B reg, count, byte
225 ldrb \reg, [rPC, #((\count)*2+(\byte))]
226.endm
227
228/*
229 * Put the instruction's opcode field into the specified register.
230 */
231.macro GET_INST_OPCODE reg
232 and \reg, rINST, #255
233.endm
234
235/*
236 * Put the prefetched instruction's opcode field into the specified register.
237 */
238.macro GET_PREFETCHED_OPCODE oreg, ireg
239 and \oreg, \ireg, #255
240.endm
241
242/*
243 * Begin executing the opcode in _reg. Because this only jumps within the
244 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
245 */
246.macro GOTO_OPCODE reg
247 add pc, rIBASE, \reg, lsl #7
248.endm
249.macro GOTO_OPCODE_BASE base,reg
250 add pc, \base, \reg, lsl #7
251.endm
252
253/*
254 * Get/set the 32-bit value from a Dalvik register.
255 */
256.macro GET_VREG reg, vreg
257 ldr \reg, [rFP, \vreg, lsl #2]
258.endm
259.macro SET_VREG reg, vreg
260 str \reg, [rFP, \vreg, lsl #2]
261 mov \reg, #0
262 str \reg, [rREFS, \vreg, lsl #2]
263.endm
264.macro SET_VREG_OBJECT reg, vreg, tmpreg
265 str \reg, [rFP, \vreg, lsl #2]
266 str \reg, [rREFS, \vreg, lsl #2]
267.endm
buzbee50cf6002016-02-10 08:59:12 -0800268.macro SET_VREG_SHADOW reg, vreg
269 str \reg, [rREFS, \vreg, lsl #2]
270.endm
271
272/*
273 * Clear the corresponding shadow regs for a vreg pair
274 */
275.macro CLEAR_SHADOW_PAIR vreg, tmp1, tmp2
276 mov \tmp1, #0
277 add \tmp2, \vreg, #1
278 SET_VREG_SHADOW \tmp1, \vreg
279 SET_VREG_SHADOW \tmp1, \tmp2
280.endm
buzbee1452bee2015-03-06 14:43:04 -0800281
282/*
283 * Convert a virtual register index into an address.
284 */
285.macro VREG_INDEX_TO_ADDR reg, vreg
286 add \reg, rFP, \vreg, lsl #2 /* WARNING/FIXME: handle shadow frame vreg zero if store */
287.endm
288
289/*
290 * Refresh handler table.
291 */
292.macro REFRESH_IBASE
293 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
294.endm
295
296/* File: arm/entry.S */
297/*
298 * Copyright (C) 2016 The Android Open Source Project
299 *
300 * Licensed under the Apache License, Version 2.0 (the "License");
301 * you may not use this file except in compliance with the License.
302 * You may obtain a copy of the License at
303 *
304 * http://www.apache.org/licenses/LICENSE-2.0
305 *
306 * Unless required by applicable law or agreed to in writing, software
307 * distributed under the License is distributed on an "AS IS" BASIS,
308 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
309 * See the License for the specific language governing permissions and
310 * limitations under the License.
311 */
312/*
313 * Interpreter entry point.
314 */
315
316 .text
317 .align 2
318 .global ExecuteMterpImpl
319 .type ExecuteMterpImpl, %function
320
321/*
322 * On entry:
323 * r0 Thread* self/
324 * r1 code_item
325 * r2 ShadowFrame
326 * r3 JValue* result_register
327 *
328 */
329
330ExecuteMterpImpl:
331 .fnstart
332 .save {r4-r10,fp,lr}
333 stmfd sp!, {r4-r10,fp,lr} @ save 9 regs
334 .pad #4
335 sub sp, sp, #4 @ align 64
336
337 /* Remember the return register */
338 str r3, [r2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
339
340 /* Remember the code_item */
341 str r1, [r2, #SHADOWFRAME_CODE_ITEM_OFFSET]
342
343 /* set up "named" registers */
344 mov rSELF, r0
345 ldr r0, [r2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
346 add rFP, r2, #SHADOWFRAME_VREGS_OFFSET @ point to insns[] (i.e. - the dalivk byte code).
347 add rREFS, rFP, r0, lsl #2 @ point to reference array in shadow frame
348 ldr r0, [r2, #SHADOWFRAME_DEX_PC_OFFSET] @ Get starting dex_pc.
349 add rPC, r1, #CODEITEM_INSNS_OFFSET @ Point to base of insns[]
350 add rPC, rPC, r0, lsl #1 @ Create direct pointer to 1st dex opcode
351 EXPORT_PC
352
353 /* Starting ibase */
354 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
355
356 /* start executing the instruction at rPC */
357 FETCH_INST @ load rINST from rPC
358 GET_INST_OPCODE ip @ extract opcode from rINST
359 GOTO_OPCODE ip @ jump to next instruction
360 /* NOTE: no fallthrough */
361
362
363 .global artMterpAsmInstructionStart
364 .type artMterpAsmInstructionStart, %function
365artMterpAsmInstructionStart = .L_op_nop
366 .text
367
368/* ------------------------------ */
369 .balign 128
370.L_op_nop: /* 0x00 */
371/* File: arm/op_nop.S */
372 FETCH_ADVANCE_INST 1 @ advance to next instr, load rINST
373 GET_INST_OPCODE ip @ ip<- opcode from rINST
374 GOTO_OPCODE ip @ execute it
375
376/* ------------------------------ */
377 .balign 128
378.L_op_move: /* 0x01 */
379/* File: arm/op_move.S */
380 /* for move, move-object, long-to-int */
381 /* op vA, vB */
382 mov r1, rINST, lsr #12 @ r1<- B from 15:12
383 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
384 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
385 GET_VREG r2, r1 @ r2<- fp[B]
386 GET_INST_OPCODE ip @ ip<- opcode from rINST
387 .if 0
388 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
389 .else
390 SET_VREG r2, r0 @ fp[A]<- r2
391 .endif
392 GOTO_OPCODE ip @ execute next instruction
393
394/* ------------------------------ */
395 .balign 128
396.L_op_move_from16: /* 0x02 */
397/* File: arm/op_move_from16.S */
398 /* for: move/from16, move-object/from16 */
399 /* op vAA, vBBBB */
400 FETCH r1, 1 @ r1<- BBBB
401 mov r0, rINST, lsr #8 @ r0<- AA
402 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
403 GET_VREG r2, r1 @ r2<- fp[BBBB]
404 GET_INST_OPCODE ip @ extract opcode from rINST
405 .if 0
406 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
407 .else
408 SET_VREG r2, r0 @ fp[AA]<- r2
409 .endif
410 GOTO_OPCODE ip @ jump to next instruction
411
412/* ------------------------------ */
413 .balign 128
414.L_op_move_16: /* 0x03 */
415/* File: arm/op_move_16.S */
416 /* for: move/16, move-object/16 */
417 /* op vAAAA, vBBBB */
418 FETCH r1, 2 @ r1<- BBBB
419 FETCH r0, 1 @ r0<- AAAA
420 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
421 GET_VREG r2, r1 @ r2<- fp[BBBB]
422 GET_INST_OPCODE ip @ extract opcode from rINST
423 .if 0
424 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
425 .else
426 SET_VREG r2, r0 @ fp[AAAA]<- r2
427 .endif
428 GOTO_OPCODE ip @ jump to next instruction
429
430/* ------------------------------ */
431 .balign 128
432.L_op_move_wide: /* 0x04 */
433/* File: arm/op_move_wide.S */
434 /* move-wide vA, vB */
435 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
436 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -0800437 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -0800438 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -0800439 add r2, rFP, rINST, lsl #2 @ r2<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -0800440 ldmia r3, {r0-r1} @ r0/r1<- fp[B]
buzbee50cf6002016-02-10 08:59:12 -0800441 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800442 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
443 GET_INST_OPCODE ip @ extract opcode from rINST
444 stmia r2, {r0-r1} @ fp[A]<- r0/r1
445 GOTO_OPCODE ip @ jump to next instruction
446
447/* ------------------------------ */
448 .balign 128
449.L_op_move_wide_from16: /* 0x05 */
450/* File: arm/op_move_wide_from16.S */
451 /* move-wide/from16 vAA, vBBBB */
452 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
453 FETCH r3, 1 @ r3<- BBBB
buzbee50cf6002016-02-10 08:59:12 -0800454 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -0800455 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
buzbee50cf6002016-02-10 08:59:12 -0800456 add r2, rFP, rINST, lsl #2 @ r2<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800457 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
buzbee50cf6002016-02-10 08:59:12 -0800458 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800459 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
460 GET_INST_OPCODE ip @ extract opcode from rINST
461 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
462 GOTO_OPCODE ip @ jump to next instruction
463
464/* ------------------------------ */
465 .balign 128
466.L_op_move_wide_16: /* 0x06 */
467/* File: arm/op_move_wide_16.S */
468 /* move-wide/16 vAAAA, vBBBB */
469 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
470 FETCH r3, 2 @ r3<- BBBB
471 FETCH r2, 1 @ r2<- AAAA
472 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
buzbee50cf6002016-02-10 08:59:12 -0800473 add lr, rFP, r2, lsl #2 @ r2<- &fp[AAAA]
buzbee1452bee2015-03-06 14:43:04 -0800474 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
475 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -0800476 CLEAR_SHADOW_PAIR r2, r3, ip @ Zero out the shadow regs
477 stmia lr, {r0-r1} @ fp[AAAA]<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -0800478 GET_INST_OPCODE ip @ extract opcode from rINST
479 GOTO_OPCODE ip @ jump to next instruction
480
481/* ------------------------------ */
482 .balign 128
483.L_op_move_object: /* 0x07 */
484/* File: arm/op_move_object.S */
485/* File: arm/op_move.S */
486 /* for move, move-object, long-to-int */
487 /* op vA, vB */
488 mov r1, rINST, lsr #12 @ r1<- B from 15:12
489 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
490 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
491 GET_VREG r2, r1 @ r2<- fp[B]
492 GET_INST_OPCODE ip @ ip<- opcode from rINST
493 .if 1
494 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
495 .else
496 SET_VREG r2, r0 @ fp[A]<- r2
497 .endif
498 GOTO_OPCODE ip @ execute next instruction
499
500
501/* ------------------------------ */
502 .balign 128
503.L_op_move_object_from16: /* 0x08 */
504/* File: arm/op_move_object_from16.S */
505/* File: arm/op_move_from16.S */
506 /* for: move/from16, move-object/from16 */
507 /* op vAA, vBBBB */
508 FETCH r1, 1 @ r1<- BBBB
509 mov r0, rINST, lsr #8 @ r0<- AA
510 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
511 GET_VREG r2, r1 @ r2<- fp[BBBB]
512 GET_INST_OPCODE ip @ extract opcode from rINST
513 .if 1
514 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
515 .else
516 SET_VREG r2, r0 @ fp[AA]<- r2
517 .endif
518 GOTO_OPCODE ip @ jump to next instruction
519
520
521/* ------------------------------ */
522 .balign 128
523.L_op_move_object_16: /* 0x09 */
524/* File: arm/op_move_object_16.S */
525/* File: arm/op_move_16.S */
526 /* for: move/16, move-object/16 */
527 /* op vAAAA, vBBBB */
528 FETCH r1, 2 @ r1<- BBBB
529 FETCH r0, 1 @ r0<- AAAA
530 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
531 GET_VREG r2, r1 @ r2<- fp[BBBB]
532 GET_INST_OPCODE ip @ extract opcode from rINST
533 .if 1
534 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
535 .else
536 SET_VREG r2, r0 @ fp[AAAA]<- r2
537 .endif
538 GOTO_OPCODE ip @ jump to next instruction
539
540
541/* ------------------------------ */
542 .balign 128
543.L_op_move_result: /* 0x0a */
544/* File: arm/op_move_result.S */
545 /* for: move-result, move-result-object */
546 /* op vAA */
547 mov r2, rINST, lsr #8 @ r2<- AA
548 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
549 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
550 ldr r0, [r0] @ r0 <- result.i.
551 GET_INST_OPCODE ip @ extract opcode from rINST
552 .if 0
553 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
554 .else
555 SET_VREG r0, r2 @ fp[AA]<- r0
556 .endif
557 GOTO_OPCODE ip @ jump to next instruction
558
559/* ------------------------------ */
560 .balign 128
561.L_op_move_result_wide: /* 0x0b */
562/* File: arm/op_move_result_wide.S */
563 /* move-result-wide vAA */
buzbee50cf6002016-02-10 08:59:12 -0800564 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -0800565 ldr r3, [rFP, #OFF_FP_RESULT_REGISTER]
buzbee50cf6002016-02-10 08:59:12 -0800566 add r2, rFP, rINST, lsl #2 @ r2<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800567 ldmia r3, {r0-r1} @ r0/r1<- retval.j
buzbee50cf6002016-02-10 08:59:12 -0800568 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800569 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
570 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
571 GET_INST_OPCODE ip @ extract opcode from rINST
572 GOTO_OPCODE ip @ jump to next instruction
573
574/* ------------------------------ */
575 .balign 128
576.L_op_move_result_object: /* 0x0c */
577/* File: arm/op_move_result_object.S */
578/* File: arm/op_move_result.S */
579 /* for: move-result, move-result-object */
580 /* op vAA */
581 mov r2, rINST, lsr #8 @ r2<- AA
582 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
583 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
584 ldr r0, [r0] @ r0 <- result.i.
585 GET_INST_OPCODE ip @ extract opcode from rINST
586 .if 1
587 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
588 .else
589 SET_VREG r0, r2 @ fp[AA]<- r0
590 .endif
591 GOTO_OPCODE ip @ jump to next instruction
592
593
594/* ------------------------------ */
595 .balign 128
596.L_op_move_exception: /* 0x0d */
597/* File: arm/op_move_exception.S */
598 /* move-exception vAA */
599 mov r2, rINST, lsr #8 @ r2<- AA
600 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
601 mov r1, #0 @ r1<- 0
602 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
603 SET_VREG_OBJECT r3, r2 @ fp[AA]<- exception obj
604 GET_INST_OPCODE ip @ extract opcode from rINST
605 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ clear exception
606 GOTO_OPCODE ip @ jump to next instruction
607
608/* ------------------------------ */
609 .balign 128
610.L_op_return_void: /* 0x0e */
611/* File: arm/op_return_void.S */
612 .extern MterpThreadFenceForConstructor
613 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800614 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
615 mov r0, rSELF
616 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
617 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800618 mov r0, #0
619 mov r1, #0
620 b MterpReturn
621
622/* ------------------------------ */
623 .balign 128
624.L_op_return: /* 0x0f */
625/* File: arm/op_return.S */
626 /*
627 * Return a 32-bit value.
628 *
629 * for: return, return-object
630 */
631 /* op vAA */
632 .extern MterpThreadFenceForConstructor
633 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800634 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
635 mov r0, rSELF
636 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
637 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800638 mov r2, rINST, lsr #8 @ r2<- AA
639 GET_VREG r0, r2 @ r0<- vAA
640 mov r1, #0
641 b MterpReturn
642
643/* ------------------------------ */
644 .balign 128
645.L_op_return_wide: /* 0x10 */
646/* File: arm/op_return_wide.S */
647 /*
648 * Return a 64-bit value.
649 */
650 /* return-wide vAA */
651 .extern MterpThreadFenceForConstructor
652 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800653 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
654 mov r0, rSELF
655 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
656 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800657 mov r2, rINST, lsr #8 @ r2<- AA
658 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
659 ldmia r2, {r0-r1} @ r0/r1 <- vAA/vAA+1
660 b MterpReturn
661
662/* ------------------------------ */
663 .balign 128
664.L_op_return_object: /* 0x11 */
665/* File: arm/op_return_object.S */
666/* File: arm/op_return.S */
667 /*
668 * Return a 32-bit value.
669 *
670 * for: return, return-object
671 */
672 /* op vAA */
673 .extern MterpThreadFenceForConstructor
674 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800675 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
676 mov r0, rSELF
677 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
678 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800679 mov r2, rINST, lsr #8 @ r2<- AA
680 GET_VREG r0, r2 @ r0<- vAA
681 mov r1, #0
682 b MterpReturn
683
684
685/* ------------------------------ */
686 .balign 128
687.L_op_const_4: /* 0x12 */
688/* File: arm/op_const_4.S */
689 /* const/4 vA, #+B */
690 mov r1, rINST, lsl #16 @ r1<- Bxxx0000
691 ubfx r0, rINST, #8, #4 @ r0<- A
692 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
693 mov r1, r1, asr #28 @ r1<- sssssssB (sign-extended)
694 GET_INST_OPCODE ip @ ip<- opcode from rINST
695 SET_VREG r1, r0 @ fp[A]<- r1
696 GOTO_OPCODE ip @ execute next instruction
697
698/* ------------------------------ */
699 .balign 128
700.L_op_const_16: /* 0x13 */
701/* File: arm/op_const_16.S */
702 /* const/16 vAA, #+BBBB */
703 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
704 mov r3, rINST, lsr #8 @ r3<- AA
705 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
706 SET_VREG r0, r3 @ vAA<- r0
707 GET_INST_OPCODE ip @ extract opcode from rINST
708 GOTO_OPCODE ip @ jump to next instruction
709
710/* ------------------------------ */
711 .balign 128
712.L_op_const: /* 0x14 */
713/* File: arm/op_const.S */
714 /* const vAA, #+BBBBbbbb */
715 mov r3, rINST, lsr #8 @ r3<- AA
716 FETCH r0, 1 @ r0<- bbbb (low
717 FETCH r1, 2 @ r1<- BBBB (high
718 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
719 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
720 GET_INST_OPCODE ip @ extract opcode from rINST
721 SET_VREG r0, r3 @ vAA<- r0
722 GOTO_OPCODE ip @ jump to next instruction
723
724/* ------------------------------ */
725 .balign 128
726.L_op_const_high16: /* 0x15 */
727/* File: arm/op_const_high16.S */
728 /* const/high16 vAA, #+BBBB0000 */
729 FETCH r0, 1 @ r0<- 0000BBBB (zero-extended
730 mov r3, rINST, lsr #8 @ r3<- AA
731 mov r0, r0, lsl #16 @ r0<- BBBB0000
732 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
733 SET_VREG r0, r3 @ vAA<- r0
734 GET_INST_OPCODE ip @ extract opcode from rINST
735 GOTO_OPCODE ip @ jump to next instruction
736
737/* ------------------------------ */
738 .balign 128
739.L_op_const_wide_16: /* 0x16 */
740/* File: arm/op_const_wide_16.S */
741 /* const-wide/16 vAA, #+BBBB */
742 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
743 mov r3, rINST, lsr #8 @ r3<- AA
744 mov r1, r0, asr #31 @ r1<- ssssssss
745 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -0800746 CLEAR_SHADOW_PAIR r3, r2, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800747 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
748 GET_INST_OPCODE ip @ extract opcode from rINST
749 stmia r3, {r0-r1} @ vAA<- r0/r1
750 GOTO_OPCODE ip @ jump to next instruction
751
752/* ------------------------------ */
753 .balign 128
754.L_op_const_wide_32: /* 0x17 */
755/* File: arm/op_const_wide_32.S */
756 /* const-wide/32 vAA, #+BBBBbbbb */
757 FETCH r0, 1 @ r0<- 0000bbbb (low)
758 mov r3, rINST, lsr #8 @ r3<- AA
759 FETCH_S r2, 2 @ r2<- ssssBBBB (high)
760 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
761 orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb
buzbee50cf6002016-02-10 08:59:12 -0800762 CLEAR_SHADOW_PAIR r3, r2, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800763 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
764 mov r1, r0, asr #31 @ r1<- ssssssss
765 GET_INST_OPCODE ip @ extract opcode from rINST
766 stmia r3, {r0-r1} @ vAA<- r0/r1
767 GOTO_OPCODE ip @ jump to next instruction
768
769/* ------------------------------ */
770 .balign 128
771.L_op_const_wide: /* 0x18 */
772/* File: arm/op_const_wide.S */
773 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
774 FETCH r0, 1 @ r0<- bbbb (low)
775 FETCH r1, 2 @ r1<- BBBB (low middle)
776 FETCH r2, 3 @ r2<- hhhh (high middle)
777 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word)
778 FETCH r3, 4 @ r3<- HHHH (high)
779 mov r9, rINST, lsr #8 @ r9<- AA
780 orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word)
buzbee50cf6002016-02-10 08:59:12 -0800781 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800782 FETCH_ADVANCE_INST 5 @ advance rPC, load rINST
783 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
784 GET_INST_OPCODE ip @ extract opcode from rINST
785 stmia r9, {r0-r1} @ vAA<- r0/r1
786 GOTO_OPCODE ip @ jump to next instruction
787
788/* ------------------------------ */
789 .balign 128
790.L_op_const_wide_high16: /* 0x19 */
791/* File: arm/op_const_wide_high16.S */
792 /* const-wide/high16 vAA, #+BBBB000000000000 */
793 FETCH r1, 1 @ r1<- 0000BBBB (zero-extended)
794 mov r3, rINST, lsr #8 @ r3<- AA
795 mov r0, #0 @ r0<- 00000000
796 mov r1, r1, lsl #16 @ r1<- BBBB0000
797 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -0800798 CLEAR_SHADOW_PAIR r3, r0, r2 @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800799 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
800 GET_INST_OPCODE ip @ extract opcode from rINST
801 stmia r3, {r0-r1} @ vAA<- r0/r1
802 GOTO_OPCODE ip @ jump to next instruction
803
804/* ------------------------------ */
805 .balign 128
806.L_op_const_string: /* 0x1a */
807/* File: arm/op_const_string.S */
808 /* const/string vAA, String@BBBB */
809 EXPORT_PC
810 FETCH r0, 1 @ r0<- BBBB
811 mov r1, rINST, lsr #8 @ r1<- AA
812 add r2, rFP, #OFF_FP_SHADOWFRAME
813 mov r3, rSELF
814 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
815 PREFETCH_INST 2 @ load rINST
816 cmp r0, #0 @ fail?
817 bne MterpPossibleException @ let reference interpreter deal with it.
818 ADVANCE 2 @ advance rPC
819 GET_INST_OPCODE ip @ extract opcode from rINST
820 GOTO_OPCODE ip @ jump to next instruction
821
822/* ------------------------------ */
823 .balign 128
824.L_op_const_string_jumbo: /* 0x1b */
825/* File: arm/op_const_string_jumbo.S */
826 /* const/string vAA, String@BBBBBBBB */
827 EXPORT_PC
828 FETCH r0, 1 @ r0<- bbbb (low
829 FETCH r2, 2 @ r2<- BBBB (high
830 mov r1, rINST, lsr #8 @ r1<- AA
831 orr r0, r0, r2, lsl #16 @ r1<- BBBBbbbb
832 add r2, rFP, #OFF_FP_SHADOWFRAME
833 mov r3, rSELF
834 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
835 PREFETCH_INST 3 @ advance rPC
836 cmp r0, #0 @ fail?
837 bne MterpPossibleException @ let reference interpreter deal with it.
838 ADVANCE 3 @ advance rPC
839 GET_INST_OPCODE ip @ extract opcode from rINST
840 GOTO_OPCODE ip @ jump to next instruction
841
842/* ------------------------------ */
843 .balign 128
844.L_op_const_class: /* 0x1c */
845/* File: arm/op_const_class.S */
846 /* const/class vAA, Class@BBBB */
847 EXPORT_PC
848 FETCH r0, 1 @ r0<- BBBB
849 mov r1, rINST, lsr #8 @ r1<- AA
850 add r2, rFP, #OFF_FP_SHADOWFRAME
851 mov r3, rSELF
852 bl MterpConstClass @ (index, tgt_reg, shadow_frame, self)
853 PREFETCH_INST 2
854 cmp r0, #0
855 bne MterpPossibleException
856 ADVANCE 2
857 GET_INST_OPCODE ip @ extract opcode from rINST
858 GOTO_OPCODE ip @ jump to next instruction
859
860/* ------------------------------ */
861 .balign 128
862.L_op_monitor_enter: /* 0x1d */
863/* File: arm/op_monitor_enter.S */
864 /*
865 * Synchronize on an object.
866 */
867 /* monitor-enter vAA */
868 EXPORT_PC
869 mov r2, rINST, lsr #8 @ r2<- AA
870 GET_VREG r0, r2 @ r0<- vAA (object)
871 mov r1, rSELF @ r1<- self
872 bl artLockObjectFromCode
873 cmp r0, #0
874 bne MterpException
875 FETCH_ADVANCE_INST 1
876 GET_INST_OPCODE ip @ extract opcode from rINST
877 GOTO_OPCODE ip @ jump to next instruction
878
879/* ------------------------------ */
880 .balign 128
881.L_op_monitor_exit: /* 0x1e */
882/* File: arm/op_monitor_exit.S */
883 /*
884 * Unlock an object.
885 *
886 * Exceptions that occur when unlocking a monitor need to appear as
887 * if they happened at the following instruction. See the Dalvik
888 * instruction spec.
889 */
890 /* monitor-exit vAA */
891 EXPORT_PC
892 mov r2, rINST, lsr #8 @ r2<- AA
893 GET_VREG r0, r2 @ r0<- vAA (object)
894 mov r1, rSELF @ r0<- self
895 bl artUnlockObjectFromCode @ r0<- success for unlock(self, obj)
896 cmp r0, #0 @ failed?
897 bne MterpException
898 FETCH_ADVANCE_INST 1 @ before throw: advance rPC, load rINST
899 GET_INST_OPCODE ip @ extract opcode from rINST
900 GOTO_OPCODE ip @ jump to next instruction
901
902/* ------------------------------ */
903 .balign 128
904.L_op_check_cast: /* 0x1f */
905/* File: arm/op_check_cast.S */
906 /*
907 * Check to see if a cast from one class to another is allowed.
908 */
909 /* check-cast vAA, class@BBBB */
910 EXPORT_PC
911 FETCH r0, 1 @ r0<- BBBB
912 mov r1, rINST, lsr #8 @ r1<- AA
buzbeea2c97a92016-01-25 15:41:24 -0800913 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800914 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
915 mov r3, rSELF @ r3<- self
buzbeea2c97a92016-01-25 15:41:24 -0800916 bl MterpCheckCast @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800917 PREFETCH_INST 2
918 cmp r0, #0
919 bne MterpPossibleException
920 ADVANCE 2
921 GET_INST_OPCODE ip @ extract opcode from rINST
922 GOTO_OPCODE ip @ jump to next instruction
923
924/* ------------------------------ */
925 .balign 128
926.L_op_instance_of: /* 0x20 */
927/* File: arm/op_instance_of.S */
928 /*
929 * Check to see if an object reference is an instance of a class.
930 *
931 * Most common situation is a non-null object, being compared against
932 * an already-resolved class.
933 */
934 /* instance-of vA, vB, class@CCCC */
935 EXPORT_PC
936 FETCH r0, 1 @ r0<- CCCC
937 mov r1, rINST, lsr #12 @ r1<- B
buzbeea2c97a92016-01-25 15:41:24 -0800938 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800939 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
940 mov r3, rSELF @ r3<- self
941 mov r9, rINST, lsr #8 @ r9<- A+
942 and r9, r9, #15 @ r9<- A
buzbeea2c97a92016-01-25 15:41:24 -0800943 bl MterpInstanceOf @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800944 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
945 PREFETCH_INST 2
946 cmp r1, #0 @ exception pending?
947 bne MterpException
948 ADVANCE 2 @ advance rPC
949 SET_VREG r0, r9 @ vA<- r0
950 GET_INST_OPCODE ip @ extract opcode from rINST
951 GOTO_OPCODE ip @ jump to next instruction
952
953/* ------------------------------ */
954 .balign 128
955.L_op_array_length: /* 0x21 */
956/* File: arm/op_array_length.S */
957 /*
958 * Return the length of an array.
959 */
960 mov r1, rINST, lsr #12 @ r1<- B
961 ubfx r2, rINST, #8, #4 @ r2<- A
962 GET_VREG r0, r1 @ r0<- vB (object ref)
963 cmp r0, #0 @ is object null?
964 beq common_errNullObject @ yup, fail
965 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
966 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- array length
967 GET_INST_OPCODE ip @ extract opcode from rINST
968 SET_VREG r3, r2 @ vB<- length
969 GOTO_OPCODE ip @ jump to next instruction
970
971/* ------------------------------ */
972 .balign 128
973.L_op_new_instance: /* 0x22 */
974/* File: arm/op_new_instance.S */
975 /*
976 * Create a new instance of a class.
977 */
978 /* new-instance vAA, class@BBBB */
979 EXPORT_PC
980 add r0, rFP, #OFF_FP_SHADOWFRAME
981 mov r1, rSELF
982 mov r2, rINST
983 bl MterpNewInstance @ (shadow_frame, self, inst_data)
984 cmp r0, #0
985 beq MterpPossibleException
986 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
987 GET_INST_OPCODE ip @ extract opcode from rINST
988 GOTO_OPCODE ip @ jump to next instruction
989
990/* ------------------------------ */
991 .balign 128
992.L_op_new_array: /* 0x23 */
993/* File: arm/op_new_array.S */
994 /*
995 * Allocate an array of objects, specified with the array class
996 * and a count.
997 *
998 * The verifier guarantees that this is an array class, so we don't
999 * check for it here.
1000 */
1001 /* new-array vA, vB, class@CCCC */
1002 EXPORT_PC
1003 add r0, rFP, #OFF_FP_SHADOWFRAME
1004 mov r1, rPC
1005 mov r2, rINST
1006 mov r3, rSELF
1007 bl MterpNewArray
1008 cmp r0, #0
1009 beq MterpPossibleException
1010 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1011 GET_INST_OPCODE ip @ extract opcode from rINST
1012 GOTO_OPCODE ip @ jump to next instruction
1013
1014/* ------------------------------ */
1015 .balign 128
1016.L_op_filled_new_array: /* 0x24 */
1017/* File: arm/op_filled_new_array.S */
1018 /*
1019 * Create a new array with elements filled from registers.
1020 *
1021 * for: filled-new-array, filled-new-array/range
1022 */
1023 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1024 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1025 .extern MterpFilledNewArray
1026 EXPORT_PC
1027 add r0, rFP, #OFF_FP_SHADOWFRAME
1028 mov r1, rPC
1029 mov r2, rSELF
1030 bl MterpFilledNewArray
1031 cmp r0, #0
1032 beq MterpPossibleException
1033 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1034 GET_INST_OPCODE ip @ extract opcode from rINST
1035 GOTO_OPCODE ip @ jump to next instruction
1036
1037/* ------------------------------ */
1038 .balign 128
1039.L_op_filled_new_array_range: /* 0x25 */
1040/* File: arm/op_filled_new_array_range.S */
1041/* File: arm/op_filled_new_array.S */
1042 /*
1043 * Create a new array with elements filled from registers.
1044 *
1045 * for: filled-new-array, filled-new-array/range
1046 */
1047 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1048 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1049 .extern MterpFilledNewArrayRange
1050 EXPORT_PC
1051 add r0, rFP, #OFF_FP_SHADOWFRAME
1052 mov r1, rPC
1053 mov r2, rSELF
1054 bl MterpFilledNewArrayRange
1055 cmp r0, #0
1056 beq MterpPossibleException
1057 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1058 GET_INST_OPCODE ip @ extract opcode from rINST
1059 GOTO_OPCODE ip @ jump to next instruction
1060
1061
1062/* ------------------------------ */
1063 .balign 128
1064.L_op_fill_array_data: /* 0x26 */
1065/* File: arm/op_fill_array_data.S */
1066 /* fill-array-data vAA, +BBBBBBBB */
1067 EXPORT_PC
1068 FETCH r0, 1 @ r0<- bbbb (lo)
1069 FETCH r1, 2 @ r1<- BBBB (hi)
1070 mov r3, rINST, lsr #8 @ r3<- AA
1071 orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb
1072 GET_VREG r0, r3 @ r0<- vAA (array object)
1073 add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.)
1074 bl MterpFillArrayData @ (obj, payload)
1075 cmp r0, #0 @ 0 means an exception is thrown
1076 beq MterpPossibleException @ exception?
1077 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1078 GET_INST_OPCODE ip @ extract opcode from rINST
1079 GOTO_OPCODE ip @ jump to next instruction
1080
1081/* ------------------------------ */
1082 .balign 128
1083.L_op_throw: /* 0x27 */
1084/* File: arm/op_throw.S */
1085 /*
1086 * Throw an exception object in the current thread.
1087 */
1088 /* throw vAA */
1089 EXPORT_PC
1090 mov r2, rINST, lsr #8 @ r2<- AA
1091 GET_VREG r1, r2 @ r1<- vAA (exception object)
1092 cmp r1, #0 @ null object?
1093 beq common_errNullObject @ yes, throw an NPE instead
1094 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ thread->exception<- obj
1095 b MterpException
1096
1097/* ------------------------------ */
1098 .balign 128
1099.L_op_goto: /* 0x28 */
1100/* File: arm/op_goto.S */
1101 /*
1102 * Unconditional branch, 8-bit offset.
1103 *
1104 * The branch distance is a signed code-unit offset, which we need to
1105 * double to get a byte offset.
1106 */
1107 /* goto +AA */
1108 /* tuning: use sbfx for 6t2+ targets */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001109#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001110 mov r0, rINST, lsl #16 @ r0<- AAxx0000
Bill Buzbeefd522f92016-02-11 22:37:42 +00001111 movs rINST, r0, asr #24 @ rINST<- ssssssAA (sign-extended)
1112 EXPORT_PC
1113 mov r0, rSELF
1114 add r1, rFP, #OFF_FP_SHADOWFRAME
1115 mov r2, rINST
1116 bl MterpProfileBranch @ (self, shadow_frame, offset)
1117 cmp r0, #0
1118 bne MterpOnStackReplacement @ Note: offset must be in rINST
1119 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray69564bb2016-02-21 17:19:18 +00001120 adds r2, rINST, rINST @ r2<- byte offset, set flags
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001121 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001122 @ If backwards branch refresh rIBASE
1123 bmi MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001124 GET_INST_OPCODE ip @ extract opcode from rINST
1125 GOTO_OPCODE ip @ jump to next instruction
1126#else
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001127 mov r0, rINST, lsl #16 @ r0<- AAxx0000
Bill Buzbeefd522f92016-02-11 22:37:42 +00001128 movs rINST, r0, asr #24 @ rINST<- ssssssAA (sign-extended)
1129 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray69564bb2016-02-21 17:19:18 +00001130 adds r2, rINST, rINST @ r2<- byte offset, set flags
buzbee1452bee2015-03-06 14:43:04 -08001131 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1132 @ If backwards branch refresh rIBASE
1133 bmi MterpCheckSuspendAndContinue
1134 GET_INST_OPCODE ip @ extract opcode from rINST
1135 GOTO_OPCODE ip @ jump to next instruction
1136#endif
1137
1138/* ------------------------------ */
1139 .balign 128
1140.L_op_goto_16: /* 0x29 */
1141/* File: arm/op_goto_16.S */
1142 /*
1143 * Unconditional branch, 16-bit offset.
1144 *
1145 * The branch distance is a signed code-unit offset, which we need to
1146 * double to get a byte offset.
1147 */
1148 /* goto/16 +AAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001149#if MTERP_PROFILE_BRANCHES
1150 FETCH_S rINST, 1 @ rINST<- ssssAAAA (sign-extended)
1151 EXPORT_PC
1152 mov r0, rSELF
1153 add r1, rFP, #OFF_FP_SHADOWFRAME
1154 mov r2, rINST
1155 bl MterpProfileBranch @ (self, shadow_frame, offset)
1156 cmp r0, #0
1157 bne MterpOnStackReplacement @ Note: offset must be in rINST
1158 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1159 adds r1, rINST, rINST @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001160 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001161 bmi MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001162 GET_INST_OPCODE ip @ extract opcode from rINST
1163 GOTO_OPCODE ip @ jump to next instruction
1164#else
Bill Buzbeefd522f92016-02-11 22:37:42 +00001165 FETCH_S rINST, 1 @ rINST<- ssssAAAA (sign-extended)
buzbee1452bee2015-03-06 14:43:04 -08001166 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001167 adds r1, rINST, rINST @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001168 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1169 bmi MterpCheckSuspendAndContinue
1170 GET_INST_OPCODE ip @ extract opcode from rINST
1171 GOTO_OPCODE ip @ jump to next instruction
1172#endif
1173
1174/* ------------------------------ */
1175 .balign 128
1176.L_op_goto_32: /* 0x2a */
1177/* File: arm/op_goto_32.S */
1178 /*
1179 * Unconditional branch, 32-bit offset.
1180 *
1181 * The branch distance is a signed code-unit offset, which we need to
1182 * double to get a byte offset.
1183 *
1184 * Unlike most opcodes, this one is allowed to branch to itself, so
1185 * our "backward branch" test must be "<=0" instead of "<0". Because
1186 * we need the V bit set, we'll use an adds to convert from Dalvik
1187 * offset to byte offset.
1188 */
1189 /* goto/32 +AAAAAAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001190#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001191 FETCH r0, 1 @ r0<- aaaa (lo)
1192 FETCH r1, 2 @ r1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001193 orr rINST, r0, r1, lsl #16 @ rINST<- AAAAaaaa
1194 EXPORT_PC
1195 mov r0, rSELF
1196 add r1, rFP, #OFF_FP_SHADOWFRAME
1197 mov r2, rINST
1198 bl MterpProfileBranch @ (self, shadow_frame, offset)
1199 cmp r0, #0
1200 bne MterpOnStackReplacement @ Note: offset must be in rINST
1201 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1202 adds r1, rINST, rINST @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001203 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001204 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001205 GET_INST_OPCODE ip @ extract opcode from rINST
1206 GOTO_OPCODE ip @ jump to next instruction
1207#else
1208 FETCH r0, 1 @ r0<- aaaa (lo)
1209 FETCH r1, 2 @ r1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001210 orr rINST, r0, r1, lsl #16 @ rINST<- AAAAaaaa
buzbee1452bee2015-03-06 14:43:04 -08001211 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001212 adds r1, rINST, rINST @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001213 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1214 ble MterpCheckSuspendAndContinue
1215 GET_INST_OPCODE ip @ extract opcode from rINST
1216 GOTO_OPCODE ip @ jump to next instruction
1217#endif
1218
1219/* ------------------------------ */
1220 .balign 128
1221.L_op_packed_switch: /* 0x2b */
1222/* File: arm/op_packed_switch.S */
1223 /*
1224 * Handle a packed-switch or sparse-switch instruction. In both cases
1225 * we decode it and hand it off to a helper function.
1226 *
1227 * We don't really expect backward branches in a switch statement, but
1228 * they're perfectly legal, so we check for them here.
1229 *
1230 * for: packed-switch, sparse-switch
1231 */
1232 /* op vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001233#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001234 FETCH r0, 1 @ r0<- bbbb (lo)
1235 FETCH r1, 2 @ r1<- BBBB (hi)
1236 mov r3, rINST, lsr #8 @ r3<- AA
1237 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1238 GET_VREG r1, r3 @ r1<- vAA
1239 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1240 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001241 mov rINST, r0
1242 EXPORT_PC
1243 mov r0, rSELF
1244 add r1, rFP, #OFF_FP_SHADOWFRAME
1245 mov r2, rINST
1246 bl MterpProfileBranch @ (self, shadow_frame, offset)
1247 cmp r0, #0
1248 bne MterpOnStackReplacement @ Note: offset must be in rINST
1249 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1250 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001251 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001252 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001253 GET_INST_OPCODE ip @ extract opcode from rINST
1254 GOTO_OPCODE ip @ jump to next instruction
1255#else
1256 FETCH r0, 1 @ r0<- bbbb (lo)
1257 FETCH r1, 2 @ r1<- BBBB (hi)
1258 mov r3, rINST, lsr #8 @ r3<- AA
1259 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1260 GET_VREG r1, r3 @ r1<- vAA
1261 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1262 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001263 mov rINST, r0
buzbee1452bee2015-03-06 14:43:04 -08001264 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001265 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001266 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1267 ble MterpCheckSuspendAndContinue
1268 GET_INST_OPCODE ip @ extract opcode from rINST
1269 GOTO_OPCODE ip @ jump to next instruction
1270#endif
1271
1272/* ------------------------------ */
1273 .balign 128
1274.L_op_sparse_switch: /* 0x2c */
1275/* File: arm/op_sparse_switch.S */
1276/* File: arm/op_packed_switch.S */
1277 /*
1278 * Handle a packed-switch or sparse-switch instruction. In both cases
1279 * we decode it and hand it off to a helper function.
1280 *
1281 * We don't really expect backward branches in a switch statement, but
1282 * they're perfectly legal, so we check for them here.
1283 *
1284 * for: packed-switch, sparse-switch
1285 */
1286 /* op vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001287#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001288 FETCH r0, 1 @ r0<- bbbb (lo)
1289 FETCH r1, 2 @ r1<- BBBB (hi)
1290 mov r3, rINST, lsr #8 @ r3<- AA
1291 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1292 GET_VREG r1, r3 @ r1<- vAA
1293 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1294 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001295 mov rINST, r0
1296 EXPORT_PC
1297 mov r0, rSELF
1298 add r1, rFP, #OFF_FP_SHADOWFRAME
1299 mov r2, rINST
1300 bl MterpProfileBranch @ (self, shadow_frame, offset)
1301 cmp r0, #0
1302 bne MterpOnStackReplacement @ Note: offset must be in rINST
1303 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1304 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001305 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001306 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001307 GET_INST_OPCODE ip @ extract opcode from rINST
1308 GOTO_OPCODE ip @ jump to next instruction
1309#else
1310 FETCH r0, 1 @ r0<- bbbb (lo)
1311 FETCH r1, 2 @ r1<- BBBB (hi)
1312 mov r3, rINST, lsr #8 @ r3<- AA
1313 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1314 GET_VREG r1, r3 @ r1<- vAA
1315 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1316 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001317 mov rINST, r0
buzbee1452bee2015-03-06 14:43:04 -08001318 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001319 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001320 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1321 ble MterpCheckSuspendAndContinue
1322 GET_INST_OPCODE ip @ extract opcode from rINST
1323 GOTO_OPCODE ip @ jump to next instruction
1324#endif
1325
1326
1327/* ------------------------------ */
1328 .balign 128
1329.L_op_cmpl_float: /* 0x2d */
1330/* File: arm/op_cmpl_float.S */
1331 /*
1332 * Compare two floating-point values. Puts 0, 1, or -1 into the
1333 * destination register based on the results of the comparison.
1334 *
1335 * int compare(x, y) {
1336 * if (x == y) {
1337 * return 0;
1338 * } else if (x > y) {
1339 * return 1;
1340 * } else if (x < y) {
1341 * return -1;
1342 * } else {
1343 * return -1;
1344 * }
1345 * }
1346 */
1347 /* op vAA, vBB, vCC */
1348 FETCH r0, 1 @ r0<- CCBB
1349 mov r9, rINST, lsr #8 @ r9<- AA
1350 and r2, r0, #255 @ r2<- BB
1351 mov r3, r0, lsr #8 @ r3<- CC
1352 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1353 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1354 flds s0, [r2] @ s0<- vBB
1355 flds s1, [r3] @ s1<- vCC
1356 fcmpes s0, s1 @ compare (vBB, vCC)
1357 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1358 mvn r0, #0 @ r0<- -1 (default)
1359 GET_INST_OPCODE ip @ extract opcode from rINST
1360 fmstat @ export status flags
1361 movgt r0, #1 @ (greater than) r1<- 1
1362 moveq r0, #0 @ (equal) r1<- 0
1363 SET_VREG r0, r9 @ vAA<- r0
1364 GOTO_OPCODE ip @ jump to next instruction
1365
1366/* ------------------------------ */
1367 .balign 128
1368.L_op_cmpg_float: /* 0x2e */
1369/* File: arm/op_cmpg_float.S */
1370 /*
1371 * Compare two floating-point values. Puts 0, 1, or -1 into the
1372 * destination register based on the results of the comparison.
1373 *
1374 * int compare(x, y) {
1375 * if (x == y) {
1376 * return 0;
1377 * } else if (x < y) {
1378 * return -1;
1379 * } else if (x > y) {
1380 * return 1;
1381 * } else {
1382 * return 1;
1383 * }
1384 * }
1385 */
1386 /* op vAA, vBB, vCC */
1387 FETCH r0, 1 @ r0<- CCBB
1388 mov r9, rINST, lsr #8 @ r9<- AA
1389 and r2, r0, #255 @ r2<- BB
1390 mov r3, r0, lsr #8 @ r3<- CC
1391 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1392 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1393 flds s0, [r2] @ s0<- vBB
1394 flds s1, [r3] @ s1<- vCC
1395 fcmpes s0, s1 @ compare (vBB, vCC)
1396 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1397 mov r0, #1 @ r0<- 1 (default)
1398 GET_INST_OPCODE ip @ extract opcode from rINST
1399 fmstat @ export status flags
1400 mvnmi r0, #0 @ (less than) r1<- -1
1401 moveq r0, #0 @ (equal) r1<- 0
1402 SET_VREG r0, r9 @ vAA<- r0
1403 GOTO_OPCODE ip @ jump to next instruction
1404
1405/* ------------------------------ */
1406 .balign 128
1407.L_op_cmpl_double: /* 0x2f */
1408/* File: arm/op_cmpl_double.S */
1409 /*
1410 * Compare two floating-point values. Puts 0, 1, or -1 into the
1411 * destination register based on the results of the comparison.
1412 *
1413 * int compare(x, y) {
1414 * if (x == y) {
1415 * return 0;
1416 * } else if (x > y) {
1417 * return 1;
1418 * } else if (x < y) {
1419 * return -1;
1420 * } else {
1421 * return -1;
1422 * }
1423 * }
1424 */
1425 /* op vAA, vBB, vCC */
1426 FETCH r0, 1 @ r0<- CCBB
1427 mov r9, rINST, lsr #8 @ r9<- AA
1428 and r2, r0, #255 @ r2<- BB
1429 mov r3, r0, lsr #8 @ r3<- CC
1430 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1431 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1432 fldd d0, [r2] @ d0<- vBB
1433 fldd d1, [r3] @ d1<- vCC
1434 fcmped d0, d1 @ compare (vBB, vCC)
1435 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1436 mvn r0, #0 @ r0<- -1 (default)
1437 GET_INST_OPCODE ip @ extract opcode from rINST
1438 fmstat @ export status flags
1439 movgt r0, #1 @ (greater than) r1<- 1
1440 moveq r0, #0 @ (equal) r1<- 0
1441 SET_VREG r0, r9 @ vAA<- r0
1442 GOTO_OPCODE ip @ jump to next instruction
1443
1444/* ------------------------------ */
1445 .balign 128
1446.L_op_cmpg_double: /* 0x30 */
1447/* File: arm/op_cmpg_double.S */
1448 /*
1449 * Compare two floating-point values. Puts 0, 1, or -1 into the
1450 * destination register based on the results of the comparison.
1451 *
1452 * int compare(x, y) {
1453 * if (x == y) {
1454 * return 0;
1455 * } else if (x < y) {
1456 * return -1;
1457 * } else if (x > y) {
1458 * return 1;
1459 * } else {
1460 * return 1;
1461 * }
1462 * }
1463 */
1464 /* op vAA, vBB, vCC */
1465 FETCH r0, 1 @ r0<- CCBB
1466 mov r9, rINST, lsr #8 @ r9<- AA
1467 and r2, r0, #255 @ r2<- BB
1468 mov r3, r0, lsr #8 @ r3<- CC
1469 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1470 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1471 fldd d0, [r2] @ d0<- vBB
1472 fldd d1, [r3] @ d1<- vCC
1473 fcmped d0, d1 @ compare (vBB, vCC)
1474 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1475 mov r0, #1 @ r0<- 1 (default)
1476 GET_INST_OPCODE ip @ extract opcode from rINST
1477 fmstat @ export status flags
1478 mvnmi r0, #0 @ (less than) r1<- -1
1479 moveq r0, #0 @ (equal) r1<- 0
1480 SET_VREG r0, r9 @ vAA<- r0
1481 GOTO_OPCODE ip @ jump to next instruction
1482
1483/* ------------------------------ */
1484 .balign 128
1485.L_op_cmp_long: /* 0x31 */
1486/* File: arm/op_cmp_long.S */
1487 /*
1488 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination
1489 * register based on the results of the comparison.
1490 *
1491 * We load the full values with LDM, but in practice many values could
1492 * be resolved by only looking at the high word. This could be made
1493 * faster or slower by splitting the LDM into a pair of LDRs.
1494 *
1495 * If we just wanted to set condition flags, we could do this:
1496 * subs ip, r0, r2
1497 * sbcs ip, r1, r3
1498 * subeqs ip, r0, r2
1499 * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific
1500 * integer value, which we can do with 2 conditional mov/mvn instructions
1501 * (set 1, set -1; if they're equal we already have 0 in ip), giving
1502 * us a constant 5-cycle path plus a branch at the end to the
1503 * instruction epilogue code. The multi-compare approach below needs
1504 * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1505 * in the worst case (the 64-bit values are equal).
1506 */
1507 /* cmp-long vAA, vBB, vCC */
1508 FETCH r0, 1 @ r0<- CCBB
1509 mov r9, rINST, lsr #8 @ r9<- AA
1510 and r2, r0, #255 @ r2<- BB
1511 mov r3, r0, lsr #8 @ r3<- CC
1512 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
1513 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
1514 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
1515 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
1516 cmp r1, r3 @ compare (vBB+1, vCC+1)
1517 blt .Lop_cmp_long_less @ signed compare on high part
1518 bgt .Lop_cmp_long_greater
1519 subs r1, r0, r2 @ r1<- r0 - r2
1520 bhi .Lop_cmp_long_greater @ unsigned compare on low part
1521 bne .Lop_cmp_long_less
1522 b .Lop_cmp_long_finish @ equal; r1 already holds 0
1523
1524/* ------------------------------ */
1525 .balign 128
1526.L_op_if_eq: /* 0x32 */
1527/* File: arm/op_if_eq.S */
1528/* File: arm/bincmp.S */
1529 /*
1530 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1531 * fragment that specifies the *reverse* comparison to perform, e.g.
1532 * for "if-le" you would use "gt".
1533 *
1534 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1535 */
1536 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001537#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001538 mov r1, rINST, lsr #12 @ r1<- B
1539 ubfx r0, rINST, #8, #4 @ r0<- A
1540 GET_VREG r3, r1 @ r3<- vB
1541 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001542 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001543 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001544 bne .L_op_if_eq_not_taken
1545 EXPORT_PC
1546 mov r0, rSELF
1547 add r1, rFP, #OFF_FP_SHADOWFRAME
1548 mov r2, rINST
1549 bl MterpProfileBranch @ (self, shadow_frame, offset)
1550 cmp r0, #0
1551 bne MterpOnStackReplacement @ Note: offset must be in rINST
1552 adds r2, rINST, rINST @ convert to bytes, check sign
1553 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001554 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001555 bmi MterpCheckSuspendAndContinue
1556 GET_INST_OPCODE ip @ extract opcode from rINST
1557 GOTO_OPCODE ip @ jump to next instruction
1558.L_op_if_eq_not_taken:
1559 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001560 GET_INST_OPCODE ip @ extract opcode from rINST
1561 GOTO_OPCODE ip @ jump to next instruction
1562#else
1563 mov r1, rINST, lsr #12 @ r1<- B
1564 ubfx r0, rINST, #8, #4 @ r0<- A
1565 GET_VREG r3, r1 @ r3<- vB
1566 GET_VREG r2, r0 @ r2<- vA
1567 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001568 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001569 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001570 movne rINST, #2 @ rINST<- BYTE branch dist for not-taken
1571 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001572 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1573 bmi MterpCheckSuspendAndContinue
1574 GET_INST_OPCODE ip @ extract opcode from rINST
1575 GOTO_OPCODE ip @ jump to next instruction
1576#endif
1577
1578
1579/* ------------------------------ */
1580 .balign 128
1581.L_op_if_ne: /* 0x33 */
1582/* File: arm/op_if_ne.S */
1583/* File: arm/bincmp.S */
1584 /*
1585 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1586 * fragment that specifies the *reverse* comparison to perform, e.g.
1587 * for "if-le" you would use "gt".
1588 *
1589 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1590 */
1591 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001592#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001593 mov r1, rINST, lsr #12 @ r1<- B
1594 ubfx r0, rINST, #8, #4 @ r0<- A
1595 GET_VREG r3, r1 @ r3<- vB
1596 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001597 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001598 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001599 beq .L_op_if_ne_not_taken
1600 EXPORT_PC
1601 mov r0, rSELF
1602 add r1, rFP, #OFF_FP_SHADOWFRAME
1603 mov r2, rINST
1604 bl MterpProfileBranch @ (self, shadow_frame, offset)
1605 cmp r0, #0
1606 bne MterpOnStackReplacement @ Note: offset must be in rINST
1607 adds r2, rINST, rINST @ convert to bytes, check sign
1608 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001609 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001610 bmi MterpCheckSuspendAndContinue
1611 GET_INST_OPCODE ip @ extract opcode from rINST
1612 GOTO_OPCODE ip @ jump to next instruction
1613.L_op_if_ne_not_taken:
1614 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001615 GET_INST_OPCODE ip @ extract opcode from rINST
1616 GOTO_OPCODE ip @ jump to next instruction
1617#else
1618 mov r1, rINST, lsr #12 @ r1<- B
1619 ubfx r0, rINST, #8, #4 @ r0<- A
1620 GET_VREG r3, r1 @ r3<- vB
1621 GET_VREG r2, r0 @ r2<- vA
1622 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001623 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001624 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001625 moveq rINST, #2 @ rINST<- BYTE branch dist for not-taken
1626 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001627 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1628 bmi MterpCheckSuspendAndContinue
1629 GET_INST_OPCODE ip @ extract opcode from rINST
1630 GOTO_OPCODE ip @ jump to next instruction
1631#endif
1632
1633
1634/* ------------------------------ */
1635 .balign 128
1636.L_op_if_lt: /* 0x34 */
1637/* File: arm/op_if_lt.S */
1638/* File: arm/bincmp.S */
1639 /*
1640 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1641 * fragment that specifies the *reverse* comparison to perform, e.g.
1642 * for "if-le" you would use "gt".
1643 *
1644 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1645 */
1646 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001647#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001648 mov r1, rINST, lsr #12 @ r1<- B
1649 ubfx r0, rINST, #8, #4 @ r0<- A
1650 GET_VREG r3, r1 @ r3<- vB
1651 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001652 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001653 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001654 bge .L_op_if_lt_not_taken
1655 EXPORT_PC
1656 mov r0, rSELF
1657 add r1, rFP, #OFF_FP_SHADOWFRAME
1658 mov r2, rINST
1659 bl MterpProfileBranch @ (self, shadow_frame, offset)
1660 cmp r0, #0
1661 bne MterpOnStackReplacement @ Note: offset must be in rINST
1662 adds r2, rINST, rINST @ convert to bytes, check sign
1663 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001664 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001665 bmi MterpCheckSuspendAndContinue
1666 GET_INST_OPCODE ip @ extract opcode from rINST
1667 GOTO_OPCODE ip @ jump to next instruction
1668.L_op_if_lt_not_taken:
1669 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001670 GET_INST_OPCODE ip @ extract opcode from rINST
1671 GOTO_OPCODE ip @ jump to next instruction
1672#else
1673 mov r1, rINST, lsr #12 @ r1<- B
1674 ubfx r0, rINST, #8, #4 @ r0<- A
1675 GET_VREG r3, r1 @ r3<- vB
1676 GET_VREG r2, r0 @ r2<- vA
1677 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001678 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001679 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001680 movge rINST, #2 @ rINST<- BYTE branch dist for not-taken
1681 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001682 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1683 bmi MterpCheckSuspendAndContinue
1684 GET_INST_OPCODE ip @ extract opcode from rINST
1685 GOTO_OPCODE ip @ jump to next instruction
1686#endif
1687
1688
1689/* ------------------------------ */
1690 .balign 128
1691.L_op_if_ge: /* 0x35 */
1692/* File: arm/op_if_ge.S */
1693/* File: arm/bincmp.S */
1694 /*
1695 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1696 * fragment that specifies the *reverse* comparison to perform, e.g.
1697 * for "if-le" you would use "gt".
1698 *
1699 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1700 */
1701 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001702#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001703 mov r1, rINST, lsr #12 @ r1<- B
1704 ubfx r0, rINST, #8, #4 @ r0<- A
1705 GET_VREG r3, r1 @ r3<- vB
1706 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001707 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001708 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001709 blt .L_op_if_ge_not_taken
1710 EXPORT_PC
1711 mov r0, rSELF
1712 add r1, rFP, #OFF_FP_SHADOWFRAME
1713 mov r2, rINST
1714 bl MterpProfileBranch @ (self, shadow_frame, offset)
1715 cmp r0, #0
1716 bne MterpOnStackReplacement @ Note: offset must be in rINST
1717 adds r2, rINST, rINST @ convert to bytes, check sign
1718 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001719 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001720 bmi MterpCheckSuspendAndContinue
1721 GET_INST_OPCODE ip @ extract opcode from rINST
1722 GOTO_OPCODE ip @ jump to next instruction
1723.L_op_if_ge_not_taken:
1724 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001725 GET_INST_OPCODE ip @ extract opcode from rINST
1726 GOTO_OPCODE ip @ jump to next instruction
1727#else
1728 mov r1, rINST, lsr #12 @ r1<- B
1729 ubfx r0, rINST, #8, #4 @ r0<- A
1730 GET_VREG r3, r1 @ r3<- vB
1731 GET_VREG r2, r0 @ r2<- vA
1732 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001733 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001734 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001735 movlt rINST, #2 @ rINST<- BYTE branch dist for not-taken
1736 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001737 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1738 bmi MterpCheckSuspendAndContinue
1739 GET_INST_OPCODE ip @ extract opcode from rINST
1740 GOTO_OPCODE ip @ jump to next instruction
1741#endif
1742
1743
1744/* ------------------------------ */
1745 .balign 128
1746.L_op_if_gt: /* 0x36 */
1747/* File: arm/op_if_gt.S */
1748/* File: arm/bincmp.S */
1749 /*
1750 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1751 * fragment that specifies the *reverse* comparison to perform, e.g.
1752 * for "if-le" you would use "gt".
1753 *
1754 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1755 */
1756 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001757#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001758 mov r1, rINST, lsr #12 @ r1<- B
1759 ubfx r0, rINST, #8, #4 @ r0<- A
1760 GET_VREG r3, r1 @ r3<- vB
1761 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001762 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001763 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001764 ble .L_op_if_gt_not_taken
1765 EXPORT_PC
1766 mov r0, rSELF
1767 add r1, rFP, #OFF_FP_SHADOWFRAME
1768 mov r2, rINST
1769 bl MterpProfileBranch @ (self, shadow_frame, offset)
1770 cmp r0, #0
1771 bne MterpOnStackReplacement @ Note: offset must be in rINST
1772 adds r2, rINST, rINST @ convert to bytes, check sign
1773 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001774 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001775 bmi MterpCheckSuspendAndContinue
1776 GET_INST_OPCODE ip @ extract opcode from rINST
1777 GOTO_OPCODE ip @ jump to next instruction
1778.L_op_if_gt_not_taken:
1779 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001780 GET_INST_OPCODE ip @ extract opcode from rINST
1781 GOTO_OPCODE ip @ jump to next instruction
1782#else
1783 mov r1, rINST, lsr #12 @ r1<- B
1784 ubfx r0, rINST, #8, #4 @ r0<- A
1785 GET_VREG r3, r1 @ r3<- vB
1786 GET_VREG r2, r0 @ r2<- vA
1787 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001788 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001789 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001790 movle rINST, #2 @ rINST<- BYTE branch dist for not-taken
1791 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001792 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1793 bmi MterpCheckSuspendAndContinue
1794 GET_INST_OPCODE ip @ extract opcode from rINST
1795 GOTO_OPCODE ip @ jump to next instruction
1796#endif
1797
1798
1799/* ------------------------------ */
1800 .balign 128
1801.L_op_if_le: /* 0x37 */
1802/* File: arm/op_if_le.S */
1803/* File: arm/bincmp.S */
1804 /*
1805 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1806 * fragment that specifies the *reverse* comparison to perform, e.g.
1807 * for "if-le" you would use "gt".
1808 *
1809 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1810 */
1811 /* if-cmp vA, vB, +CCCC */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001812#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001813 mov r1, rINST, lsr #12 @ r1<- B
1814 ubfx r0, rINST, #8, #4 @ r0<- A
1815 GET_VREG r3, r1 @ r3<- vB
1816 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001817 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001818 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001819 bgt .L_op_if_le_not_taken
1820 EXPORT_PC
1821 mov r0, rSELF
1822 add r1, rFP, #OFF_FP_SHADOWFRAME
1823 mov r2, rINST
1824 bl MterpProfileBranch @ (self, shadow_frame, offset)
1825 cmp r0, #0
1826 bne MterpOnStackReplacement @ Note: offset must be in rINST
1827 adds r2, rINST, rINST @ convert to bytes, check sign
1828 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001829 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001830 bmi MterpCheckSuspendAndContinue
1831 GET_INST_OPCODE ip @ extract opcode from rINST
1832 GOTO_OPCODE ip @ jump to next instruction
1833.L_op_if_le_not_taken:
1834 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001835 GET_INST_OPCODE ip @ extract opcode from rINST
1836 GOTO_OPCODE ip @ jump to next instruction
1837#else
1838 mov r1, rINST, lsr #12 @ r1<- B
1839 ubfx r0, rINST, #8, #4 @ r0<- A
1840 GET_VREG r3, r1 @ r3<- vB
1841 GET_VREG r2, r0 @ r2<- vA
1842 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001843 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001844 cmp r2, r3 @ compare (vA, vB)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001845 movgt rINST, #2 @ rINST<- BYTE branch dist for not-taken
1846 adds r2, rINST, rINST @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001847 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1848 bmi MterpCheckSuspendAndContinue
1849 GET_INST_OPCODE ip @ extract opcode from rINST
1850 GOTO_OPCODE ip @ jump to next instruction
1851#endif
1852
1853
1854/* ------------------------------ */
1855 .balign 128
1856.L_op_if_eqz: /* 0x38 */
1857/* File: arm/op_if_eqz.S */
1858/* File: arm/zcmp.S */
1859 /*
1860 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1861 * fragment that specifies the *reverse* comparison to perform, e.g.
1862 * for "if-le" you would use "gt".
1863 *
1864 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1865 */
1866 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001867#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001868 mov r0, rINST, lsr #8 @ r0<- AA
1869 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001870 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1871 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001872 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001873 bne .L_op_if_eqz_not_taken
1874 EXPORT_PC
1875 mov r0, rSELF
1876 add r1, rFP, #OFF_FP_SHADOWFRAME
1877 mov r2, rINST
1878 bl MterpProfileBranch @ (self, shadow_frame, offset)
1879 cmp r0, #0
1880 bne MterpOnStackReplacement @ Note: offset must be in rINST
1881 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001882 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001883 bmi MterpCheckSuspendAndContinue
1884 GET_INST_OPCODE ip @ extract opcode from rINST
1885 GOTO_OPCODE ip @ jump to next instruction
1886.L_op_if_eqz_not_taken:
1887 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001888 GET_INST_OPCODE ip @ extract opcode from rINST
1889 GOTO_OPCODE ip @ jump to next instruction
1890#else
1891 mov r0, rINST, lsr #8 @ r0<- AA
1892 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001893 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001894 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1895 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001896 movne rINST, #2 @ rINST<- inst branch dist for not-taken
1897 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001898 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1899 bmi MterpCheckSuspendAndContinue
1900 GET_INST_OPCODE ip @ extract opcode from rINST
1901 GOTO_OPCODE ip @ jump to next instruction
1902#endif
1903
1904
1905/* ------------------------------ */
1906 .balign 128
1907.L_op_if_nez: /* 0x39 */
1908/* File: arm/op_if_nez.S */
1909/* File: arm/zcmp.S */
1910 /*
1911 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1912 * fragment that specifies the *reverse* comparison to perform, e.g.
1913 * for "if-le" you would use "gt".
1914 *
1915 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1916 */
1917 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001918#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001919 mov r0, rINST, lsr #8 @ r0<- AA
1920 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001921 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1922 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001923 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001924 beq .L_op_if_nez_not_taken
1925 EXPORT_PC
1926 mov r0, rSELF
1927 add r1, rFP, #OFF_FP_SHADOWFRAME
1928 mov r2, rINST
1929 bl MterpProfileBranch @ (self, shadow_frame, offset)
1930 cmp r0, #0
1931 bne MterpOnStackReplacement @ Note: offset must be in rINST
1932 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001933 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001934 bmi MterpCheckSuspendAndContinue
1935 GET_INST_OPCODE ip @ extract opcode from rINST
1936 GOTO_OPCODE ip @ jump to next instruction
1937.L_op_if_nez_not_taken:
1938 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
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
Bill Buzbeefd522f92016-02-11 22:37:42 +00001944 FETCH_S rINST, 1 @ rINST<- 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)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001947 moveq rINST, #2 @ rINST<- inst branch dist for not-taken
1948 adds r1, rINST, rINST @ 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_if_ltz: /* 0x3a */
1959/* File: arm/op_if_ltz.S */
1960/* File: arm/zcmp.S */
1961 /*
1962 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1963 * fragment that specifies the *reverse* comparison to perform, e.g.
1964 * for "if-le" you would use "gt".
1965 *
1966 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1967 */
1968 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001969#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001970 mov r0, rINST, lsr #8 @ r0<- AA
1971 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001972 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1973 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001974 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001975 bge .L_op_if_ltz_not_taken
1976 EXPORT_PC
1977 mov r0, rSELF
1978 add r1, rFP, #OFF_FP_SHADOWFRAME
1979 mov r2, rINST
1980 bl MterpProfileBranch @ (self, shadow_frame, offset)
1981 cmp r0, #0
1982 bne MterpOnStackReplacement @ Note: offset must be in rINST
1983 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001984 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001985 bmi MterpCheckSuspendAndContinue
1986 GET_INST_OPCODE ip @ extract opcode from rINST
1987 GOTO_OPCODE ip @ jump to next instruction
1988.L_op_if_ltz_not_taken:
1989 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08001990 GET_INST_OPCODE ip @ extract opcode from rINST
1991 GOTO_OPCODE ip @ jump to next instruction
1992#else
1993 mov r0, rINST, lsr #8 @ r0<- AA
1994 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001995 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001996 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1997 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001998 movge rINST, #2 @ rINST<- inst branch dist for not-taken
1999 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002000 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
2001 bmi MterpCheckSuspendAndContinue
2002 GET_INST_OPCODE ip @ extract opcode from rINST
2003 GOTO_OPCODE ip @ jump to next instruction
2004#endif
2005
2006
2007/* ------------------------------ */
2008 .balign 128
2009.L_op_if_gez: /* 0x3b */
2010/* File: arm/op_if_gez.S */
2011/* File: arm/zcmp.S */
2012 /*
2013 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
2014 * fragment that specifies the *reverse* comparison to perform, e.g.
2015 * for "if-le" you would use "gt".
2016 *
2017 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2018 */
2019 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00002020#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08002021 mov r0, rINST, lsr #8 @ r0<- AA
2022 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00002023 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
2024 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08002025 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00002026 blt .L_op_if_gez_not_taken
2027 EXPORT_PC
2028 mov r0, rSELF
2029 add r1, rFP, #OFF_FP_SHADOWFRAME
2030 mov r2, rINST
2031 bl MterpProfileBranch @ (self, shadow_frame, offset)
2032 cmp r0, #0
2033 bne MterpOnStackReplacement @ Note: offset must be in rINST
2034 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002035 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00002036 bmi MterpCheckSuspendAndContinue
2037 GET_INST_OPCODE ip @ extract opcode from rINST
2038 GOTO_OPCODE ip @ jump to next instruction
2039.L_op_if_gez_not_taken:
2040 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08002041 GET_INST_OPCODE ip @ extract opcode from rINST
2042 GOTO_OPCODE ip @ jump to next instruction
2043#else
2044 mov r0, rINST, lsr #8 @ r0<- AA
2045 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00002046 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08002047 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
2048 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00002049 movlt rINST, #2 @ rINST<- inst branch dist for not-taken
2050 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002051 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
2052 bmi MterpCheckSuspendAndContinue
2053 GET_INST_OPCODE ip @ extract opcode from rINST
2054 GOTO_OPCODE ip @ jump to next instruction
2055#endif
2056
2057
2058/* ------------------------------ */
2059 .balign 128
2060.L_op_if_gtz: /* 0x3c */
2061/* File: arm/op_if_gtz.S */
2062/* File: arm/zcmp.S */
2063 /*
2064 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
2065 * fragment that specifies the *reverse* comparison to perform, e.g.
2066 * for "if-le" you would use "gt".
2067 *
2068 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2069 */
2070 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00002071#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08002072 mov r0, rINST, lsr #8 @ r0<- AA
2073 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00002074 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
2075 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08002076 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00002077 ble .L_op_if_gtz_not_taken
2078 EXPORT_PC
2079 mov r0, rSELF
2080 add r1, rFP, #OFF_FP_SHADOWFRAME
2081 mov r2, rINST
2082 bl MterpProfileBranch @ (self, shadow_frame, offset)
2083 cmp r0, #0
2084 bne MterpOnStackReplacement @ Note: offset must be in rINST
2085 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002086 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00002087 bmi MterpCheckSuspendAndContinue
2088 GET_INST_OPCODE ip @ extract opcode from rINST
2089 GOTO_OPCODE ip @ jump to next instruction
2090.L_op_if_gtz_not_taken:
2091 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08002092 GET_INST_OPCODE ip @ extract opcode from rINST
2093 GOTO_OPCODE ip @ jump to next instruction
2094#else
2095 mov r0, rINST, lsr #8 @ r0<- AA
2096 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00002097 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08002098 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
2099 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00002100 movle rINST, #2 @ rINST<- inst branch dist for not-taken
2101 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002102 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
2103 bmi MterpCheckSuspendAndContinue
2104 GET_INST_OPCODE ip @ extract opcode from rINST
2105 GOTO_OPCODE ip @ jump to next instruction
2106#endif
2107
2108
2109/* ------------------------------ */
2110 .balign 128
2111.L_op_if_lez: /* 0x3d */
2112/* File: arm/op_if_lez.S */
2113/* File: arm/zcmp.S */
2114 /*
2115 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
2116 * fragment that specifies the *reverse* comparison to perform, e.g.
2117 * for "if-le" you would use "gt".
2118 *
2119 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
2120 */
2121 /* if-cmp vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00002122#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08002123 mov r0, rINST, lsr #8 @ r0<- AA
2124 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00002125 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
2126 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08002127 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00002128 bgt .L_op_if_lez_not_taken
2129 EXPORT_PC
2130 mov r0, rSELF
2131 add r1, rFP, #OFF_FP_SHADOWFRAME
2132 mov r2, rINST
2133 bl MterpProfileBranch @ (self, shadow_frame, offset)
2134 cmp r0, #0
2135 bne MterpOnStackReplacement @ Note: offset must be in rINST
2136 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002137 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00002138 bmi MterpCheckSuspendAndContinue
2139 GET_INST_OPCODE ip @ extract opcode from rINST
2140 GOTO_OPCODE ip @ jump to next instruction
2141.L_op_if_lez_not_taken:
2142 FETCH_ADVANCE_INST 2 @ update rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08002143 GET_INST_OPCODE ip @ extract opcode from rINST
2144 GOTO_OPCODE ip @ jump to next instruction
2145#else
2146 mov r0, rINST, lsr #8 @ r0<- AA
2147 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00002148 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08002149 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
2150 cmp r2, #0 @ compare (vA, 0)
Bill Buzbeefd522f92016-02-11 22:37:42 +00002151 movgt rINST, #2 @ rINST<- inst branch dist for not-taken
2152 adds r1, rINST, rINST @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08002153 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
2154 bmi MterpCheckSuspendAndContinue
2155 GET_INST_OPCODE ip @ extract opcode from rINST
2156 GOTO_OPCODE ip @ jump to next instruction
2157#endif
2158
2159
2160/* ------------------------------ */
2161 .balign 128
2162.L_op_unused_3e: /* 0x3e */
2163/* File: arm/op_unused_3e.S */
2164/* File: arm/unused.S */
2165/*
2166 * Bail to reference interpreter to throw.
2167 */
2168 b MterpFallback
2169
2170
2171/* ------------------------------ */
2172 .balign 128
2173.L_op_unused_3f: /* 0x3f */
2174/* File: arm/op_unused_3f.S */
2175/* File: arm/unused.S */
2176/*
2177 * Bail to reference interpreter to throw.
2178 */
2179 b MterpFallback
2180
2181
2182/* ------------------------------ */
2183 .balign 128
2184.L_op_unused_40: /* 0x40 */
2185/* File: arm/op_unused_40.S */
2186/* File: arm/unused.S */
2187/*
2188 * Bail to reference interpreter to throw.
2189 */
2190 b MterpFallback
2191
2192
2193/* ------------------------------ */
2194 .balign 128
2195.L_op_unused_41: /* 0x41 */
2196/* File: arm/op_unused_41.S */
2197/* File: arm/unused.S */
2198/*
2199 * Bail to reference interpreter to throw.
2200 */
2201 b MterpFallback
2202
2203
2204/* ------------------------------ */
2205 .balign 128
2206.L_op_unused_42: /* 0x42 */
2207/* File: arm/op_unused_42.S */
2208/* File: arm/unused.S */
2209/*
2210 * Bail to reference interpreter to throw.
2211 */
2212 b MterpFallback
2213
2214
2215/* ------------------------------ */
2216 .balign 128
2217.L_op_unused_43: /* 0x43 */
2218/* File: arm/op_unused_43.S */
2219/* File: arm/unused.S */
2220/*
2221 * Bail to reference interpreter to throw.
2222 */
2223 b MterpFallback
2224
2225
2226/* ------------------------------ */
2227 .balign 128
2228.L_op_aget: /* 0x44 */
2229/* File: arm/op_aget.S */
2230 /*
2231 * Array get, 32 bits or less. vAA <- vBB[vCC].
2232 *
2233 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2234 * instructions. We use a pair of FETCH_Bs instead.
2235 *
buzbee76833da2016-01-13 13:06:22 -08002236 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002237 *
2238 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2239 * If this changes, specialize.
2240 */
2241 /* op vAA, vBB, vCC */
2242 FETCH_B r2, 1, 0 @ r2<- BB
2243 mov r9, rINST, lsr #8 @ r9<- AA
2244 FETCH_B r3, 1, 1 @ r3<- CC
2245 GET_VREG r0, r2 @ r0<- vBB (array object)
2246 GET_VREG r1, r3 @ r1<- vCC (requested index)
2247 cmp r0, #0 @ null array object?
2248 beq common_errNullObject @ yes, bail
2249 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2250 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2251 cmp r1, r3 @ compare unsigned index, length
2252 bcs common_errArrayIndex @ index >= length, bail
2253 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2254 ldr r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2255 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002256 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002257 GOTO_OPCODE ip @ jump to next instruction
2258
2259/* ------------------------------ */
2260 .balign 128
2261.L_op_aget_wide: /* 0x45 */
2262/* File: arm/op_aget_wide.S */
2263 /*
2264 * Array get, 64 bits. vAA <- vBB[vCC].
2265 *
2266 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2267 */
2268 /* aget-wide vAA, vBB, vCC */
2269 FETCH r0, 1 @ r0<- CCBB
2270 mov r9, rINST, lsr #8 @ r9<- AA
2271 and r2, r0, #255 @ r2<- BB
2272 mov r3, r0, lsr #8 @ r3<- CC
2273 GET_VREG r0, r2 @ r0<- vBB (array object)
2274 GET_VREG r1, r3 @ r1<- vCC (requested index)
buzbee50cf6002016-02-10 08:59:12 -08002275 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08002276 cmp r0, #0 @ null array object?
2277 beq common_errNullObject @ yes, bail
2278 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2279 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2280 cmp r1, r3 @ compare unsigned index, length
2281 bcs common_errArrayIndex @ index >= length, bail
2282 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2283 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2284 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2285 GET_INST_OPCODE ip @ extract opcode from rINST
2286 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3
2287 GOTO_OPCODE ip @ jump to next instruction
2288
2289/* ------------------------------ */
2290 .balign 128
2291.L_op_aget_object: /* 0x46 */
2292/* File: arm/op_aget_object.S */
2293 /*
2294 * Array object get. vAA <- vBB[vCC].
2295 *
2296 * for: aget-object
2297 */
2298 /* op vAA, vBB, vCC */
2299 FETCH_B r2, 1, 0 @ r2<- BB
2300 mov r9, rINST, lsr #8 @ r9<- AA
2301 FETCH_B r3, 1, 1 @ r3<- CC
2302 EXPORT_PC
2303 GET_VREG r0, r2 @ r0<- vBB (array object)
2304 GET_VREG r1, r3 @ r1<- vCC (requested index)
2305 bl artAGetObjectFromMterp @ (array, index)
2306 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
2307 PREFETCH_INST 2
2308 cmp r1, #0
2309 bne MterpException
2310 SET_VREG_OBJECT r0, r9
2311 ADVANCE 2
2312 GET_INST_OPCODE ip
2313 GOTO_OPCODE ip @ jump to next instruction
2314
2315/* ------------------------------ */
2316 .balign 128
2317.L_op_aget_boolean: /* 0x47 */
2318/* File: arm/op_aget_boolean.S */
2319/* File: arm/op_aget.S */
2320 /*
2321 * Array get, 32 bits or less. vAA <- vBB[vCC].
2322 *
2323 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2324 * instructions. We use a pair of FETCH_Bs instead.
2325 *
buzbee76833da2016-01-13 13:06:22 -08002326 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002327 *
2328 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2329 * If this changes, specialize.
2330 */
2331 /* op vAA, vBB, vCC */
2332 FETCH_B r2, 1, 0 @ r2<- BB
2333 mov r9, rINST, lsr #8 @ r9<- AA
2334 FETCH_B r3, 1, 1 @ r3<- CC
2335 GET_VREG r0, r2 @ r0<- vBB (array object)
2336 GET_VREG r1, r3 @ r1<- vCC (requested index)
2337 cmp r0, #0 @ null array object?
2338 beq common_errNullObject @ yes, bail
2339 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2340 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2341 cmp r1, r3 @ compare unsigned index, length
2342 bcs common_errArrayIndex @ index >= length, bail
2343 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2344 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2345 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002346 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002347 GOTO_OPCODE ip @ jump to next instruction
2348
2349
2350/* ------------------------------ */
2351 .balign 128
2352.L_op_aget_byte: /* 0x48 */
2353/* File: arm/op_aget_byte.S */
2354/* File: arm/op_aget.S */
2355 /*
2356 * Array get, 32 bits or less. vAA <- vBB[vCC].
2357 *
2358 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2359 * instructions. We use a pair of FETCH_Bs instead.
2360 *
buzbee76833da2016-01-13 13:06:22 -08002361 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002362 *
2363 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2364 * If this changes, specialize.
2365 */
2366 /* op vAA, vBB, vCC */
2367 FETCH_B r2, 1, 0 @ r2<- BB
2368 mov r9, rINST, lsr #8 @ r9<- AA
2369 FETCH_B r3, 1, 1 @ r3<- CC
2370 GET_VREG r0, r2 @ r0<- vBB (array object)
2371 GET_VREG r1, r3 @ r1<- vCC (requested index)
2372 cmp r0, #0 @ null array object?
2373 beq common_errNullObject @ yes, bail
2374 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2375 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2376 cmp r1, r3 @ compare unsigned index, length
2377 bcs common_errArrayIndex @ index >= length, bail
2378 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2379 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2380 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002381 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002382 GOTO_OPCODE ip @ jump to next instruction
2383
2384
2385/* ------------------------------ */
2386 .balign 128
2387.L_op_aget_char: /* 0x49 */
2388/* File: arm/op_aget_char.S */
2389/* File: arm/op_aget.S */
2390 /*
2391 * Array get, 32 bits or less. vAA <- vBB[vCC].
2392 *
2393 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2394 * instructions. We use a pair of FETCH_Bs instead.
2395 *
buzbee76833da2016-01-13 13:06:22 -08002396 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002397 *
2398 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2399 * If this changes, specialize.
2400 */
2401 /* op vAA, vBB, vCC */
2402 FETCH_B r2, 1, 0 @ r2<- BB
2403 mov r9, rINST, lsr #8 @ r9<- AA
2404 FETCH_B r3, 1, 1 @ r3<- CC
2405 GET_VREG r0, r2 @ r0<- vBB (array object)
2406 GET_VREG r1, r3 @ r1<- vCC (requested index)
2407 cmp r0, #0 @ null array object?
2408 beq common_errNullObject @ yes, bail
2409 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2410 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2411 cmp r1, r3 @ compare unsigned index, length
2412 bcs common_errArrayIndex @ index >= length, bail
2413 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2414 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2415 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002416 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002417 GOTO_OPCODE ip @ jump to next instruction
2418
2419
2420/* ------------------------------ */
2421 .balign 128
2422.L_op_aget_short: /* 0x4a */
2423/* File: arm/op_aget_short.S */
2424/* File: arm/op_aget.S */
2425 /*
2426 * Array get, 32 bits or less. vAA <- vBB[vCC].
2427 *
2428 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2429 * instructions. We use a pair of FETCH_Bs instead.
2430 *
buzbee76833da2016-01-13 13:06:22 -08002431 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002432 *
2433 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2434 * If this changes, specialize.
2435 */
2436 /* op vAA, vBB, vCC */
2437 FETCH_B r2, 1, 0 @ r2<- BB
2438 mov r9, rINST, lsr #8 @ r9<- AA
2439 FETCH_B r3, 1, 1 @ r3<- CC
2440 GET_VREG r0, r2 @ r0<- vBB (array object)
2441 GET_VREG r1, r3 @ r1<- vCC (requested index)
2442 cmp r0, #0 @ null array object?
2443 beq common_errNullObject @ yes, bail
2444 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2445 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2446 cmp r1, r3 @ compare unsigned index, length
2447 bcs common_errArrayIndex @ index >= length, bail
2448 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2449 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2450 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002451 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002452 GOTO_OPCODE ip @ jump to next instruction
2453
2454
2455/* ------------------------------ */
2456 .balign 128
2457.L_op_aput: /* 0x4b */
2458/* File: arm/op_aput.S */
2459 /*
2460 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2461 *
2462 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2463 * instructions. We use a pair of FETCH_Bs instead.
2464 *
2465 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2466 *
2467 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2468 * If this changes, specialize.
2469 */
2470 /* op vAA, vBB, vCC */
2471 FETCH_B r2, 1, 0 @ r2<- BB
2472 mov r9, rINST, lsr #8 @ r9<- AA
2473 FETCH_B r3, 1, 1 @ r3<- CC
2474 GET_VREG r0, r2 @ r0<- vBB (array object)
2475 GET_VREG r1, r3 @ r1<- vCC (requested index)
2476 cmp r0, #0 @ null array object?
2477 beq common_errNullObject @ yes, bail
2478 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2479 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2480 cmp r1, r3 @ compare unsigned index, length
2481 bcs common_errArrayIndex @ index >= length, bail
2482 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2483 GET_VREG r2, r9 @ r2<- vAA
2484 GET_INST_OPCODE ip @ extract opcode from rINST
2485 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2486 GOTO_OPCODE ip @ jump to next instruction
2487
2488/* ------------------------------ */
2489 .balign 128
2490.L_op_aput_wide: /* 0x4c */
2491/* File: arm/op_aput_wide.S */
2492 /*
2493 * Array put, 64 bits. vBB[vCC] <- vAA.
2494 *
2495 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2496 */
2497 /* aput-wide vAA, vBB, vCC */
2498 FETCH r0, 1 @ r0<- CCBB
2499 mov r9, rINST, lsr #8 @ r9<- AA
2500 and r2, r0, #255 @ r2<- BB
2501 mov r3, r0, lsr #8 @ r3<- CC
2502 GET_VREG r0, r2 @ r0<- vBB (array object)
2503 GET_VREG r1, r3 @ r1<- vCC (requested index)
2504 cmp r0, #0 @ null array object?
2505 beq common_errNullObject @ yes, bail
2506 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2507 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2508 cmp r1, r3 @ compare unsigned index, length
2509 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2510 bcs common_errArrayIndex @ index >= length, bail
2511 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2512 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1
2513 GET_INST_OPCODE ip @ extract opcode from rINST
2514 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2515 GOTO_OPCODE ip @ jump to next instruction
2516
2517/* ------------------------------ */
2518 .balign 128
2519.L_op_aput_object: /* 0x4d */
2520/* File: arm/op_aput_object.S */
2521 /*
2522 * Store an object into an array. vBB[vCC] <- vAA.
2523 */
2524 /* op vAA, vBB, vCC */
2525 EXPORT_PC
2526 add r0, rFP, #OFF_FP_SHADOWFRAME
2527 mov r1, rPC
2528 mov r2, rINST
2529 bl MterpAputObject
2530 cmp r0, #0
2531 beq MterpPossibleException
2532 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2533 GET_INST_OPCODE ip @ extract opcode from rINST
2534 GOTO_OPCODE ip @ jump to next instruction
2535
2536/* ------------------------------ */
2537 .balign 128
2538.L_op_aput_boolean: /* 0x4e */
2539/* File: arm/op_aput_boolean.S */
2540/* File: arm/op_aput.S */
2541 /*
2542 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2543 *
2544 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2545 * instructions. We use a pair of FETCH_Bs instead.
2546 *
2547 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2548 *
2549 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2550 * If this changes, specialize.
2551 */
2552 /* op vAA, vBB, vCC */
2553 FETCH_B r2, 1, 0 @ r2<- BB
2554 mov r9, rINST, lsr #8 @ r9<- AA
2555 FETCH_B r3, 1, 1 @ r3<- CC
2556 GET_VREG r0, r2 @ r0<- vBB (array object)
2557 GET_VREG r1, r3 @ r1<- vCC (requested index)
2558 cmp r0, #0 @ null array object?
2559 beq common_errNullObject @ yes, bail
2560 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2561 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2562 cmp r1, r3 @ compare unsigned index, length
2563 bcs common_errArrayIndex @ index >= length, bail
2564 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2565 GET_VREG r2, r9 @ r2<- vAA
2566 GET_INST_OPCODE ip @ extract opcode from rINST
2567 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2568 GOTO_OPCODE ip @ jump to next instruction
2569
2570
2571/* ------------------------------ */
2572 .balign 128
2573.L_op_aput_byte: /* 0x4f */
2574/* File: arm/op_aput_byte.S */
2575/* File: arm/op_aput.S */
2576 /*
2577 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2578 *
2579 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2580 * instructions. We use a pair of FETCH_Bs instead.
2581 *
2582 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2583 *
2584 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2585 * If this changes, specialize.
2586 */
2587 /* op vAA, vBB, vCC */
2588 FETCH_B r2, 1, 0 @ r2<- BB
2589 mov r9, rINST, lsr #8 @ r9<- AA
2590 FETCH_B r3, 1, 1 @ r3<- CC
2591 GET_VREG r0, r2 @ r0<- vBB (array object)
2592 GET_VREG r1, r3 @ r1<- vCC (requested index)
2593 cmp r0, #0 @ null array object?
2594 beq common_errNullObject @ yes, bail
2595 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2596 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2597 cmp r1, r3 @ compare unsigned index, length
2598 bcs common_errArrayIndex @ index >= length, bail
2599 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2600 GET_VREG r2, r9 @ r2<- vAA
2601 GET_INST_OPCODE ip @ extract opcode from rINST
2602 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2603 GOTO_OPCODE ip @ jump to next instruction
2604
2605
2606/* ------------------------------ */
2607 .balign 128
2608.L_op_aput_char: /* 0x50 */
2609/* File: arm/op_aput_char.S */
2610/* File: arm/op_aput.S */
2611 /*
2612 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2613 *
2614 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2615 * instructions. We use a pair of FETCH_Bs instead.
2616 *
2617 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2618 *
2619 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2620 * If this changes, specialize.
2621 */
2622 /* op vAA, vBB, vCC */
2623 FETCH_B r2, 1, 0 @ r2<- BB
2624 mov r9, rINST, lsr #8 @ r9<- AA
2625 FETCH_B r3, 1, 1 @ r3<- CC
2626 GET_VREG r0, r2 @ r0<- vBB (array object)
2627 GET_VREG r1, r3 @ r1<- vCC (requested index)
2628 cmp r0, #0 @ null array object?
2629 beq common_errNullObject @ yes, bail
2630 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2631 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2632 cmp r1, r3 @ compare unsigned index, length
2633 bcs common_errArrayIndex @ index >= length, bail
2634 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2635 GET_VREG r2, r9 @ r2<- vAA
2636 GET_INST_OPCODE ip @ extract opcode from rINST
2637 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2638 GOTO_OPCODE ip @ jump to next instruction
2639
2640
2641/* ------------------------------ */
2642 .balign 128
2643.L_op_aput_short: /* 0x51 */
2644/* File: arm/op_aput_short.S */
2645/* File: arm/op_aput.S */
2646 /*
2647 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2648 *
2649 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2650 * instructions. We use a pair of FETCH_Bs instead.
2651 *
2652 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2653 *
2654 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2655 * If this changes, specialize.
2656 */
2657 /* op vAA, vBB, vCC */
2658 FETCH_B r2, 1, 0 @ r2<- BB
2659 mov r9, rINST, lsr #8 @ r9<- AA
2660 FETCH_B r3, 1, 1 @ r3<- CC
2661 GET_VREG r0, r2 @ r0<- vBB (array object)
2662 GET_VREG r1, r3 @ r1<- vCC (requested index)
2663 cmp r0, #0 @ null array object?
2664 beq common_errNullObject @ yes, bail
2665 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2666 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2667 cmp r1, r3 @ compare unsigned index, length
2668 bcs common_errArrayIndex @ index >= length, bail
2669 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2670 GET_VREG r2, r9 @ r2<- vAA
2671 GET_INST_OPCODE ip @ extract opcode from rINST
2672 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2673 GOTO_OPCODE ip @ jump to next instruction
2674
2675
2676/* ------------------------------ */
2677 .balign 128
2678.L_op_iget: /* 0x52 */
2679/* File: arm/op_iget.S */
2680 /*
2681 * General instance field get.
2682 *
2683 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2684 */
2685 EXPORT_PC
2686 FETCH r0, 1 @ r0<- field ref CCCC
2687 mov r1, rINST, lsr #12 @ r1<- B
2688 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2689 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2690 mov r3, rSELF @ r3<- self
2691 bl artGet32InstanceFromCode
2692 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2693 ubfx r2, rINST, #8, #4 @ r2<- A
2694 PREFETCH_INST 2
2695 cmp r3, #0
2696 bne MterpPossibleException @ bail out
2697 .if 0
2698 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2699 .else
2700 SET_VREG r0, r2 @ fp[A]<- r0
2701 .endif
2702 ADVANCE 2
2703 GET_INST_OPCODE ip @ extract opcode from rINST
2704 GOTO_OPCODE ip @ jump to next instruction
2705
2706/* ------------------------------ */
2707 .balign 128
2708.L_op_iget_wide: /* 0x53 */
2709/* File: arm/op_iget_wide.S */
2710 /*
2711 * 64-bit instance field get.
2712 *
2713 * for: iget-wide
2714 */
2715 EXPORT_PC
2716 FETCH r0, 1 @ r0<- field ref CCCC
2717 mov r1, rINST, lsr #12 @ r1<- B
2718 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2719 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2720 mov r3, rSELF @ r3<- self
2721 bl artGet64InstanceFromCode
2722 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2723 ubfx r2, rINST, #8, #4 @ r2<- A
2724 PREFETCH_INST 2
2725 cmp r3, #0
2726 bne MterpException @ bail out
buzbee50cf6002016-02-10 08:59:12 -08002727 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
2728 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
2729 stmia r3, {r0-r1} @ fp[A]<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -08002730 ADVANCE 2
2731 GET_INST_OPCODE ip @ extract opcode from rINST
2732 GOTO_OPCODE ip @ jump to next instruction
2733
2734/* ------------------------------ */
2735 .balign 128
2736.L_op_iget_object: /* 0x54 */
2737/* File: arm/op_iget_object.S */
2738/* File: arm/op_iget.S */
2739 /*
2740 * General instance field get.
2741 *
2742 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2743 */
2744 EXPORT_PC
2745 FETCH r0, 1 @ r0<- field ref CCCC
2746 mov r1, rINST, lsr #12 @ r1<- B
2747 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2748 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2749 mov r3, rSELF @ r3<- self
2750 bl artGetObjInstanceFromCode
2751 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2752 ubfx r2, rINST, #8, #4 @ r2<- A
2753 PREFETCH_INST 2
2754 cmp r3, #0
2755 bne MterpPossibleException @ bail out
2756 .if 1
2757 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2758 .else
2759 SET_VREG r0, r2 @ fp[A]<- r0
2760 .endif
2761 ADVANCE 2
2762 GET_INST_OPCODE ip @ extract opcode from rINST
2763 GOTO_OPCODE ip @ jump to next instruction
2764
2765
2766/* ------------------------------ */
2767 .balign 128
2768.L_op_iget_boolean: /* 0x55 */
2769/* File: arm/op_iget_boolean.S */
2770/* File: arm/op_iget.S */
2771 /*
2772 * General instance field get.
2773 *
2774 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2775 */
2776 EXPORT_PC
2777 FETCH r0, 1 @ r0<- field ref CCCC
2778 mov r1, rINST, lsr #12 @ r1<- B
2779 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2780 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2781 mov r3, rSELF @ r3<- self
2782 bl artGetBooleanInstanceFromCode
2783 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2784 ubfx r2, rINST, #8, #4 @ r2<- A
2785 PREFETCH_INST 2
2786 cmp r3, #0
2787 bne MterpPossibleException @ bail out
2788 .if 0
2789 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2790 .else
2791 SET_VREG r0, r2 @ fp[A]<- r0
2792 .endif
2793 ADVANCE 2
2794 GET_INST_OPCODE ip @ extract opcode from rINST
2795 GOTO_OPCODE ip @ jump to next instruction
2796
2797
2798/* ------------------------------ */
2799 .balign 128
2800.L_op_iget_byte: /* 0x56 */
2801/* File: arm/op_iget_byte.S */
2802/* File: arm/op_iget.S */
2803 /*
2804 * General instance field get.
2805 *
2806 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2807 */
2808 EXPORT_PC
2809 FETCH r0, 1 @ r0<- field ref CCCC
2810 mov r1, rINST, lsr #12 @ r1<- B
2811 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2812 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2813 mov r3, rSELF @ r3<- self
2814 bl artGetByteInstanceFromCode
2815 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2816 ubfx r2, rINST, #8, #4 @ r2<- A
2817 PREFETCH_INST 2
2818 cmp r3, #0
2819 bne MterpPossibleException @ bail out
2820 .if 0
2821 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2822 .else
2823 SET_VREG r0, r2 @ fp[A]<- r0
2824 .endif
2825 ADVANCE 2
2826 GET_INST_OPCODE ip @ extract opcode from rINST
2827 GOTO_OPCODE ip @ jump to next instruction
2828
2829
2830/* ------------------------------ */
2831 .balign 128
2832.L_op_iget_char: /* 0x57 */
2833/* File: arm/op_iget_char.S */
2834/* File: arm/op_iget.S */
2835 /*
2836 * General instance field get.
2837 *
2838 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2839 */
2840 EXPORT_PC
2841 FETCH r0, 1 @ r0<- field ref CCCC
2842 mov r1, rINST, lsr #12 @ r1<- B
2843 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2844 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2845 mov r3, rSELF @ r3<- self
2846 bl artGetCharInstanceFromCode
2847 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2848 ubfx r2, rINST, #8, #4 @ r2<- A
2849 PREFETCH_INST 2
2850 cmp r3, #0
2851 bne MterpPossibleException @ bail out
2852 .if 0
2853 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2854 .else
2855 SET_VREG r0, r2 @ fp[A]<- r0
2856 .endif
2857 ADVANCE 2
2858 GET_INST_OPCODE ip @ extract opcode from rINST
2859 GOTO_OPCODE ip @ jump to next instruction
2860
2861
2862/* ------------------------------ */
2863 .balign 128
2864.L_op_iget_short: /* 0x58 */
2865/* File: arm/op_iget_short.S */
2866/* File: arm/op_iget.S */
2867 /*
2868 * General instance field get.
2869 *
2870 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2871 */
2872 EXPORT_PC
2873 FETCH r0, 1 @ r0<- field ref CCCC
2874 mov r1, rINST, lsr #12 @ r1<- B
2875 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2876 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2877 mov r3, rSELF @ r3<- self
2878 bl artGetShortInstanceFromCode
2879 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2880 ubfx r2, rINST, #8, #4 @ r2<- A
2881 PREFETCH_INST 2
2882 cmp r3, #0
2883 bne MterpPossibleException @ bail out
2884 .if 0
2885 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2886 .else
2887 SET_VREG r0, r2 @ fp[A]<- r0
2888 .endif
2889 ADVANCE 2
2890 GET_INST_OPCODE ip @ extract opcode from rINST
2891 GOTO_OPCODE ip @ jump to next instruction
2892
2893
2894/* ------------------------------ */
2895 .balign 128
2896.L_op_iput: /* 0x59 */
2897/* File: arm/op_iput.S */
2898 /*
2899 * General 32-bit instance field put.
2900 *
2901 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2902 */
2903 /* op vA, vB, field@CCCC */
2904 .extern artSet32InstanceFromMterp
2905 EXPORT_PC
2906 FETCH r0, 1 @ r0<- field ref CCCC
2907 mov r1, rINST, lsr #12 @ r1<- B
2908 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2909 ubfx r2, rINST, #8, #4 @ r2<- A
2910 GET_VREG r2, r2 @ r2<- fp[A]
2911 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2912 PREFETCH_INST 2
2913 bl artSet32InstanceFromMterp
2914 cmp r0, #0
2915 bne MterpPossibleException
2916 ADVANCE 2 @ advance rPC
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_iput_wide: /* 0x5a */
2923/* File: arm/op_iput_wide.S */
2924 /* iput-wide vA, vB, field@CCCC */
2925 .extern artSet64InstanceFromMterp
2926 EXPORT_PC
2927 FETCH r0, 1 @ r0<- field ref CCCC
2928 mov r1, rINST, lsr #12 @ r1<- B
2929 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2930 ubfx r2, rINST, #8, #4 @ r2<- A
2931 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
2932 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2933 PREFETCH_INST 2
2934 bl artSet64InstanceFromMterp
2935 cmp r0, #0
2936 bne MterpPossibleException
2937 ADVANCE 2 @ advance rPC
2938 GET_INST_OPCODE ip @ extract opcode from rINST
2939 GOTO_OPCODE ip @ jump to next instruction
2940
2941/* ------------------------------ */
2942 .balign 128
2943.L_op_iput_object: /* 0x5b */
2944/* File: arm/op_iput_object.S */
2945 EXPORT_PC
2946 add r0, rFP, #OFF_FP_SHADOWFRAME
2947 mov r1, rPC
2948 mov r2, rINST
2949 mov r3, rSELF
2950 bl MterpIputObject
2951 cmp r0, #0
2952 beq MterpException
2953 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2954 GET_INST_OPCODE ip @ extract opcode from rINST
2955 GOTO_OPCODE ip @ jump to next instruction
2956
2957/* ------------------------------ */
2958 .balign 128
2959.L_op_iput_boolean: /* 0x5c */
2960/* File: arm/op_iput_boolean.S */
2961/* File: arm/op_iput.S */
2962 /*
2963 * General 32-bit instance field put.
2964 *
2965 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2966 */
2967 /* op vA, vB, field@CCCC */
2968 .extern artSet8InstanceFromMterp
2969 EXPORT_PC
2970 FETCH r0, 1 @ r0<- field ref CCCC
2971 mov r1, rINST, lsr #12 @ r1<- B
2972 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2973 ubfx r2, rINST, #8, #4 @ r2<- A
2974 GET_VREG r2, r2 @ r2<- fp[A]
2975 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2976 PREFETCH_INST 2
2977 bl artSet8InstanceFromMterp
2978 cmp r0, #0
2979 bne MterpPossibleException
2980 ADVANCE 2 @ advance rPC
2981 GET_INST_OPCODE ip @ extract opcode from rINST
2982 GOTO_OPCODE ip @ jump to next instruction
2983
2984
2985/* ------------------------------ */
2986 .balign 128
2987.L_op_iput_byte: /* 0x5d */
2988/* File: arm/op_iput_byte.S */
2989/* File: arm/op_iput.S */
2990 /*
2991 * General 32-bit instance field put.
2992 *
2993 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2994 */
2995 /* op vA, vB, field@CCCC */
2996 .extern artSet8InstanceFromMterp
2997 EXPORT_PC
2998 FETCH r0, 1 @ r0<- field ref CCCC
2999 mov r1, rINST, lsr #12 @ r1<- B
3000 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
3001 ubfx r2, rINST, #8, #4 @ r2<- A
3002 GET_VREG r2, r2 @ r2<- fp[A]
3003 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
3004 PREFETCH_INST 2
3005 bl artSet8InstanceFromMterp
3006 cmp r0, #0
3007 bne MterpPossibleException
3008 ADVANCE 2 @ advance rPC
3009 GET_INST_OPCODE ip @ extract opcode from rINST
3010 GOTO_OPCODE ip @ jump to next instruction
3011
3012
3013/* ------------------------------ */
3014 .balign 128
3015.L_op_iput_char: /* 0x5e */
3016/* File: arm/op_iput_char.S */
3017/* File: arm/op_iput.S */
3018 /*
3019 * General 32-bit instance field put.
3020 *
3021 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
3022 */
3023 /* op vA, vB, field@CCCC */
3024 .extern artSet16InstanceFromMterp
3025 EXPORT_PC
3026 FETCH r0, 1 @ r0<- field ref CCCC
3027 mov r1, rINST, lsr #12 @ r1<- B
3028 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
3029 ubfx r2, rINST, #8, #4 @ r2<- A
3030 GET_VREG r2, r2 @ r2<- fp[A]
3031 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
3032 PREFETCH_INST 2
3033 bl artSet16InstanceFromMterp
3034 cmp r0, #0
3035 bne MterpPossibleException
3036 ADVANCE 2 @ advance rPC
3037 GET_INST_OPCODE ip @ extract opcode from rINST
3038 GOTO_OPCODE ip @ jump to next instruction
3039
3040
3041/* ------------------------------ */
3042 .balign 128
3043.L_op_iput_short: /* 0x5f */
3044/* File: arm/op_iput_short.S */
3045/* File: arm/op_iput.S */
3046 /*
3047 * General 32-bit instance field put.
3048 *
3049 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
3050 */
3051 /* op vA, vB, field@CCCC */
3052 .extern artSet16InstanceFromMterp
3053 EXPORT_PC
3054 FETCH r0, 1 @ r0<- field ref CCCC
3055 mov r1, rINST, lsr #12 @ r1<- B
3056 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
3057 ubfx r2, rINST, #8, #4 @ r2<- A
3058 GET_VREG r2, r2 @ r2<- fp[A]
3059 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
3060 PREFETCH_INST 2
3061 bl artSet16InstanceFromMterp
3062 cmp r0, #0
3063 bne MterpPossibleException
3064 ADVANCE 2 @ advance rPC
3065 GET_INST_OPCODE ip @ extract opcode from rINST
3066 GOTO_OPCODE ip @ jump to next instruction
3067
3068
3069/* ------------------------------ */
3070 .balign 128
3071.L_op_sget: /* 0x60 */
3072/* File: arm/op_sget.S */
3073 /*
3074 * General SGET handler wrapper.
3075 *
3076 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3077 */
3078 /* op vAA, field@BBBB */
3079
3080 .extern artGet32StaticFromCode
3081 EXPORT_PC
3082 FETCH r0, 1 @ r0<- field ref BBBB
3083 ldr r1, [rFP, #OFF_FP_METHOD]
3084 mov r2, rSELF
3085 bl artGet32StaticFromCode
3086 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3087 mov r2, rINST, lsr #8 @ r2<- AA
3088 PREFETCH_INST 2
3089 cmp r3, #0 @ Fail to resolve?
3090 bne MterpException @ bail out
3091.if 0
3092 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3093.else
3094 SET_VREG r0, r2 @ fp[AA]<- r0
3095.endif
3096 ADVANCE 2
3097 GET_INST_OPCODE ip @ extract opcode from rINST
3098 GOTO_OPCODE ip
3099
3100/* ------------------------------ */
3101 .balign 128
3102.L_op_sget_wide: /* 0x61 */
3103/* File: arm/op_sget_wide.S */
3104 /*
3105 * SGET_WIDE handler wrapper.
3106 *
3107 */
3108 /* sget-wide vAA, field@BBBB */
3109
3110 .extern artGet64StaticFromCode
3111 EXPORT_PC
3112 FETCH r0, 1 @ r0<- field ref BBBB
3113 ldr r1, [rFP, #OFF_FP_METHOD]
3114 mov r2, rSELF
3115 bl artGet64StaticFromCode
3116 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3117 mov r9, rINST, lsr #8 @ r9<- AA
buzbee50cf6002016-02-10 08:59:12 -08003118 add lr, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08003119 cmp r3, #0 @ Fail to resolve?
3120 bne MterpException @ bail out
3121 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -08003122 CLEAR_SHADOW_PAIR r9, r2, ip @ Zero out the shadow regs
3123 stmia lr, {r0-r1} @ vAA/vAA+1<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -08003124 GET_INST_OPCODE ip @ extract opcode from rINST
3125 GOTO_OPCODE ip @ jump to next instruction
3126
3127/* ------------------------------ */
3128 .balign 128
3129.L_op_sget_object: /* 0x62 */
3130/* File: arm/op_sget_object.S */
3131/* File: arm/op_sget.S */
3132 /*
3133 * General SGET handler wrapper.
3134 *
3135 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3136 */
3137 /* op vAA, field@BBBB */
3138
3139 .extern artGetObjStaticFromCode
3140 EXPORT_PC
3141 FETCH r0, 1 @ r0<- field ref BBBB
3142 ldr r1, [rFP, #OFF_FP_METHOD]
3143 mov r2, rSELF
3144 bl artGetObjStaticFromCode
3145 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3146 mov r2, rINST, lsr #8 @ r2<- AA
3147 PREFETCH_INST 2
3148 cmp r3, #0 @ Fail to resolve?
3149 bne MterpException @ bail out
3150.if 1
3151 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3152.else
3153 SET_VREG r0, r2 @ fp[AA]<- r0
3154.endif
3155 ADVANCE 2
3156 GET_INST_OPCODE ip @ extract opcode from rINST
3157 GOTO_OPCODE ip
3158
3159
3160/* ------------------------------ */
3161 .balign 128
3162.L_op_sget_boolean: /* 0x63 */
3163/* File: arm/op_sget_boolean.S */
3164/* File: arm/op_sget.S */
3165 /*
3166 * General SGET handler wrapper.
3167 *
3168 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3169 */
3170 /* op vAA, field@BBBB */
3171
3172 .extern artGetBooleanStaticFromCode
3173 EXPORT_PC
3174 FETCH r0, 1 @ r0<- field ref BBBB
3175 ldr r1, [rFP, #OFF_FP_METHOD]
3176 mov r2, rSELF
3177 bl artGetBooleanStaticFromCode
3178 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3179 mov r2, rINST, lsr #8 @ r2<- AA
3180 PREFETCH_INST 2
3181 cmp r3, #0 @ Fail to resolve?
3182 bne MterpException @ bail out
3183.if 0
3184 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3185.else
3186 SET_VREG r0, r2 @ fp[AA]<- r0
3187.endif
3188 ADVANCE 2
3189 GET_INST_OPCODE ip @ extract opcode from rINST
3190 GOTO_OPCODE ip
3191
3192
3193/* ------------------------------ */
3194 .balign 128
3195.L_op_sget_byte: /* 0x64 */
3196/* File: arm/op_sget_byte.S */
3197/* File: arm/op_sget.S */
3198 /*
3199 * General SGET handler wrapper.
3200 *
3201 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3202 */
3203 /* op vAA, field@BBBB */
3204
3205 .extern artGetByteStaticFromCode
3206 EXPORT_PC
3207 FETCH r0, 1 @ r0<- field ref BBBB
3208 ldr r1, [rFP, #OFF_FP_METHOD]
3209 mov r2, rSELF
3210 bl artGetByteStaticFromCode
3211 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3212 mov r2, rINST, lsr #8 @ r2<- AA
3213 PREFETCH_INST 2
3214 cmp r3, #0 @ Fail to resolve?
3215 bne MterpException @ bail out
3216.if 0
3217 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3218.else
3219 SET_VREG r0, r2 @ fp[AA]<- r0
3220.endif
3221 ADVANCE 2
3222 GET_INST_OPCODE ip @ extract opcode from rINST
3223 GOTO_OPCODE ip
3224
3225
3226/* ------------------------------ */
3227 .balign 128
3228.L_op_sget_char: /* 0x65 */
3229/* File: arm/op_sget_char.S */
3230/* File: arm/op_sget.S */
3231 /*
3232 * General SGET handler wrapper.
3233 *
3234 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3235 */
3236 /* op vAA, field@BBBB */
3237
3238 .extern artGetCharStaticFromCode
3239 EXPORT_PC
3240 FETCH r0, 1 @ r0<- field ref BBBB
3241 ldr r1, [rFP, #OFF_FP_METHOD]
3242 mov r2, rSELF
3243 bl artGetCharStaticFromCode
3244 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3245 mov r2, rINST, lsr #8 @ r2<- AA
3246 PREFETCH_INST 2
3247 cmp r3, #0 @ Fail to resolve?
3248 bne MterpException @ bail out
3249.if 0
3250 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3251.else
3252 SET_VREG r0, r2 @ fp[AA]<- r0
3253.endif
3254 ADVANCE 2
3255 GET_INST_OPCODE ip @ extract opcode from rINST
3256 GOTO_OPCODE ip
3257
3258
3259/* ------------------------------ */
3260 .balign 128
3261.L_op_sget_short: /* 0x66 */
3262/* File: arm/op_sget_short.S */
3263/* File: arm/op_sget.S */
3264 /*
3265 * General SGET handler wrapper.
3266 *
3267 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3268 */
3269 /* op vAA, field@BBBB */
3270
3271 .extern artGetShortStaticFromCode
3272 EXPORT_PC
3273 FETCH r0, 1 @ r0<- field ref BBBB
3274 ldr r1, [rFP, #OFF_FP_METHOD]
3275 mov r2, rSELF
3276 bl artGetShortStaticFromCode
3277 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3278 mov r2, rINST, lsr #8 @ r2<- AA
3279 PREFETCH_INST 2
3280 cmp r3, #0 @ Fail to resolve?
3281 bne MterpException @ bail out
3282.if 0
3283 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3284.else
3285 SET_VREG r0, r2 @ fp[AA]<- r0
3286.endif
3287 ADVANCE 2
3288 GET_INST_OPCODE ip @ extract opcode from rINST
3289 GOTO_OPCODE ip
3290
3291
3292/* ------------------------------ */
3293 .balign 128
3294.L_op_sput: /* 0x67 */
3295/* File: arm/op_sput.S */
3296 /*
3297 * General SPUT handler wrapper.
3298 *
3299 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3300 */
3301 /* op vAA, field@BBBB */
3302 EXPORT_PC
3303 FETCH r0, 1 @ r0<- field ref BBBB
3304 mov r3, rINST, lsr #8 @ r3<- AA
3305 GET_VREG r1, r3 @ r1<= fp[AA]
3306 ldr r2, [rFP, #OFF_FP_METHOD]
3307 mov r3, rSELF
3308 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3309 bl artSet32StaticFromCode
3310 cmp r0, #0 @ 0 on success, -1 on failure
3311 bne MterpException
3312 ADVANCE 2 @ Past exception point - now advance rPC
3313 GET_INST_OPCODE ip @ extract opcode from rINST
3314 GOTO_OPCODE ip @ jump to next instruction
3315
3316/* ------------------------------ */
3317 .balign 128
3318.L_op_sput_wide: /* 0x68 */
3319/* File: arm/op_sput_wide.S */
3320 /*
3321 * SPUT_WIDE handler wrapper.
3322 *
3323 */
3324 /* sput-wide vAA, field@BBBB */
3325 .extern artSet64IndirectStaticFromMterp
3326 EXPORT_PC
3327 FETCH r0, 1 @ r0<- field ref BBBB
3328 ldr r1, [rFP, #OFF_FP_METHOD]
3329 mov r2, rINST, lsr #8 @ r3<- AA
3330 add r2, rFP, r2, lsl #2
3331 mov r3, rSELF
3332 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3333 bl artSet64IndirectStaticFromMterp
3334 cmp r0, #0 @ 0 on success, -1 on failure
3335 bne MterpException
3336 ADVANCE 2 @ Past exception point - now advance rPC
3337 GET_INST_OPCODE ip @ extract opcode from rINST
3338 GOTO_OPCODE ip @ jump to next instruction
3339
3340/* ------------------------------ */
3341 .balign 128
3342.L_op_sput_object: /* 0x69 */
3343/* File: arm/op_sput_object.S */
3344 EXPORT_PC
3345 add r0, rFP, #OFF_FP_SHADOWFRAME
3346 mov r1, rPC
3347 mov r2, rINST
3348 mov r3, rSELF
3349 bl MterpSputObject
3350 cmp r0, #0
3351 beq MterpException
3352 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3353 GET_INST_OPCODE ip @ extract opcode from rINST
3354 GOTO_OPCODE ip @ jump to next instruction
3355
3356/* ------------------------------ */
3357 .balign 128
3358.L_op_sput_boolean: /* 0x6a */
3359/* File: arm/op_sput_boolean.S */
3360/* File: arm/op_sput.S */
3361 /*
3362 * General SPUT handler wrapper.
3363 *
3364 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3365 */
3366 /* op vAA, field@BBBB */
3367 EXPORT_PC
3368 FETCH r0, 1 @ r0<- field ref BBBB
3369 mov r3, rINST, lsr #8 @ r3<- AA
3370 GET_VREG r1, r3 @ r1<= fp[AA]
3371 ldr r2, [rFP, #OFF_FP_METHOD]
3372 mov r3, rSELF
3373 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3374 bl artSet8StaticFromCode
3375 cmp r0, #0 @ 0 on success, -1 on failure
3376 bne MterpException
3377 ADVANCE 2 @ Past exception point - now advance rPC
3378 GET_INST_OPCODE ip @ extract opcode from rINST
3379 GOTO_OPCODE ip @ jump to next instruction
3380
3381
3382/* ------------------------------ */
3383 .balign 128
3384.L_op_sput_byte: /* 0x6b */
3385/* File: arm/op_sput_byte.S */
3386/* File: arm/op_sput.S */
3387 /*
3388 * General SPUT handler wrapper.
3389 *
3390 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3391 */
3392 /* op vAA, field@BBBB */
3393 EXPORT_PC
3394 FETCH r0, 1 @ r0<- field ref BBBB
3395 mov r3, rINST, lsr #8 @ r3<- AA
3396 GET_VREG r1, r3 @ r1<= fp[AA]
3397 ldr r2, [rFP, #OFF_FP_METHOD]
3398 mov r3, rSELF
3399 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3400 bl artSet8StaticFromCode
3401 cmp r0, #0 @ 0 on success, -1 on failure
3402 bne MterpException
3403 ADVANCE 2 @ Past exception point - now advance rPC
3404 GET_INST_OPCODE ip @ extract opcode from rINST
3405 GOTO_OPCODE ip @ jump to next instruction
3406
3407
3408/* ------------------------------ */
3409 .balign 128
3410.L_op_sput_char: /* 0x6c */
3411/* File: arm/op_sput_char.S */
3412/* File: arm/op_sput.S */
3413 /*
3414 * General SPUT handler wrapper.
3415 *
3416 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3417 */
3418 /* op vAA, field@BBBB */
3419 EXPORT_PC
3420 FETCH r0, 1 @ r0<- field ref BBBB
3421 mov r3, rINST, lsr #8 @ r3<- AA
3422 GET_VREG r1, r3 @ r1<= fp[AA]
3423 ldr r2, [rFP, #OFF_FP_METHOD]
3424 mov r3, rSELF
3425 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3426 bl artSet16StaticFromCode
3427 cmp r0, #0 @ 0 on success, -1 on failure
3428 bne MterpException
3429 ADVANCE 2 @ Past exception point - now advance rPC
3430 GET_INST_OPCODE ip @ extract opcode from rINST
3431 GOTO_OPCODE ip @ jump to next instruction
3432
3433
3434/* ------------------------------ */
3435 .balign 128
3436.L_op_sput_short: /* 0x6d */
3437/* File: arm/op_sput_short.S */
3438/* File: arm/op_sput.S */
3439 /*
3440 * General SPUT handler wrapper.
3441 *
3442 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3443 */
3444 /* op vAA, field@BBBB */
3445 EXPORT_PC
3446 FETCH r0, 1 @ r0<- field ref BBBB
3447 mov r3, rINST, lsr #8 @ r3<- AA
3448 GET_VREG r1, r3 @ r1<= fp[AA]
3449 ldr r2, [rFP, #OFF_FP_METHOD]
3450 mov r3, rSELF
3451 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3452 bl artSet16StaticFromCode
3453 cmp r0, #0 @ 0 on success, -1 on failure
3454 bne MterpException
3455 ADVANCE 2 @ Past exception point - now advance rPC
3456 GET_INST_OPCODE ip @ extract opcode from rINST
3457 GOTO_OPCODE ip @ jump to next instruction
3458
3459
3460/* ------------------------------ */
3461 .balign 128
3462.L_op_invoke_virtual: /* 0x6e */
3463/* File: arm/op_invoke_virtual.S */
3464/* File: arm/invoke.S */
3465 /*
3466 * Generic invoke handler wrapper.
3467 */
3468 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3469 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3470 .extern MterpInvokeVirtual
3471 EXPORT_PC
3472 mov r0, rSELF
3473 add r1, rFP, #OFF_FP_SHADOWFRAME
3474 mov r2, rPC
3475 mov r3, rINST
3476 bl MterpInvokeVirtual
3477 cmp r0, #0
3478 beq MterpException
3479 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003480 bl MterpShouldSwitchInterpreters
3481 cmp r0, #0
3482 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003483 GET_INST_OPCODE ip
3484 GOTO_OPCODE ip
3485
3486
3487 /*
3488 * Handle a virtual method call.
3489 *
3490 * for: invoke-virtual, invoke-virtual/range
3491 */
3492 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3493 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3494
3495/* ------------------------------ */
3496 .balign 128
3497.L_op_invoke_super: /* 0x6f */
3498/* File: arm/op_invoke_super.S */
3499/* File: arm/invoke.S */
3500 /*
3501 * Generic invoke handler wrapper.
3502 */
3503 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3504 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3505 .extern MterpInvokeSuper
3506 EXPORT_PC
3507 mov r0, rSELF
3508 add r1, rFP, #OFF_FP_SHADOWFRAME
3509 mov r2, rPC
3510 mov r3, rINST
3511 bl MterpInvokeSuper
3512 cmp r0, #0
3513 beq MterpException
3514 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003515 bl MterpShouldSwitchInterpreters
3516 cmp r0, #0
3517 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003518 GET_INST_OPCODE ip
3519 GOTO_OPCODE ip
3520
3521
3522 /*
3523 * Handle a "super" method call.
3524 *
3525 * for: invoke-super, invoke-super/range
3526 */
3527 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3528 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3529
3530/* ------------------------------ */
3531 .balign 128
3532.L_op_invoke_direct: /* 0x70 */
3533/* File: arm/op_invoke_direct.S */
3534/* File: arm/invoke.S */
3535 /*
3536 * Generic invoke handler wrapper.
3537 */
3538 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3539 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3540 .extern MterpInvokeDirect
3541 EXPORT_PC
3542 mov r0, rSELF
3543 add r1, rFP, #OFF_FP_SHADOWFRAME
3544 mov r2, rPC
3545 mov r3, rINST
3546 bl MterpInvokeDirect
3547 cmp r0, #0
3548 beq MterpException
3549 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003550 bl MterpShouldSwitchInterpreters
3551 cmp r0, #0
3552 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003553 GET_INST_OPCODE ip
3554 GOTO_OPCODE ip
3555
3556
3557
3558/* ------------------------------ */
3559 .balign 128
3560.L_op_invoke_static: /* 0x71 */
3561/* File: arm/op_invoke_static.S */
3562/* File: arm/invoke.S */
3563 /*
3564 * Generic invoke handler wrapper.
3565 */
3566 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3567 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3568 .extern MterpInvokeStatic
3569 EXPORT_PC
3570 mov r0, rSELF
3571 add r1, rFP, #OFF_FP_SHADOWFRAME
3572 mov r2, rPC
3573 mov r3, rINST
3574 bl MterpInvokeStatic
3575 cmp r0, #0
3576 beq MterpException
3577 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003578 bl MterpShouldSwitchInterpreters
3579 cmp r0, #0
3580 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003581 GET_INST_OPCODE ip
3582 GOTO_OPCODE ip
3583
3584
3585
3586
3587/* ------------------------------ */
3588 .balign 128
3589.L_op_invoke_interface: /* 0x72 */
3590/* File: arm/op_invoke_interface.S */
3591/* File: arm/invoke.S */
3592 /*
3593 * Generic invoke handler wrapper.
3594 */
3595 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3596 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3597 .extern MterpInvokeInterface
3598 EXPORT_PC
3599 mov r0, rSELF
3600 add r1, rFP, #OFF_FP_SHADOWFRAME
3601 mov r2, rPC
3602 mov r3, rINST
3603 bl MterpInvokeInterface
3604 cmp r0, #0
3605 beq MterpException
3606 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003607 bl MterpShouldSwitchInterpreters
3608 cmp r0, #0
3609 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003610 GET_INST_OPCODE ip
3611 GOTO_OPCODE ip
3612
3613
3614 /*
3615 * Handle an interface method call.
3616 *
3617 * for: invoke-interface, invoke-interface/range
3618 */
3619 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3620 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3621
3622/* ------------------------------ */
3623 .balign 128
3624.L_op_return_void_no_barrier: /* 0x73 */
3625/* File: arm/op_return_void_no_barrier.S */
buzbeea2c97a92016-01-25 15:41:24 -08003626 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
3627 mov r0, rSELF
3628 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3629 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -08003630 mov r0, #0
3631 mov r1, #0
3632 b MterpReturn
3633
3634/* ------------------------------ */
3635 .balign 128
3636.L_op_invoke_virtual_range: /* 0x74 */
3637/* File: arm/op_invoke_virtual_range.S */
3638/* File: arm/invoke.S */
3639 /*
3640 * Generic invoke handler wrapper.
3641 */
3642 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3643 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3644 .extern MterpInvokeVirtualRange
3645 EXPORT_PC
3646 mov r0, rSELF
3647 add r1, rFP, #OFF_FP_SHADOWFRAME
3648 mov r2, rPC
3649 mov r3, rINST
3650 bl MterpInvokeVirtualRange
3651 cmp r0, #0
3652 beq MterpException
3653 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003654 bl MterpShouldSwitchInterpreters
3655 cmp r0, #0
3656 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003657 GET_INST_OPCODE ip
3658 GOTO_OPCODE ip
3659
3660
3661
3662/* ------------------------------ */
3663 .balign 128
3664.L_op_invoke_super_range: /* 0x75 */
3665/* File: arm/op_invoke_super_range.S */
3666/* File: arm/invoke.S */
3667 /*
3668 * Generic invoke handler wrapper.
3669 */
3670 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3671 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3672 .extern MterpInvokeSuperRange
3673 EXPORT_PC
3674 mov r0, rSELF
3675 add r1, rFP, #OFF_FP_SHADOWFRAME
3676 mov r2, rPC
3677 mov r3, rINST
3678 bl MterpInvokeSuperRange
3679 cmp r0, #0
3680 beq MterpException
3681 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003682 bl MterpShouldSwitchInterpreters
3683 cmp r0, #0
3684 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003685 GET_INST_OPCODE ip
3686 GOTO_OPCODE ip
3687
3688
3689
3690/* ------------------------------ */
3691 .balign 128
3692.L_op_invoke_direct_range: /* 0x76 */
3693/* File: arm/op_invoke_direct_range.S */
3694/* File: arm/invoke.S */
3695 /*
3696 * Generic invoke handler wrapper.
3697 */
3698 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3699 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3700 .extern MterpInvokeDirectRange
3701 EXPORT_PC
3702 mov r0, rSELF
3703 add r1, rFP, #OFF_FP_SHADOWFRAME
3704 mov r2, rPC
3705 mov r3, rINST
3706 bl MterpInvokeDirectRange
3707 cmp r0, #0
3708 beq MterpException
3709 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003710 bl MterpShouldSwitchInterpreters
3711 cmp r0, #0
3712 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003713 GET_INST_OPCODE ip
3714 GOTO_OPCODE ip
3715
3716
3717
3718/* ------------------------------ */
3719 .balign 128
3720.L_op_invoke_static_range: /* 0x77 */
3721/* File: arm/op_invoke_static_range.S */
3722/* File: arm/invoke.S */
3723 /*
3724 * Generic invoke handler wrapper.
3725 */
3726 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3727 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3728 .extern MterpInvokeStaticRange
3729 EXPORT_PC
3730 mov r0, rSELF
3731 add r1, rFP, #OFF_FP_SHADOWFRAME
3732 mov r2, rPC
3733 mov r3, rINST
3734 bl MterpInvokeStaticRange
3735 cmp r0, #0
3736 beq MterpException
3737 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003738 bl MterpShouldSwitchInterpreters
3739 cmp r0, #0
3740 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003741 GET_INST_OPCODE ip
3742 GOTO_OPCODE ip
3743
3744
3745
3746/* ------------------------------ */
3747 .balign 128
3748.L_op_invoke_interface_range: /* 0x78 */
3749/* File: arm/op_invoke_interface_range.S */
3750/* File: arm/invoke.S */
3751 /*
3752 * Generic invoke handler wrapper.
3753 */
3754 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3755 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3756 .extern MterpInvokeInterfaceRange
3757 EXPORT_PC
3758 mov r0, rSELF
3759 add r1, rFP, #OFF_FP_SHADOWFRAME
3760 mov r2, rPC
3761 mov r3, rINST
3762 bl MterpInvokeInterfaceRange
3763 cmp r0, #0
3764 beq MterpException
3765 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003766 bl MterpShouldSwitchInterpreters
3767 cmp r0, #0
3768 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003769 GET_INST_OPCODE ip
3770 GOTO_OPCODE ip
3771
3772
3773
3774/* ------------------------------ */
3775 .balign 128
3776.L_op_unused_79: /* 0x79 */
3777/* File: arm/op_unused_79.S */
3778/* File: arm/unused.S */
3779/*
3780 * Bail to reference interpreter to throw.
3781 */
3782 b MterpFallback
3783
3784
3785/* ------------------------------ */
3786 .balign 128
3787.L_op_unused_7a: /* 0x7a */
3788/* File: arm/op_unused_7a.S */
3789/* File: arm/unused.S */
3790/*
3791 * Bail to reference interpreter to throw.
3792 */
3793 b MterpFallback
3794
3795
3796/* ------------------------------ */
3797 .balign 128
3798.L_op_neg_int: /* 0x7b */
3799/* File: arm/op_neg_int.S */
3800/* File: arm/unop.S */
3801 /*
3802 * Generic 32-bit unary operation. Provide an "instr" line that
3803 * specifies an instruction that performs "result = op r0".
3804 * This could be an ARM instruction or a function call.
3805 *
3806 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3807 * int-to-byte, int-to-char, int-to-short
3808 */
3809 /* unop vA, vB */
3810 mov r3, rINST, lsr #12 @ r3<- B
3811 ubfx r9, rINST, #8, #4 @ r9<- A
3812 GET_VREG r0, r3 @ r0<- vB
3813 @ optional op; may set condition codes
3814 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3815 rsb r0, r0, #0 @ r0<- op, r0-r3 changed
3816 GET_INST_OPCODE ip @ extract opcode from rINST
3817 SET_VREG r0, r9 @ vAA<- r0
3818 GOTO_OPCODE ip @ jump to next instruction
3819 /* 8-9 instructions */
3820
3821
3822/* ------------------------------ */
3823 .balign 128
3824.L_op_not_int: /* 0x7c */
3825/* File: arm/op_not_int.S */
3826/* File: arm/unop.S */
3827 /*
3828 * Generic 32-bit unary operation. Provide an "instr" line that
3829 * specifies an instruction that performs "result = op r0".
3830 * This could be an ARM instruction or a function call.
3831 *
3832 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3833 * int-to-byte, int-to-char, int-to-short
3834 */
3835 /* unop vA, vB */
3836 mov r3, rINST, lsr #12 @ r3<- B
3837 ubfx r9, rINST, #8, #4 @ r9<- A
3838 GET_VREG r0, r3 @ r0<- vB
3839 @ optional op; may set condition codes
3840 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3841 mvn r0, r0 @ r0<- op, r0-r3 changed
3842 GET_INST_OPCODE ip @ extract opcode from rINST
3843 SET_VREG r0, r9 @ vAA<- r0
3844 GOTO_OPCODE ip @ jump to next instruction
3845 /* 8-9 instructions */
3846
3847
3848/* ------------------------------ */
3849 .balign 128
3850.L_op_neg_long: /* 0x7d */
3851/* File: arm/op_neg_long.S */
3852/* File: arm/unopWide.S */
3853 /*
3854 * Generic 64-bit unary operation. Provide an "instr" line that
3855 * specifies an instruction that performs "result = op r0/r1".
3856 * This could be an ARM instruction or a function call.
3857 *
3858 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3859 */
3860 /* unop vA, vB */
3861 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003862 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003863 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003864 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003865 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003866 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003867 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3868 rsbs r0, r0, #0 @ optional op; may set condition codes
3869 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed
3870 GET_INST_OPCODE ip @ extract opcode from rINST
3871 stmia r9, {r0-r1} @ vAA<- r0/r1
3872 GOTO_OPCODE ip @ jump to next instruction
3873 /* 10-11 instructions */
3874
3875
3876/* ------------------------------ */
3877 .balign 128
3878.L_op_not_long: /* 0x7e */
3879/* File: arm/op_not_long.S */
3880/* File: arm/unopWide.S */
3881 /*
3882 * Generic 64-bit unary operation. Provide an "instr" line that
3883 * specifies an instruction that performs "result = op r0/r1".
3884 * This could be an ARM instruction or a function call.
3885 *
3886 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3887 */
3888 /* unop vA, vB */
3889 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003890 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003891 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003892 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003893 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003894 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003895 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3896 mvn r0, r0 @ optional op; may set condition codes
3897 mvn r1, r1 @ r0/r1<- op, r2-r3 changed
3898 GET_INST_OPCODE ip @ extract opcode from rINST
3899 stmia r9, {r0-r1} @ vAA<- r0/r1
3900 GOTO_OPCODE ip @ jump to next instruction
3901 /* 10-11 instructions */
3902
3903
3904/* ------------------------------ */
3905 .balign 128
3906.L_op_neg_float: /* 0x7f */
3907/* File: arm/op_neg_float.S */
3908/* File: arm/unop.S */
3909 /*
3910 * Generic 32-bit unary operation. Provide an "instr" line that
3911 * specifies an instruction that performs "result = op r0".
3912 * This could be an ARM instruction or a function call.
3913 *
3914 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3915 * int-to-byte, int-to-char, int-to-short
3916 */
3917 /* unop vA, vB */
3918 mov r3, rINST, lsr #12 @ r3<- B
3919 ubfx r9, rINST, #8, #4 @ r9<- A
3920 GET_VREG r0, r3 @ r0<- vB
3921 @ optional op; may set condition codes
3922 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3923 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed
3924 GET_INST_OPCODE ip @ extract opcode from rINST
3925 SET_VREG r0, r9 @ vAA<- r0
3926 GOTO_OPCODE ip @ jump to next instruction
3927 /* 8-9 instructions */
3928
3929
3930/* ------------------------------ */
3931 .balign 128
3932.L_op_neg_double: /* 0x80 */
3933/* File: arm/op_neg_double.S */
3934/* File: arm/unopWide.S */
3935 /*
3936 * Generic 64-bit unary operation. Provide an "instr" line that
3937 * specifies an instruction that performs "result = op r0/r1".
3938 * This could be an ARM instruction or a function call.
3939 *
3940 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3941 */
3942 /* unop vA, vB */
3943 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003944 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003945 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003946 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003947 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003948 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003949 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3950 @ optional op; may set condition codes
3951 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed
3952 GET_INST_OPCODE ip @ extract opcode from rINST
3953 stmia r9, {r0-r1} @ vAA<- r0/r1
3954 GOTO_OPCODE ip @ jump to next instruction
3955 /* 10-11 instructions */
3956
3957
3958/* ------------------------------ */
3959 .balign 128
3960.L_op_int_to_long: /* 0x81 */
3961/* File: arm/op_int_to_long.S */
3962/* File: arm/unopWider.S */
3963 /*
3964 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3965 * that specifies an instruction that performs "result = op r0", where
3966 * "result" is a 64-bit quantity in r0/r1.
3967 *
3968 * For: int-to-long, int-to-double, float-to-long, float-to-double
3969 */
3970 /* unop vA, vB */
3971 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003972 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003973 GET_VREG r0, r3 @ r0<- vB
buzbee50cf6002016-02-10 08:59:12 -08003974 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003975 @ optional op; may set condition codes
buzbee50cf6002016-02-10 08:59:12 -08003976 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003977 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3978 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed
3979 GET_INST_OPCODE ip @ extract opcode from rINST
3980 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3981 GOTO_OPCODE ip @ jump to next instruction
3982 /* 9-10 instructions */
3983
3984
3985/* ------------------------------ */
3986 .balign 128
3987.L_op_int_to_float: /* 0x82 */
3988/* File: arm/op_int_to_float.S */
3989/* File: arm/funop.S */
3990 /*
3991 * Generic 32-bit unary floating-point operation. Provide an "instr"
3992 * line that specifies an instruction that performs "s1 = op s0".
3993 *
3994 * for: int-to-float, float-to-int
3995 */
3996 /* unop vA, vB */
3997 mov r3, rINST, lsr #12 @ r3<- B
3998 mov r9, rINST, lsr #8 @ r9<- A+
3999 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4000 flds s0, [r3] @ s0<- vB
4001 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4002 and r9, r9, #15 @ r9<- A
4003 fsitos s1, s0 @ s1<- op
4004 GET_INST_OPCODE ip @ extract opcode from rINST
4005 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4006 fsts s1, [r9] @ vA<- s1
4007 GOTO_OPCODE ip @ jump to next instruction
4008
4009
4010/* ------------------------------ */
4011 .balign 128
4012.L_op_int_to_double: /* 0x83 */
4013/* File: arm/op_int_to_double.S */
4014/* File: arm/funopWider.S */
4015 /*
4016 * Generic 32bit-to-64bit floating point unary operation. Provide an
4017 * "instr" line that specifies an instruction that performs "d0 = op s0".
4018 *
4019 * For: int-to-double, float-to-double
4020 */
4021 /* unop vA, vB */
4022 mov r3, rINST, lsr #12 @ r3<- B
4023 mov r9, rINST, lsr #8 @ r9<- A+
4024 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4025 flds s0, [r3] @ s0<- vB
4026 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4027 and r9, r9, #15 @ r9<- A
4028 fsitod d0, s0 @ d0<- op
buzbee50cf6002016-02-10 08:59:12 -08004029 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004030 GET_INST_OPCODE ip @ extract opcode from rINST
4031 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4032 fstd d0, [r9] @ vA<- d0
4033 GOTO_OPCODE ip @ jump to next instruction
4034
4035
4036/* ------------------------------ */
4037 .balign 128
4038.L_op_long_to_int: /* 0x84 */
4039/* File: arm/op_long_to_int.S */
4040/* we ignore the high word, making this equivalent to a 32-bit reg move */
4041/* File: arm/op_move.S */
4042 /* for move, move-object, long-to-int */
4043 /* op vA, vB */
4044 mov r1, rINST, lsr #12 @ r1<- B from 15:12
4045 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
4046 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4047 GET_VREG r2, r1 @ r2<- fp[B]
4048 GET_INST_OPCODE ip @ ip<- opcode from rINST
4049 .if 0
4050 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
4051 .else
4052 SET_VREG r2, r0 @ fp[A]<- r2
4053 .endif
4054 GOTO_OPCODE ip @ execute next instruction
4055
4056
4057/* ------------------------------ */
4058 .balign 128
4059.L_op_long_to_float: /* 0x85 */
4060/* File: arm/op_long_to_float.S */
4061/* File: arm/unopNarrower.S */
4062 /*
4063 * Generic 64bit-to-32bit unary operation. Provide an "instr" line
4064 * that specifies an instruction that performs "result = op r0/r1", where
4065 * "result" is a 32-bit quantity in r0.
4066 *
4067 * For: long-to-float, double-to-int, double-to-float
4068 *
4069 * (This would work for long-to-int, but that instruction is actually
4070 * an exact match for op_move.)
4071 */
4072 /* unop vA, vB */
4073 mov r3, rINST, lsr #12 @ r3<- B
4074 ubfx r9, rINST, #8, #4 @ r9<- A
4075 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
4076 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1
4077 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4078 @ optional op; may set condition codes
4079 bl __aeabi_l2f @ r0<- op, r0-r3 changed
4080 GET_INST_OPCODE ip @ extract opcode from rINST
4081 SET_VREG r0, r9 @ vA<- r0
4082 GOTO_OPCODE ip @ jump to next instruction
4083 /* 9-10 instructions */
4084
4085
4086/* ------------------------------ */
4087 .balign 128
4088.L_op_long_to_double: /* 0x86 */
4089/* File: arm/op_long_to_double.S */
4090 /*
4091 * Specialised 64-bit floating point operation.
4092 *
4093 * Note: The result will be returned in d2.
4094 *
4095 * For: long-to-double
4096 */
4097 mov r3, rINST, lsr #12 @ r3<- B
4098 ubfx r9, rINST, #8, #4 @ r9<- A
4099 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
4100 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
4101 vldr d0, [r3] @ d0<- vAA
4102 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4103
4104 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh)
4105 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl)
4106 vldr d3, constvalop_long_to_double
4107 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl
4108
4109 GET_INST_OPCODE ip @ extract opcode from rINST
4110 vstr.64 d2, [r9] @ vAA<- d2
4111 GOTO_OPCODE ip @ jump to next instruction
4112
4113 /* literal pool helper */
4114constvalop_long_to_double:
4115 .8byte 0x41f0000000000000
4116
4117/* ------------------------------ */
4118 .balign 128
4119.L_op_float_to_int: /* 0x87 */
4120/* File: arm/op_float_to_int.S */
4121/* File: arm/funop.S */
4122 /*
4123 * Generic 32-bit unary floating-point operation. Provide an "instr"
4124 * line that specifies an instruction that performs "s1 = op s0".
4125 *
4126 * for: int-to-float, float-to-int
4127 */
4128 /* unop vA, vB */
4129 mov r3, rINST, lsr #12 @ r3<- B
4130 mov r9, rINST, lsr #8 @ r9<- A+
4131 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4132 flds s0, [r3] @ s0<- vB
4133 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4134 and r9, r9, #15 @ r9<- A
4135 ftosizs s1, s0 @ s1<- op
4136 GET_INST_OPCODE ip @ extract opcode from rINST
4137 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4138 fsts s1, [r9] @ vA<- s1
4139 GOTO_OPCODE ip @ jump to next instruction
4140
4141
4142/* ------------------------------ */
4143 .balign 128
4144.L_op_float_to_long: /* 0x88 */
4145/* File: arm/op_float_to_long.S */
4146@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"}
4147/* File: arm/unopWider.S */
4148 /*
4149 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
4150 * that specifies an instruction that performs "result = op r0", where
4151 * "result" is a 64-bit quantity in r0/r1.
4152 *
4153 * For: int-to-long, int-to-double, float-to-long, float-to-double
4154 */
4155 /* unop vA, vB */
4156 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08004157 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08004158 GET_VREG r0, r3 @ r0<- vB
buzbee50cf6002016-02-10 08:59:12 -08004159 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08004160 @ optional op; may set condition codes
buzbee50cf6002016-02-10 08:59:12 -08004161 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004162 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4163 bl f2l_doconv @ r0<- op, r0-r3 changed
4164 GET_INST_OPCODE ip @ extract opcode from rINST
4165 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
4166 GOTO_OPCODE ip @ jump to next instruction
4167 /* 9-10 instructions */
4168
4169
4170
4171/* ------------------------------ */
4172 .balign 128
4173.L_op_float_to_double: /* 0x89 */
4174/* File: arm/op_float_to_double.S */
4175/* File: arm/funopWider.S */
4176 /*
4177 * Generic 32bit-to-64bit floating point unary operation. Provide an
4178 * "instr" line that specifies an instruction that performs "d0 = op s0".
4179 *
4180 * For: int-to-double, float-to-double
4181 */
4182 /* unop vA, vB */
4183 mov r3, rINST, lsr #12 @ r3<- B
4184 mov r9, rINST, lsr #8 @ r9<- A+
4185 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4186 flds s0, [r3] @ s0<- vB
4187 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4188 and r9, r9, #15 @ r9<- A
4189 fcvtds d0, s0 @ d0<- op
buzbee50cf6002016-02-10 08:59:12 -08004190 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004191 GET_INST_OPCODE ip @ extract opcode from rINST
4192 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4193 fstd d0, [r9] @ vA<- d0
4194 GOTO_OPCODE ip @ jump to next instruction
4195
4196
4197/* ------------------------------ */
4198 .balign 128
4199.L_op_double_to_int: /* 0x8a */
4200/* File: arm/op_double_to_int.S */
4201/* File: arm/funopNarrower.S */
4202 /*
4203 * Generic 64bit-to-32bit unary floating point operation. Provide an
4204 * "instr" line that specifies an instruction that performs "s0 = op d0".
4205 *
4206 * For: double-to-int, double-to-float
4207 */
4208 /* unop vA, vB */
4209 mov r3, rINST, lsr #12 @ r3<- B
4210 mov r9, rINST, lsr #8 @ r9<- A+
4211 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4212 fldd d0, [r3] @ d0<- vB
4213 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4214 and r9, r9, #15 @ r9<- A
4215 ftosizd s0, d0 @ s0<- op
4216 GET_INST_OPCODE ip @ extract opcode from rINST
4217 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4218 fsts s0, [r9] @ vA<- s0
4219 GOTO_OPCODE ip @ jump to next instruction
4220
4221
4222/* ------------------------------ */
4223 .balign 128
4224.L_op_double_to_long: /* 0x8b */
4225/* File: arm/op_double_to_long.S */
4226@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"}
4227/* File: arm/unopWide.S */
4228 /*
4229 * Generic 64-bit unary operation. Provide an "instr" line that
4230 * specifies an instruction that performs "result = op r0/r1".
4231 * This could be an ARM instruction or a function call.
4232 *
4233 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
4234 */
4235 /* unop vA, vB */
4236 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08004237 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08004238 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08004239 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08004240 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08004241 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004242 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4243 @ optional op; may set condition codes
4244 bl d2l_doconv @ r0/r1<- op, r2-r3 changed
4245 GET_INST_OPCODE ip @ extract opcode from rINST
4246 stmia r9, {r0-r1} @ vAA<- r0/r1
4247 GOTO_OPCODE ip @ jump to next instruction
4248 /* 10-11 instructions */
4249
4250
4251
4252/* ------------------------------ */
4253 .balign 128
4254.L_op_double_to_float: /* 0x8c */
4255/* File: arm/op_double_to_float.S */
4256/* File: arm/funopNarrower.S */
4257 /*
4258 * Generic 64bit-to-32bit unary floating point operation. Provide an
4259 * "instr" line that specifies an instruction that performs "s0 = op d0".
4260 *
4261 * For: double-to-int, double-to-float
4262 */
4263 /* unop vA, vB */
4264 mov r3, rINST, lsr #12 @ r3<- B
4265 mov r9, rINST, lsr #8 @ r9<- A+
4266 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4267 fldd d0, [r3] @ d0<- vB
4268 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4269 and r9, r9, #15 @ r9<- A
4270 fcvtsd s0, d0 @ s0<- op
4271 GET_INST_OPCODE ip @ extract opcode from rINST
4272 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4273 fsts s0, [r9] @ vA<- s0
4274 GOTO_OPCODE ip @ jump to next instruction
4275
4276
4277/* ------------------------------ */
4278 .balign 128
4279.L_op_int_to_byte: /* 0x8d */
4280/* File: arm/op_int_to_byte.S */
4281/* File: arm/unop.S */
4282 /*
4283 * Generic 32-bit unary operation. Provide an "instr" line that
4284 * specifies an instruction that performs "result = op r0".
4285 * This could be an ARM instruction or a function call.
4286 *
4287 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4288 * int-to-byte, int-to-char, int-to-short
4289 */
4290 /* unop vA, vB */
4291 mov r3, rINST, lsr #12 @ r3<- B
4292 ubfx r9, rINST, #8, #4 @ r9<- A
4293 GET_VREG r0, r3 @ r0<- vB
4294 @ optional op; may set condition codes
4295 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4296 sxtb r0, r0 @ r0<- op, r0-r3 changed
4297 GET_INST_OPCODE ip @ extract opcode from rINST
4298 SET_VREG r0, r9 @ vAA<- r0
4299 GOTO_OPCODE ip @ jump to next instruction
4300 /* 8-9 instructions */
4301
4302
4303/* ------------------------------ */
4304 .balign 128
4305.L_op_int_to_char: /* 0x8e */
4306/* File: arm/op_int_to_char.S */
4307/* File: arm/unop.S */
4308 /*
4309 * Generic 32-bit unary operation. Provide an "instr" line that
4310 * specifies an instruction that performs "result = op r0".
4311 * This could be an ARM instruction or a function call.
4312 *
4313 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4314 * int-to-byte, int-to-char, int-to-short
4315 */
4316 /* unop vA, vB */
4317 mov r3, rINST, lsr #12 @ r3<- B
4318 ubfx r9, rINST, #8, #4 @ r9<- A
4319 GET_VREG r0, r3 @ r0<- vB
4320 @ optional op; may set condition codes
4321 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4322 uxth r0, r0 @ r0<- op, r0-r3 changed
4323 GET_INST_OPCODE ip @ extract opcode from rINST
4324 SET_VREG r0, r9 @ vAA<- r0
4325 GOTO_OPCODE ip @ jump to next instruction
4326 /* 8-9 instructions */
4327
4328
4329/* ------------------------------ */
4330 .balign 128
4331.L_op_int_to_short: /* 0x8f */
4332/* File: arm/op_int_to_short.S */
4333/* File: arm/unop.S */
4334 /*
4335 * Generic 32-bit unary operation. Provide an "instr" line that
4336 * specifies an instruction that performs "result = op r0".
4337 * This could be an ARM instruction or a function call.
4338 *
4339 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4340 * int-to-byte, int-to-char, int-to-short
4341 */
4342 /* unop vA, vB */
4343 mov r3, rINST, lsr #12 @ r3<- B
4344 ubfx r9, rINST, #8, #4 @ r9<- A
4345 GET_VREG r0, r3 @ r0<- vB
4346 @ optional op; may set condition codes
4347 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4348 sxth r0, r0 @ r0<- op, r0-r3 changed
4349 GET_INST_OPCODE ip @ extract opcode from rINST
4350 SET_VREG r0, r9 @ vAA<- r0
4351 GOTO_OPCODE ip @ jump to next instruction
4352 /* 8-9 instructions */
4353
4354
4355/* ------------------------------ */
4356 .balign 128
4357.L_op_add_int: /* 0x90 */
4358/* File: arm/op_add_int.S */
4359/* File: arm/binop.S */
4360 /*
4361 * Generic 32-bit binary operation. Provide an "instr" line that
4362 * specifies an instruction that performs "result = r0 op r1".
4363 * This could be an ARM instruction or a function call. (If the result
4364 * comes back in a register other than r0, you can override "result".)
4365 *
4366 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4367 * vCC (r1). Useful for integer division and modulus. Note that we
4368 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4369 * handles it correctly.
4370 *
4371 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4372 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4373 * mul-float, div-float, rem-float
4374 */
4375 /* binop vAA, vBB, vCC */
4376 FETCH r0, 1 @ r0<- CCBB
4377 mov r9, rINST, lsr #8 @ r9<- AA
4378 mov r3, r0, lsr #8 @ r3<- CC
4379 and r2, r0, #255 @ r2<- BB
4380 GET_VREG r1, r3 @ r1<- vCC
4381 GET_VREG r0, r2 @ r0<- vBB
4382 .if 0
4383 cmp r1, #0 @ is second operand zero?
4384 beq common_errDivideByZero
4385 .endif
4386
4387 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4388 @ optional op; may set condition codes
4389 add r0, r0, r1 @ r0<- op, r0-r3 changed
4390 GET_INST_OPCODE ip @ extract opcode from rINST
4391 SET_VREG r0, r9 @ vAA<- r0
4392 GOTO_OPCODE ip @ jump to next instruction
4393 /* 11-14 instructions */
4394
4395
4396/* ------------------------------ */
4397 .balign 128
4398.L_op_sub_int: /* 0x91 */
4399/* File: arm/op_sub_int.S */
4400/* File: arm/binop.S */
4401 /*
4402 * Generic 32-bit binary operation. Provide an "instr" line that
4403 * specifies an instruction that performs "result = r0 op r1".
4404 * This could be an ARM instruction or a function call. (If the result
4405 * comes back in a register other than r0, you can override "result".)
4406 *
4407 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4408 * vCC (r1). Useful for integer division and modulus. Note that we
4409 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4410 * handles it correctly.
4411 *
4412 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4413 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4414 * mul-float, div-float, rem-float
4415 */
4416 /* binop vAA, vBB, vCC */
4417 FETCH r0, 1 @ r0<- CCBB
4418 mov r9, rINST, lsr #8 @ r9<- AA
4419 mov r3, r0, lsr #8 @ r3<- CC
4420 and r2, r0, #255 @ r2<- BB
4421 GET_VREG r1, r3 @ r1<- vCC
4422 GET_VREG r0, r2 @ r0<- vBB
4423 .if 0
4424 cmp r1, #0 @ is second operand zero?
4425 beq common_errDivideByZero
4426 .endif
4427
4428 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4429 @ optional op; may set condition codes
4430 sub r0, r0, r1 @ r0<- op, r0-r3 changed
4431 GET_INST_OPCODE ip @ extract opcode from rINST
4432 SET_VREG r0, r9 @ vAA<- r0
4433 GOTO_OPCODE ip @ jump to next instruction
4434 /* 11-14 instructions */
4435
4436
4437/* ------------------------------ */
4438 .balign 128
4439.L_op_mul_int: /* 0x92 */
4440/* File: arm/op_mul_int.S */
4441/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4442/* File: arm/binop.S */
4443 /*
4444 * Generic 32-bit binary operation. Provide an "instr" line that
4445 * specifies an instruction that performs "result = r0 op r1".
4446 * This could be an ARM instruction or a function call. (If the result
4447 * comes back in a register other than r0, you can override "result".)
4448 *
4449 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4450 * vCC (r1). Useful for integer division and modulus. Note that we
4451 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4452 * handles it correctly.
4453 *
4454 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4455 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4456 * mul-float, div-float, rem-float
4457 */
4458 /* binop vAA, vBB, vCC */
4459 FETCH r0, 1 @ r0<- CCBB
4460 mov r9, rINST, lsr #8 @ r9<- AA
4461 mov r3, r0, lsr #8 @ r3<- CC
4462 and r2, r0, #255 @ r2<- BB
4463 GET_VREG r1, r3 @ r1<- vCC
4464 GET_VREG r0, r2 @ r0<- vBB
4465 .if 0
4466 cmp r1, #0 @ is second operand zero?
4467 beq common_errDivideByZero
4468 .endif
4469
4470 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4471 @ optional op; may set condition codes
4472 mul r0, r1, r0 @ r0<- op, r0-r3 changed
4473 GET_INST_OPCODE ip @ extract opcode from rINST
4474 SET_VREG r0, r9 @ vAA<- r0
4475 GOTO_OPCODE ip @ jump to next instruction
4476 /* 11-14 instructions */
4477
4478
4479/* ------------------------------ */
4480 .balign 128
4481.L_op_div_int: /* 0x93 */
4482/* File: arm/op_div_int.S */
4483 /*
4484 * Specialized 32-bit binary operation
4485 *
4486 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4487 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4488 * ARMv7 CPUs that have hardware division support).
4489 *
4490 * div-int
4491 *
4492 */
4493 FETCH r0, 1 @ r0<- CCBB
4494 mov r9, rINST, lsr #8 @ r9<- AA
4495 mov r3, r0, lsr #8 @ r3<- CC
4496 and r2, r0, #255 @ r2<- BB
4497 GET_VREG r1, r3 @ r1<- vCC
4498 GET_VREG r0, r2 @ r0<- vBB
4499 cmp r1, #0 @ is second operand zero?
4500 beq common_errDivideByZero
4501
4502 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4503#ifdef __ARM_ARCH_EXT_IDIV__
4504 sdiv r0, r0, r1 @ r0<- op
4505#else
4506 bl __aeabi_idiv @ r0<- op, r0-r3 changed
4507#endif
4508 GET_INST_OPCODE ip @ extract opcode from rINST
4509 SET_VREG r0, r9 @ vAA<- r0
4510 GOTO_OPCODE ip @ jump to next instruction
4511 /* 11-14 instructions */
4512
4513/* ------------------------------ */
4514 .balign 128
4515.L_op_rem_int: /* 0x94 */
4516/* File: arm/op_rem_int.S */
4517 /*
4518 * Specialized 32-bit binary operation
4519 *
4520 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4521 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4522 * ARMv7 CPUs that have hardware division support).
4523 *
4524 * NOTE: idivmod returns quotient in r0 and remainder in r1
4525 *
4526 * rem-int
4527 *
4528 */
4529 FETCH r0, 1 @ r0<- CCBB
4530 mov r9, rINST, lsr #8 @ r9<- AA
4531 mov r3, r0, lsr #8 @ r3<- CC
4532 and r2, r0, #255 @ r2<- BB
4533 GET_VREG r1, r3 @ r1<- vCC
4534 GET_VREG r0, r2 @ r0<- vBB
4535 cmp r1, #0 @ is second operand zero?
4536 beq common_errDivideByZero
4537
4538 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4539#ifdef __ARM_ARCH_EXT_IDIV__
4540 sdiv r2, r0, r1
4541 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed
4542#else
4543 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
4544#endif
4545 GET_INST_OPCODE ip @ extract opcode from rINST
4546 SET_VREG r1, r9 @ vAA<- r1
4547 GOTO_OPCODE ip @ jump to next instruction
4548 /* 11-14 instructions */
4549
4550/* ------------------------------ */
4551 .balign 128
4552.L_op_and_int: /* 0x95 */
4553/* File: arm/op_and_int.S */
4554/* File: arm/binop.S */
4555 /*
4556 * Generic 32-bit binary operation. Provide an "instr" line that
4557 * specifies an instruction that performs "result = r0 op r1".
4558 * This could be an ARM instruction or a function call. (If the result
4559 * comes back in a register other than r0, you can override "result".)
4560 *
4561 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4562 * vCC (r1). Useful for integer division and modulus. Note that we
4563 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4564 * handles it correctly.
4565 *
4566 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4567 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4568 * mul-float, div-float, rem-float
4569 */
4570 /* binop vAA, vBB, vCC */
4571 FETCH r0, 1 @ r0<- CCBB
4572 mov r9, rINST, lsr #8 @ r9<- AA
4573 mov r3, r0, lsr #8 @ r3<- CC
4574 and r2, r0, #255 @ r2<- BB
4575 GET_VREG r1, r3 @ r1<- vCC
4576 GET_VREG r0, r2 @ r0<- vBB
4577 .if 0
4578 cmp r1, #0 @ is second operand zero?
4579 beq common_errDivideByZero
4580 .endif
4581
4582 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4583 @ optional op; may set condition codes
4584 and r0, r0, r1 @ r0<- op, r0-r3 changed
4585 GET_INST_OPCODE ip @ extract opcode from rINST
4586 SET_VREG r0, r9 @ vAA<- r0
4587 GOTO_OPCODE ip @ jump to next instruction
4588 /* 11-14 instructions */
4589
4590
4591/* ------------------------------ */
4592 .balign 128
4593.L_op_or_int: /* 0x96 */
4594/* File: arm/op_or_int.S */
4595/* File: arm/binop.S */
4596 /*
4597 * Generic 32-bit binary operation. Provide an "instr" line that
4598 * specifies an instruction that performs "result = r0 op r1".
4599 * This could be an ARM instruction or a function call. (If the result
4600 * comes back in a register other than r0, you can override "result".)
4601 *
4602 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4603 * vCC (r1). Useful for integer division and modulus. Note that we
4604 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4605 * handles it correctly.
4606 *
4607 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4608 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4609 * mul-float, div-float, rem-float
4610 */
4611 /* binop vAA, vBB, vCC */
4612 FETCH r0, 1 @ r0<- CCBB
4613 mov r9, rINST, lsr #8 @ r9<- AA
4614 mov r3, r0, lsr #8 @ r3<- CC
4615 and r2, r0, #255 @ r2<- BB
4616 GET_VREG r1, r3 @ r1<- vCC
4617 GET_VREG r0, r2 @ r0<- vBB
4618 .if 0
4619 cmp r1, #0 @ is second operand zero?
4620 beq common_errDivideByZero
4621 .endif
4622
4623 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4624 @ optional op; may set condition codes
4625 orr r0, r0, r1 @ r0<- op, r0-r3 changed
4626 GET_INST_OPCODE ip @ extract opcode from rINST
4627 SET_VREG r0, r9 @ vAA<- r0
4628 GOTO_OPCODE ip @ jump to next instruction
4629 /* 11-14 instructions */
4630
4631
4632/* ------------------------------ */
4633 .balign 128
4634.L_op_xor_int: /* 0x97 */
4635/* File: arm/op_xor_int.S */
4636/* File: arm/binop.S */
4637 /*
4638 * Generic 32-bit binary operation. Provide an "instr" line that
4639 * specifies an instruction that performs "result = r0 op r1".
4640 * This could be an ARM instruction or a function call. (If the result
4641 * comes back in a register other than r0, you can override "result".)
4642 *
4643 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4644 * vCC (r1). Useful for integer division and modulus. Note that we
4645 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4646 * handles it correctly.
4647 *
4648 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4649 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4650 * mul-float, div-float, rem-float
4651 */
4652 /* binop vAA, vBB, vCC */
4653 FETCH r0, 1 @ r0<- CCBB
4654 mov r9, rINST, lsr #8 @ r9<- AA
4655 mov r3, r0, lsr #8 @ r3<- CC
4656 and r2, r0, #255 @ r2<- BB
4657 GET_VREG r1, r3 @ r1<- vCC
4658 GET_VREG r0, r2 @ r0<- vBB
4659 .if 0
4660 cmp r1, #0 @ is second operand zero?
4661 beq common_errDivideByZero
4662 .endif
4663
4664 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4665 @ optional op; may set condition codes
4666 eor r0, r0, r1 @ r0<- op, r0-r3 changed
4667 GET_INST_OPCODE ip @ extract opcode from rINST
4668 SET_VREG r0, r9 @ vAA<- r0
4669 GOTO_OPCODE ip @ jump to next instruction
4670 /* 11-14 instructions */
4671
4672
4673/* ------------------------------ */
4674 .balign 128
4675.L_op_shl_int: /* 0x98 */
4676/* File: arm/op_shl_int.S */
4677/* File: arm/binop.S */
4678 /*
4679 * Generic 32-bit binary operation. Provide an "instr" line that
4680 * specifies an instruction that performs "result = r0 op r1".
4681 * This could be an ARM instruction or a function call. (If the result
4682 * comes back in a register other than r0, you can override "result".)
4683 *
4684 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4685 * vCC (r1). Useful for integer division and modulus. Note that we
4686 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4687 * handles it correctly.
4688 *
4689 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4690 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4691 * mul-float, div-float, rem-float
4692 */
4693 /* binop vAA, vBB, vCC */
4694 FETCH r0, 1 @ r0<- CCBB
4695 mov r9, rINST, lsr #8 @ r9<- AA
4696 mov r3, r0, lsr #8 @ r3<- CC
4697 and r2, r0, #255 @ r2<- BB
4698 GET_VREG r1, r3 @ r1<- vCC
4699 GET_VREG r0, r2 @ r0<- vBB
4700 .if 0
4701 cmp r1, #0 @ is second operand zero?
4702 beq common_errDivideByZero
4703 .endif
4704
4705 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4706 and r1, r1, #31 @ optional op; may set condition codes
4707 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
4708 GET_INST_OPCODE ip @ extract opcode from rINST
4709 SET_VREG r0, r9 @ vAA<- r0
4710 GOTO_OPCODE ip @ jump to next instruction
4711 /* 11-14 instructions */
4712
4713
4714/* ------------------------------ */
4715 .balign 128
4716.L_op_shr_int: /* 0x99 */
4717/* File: arm/op_shr_int.S */
4718/* File: arm/binop.S */
4719 /*
4720 * Generic 32-bit binary operation. Provide an "instr" line that
4721 * specifies an instruction that performs "result = r0 op r1".
4722 * This could be an ARM instruction or a function call. (If the result
4723 * comes back in a register other than r0, you can override "result".)
4724 *
4725 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4726 * vCC (r1). Useful for integer division and modulus. Note that we
4727 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4728 * handles it correctly.
4729 *
4730 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4731 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4732 * mul-float, div-float, rem-float
4733 */
4734 /* binop vAA, vBB, vCC */
4735 FETCH r0, 1 @ r0<- CCBB
4736 mov r9, rINST, lsr #8 @ r9<- AA
4737 mov r3, r0, lsr #8 @ r3<- CC
4738 and r2, r0, #255 @ r2<- BB
4739 GET_VREG r1, r3 @ r1<- vCC
4740 GET_VREG r0, r2 @ r0<- vBB
4741 .if 0
4742 cmp r1, #0 @ is second operand zero?
4743 beq common_errDivideByZero
4744 .endif
4745
4746 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4747 and r1, r1, #31 @ optional op; may set condition codes
4748 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
4749 GET_INST_OPCODE ip @ extract opcode from rINST
4750 SET_VREG r0, r9 @ vAA<- r0
4751 GOTO_OPCODE ip @ jump to next instruction
4752 /* 11-14 instructions */
4753
4754
4755/* ------------------------------ */
4756 .balign 128
4757.L_op_ushr_int: /* 0x9a */
4758/* File: arm/op_ushr_int.S */
4759/* File: arm/binop.S */
4760 /*
4761 * Generic 32-bit binary operation. Provide an "instr" line that
4762 * specifies an instruction that performs "result = r0 op r1".
4763 * This could be an ARM instruction or a function call. (If the result
4764 * comes back in a register other than r0, you can override "result".)
4765 *
4766 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4767 * vCC (r1). Useful for integer division and modulus. Note that we
4768 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4769 * handles it correctly.
4770 *
4771 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4772 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4773 * mul-float, div-float, rem-float
4774 */
4775 /* binop vAA, vBB, vCC */
4776 FETCH r0, 1 @ r0<- CCBB
4777 mov r9, rINST, lsr #8 @ r9<- AA
4778 mov r3, r0, lsr #8 @ r3<- CC
4779 and r2, r0, #255 @ r2<- BB
4780 GET_VREG r1, r3 @ r1<- vCC
4781 GET_VREG r0, r2 @ r0<- vBB
4782 .if 0
4783 cmp r1, #0 @ is second operand zero?
4784 beq common_errDivideByZero
4785 .endif
4786
4787 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4788 and r1, r1, #31 @ optional op; may set condition codes
4789 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
4790 GET_INST_OPCODE ip @ extract opcode from rINST
4791 SET_VREG r0, r9 @ vAA<- r0
4792 GOTO_OPCODE ip @ jump to next instruction
4793 /* 11-14 instructions */
4794
4795
4796/* ------------------------------ */
4797 .balign 128
4798.L_op_add_long: /* 0x9b */
4799/* File: arm/op_add_long.S */
4800/* File: arm/binopWide.S */
4801 /*
4802 * Generic 64-bit binary operation. Provide an "instr" line that
4803 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4804 * This could be an ARM instruction or a function call. (If the result
4805 * comes back in a register other than r0, you can override "result".)
4806 *
4807 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4808 * vCC (r1). Useful for integer division and modulus.
4809 *
4810 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4811 * xor-long, add-double, sub-double, mul-double, div-double,
4812 * rem-double
4813 *
4814 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4815 */
4816 /* binop vAA, vBB, vCC */
4817 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004818 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004819 and r2, r0, #255 @ r2<- BB
4820 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004821 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004822 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4823 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4824 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4825 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4826 .if 0
4827 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4828 beq common_errDivideByZero
4829 .endif
buzbee50cf6002016-02-10 08:59:12 -08004830 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004831 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004832 adds r0, r0, r2 @ optional op; may set condition codes
4833 adc r1, r1, r3 @ result<- op, r0-r3 changed
4834 GET_INST_OPCODE ip @ extract opcode from rINST
4835 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4836 GOTO_OPCODE ip @ jump to next instruction
4837 /* 14-17 instructions */
4838
4839
4840/* ------------------------------ */
4841 .balign 128
4842.L_op_sub_long: /* 0x9c */
4843/* File: arm/op_sub_long.S */
4844/* File: arm/binopWide.S */
4845 /*
4846 * Generic 64-bit binary operation. Provide an "instr" line that
4847 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4848 * This could be an ARM instruction or a function call. (If the result
4849 * comes back in a register other than r0, you can override "result".)
4850 *
4851 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4852 * vCC (r1). Useful for integer division and modulus.
4853 *
4854 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4855 * xor-long, add-double, sub-double, mul-double, div-double,
4856 * rem-double
4857 *
4858 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4859 */
4860 /* binop vAA, vBB, vCC */
4861 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004862 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004863 and r2, r0, #255 @ r2<- BB
4864 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004865 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004866 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4867 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4868 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4869 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4870 .if 0
4871 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4872 beq common_errDivideByZero
4873 .endif
buzbee50cf6002016-02-10 08:59:12 -08004874 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004875 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004876 subs r0, r0, r2 @ optional op; may set condition codes
4877 sbc r1, r1, r3 @ result<- op, r0-r3 changed
4878 GET_INST_OPCODE ip @ extract opcode from rINST
4879 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4880 GOTO_OPCODE ip @ jump to next instruction
4881 /* 14-17 instructions */
4882
4883
4884/* ------------------------------ */
4885 .balign 128
4886.L_op_mul_long: /* 0x9d */
4887/* File: arm/op_mul_long.S */
4888 /*
4889 * Signed 64-bit integer multiply.
4890 *
4891 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4892 * WX
4893 * x YZ
4894 * --------
4895 * ZW ZX
4896 * YW YX
4897 *
4898 * The low word of the result holds ZX, the high word holds
4899 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
4900 * it doesn't fit in the low 64 bits.
4901 *
4902 * Unlike most ARM math operations, multiply instructions have
4903 * restrictions on using the same register more than once (Rd and Rm
4904 * cannot be the same).
4905 */
4906 /* mul-long vAA, vBB, vCC */
4907 FETCH r0, 1 @ r0<- CCBB
4908 and r2, r0, #255 @ r2<- BB
4909 mov r3, r0, lsr #8 @ r3<- CC
4910 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4911 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4912 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4913 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4914 mul ip, r2, r1 @ ip<- ZxW
4915 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
4916 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
4917 mov r0, rINST, lsr #8 @ r0<- AA
4918 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
4919 add r0, rFP, r0, lsl #2 @ r0<- &fp[AA]
4920 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4921 GET_INST_OPCODE ip @ extract opcode from rINST
4922 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
4923 GOTO_OPCODE ip @ jump to next instruction
4924
4925/* ------------------------------ */
4926 .balign 128
4927.L_op_div_long: /* 0x9e */
4928/* File: arm/op_div_long.S */
4929/* File: arm/binopWide.S */
4930 /*
4931 * Generic 64-bit binary operation. Provide an "instr" line that
4932 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4933 * This could be an ARM instruction or a function call. (If the result
4934 * comes back in a register other than r0, you can override "result".)
4935 *
4936 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4937 * vCC (r1). Useful for integer division and modulus.
4938 *
4939 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4940 * xor-long, add-double, sub-double, mul-double, div-double,
4941 * rem-double
4942 *
4943 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4944 */
4945 /* binop vAA, vBB, vCC */
4946 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004947 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004948 and r2, r0, #255 @ r2<- BB
4949 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004950 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004951 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4952 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4953 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4954 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4955 .if 1
4956 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4957 beq common_errDivideByZero
4958 .endif
buzbee50cf6002016-02-10 08:59:12 -08004959 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004960 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004961 @ optional op; may set condition codes
4962 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4963 GET_INST_OPCODE ip @ extract opcode from rINST
4964 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4965 GOTO_OPCODE ip @ jump to next instruction
4966 /* 14-17 instructions */
4967
4968
4969/* ------------------------------ */
4970 .balign 128
4971.L_op_rem_long: /* 0x9f */
4972/* File: arm/op_rem_long.S */
4973/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4974/* File: arm/binopWide.S */
4975 /*
4976 * Generic 64-bit binary operation. Provide an "instr" line that
4977 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4978 * This could be an ARM instruction or a function call. (If the result
4979 * comes back in a register other than r0, you can override "result".)
4980 *
4981 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4982 * vCC (r1). Useful for integer division and modulus.
4983 *
4984 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4985 * xor-long, add-double, sub-double, mul-double, div-double,
4986 * rem-double
4987 *
4988 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4989 */
4990 /* binop vAA, vBB, vCC */
4991 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004992 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004993 and r2, r0, #255 @ r2<- BB
4994 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004995 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004996 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4997 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4998 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4999 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5000 .if 1
5001 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5002 beq common_errDivideByZero
5003 .endif
buzbee50cf6002016-02-10 08:59:12 -08005004 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005005 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005006 @ optional op; may set condition codes
5007 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5008 GET_INST_OPCODE ip @ extract opcode from rINST
5009 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
5010 GOTO_OPCODE ip @ jump to next instruction
5011 /* 14-17 instructions */
5012
5013
5014/* ------------------------------ */
5015 .balign 128
5016.L_op_and_long: /* 0xa0 */
5017/* File: arm/op_and_long.S */
5018/* File: arm/binopWide.S */
5019 /*
5020 * Generic 64-bit binary operation. Provide an "instr" line that
5021 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5022 * This could be an ARM instruction or a function call. (If the result
5023 * comes back in a register other than r0, you can override "result".)
5024 *
5025 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5026 * vCC (r1). Useful for integer division and modulus.
5027 *
5028 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5029 * xor-long, add-double, sub-double, mul-double, div-double,
5030 * rem-double
5031 *
5032 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5033 */
5034 /* binop vAA, vBB, vCC */
5035 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08005036 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08005037 and r2, r0, #255 @ r2<- BB
5038 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08005039 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08005040 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5041 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5042 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5043 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5044 .if 0
5045 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5046 beq common_errDivideByZero
5047 .endif
buzbee50cf6002016-02-10 08:59:12 -08005048 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005049 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005050 and r0, r0, r2 @ optional op; may set condition codes
5051 and r1, r1, r3 @ result<- op, r0-r3 changed
5052 GET_INST_OPCODE ip @ extract opcode from rINST
5053 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5054 GOTO_OPCODE ip @ jump to next instruction
5055 /* 14-17 instructions */
5056
5057
5058/* ------------------------------ */
5059 .balign 128
5060.L_op_or_long: /* 0xa1 */
5061/* File: arm/op_or_long.S */
5062/* File: arm/binopWide.S */
5063 /*
5064 * Generic 64-bit binary operation. Provide an "instr" line that
5065 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5066 * This could be an ARM instruction or a function call. (If the result
5067 * comes back in a register other than r0, you can override "result".)
5068 *
5069 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5070 * vCC (r1). Useful for integer division and modulus.
5071 *
5072 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5073 * xor-long, add-double, sub-double, mul-double, div-double,
5074 * rem-double
5075 *
5076 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5077 */
5078 /* binop vAA, vBB, vCC */
5079 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08005080 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08005081 and r2, r0, #255 @ r2<- BB
5082 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08005083 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08005084 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5085 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5086 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5087 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5088 .if 0
5089 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5090 beq common_errDivideByZero
5091 .endif
buzbee50cf6002016-02-10 08:59:12 -08005092 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005093 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005094 orr r0, r0, r2 @ optional op; may set condition codes
5095 orr r1, r1, r3 @ result<- op, r0-r3 changed
5096 GET_INST_OPCODE ip @ extract opcode from rINST
5097 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5098 GOTO_OPCODE ip @ jump to next instruction
5099 /* 14-17 instructions */
5100
5101
5102/* ------------------------------ */
5103 .balign 128
5104.L_op_xor_long: /* 0xa2 */
5105/* File: arm/op_xor_long.S */
5106/* File: arm/binopWide.S */
5107 /*
5108 * Generic 64-bit binary operation. Provide an "instr" line that
5109 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5110 * This could be an ARM instruction or a function call. (If the result
5111 * comes back in a register other than r0, you can override "result".)
5112 *
5113 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5114 * vCC (r1). Useful for integer division and modulus.
5115 *
5116 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5117 * xor-long, add-double, sub-double, mul-double, div-double,
5118 * rem-double
5119 *
5120 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5121 */
5122 /* binop vAA, vBB, vCC */
5123 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08005124 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08005125 and r2, r0, #255 @ r2<- BB
5126 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08005127 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08005128 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5129 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5130 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5131 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5132 .if 0
5133 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5134 beq common_errDivideByZero
5135 .endif
buzbee50cf6002016-02-10 08:59:12 -08005136 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005137 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005138 eor r0, r0, r2 @ optional op; may set condition codes
5139 eor r1, r1, r3 @ result<- op, r0-r3 changed
5140 GET_INST_OPCODE ip @ extract opcode from rINST
5141 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5142 GOTO_OPCODE ip @ jump to next instruction
5143 /* 14-17 instructions */
5144
5145
5146/* ------------------------------ */
5147 .balign 128
5148.L_op_shl_long: /* 0xa3 */
5149/* File: arm/op_shl_long.S */
5150 /*
5151 * Long integer shift. This is different from the generic 32/64-bit
5152 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5153 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5154 * 6 bits of the shift distance.
5155 */
5156 /* shl-long vAA, vBB, vCC */
5157 FETCH r0, 1 @ r0<- CCBB
5158 mov r9, rINST, lsr #8 @ r9<- AA
5159 and r3, r0, #255 @ r3<- BB
5160 mov r0, r0, lsr #8 @ r0<- CC
5161 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5162 GET_VREG r2, r0 @ r2<- vCC
5163 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08005164 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005165 and r2, r2, #63 @ r2<- r2 & 0x3f
5166 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08005167 mov r1, r1, asl r2 @ r1<- r1 << r2
5168 rsb r3, r2, #32 @ r3<- 32 - r2
5169 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
5170 subs ip, r2, #32 @ ip<- r2 - 32
5171 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08005172 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08005173 mov r0, r0, asl r2 @ r0<- r0 << r2
buzbee1452bee2015-03-06 14:43:04 -08005174 GET_INST_OPCODE ip @ extract opcode from rINST
5175 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5176 GOTO_OPCODE ip @ jump to next instruction
5177
5178/* ------------------------------ */
5179 .balign 128
5180.L_op_shr_long: /* 0xa4 */
5181/* File: arm/op_shr_long.S */
5182 /*
5183 * Long integer shift. This is different from the generic 32/64-bit
5184 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5185 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5186 * 6 bits of the shift distance.
5187 */
5188 /* shr-long vAA, vBB, vCC */
5189 FETCH r0, 1 @ r0<- CCBB
5190 mov r9, rINST, lsr #8 @ r9<- AA
5191 and r3, r0, #255 @ r3<- BB
5192 mov r0, r0, lsr #8 @ r0<- CC
5193 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5194 GET_VREG r2, r0 @ r2<- vCC
5195 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08005196 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005197 and r2, r2, #63 @ r0<- r0 & 0x3f
5198 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08005199 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5200 rsb r3, r2, #32 @ r3<- 32 - r2
5201 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5202 subs ip, r2, #32 @ ip<- r2 - 32
5203 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08005204 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08005205 mov r1, r1, asr r2 @ r1<- r1 >> r2
buzbee1452bee2015-03-06 14:43:04 -08005206 GET_INST_OPCODE ip @ extract opcode from rINST
5207 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5208 GOTO_OPCODE ip @ jump to next instruction
5209
5210/* ------------------------------ */
5211 .balign 128
5212.L_op_ushr_long: /* 0xa5 */
5213/* File: arm/op_ushr_long.S */
5214 /*
5215 * Long integer shift. This is different from the generic 32/64-bit
5216 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5217 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5218 * 6 bits of the shift distance.
5219 */
5220 /* ushr-long vAA, vBB, vCC */
5221 FETCH r0, 1 @ r0<- CCBB
5222 mov r9, rINST, lsr #8 @ r9<- AA
5223 and r3, r0, #255 @ r3<- BB
5224 mov r0, r0, lsr #8 @ r0<- CC
5225 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5226 GET_VREG r2, r0 @ r2<- vCC
5227 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08005228 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005229 and r2, r2, #63 @ r0<- r0 & 0x3f
5230 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08005231 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5232 rsb r3, r2, #32 @ r3<- 32 - r2
5233 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5234 subs ip, r2, #32 @ ip<- r2 - 32
5235 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08005236 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08005237 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
buzbee1452bee2015-03-06 14:43:04 -08005238 GET_INST_OPCODE ip @ extract opcode from rINST
5239 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5240 GOTO_OPCODE ip @ jump to next instruction
5241
5242/* ------------------------------ */
5243 .balign 128
5244.L_op_add_float: /* 0xa6 */
5245/* File: arm/op_add_float.S */
5246/* File: arm/fbinop.S */
5247 /*
5248 * Generic 32-bit floating-point operation. Provide an "instr" line that
5249 * specifies an instruction that performs "s2 = s0 op s1". Because we
5250 * use the "softfp" ABI, this must be an instruction, not a function call.
5251 *
5252 * For: add-float, sub-float, mul-float, div-float
5253 */
5254 /* floatop vAA, vBB, vCC */
5255 FETCH r0, 1 @ r0<- CCBB
5256 mov r9, rINST, lsr #8 @ r9<- AA
5257 mov r3, r0, lsr #8 @ r3<- CC
5258 and r2, r0, #255 @ r2<- BB
5259 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5260 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5261 flds s1, [r3] @ s1<- vCC
5262 flds s0, [r2] @ s0<- vBB
5263
5264 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5265 fadds s2, s0, s1 @ s2<- op
5266 GET_INST_OPCODE ip @ extract opcode from rINST
5267 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5268 fsts s2, [r9] @ vAA<- s2
5269 GOTO_OPCODE ip @ jump to next instruction
5270
5271
5272/* ------------------------------ */
5273 .balign 128
5274.L_op_sub_float: /* 0xa7 */
5275/* File: arm/op_sub_float.S */
5276/* File: arm/fbinop.S */
5277 /*
5278 * Generic 32-bit floating-point operation. Provide an "instr" line that
5279 * specifies an instruction that performs "s2 = s0 op s1". Because we
5280 * use the "softfp" ABI, this must be an instruction, not a function call.
5281 *
5282 * For: add-float, sub-float, mul-float, div-float
5283 */
5284 /* floatop vAA, vBB, vCC */
5285 FETCH r0, 1 @ r0<- CCBB
5286 mov r9, rINST, lsr #8 @ r9<- AA
5287 mov r3, r0, lsr #8 @ r3<- CC
5288 and r2, r0, #255 @ r2<- BB
5289 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5290 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5291 flds s1, [r3] @ s1<- vCC
5292 flds s0, [r2] @ s0<- vBB
5293
5294 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5295 fsubs s2, s0, s1 @ s2<- op
5296 GET_INST_OPCODE ip @ extract opcode from rINST
5297 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5298 fsts s2, [r9] @ vAA<- s2
5299 GOTO_OPCODE ip @ jump to next instruction
5300
5301
5302/* ------------------------------ */
5303 .balign 128
5304.L_op_mul_float: /* 0xa8 */
5305/* File: arm/op_mul_float.S */
5306/* File: arm/fbinop.S */
5307 /*
5308 * Generic 32-bit floating-point operation. Provide an "instr" line that
5309 * specifies an instruction that performs "s2 = s0 op s1". Because we
5310 * use the "softfp" ABI, this must be an instruction, not a function call.
5311 *
5312 * For: add-float, sub-float, mul-float, div-float
5313 */
5314 /* floatop vAA, vBB, vCC */
5315 FETCH r0, 1 @ r0<- CCBB
5316 mov r9, rINST, lsr #8 @ r9<- AA
5317 mov r3, r0, lsr #8 @ r3<- CC
5318 and r2, r0, #255 @ r2<- BB
5319 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5320 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5321 flds s1, [r3] @ s1<- vCC
5322 flds s0, [r2] @ s0<- vBB
5323
5324 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5325 fmuls s2, s0, s1 @ s2<- op
5326 GET_INST_OPCODE ip @ extract opcode from rINST
5327 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5328 fsts s2, [r9] @ vAA<- s2
5329 GOTO_OPCODE ip @ jump to next instruction
5330
5331
5332/* ------------------------------ */
5333 .balign 128
5334.L_op_div_float: /* 0xa9 */
5335/* File: arm/op_div_float.S */
5336/* File: arm/fbinop.S */
5337 /*
5338 * Generic 32-bit floating-point operation. Provide an "instr" line that
5339 * specifies an instruction that performs "s2 = s0 op s1". Because we
5340 * use the "softfp" ABI, this must be an instruction, not a function call.
5341 *
5342 * For: add-float, sub-float, mul-float, div-float
5343 */
5344 /* floatop vAA, vBB, vCC */
5345 FETCH r0, 1 @ r0<- CCBB
5346 mov r9, rINST, lsr #8 @ r9<- AA
5347 mov r3, r0, lsr #8 @ r3<- CC
5348 and r2, r0, #255 @ r2<- BB
5349 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5350 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5351 flds s1, [r3] @ s1<- vCC
5352 flds s0, [r2] @ s0<- vBB
5353
5354 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5355 fdivs s2, s0, s1 @ s2<- op
5356 GET_INST_OPCODE ip @ extract opcode from rINST
5357 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5358 fsts s2, [r9] @ vAA<- s2
5359 GOTO_OPCODE ip @ jump to next instruction
5360
5361
5362/* ------------------------------ */
5363 .balign 128
5364.L_op_rem_float: /* 0xaa */
5365/* File: arm/op_rem_float.S */
5366/* EABI doesn't define a float remainder function, but libm does */
5367/* File: arm/binop.S */
5368 /*
5369 * Generic 32-bit binary operation. Provide an "instr" line that
5370 * specifies an instruction that performs "result = r0 op r1".
5371 * This could be an ARM instruction or a function call. (If the result
5372 * comes back in a register other than r0, you can override "result".)
5373 *
5374 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5375 * vCC (r1). Useful for integer division and modulus. Note that we
5376 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5377 * handles it correctly.
5378 *
5379 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5380 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5381 * mul-float, div-float, rem-float
5382 */
5383 /* binop vAA, vBB, vCC */
5384 FETCH r0, 1 @ r0<- CCBB
5385 mov r9, rINST, lsr #8 @ r9<- AA
5386 mov r3, r0, lsr #8 @ r3<- CC
5387 and r2, r0, #255 @ r2<- BB
5388 GET_VREG r1, r3 @ r1<- vCC
5389 GET_VREG r0, r2 @ r0<- vBB
5390 .if 0
5391 cmp r1, #0 @ is second operand zero?
5392 beq common_errDivideByZero
5393 .endif
5394
5395 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5396 @ optional op; may set condition codes
5397 bl fmodf @ r0<- op, r0-r3 changed
5398 GET_INST_OPCODE ip @ extract opcode from rINST
5399 SET_VREG r0, r9 @ vAA<- r0
5400 GOTO_OPCODE ip @ jump to next instruction
5401 /* 11-14 instructions */
5402
5403
5404/* ------------------------------ */
5405 .balign 128
5406.L_op_add_double: /* 0xab */
5407/* File: arm/op_add_double.S */
5408/* File: arm/fbinopWide.S */
5409 /*
5410 * Generic 64-bit double-precision floating point binary operation.
5411 * Provide an "instr" line that specifies an instruction that performs
5412 * "d2 = d0 op d1".
5413 *
5414 * for: add-double, sub-double, mul-double, div-double
5415 */
5416 /* doubleop vAA, vBB, vCC */
5417 FETCH r0, 1 @ r0<- CCBB
5418 mov r9, rINST, lsr #8 @ r9<- AA
5419 mov r3, r0, lsr #8 @ r3<- CC
5420 and r2, r0, #255 @ r2<- BB
5421 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5422 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5423 fldd d1, [r3] @ d1<- vCC
5424 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005425 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5426 faddd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005427 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005428 GET_INST_OPCODE ip @ extract opcode from rINST
5429 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5430 fstd d2, [r9] @ vAA<- d2
5431 GOTO_OPCODE ip @ jump to next instruction
5432
5433
5434/* ------------------------------ */
5435 .balign 128
5436.L_op_sub_double: /* 0xac */
5437/* File: arm/op_sub_double.S */
5438/* File: arm/fbinopWide.S */
5439 /*
5440 * Generic 64-bit double-precision floating point binary operation.
5441 * Provide an "instr" line that specifies an instruction that performs
5442 * "d2 = d0 op d1".
5443 *
5444 * for: add-double, sub-double, mul-double, div-double
5445 */
5446 /* doubleop vAA, vBB, vCC */
5447 FETCH r0, 1 @ r0<- CCBB
5448 mov r9, rINST, lsr #8 @ r9<- AA
5449 mov r3, r0, lsr #8 @ r3<- CC
5450 and r2, r0, #255 @ r2<- BB
5451 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5452 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5453 fldd d1, [r3] @ d1<- vCC
5454 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005455 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5456 fsubd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005457 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005458 GET_INST_OPCODE ip @ extract opcode from rINST
5459 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5460 fstd d2, [r9] @ vAA<- d2
5461 GOTO_OPCODE ip @ jump to next instruction
5462
5463
5464/* ------------------------------ */
5465 .balign 128
5466.L_op_mul_double: /* 0xad */
5467/* File: arm/op_mul_double.S */
5468/* File: arm/fbinopWide.S */
5469 /*
5470 * Generic 64-bit double-precision floating point binary operation.
5471 * Provide an "instr" line that specifies an instruction that performs
5472 * "d2 = d0 op d1".
5473 *
5474 * for: add-double, sub-double, mul-double, div-double
5475 */
5476 /* doubleop vAA, vBB, vCC */
5477 FETCH r0, 1 @ r0<- CCBB
5478 mov r9, rINST, lsr #8 @ r9<- AA
5479 mov r3, r0, lsr #8 @ r3<- CC
5480 and r2, r0, #255 @ r2<- BB
5481 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5482 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5483 fldd d1, [r3] @ d1<- vCC
5484 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005485 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5486 fmuld d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005487 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005488 GET_INST_OPCODE ip @ extract opcode from rINST
5489 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5490 fstd d2, [r9] @ vAA<- d2
5491 GOTO_OPCODE ip @ jump to next instruction
5492
5493
5494/* ------------------------------ */
5495 .balign 128
5496.L_op_div_double: /* 0xae */
5497/* File: arm/op_div_double.S */
5498/* File: arm/fbinopWide.S */
5499 /*
5500 * Generic 64-bit double-precision floating point binary operation.
5501 * Provide an "instr" line that specifies an instruction that performs
5502 * "d2 = d0 op d1".
5503 *
5504 * for: add-double, sub-double, mul-double, div-double
5505 */
5506 /* doubleop vAA, vBB, vCC */
5507 FETCH r0, 1 @ r0<- CCBB
5508 mov r9, rINST, lsr #8 @ r9<- AA
5509 mov r3, r0, lsr #8 @ r3<- CC
5510 and r2, r0, #255 @ r2<- BB
5511 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5512 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5513 fldd d1, [r3] @ d1<- vCC
5514 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005515 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5516 fdivd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005517 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005518 GET_INST_OPCODE ip @ extract opcode from rINST
5519 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5520 fstd d2, [r9] @ vAA<- d2
5521 GOTO_OPCODE ip @ jump to next instruction
5522
5523
5524/* ------------------------------ */
5525 .balign 128
5526.L_op_rem_double: /* 0xaf */
5527/* File: arm/op_rem_double.S */
5528/* EABI doesn't define a double remainder function, but libm does */
5529/* File: arm/binopWide.S */
5530 /*
5531 * Generic 64-bit binary operation. Provide an "instr" line that
5532 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5533 * This could be an ARM instruction or a function call. (If the result
5534 * comes back in a register other than r0, you can override "result".)
5535 *
5536 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5537 * vCC (r1). Useful for integer division and modulus.
5538 *
5539 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5540 * xor-long, add-double, sub-double, mul-double, div-double,
5541 * rem-double
5542 *
5543 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5544 */
5545 /* binop vAA, vBB, vCC */
5546 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08005547 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08005548 and r2, r0, #255 @ r2<- BB
5549 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08005550 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08005551 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5552 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5553 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5554 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5555 .if 0
5556 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5557 beq common_errDivideByZero
5558 .endif
buzbee50cf6002016-02-10 08:59:12 -08005559 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005560 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005561 @ optional op; may set condition codes
5562 bl fmod @ result<- op, r0-r3 changed
5563 GET_INST_OPCODE ip @ extract opcode from rINST
5564 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5565 GOTO_OPCODE ip @ jump to next instruction
5566 /* 14-17 instructions */
5567
5568
5569/* ------------------------------ */
5570 .balign 128
5571.L_op_add_int_2addr: /* 0xb0 */
5572/* File: arm/op_add_int_2addr.S */
5573/* File: arm/binop2addr.S */
5574 /*
5575 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5576 * that specifies an instruction that performs "result = r0 op r1".
5577 * This could be an ARM instruction or a function call. (If the result
5578 * comes back in a register other than r0, you can override "result".)
5579 *
5580 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5581 * vCC (r1). Useful for integer division and modulus.
5582 *
5583 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5584 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5585 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5586 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5587 */
5588 /* binop/2addr vA, vB */
5589 mov r3, rINST, lsr #12 @ r3<- B
5590 ubfx r9, rINST, #8, #4 @ r9<- A
5591 GET_VREG r1, r3 @ r1<- vB
5592 GET_VREG r0, r9 @ r0<- vA
5593 .if 0
5594 cmp r1, #0 @ is second operand zero?
5595 beq common_errDivideByZero
5596 .endif
5597 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5598
5599 @ optional op; may set condition codes
5600 add r0, r0, r1 @ r0<- op, r0-r3 changed
5601 GET_INST_OPCODE ip @ extract opcode from rINST
5602 SET_VREG r0, r9 @ vAA<- r0
5603 GOTO_OPCODE ip @ jump to next instruction
5604 /* 10-13 instructions */
5605
5606
5607/* ------------------------------ */
5608 .balign 128
5609.L_op_sub_int_2addr: /* 0xb1 */
5610/* File: arm/op_sub_int_2addr.S */
5611/* File: arm/binop2addr.S */
5612 /*
5613 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5614 * that specifies an instruction that performs "result = r0 op r1".
5615 * This could be an ARM instruction or a function call. (If the result
5616 * comes back in a register other than r0, you can override "result".)
5617 *
5618 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5619 * vCC (r1). Useful for integer division and modulus.
5620 *
5621 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5622 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5623 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5624 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5625 */
5626 /* binop/2addr vA, vB */
5627 mov r3, rINST, lsr #12 @ r3<- B
5628 ubfx r9, rINST, #8, #4 @ r9<- A
5629 GET_VREG r1, r3 @ r1<- vB
5630 GET_VREG r0, r9 @ r0<- vA
5631 .if 0
5632 cmp r1, #0 @ is second operand zero?
5633 beq common_errDivideByZero
5634 .endif
5635 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5636
5637 @ optional op; may set condition codes
5638 sub r0, r0, r1 @ r0<- op, r0-r3 changed
5639 GET_INST_OPCODE ip @ extract opcode from rINST
5640 SET_VREG r0, r9 @ vAA<- r0
5641 GOTO_OPCODE ip @ jump to next instruction
5642 /* 10-13 instructions */
5643
5644
5645/* ------------------------------ */
5646 .balign 128
5647.L_op_mul_int_2addr: /* 0xb2 */
5648/* File: arm/op_mul_int_2addr.S */
5649/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5650/* File: arm/binop2addr.S */
5651 /*
5652 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5653 * that specifies an instruction that performs "result = r0 op r1".
5654 * This could be an ARM instruction or a function call. (If the result
5655 * comes back in a register other than r0, you can override "result".)
5656 *
5657 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5658 * vCC (r1). Useful for integer division and modulus.
5659 *
5660 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5661 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5662 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5663 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5664 */
5665 /* binop/2addr vA, vB */
5666 mov r3, rINST, lsr #12 @ r3<- B
5667 ubfx r9, rINST, #8, #4 @ r9<- A
5668 GET_VREG r1, r3 @ r1<- vB
5669 GET_VREG r0, r9 @ r0<- vA
5670 .if 0
5671 cmp r1, #0 @ is second operand zero?
5672 beq common_errDivideByZero
5673 .endif
5674 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5675
5676 @ optional op; may set condition codes
5677 mul r0, r1, r0 @ r0<- op, r0-r3 changed
5678 GET_INST_OPCODE ip @ extract opcode from rINST
5679 SET_VREG r0, r9 @ vAA<- r0
5680 GOTO_OPCODE ip @ jump to next instruction
5681 /* 10-13 instructions */
5682
5683
5684/* ------------------------------ */
5685 .balign 128
5686.L_op_div_int_2addr: /* 0xb3 */
5687/* File: arm/op_div_int_2addr.S */
5688 /*
5689 * Specialized 32-bit binary operation
5690 *
5691 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5692 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5693 * ARMv7 CPUs that have hardware division support).
5694 *
5695 * div-int/2addr
5696 *
5697 */
5698 mov r3, rINST, lsr #12 @ r3<- B
5699 ubfx r9, rINST, #8, #4 @ r9<- A
5700 GET_VREG r1, r3 @ r1<- vB
5701 GET_VREG r0, r9 @ r0<- vA
5702 cmp r1, #0 @ is second operand zero?
5703 beq common_errDivideByZero
5704 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5705
5706#ifdef __ARM_ARCH_EXT_IDIV__
5707 sdiv r0, r0, r1 @ r0<- op
5708#else
5709 bl __aeabi_idiv @ r0<- op, r0-r3 changed
5710#endif
5711 GET_INST_OPCODE ip @ extract opcode from rINST
5712 SET_VREG r0, r9 @ vAA<- r0
5713 GOTO_OPCODE ip @ jump to next instruction
5714 /* 10-13 instructions */
5715
5716
5717/* ------------------------------ */
5718 .balign 128
5719.L_op_rem_int_2addr: /* 0xb4 */
5720/* File: arm/op_rem_int_2addr.S */
5721 /*
5722 * Specialized 32-bit binary operation
5723 *
5724 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5725 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5726 * ARMv7 CPUs that have hardware division support).
5727 *
5728 * NOTE: idivmod returns quotient in r0 and remainder in r1
5729 *
5730 * rem-int/2addr
5731 *
5732 */
5733 mov r3, rINST, lsr #12 @ r3<- B
5734 ubfx r9, rINST, #8, #4 @ r9<- A
5735 GET_VREG r1, r3 @ r1<- vB
5736 GET_VREG r0, r9 @ r0<- vA
5737 cmp r1, #0 @ is second operand zero?
5738 beq common_errDivideByZero
5739 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5740
5741#ifdef __ARM_ARCH_EXT_IDIV__
5742 sdiv r2, r0, r1
5743 mls r1, r1, r2, r0 @ r1<- op
5744#else
5745 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
5746#endif
5747 GET_INST_OPCODE ip @ extract opcode from rINST
5748 SET_VREG r1, r9 @ vAA<- r1
5749 GOTO_OPCODE ip @ jump to next instruction
5750 /* 10-13 instructions */
5751
5752
5753/* ------------------------------ */
5754 .balign 128
5755.L_op_and_int_2addr: /* 0xb5 */
5756/* File: arm/op_and_int_2addr.S */
5757/* File: arm/binop2addr.S */
5758 /*
5759 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5760 * that specifies an instruction that performs "result = r0 op r1".
5761 * This could be an ARM instruction or a function call. (If the result
5762 * comes back in a register other than r0, you can override "result".)
5763 *
5764 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5765 * vCC (r1). Useful for integer division and modulus.
5766 *
5767 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5768 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5769 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5770 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5771 */
5772 /* binop/2addr vA, vB */
5773 mov r3, rINST, lsr #12 @ r3<- B
5774 ubfx r9, rINST, #8, #4 @ r9<- A
5775 GET_VREG r1, r3 @ r1<- vB
5776 GET_VREG r0, r9 @ r0<- vA
5777 .if 0
5778 cmp r1, #0 @ is second operand zero?
5779 beq common_errDivideByZero
5780 .endif
5781 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5782
5783 @ optional op; may set condition codes
5784 and r0, r0, r1 @ r0<- op, r0-r3 changed
5785 GET_INST_OPCODE ip @ extract opcode from rINST
5786 SET_VREG r0, r9 @ vAA<- r0
5787 GOTO_OPCODE ip @ jump to next instruction
5788 /* 10-13 instructions */
5789
5790
5791/* ------------------------------ */
5792 .balign 128
5793.L_op_or_int_2addr: /* 0xb6 */
5794/* File: arm/op_or_int_2addr.S */
5795/* File: arm/binop2addr.S */
5796 /*
5797 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5798 * that specifies an instruction that performs "result = r0 op r1".
5799 * This could be an ARM instruction or a function call. (If the result
5800 * comes back in a register other than r0, you can override "result".)
5801 *
5802 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5803 * vCC (r1). Useful for integer division and modulus.
5804 *
5805 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5806 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5807 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5808 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5809 */
5810 /* binop/2addr vA, vB */
5811 mov r3, rINST, lsr #12 @ r3<- B
5812 ubfx r9, rINST, #8, #4 @ r9<- A
5813 GET_VREG r1, r3 @ r1<- vB
5814 GET_VREG r0, r9 @ r0<- vA
5815 .if 0
5816 cmp r1, #0 @ is second operand zero?
5817 beq common_errDivideByZero
5818 .endif
5819 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5820
5821 @ optional op; may set condition codes
5822 orr r0, r0, r1 @ r0<- op, r0-r3 changed
5823 GET_INST_OPCODE ip @ extract opcode from rINST
5824 SET_VREG r0, r9 @ vAA<- r0
5825 GOTO_OPCODE ip @ jump to next instruction
5826 /* 10-13 instructions */
5827
5828
5829/* ------------------------------ */
5830 .balign 128
5831.L_op_xor_int_2addr: /* 0xb7 */
5832/* File: arm/op_xor_int_2addr.S */
5833/* File: arm/binop2addr.S */
5834 /*
5835 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5836 * that specifies an instruction that performs "result = r0 op r1".
5837 * This could be an ARM instruction or a function call. (If the result
5838 * comes back in a register other than r0, you can override "result".)
5839 *
5840 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5841 * vCC (r1). Useful for integer division and modulus.
5842 *
5843 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5844 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5845 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5846 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5847 */
5848 /* binop/2addr vA, vB */
5849 mov r3, rINST, lsr #12 @ r3<- B
5850 ubfx r9, rINST, #8, #4 @ r9<- A
5851 GET_VREG r1, r3 @ r1<- vB
5852 GET_VREG r0, r9 @ r0<- vA
5853 .if 0
5854 cmp r1, #0 @ is second operand zero?
5855 beq common_errDivideByZero
5856 .endif
5857 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5858
5859 @ optional op; may set condition codes
5860 eor r0, r0, r1 @ r0<- op, r0-r3 changed
5861 GET_INST_OPCODE ip @ extract opcode from rINST
5862 SET_VREG r0, r9 @ vAA<- r0
5863 GOTO_OPCODE ip @ jump to next instruction
5864 /* 10-13 instructions */
5865
5866
5867/* ------------------------------ */
5868 .balign 128
5869.L_op_shl_int_2addr: /* 0xb8 */
5870/* File: arm/op_shl_int_2addr.S */
5871/* File: arm/binop2addr.S */
5872 /*
5873 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5874 * that specifies an instruction that performs "result = r0 op r1".
5875 * This could be an ARM instruction or a function call. (If the result
5876 * comes back in a register other than r0, you can override "result".)
5877 *
5878 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5879 * vCC (r1). Useful for integer division and modulus.
5880 *
5881 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5882 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5883 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5884 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5885 */
5886 /* binop/2addr vA, vB */
5887 mov r3, rINST, lsr #12 @ r3<- B
5888 ubfx r9, rINST, #8, #4 @ r9<- A
5889 GET_VREG r1, r3 @ r1<- vB
5890 GET_VREG r0, r9 @ r0<- vA
5891 .if 0
5892 cmp r1, #0 @ is second operand zero?
5893 beq common_errDivideByZero
5894 .endif
5895 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5896
5897 and r1, r1, #31 @ optional op; may set condition codes
5898 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
5899 GET_INST_OPCODE ip @ extract opcode from rINST
5900 SET_VREG r0, r9 @ vAA<- r0
5901 GOTO_OPCODE ip @ jump to next instruction
5902 /* 10-13 instructions */
5903
5904
5905/* ------------------------------ */
5906 .balign 128
5907.L_op_shr_int_2addr: /* 0xb9 */
5908/* File: arm/op_shr_int_2addr.S */
5909/* File: arm/binop2addr.S */
5910 /*
5911 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5912 * that specifies an instruction that performs "result = r0 op r1".
5913 * This could be an ARM instruction or a function call. (If the result
5914 * comes back in a register other than r0, you can override "result".)
5915 *
5916 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5917 * vCC (r1). Useful for integer division and modulus.
5918 *
5919 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5920 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5921 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5922 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5923 */
5924 /* binop/2addr vA, vB */
5925 mov r3, rINST, lsr #12 @ r3<- B
5926 ubfx r9, rINST, #8, #4 @ r9<- A
5927 GET_VREG r1, r3 @ r1<- vB
5928 GET_VREG r0, r9 @ r0<- vA
5929 .if 0
5930 cmp r1, #0 @ is second operand zero?
5931 beq common_errDivideByZero
5932 .endif
5933 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5934
5935 and r1, r1, #31 @ optional op; may set condition codes
5936 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
5937 GET_INST_OPCODE ip @ extract opcode from rINST
5938 SET_VREG r0, r9 @ vAA<- r0
5939 GOTO_OPCODE ip @ jump to next instruction
5940 /* 10-13 instructions */
5941
5942
5943/* ------------------------------ */
5944 .balign 128
5945.L_op_ushr_int_2addr: /* 0xba */
5946/* File: arm/op_ushr_int_2addr.S */
5947/* File: arm/binop2addr.S */
5948 /*
5949 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5950 * that specifies an instruction that performs "result = r0 op r1".
5951 * This could be an ARM instruction or a function call. (If the result
5952 * comes back in a register other than r0, you can override "result".)
5953 *
5954 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5955 * vCC (r1). Useful for integer division and modulus.
5956 *
5957 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5958 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5959 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5960 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5961 */
5962 /* binop/2addr vA, vB */
5963 mov r3, rINST, lsr #12 @ r3<- B
5964 ubfx r9, rINST, #8, #4 @ r9<- A
5965 GET_VREG r1, r3 @ r1<- vB
5966 GET_VREG r0, r9 @ r0<- vA
5967 .if 0
5968 cmp r1, #0 @ is second operand zero?
5969 beq common_errDivideByZero
5970 .endif
5971 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5972
5973 and r1, r1, #31 @ optional op; may set condition codes
5974 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
5975 GET_INST_OPCODE ip @ extract opcode from rINST
5976 SET_VREG r0, r9 @ vAA<- r0
5977 GOTO_OPCODE ip @ jump to next instruction
5978 /* 10-13 instructions */
5979
5980
5981/* ------------------------------ */
5982 .balign 128
5983.L_op_add_long_2addr: /* 0xbb */
5984/* File: arm/op_add_long_2addr.S */
5985/* File: arm/binopWide2addr.S */
5986 /*
5987 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5988 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5989 * This could be an ARM instruction or a function call. (If the result
5990 * comes back in a register other than r0, you can override "result".)
5991 *
5992 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5993 * vCC (r1). Useful for integer division and modulus.
5994 *
5995 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5996 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5997 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5998 * rem-double/2addr
5999 */
6000 /* binop/2addr vA, vB */
6001 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006002 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006003 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006004 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006005 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6006 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6007 .if 0
6008 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6009 beq common_errDivideByZero
6010 .endif
buzbee50cf6002016-02-10 08:59:12 -08006011 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006012 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006013 adds r0, r0, r2 @ optional op; may set condition codes
6014 adc r1, r1, r3 @ result<- op, r0-r3 changed
6015 GET_INST_OPCODE ip @ extract opcode from rINST
6016 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6017 GOTO_OPCODE ip @ jump to next instruction
6018 /* 12-15 instructions */
6019
6020
6021/* ------------------------------ */
6022 .balign 128
6023.L_op_sub_long_2addr: /* 0xbc */
6024/* File: arm/op_sub_long_2addr.S */
6025/* File: arm/binopWide2addr.S */
6026 /*
6027 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6028 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6029 * This could be an ARM instruction or a function call. (If the result
6030 * comes back in a register other than r0, you can override "result".)
6031 *
6032 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6033 * vCC (r1). Useful for integer division and modulus.
6034 *
6035 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6036 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6037 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6038 * rem-double/2addr
6039 */
6040 /* binop/2addr vA, vB */
6041 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006042 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006043 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006044 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006045 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6046 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6047 .if 0
6048 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6049 beq common_errDivideByZero
6050 .endif
buzbee50cf6002016-02-10 08:59:12 -08006051 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006052 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006053 subs r0, r0, r2 @ optional op; may set condition codes
6054 sbc r1, r1, r3 @ result<- op, r0-r3 changed
6055 GET_INST_OPCODE ip @ extract opcode from rINST
6056 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6057 GOTO_OPCODE ip @ jump to next instruction
6058 /* 12-15 instructions */
6059
6060
6061/* ------------------------------ */
6062 .balign 128
6063.L_op_mul_long_2addr: /* 0xbd */
6064/* File: arm/op_mul_long_2addr.S */
6065 /*
6066 * Signed 64-bit integer multiply, "/2addr" version.
6067 *
6068 * See op_mul_long for an explanation.
6069 *
6070 * We get a little tight on registers, so to avoid looking up &fp[A]
6071 * again we stuff it into rINST.
6072 */
6073 /* mul-long/2addr vA, vB */
6074 mov r1, rINST, lsr #12 @ r1<- B
6075 ubfx r9, rINST, #8, #4 @ r9<- A
6076 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6077 add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A]
6078 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6079 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1
6080 mul ip, r2, r1 @ ip<- ZxW
6081 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
6082 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
6083 mov r0, rINST @ r0<- &fp[A] (free up rINST)
6084 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6085 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
6086 GET_INST_OPCODE ip @ extract opcode from rINST
6087 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
6088 GOTO_OPCODE ip @ jump to next instruction
6089
6090/* ------------------------------ */
6091 .balign 128
6092.L_op_div_long_2addr: /* 0xbe */
6093/* File: arm/op_div_long_2addr.S */
6094/* File: arm/binopWide2addr.S */
6095 /*
6096 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6097 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6098 * This could be an ARM instruction or a function call. (If the result
6099 * comes back in a register other than r0, you can override "result".)
6100 *
6101 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6102 * vCC (r1). Useful for integer division and modulus.
6103 *
6104 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6105 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6106 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6107 * rem-double/2addr
6108 */
6109 /* binop/2addr vA, vB */
6110 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006111 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006112 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006113 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006114 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6115 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6116 .if 1
6117 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6118 beq common_errDivideByZero
6119 .endif
buzbee50cf6002016-02-10 08:59:12 -08006120 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006121 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006122 @ optional op; may set condition codes
6123 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
6124 GET_INST_OPCODE ip @ extract opcode from rINST
6125 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6126 GOTO_OPCODE ip @ jump to next instruction
6127 /* 12-15 instructions */
6128
6129
6130/* ------------------------------ */
6131 .balign 128
6132.L_op_rem_long_2addr: /* 0xbf */
6133/* File: arm/op_rem_long_2addr.S */
6134/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
6135/* File: arm/binopWide2addr.S */
6136 /*
6137 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6138 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6139 * This could be an ARM instruction or a function call. (If the result
6140 * comes back in a register other than r0, you can override "result".)
6141 *
6142 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6143 * vCC (r1). Useful for integer division and modulus.
6144 *
6145 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6146 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6147 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6148 * rem-double/2addr
6149 */
6150 /* binop/2addr vA, vB */
6151 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006152 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006153 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006154 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006155 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6156 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6157 .if 1
6158 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6159 beq common_errDivideByZero
6160 .endif
buzbee50cf6002016-02-10 08:59:12 -08006161 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006162 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006163 @ optional op; may set condition codes
6164 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
6165 GET_INST_OPCODE ip @ extract opcode from rINST
6166 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
6167 GOTO_OPCODE ip @ jump to next instruction
6168 /* 12-15 instructions */
6169
6170
6171/* ------------------------------ */
6172 .balign 128
6173.L_op_and_long_2addr: /* 0xc0 */
6174/* File: arm/op_and_long_2addr.S */
6175/* File: arm/binopWide2addr.S */
6176 /*
6177 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6178 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6179 * This could be an ARM instruction or a function call. (If the result
6180 * comes back in a register other than r0, you can override "result".)
6181 *
6182 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6183 * vCC (r1). Useful for integer division and modulus.
6184 *
6185 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6186 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6187 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6188 * rem-double/2addr
6189 */
6190 /* binop/2addr vA, vB */
6191 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006192 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006193 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006194 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006195 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6196 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6197 .if 0
6198 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6199 beq common_errDivideByZero
6200 .endif
buzbee50cf6002016-02-10 08:59:12 -08006201 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006202 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006203 and r0, r0, r2 @ optional op; may set condition codes
6204 and r1, r1, r3 @ result<- op, r0-r3 changed
6205 GET_INST_OPCODE ip @ extract opcode from rINST
6206 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6207 GOTO_OPCODE ip @ jump to next instruction
6208 /* 12-15 instructions */
6209
6210
6211/* ------------------------------ */
6212 .balign 128
6213.L_op_or_long_2addr: /* 0xc1 */
6214/* File: arm/op_or_long_2addr.S */
6215/* File: arm/binopWide2addr.S */
6216 /*
6217 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6218 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6219 * This could be an ARM instruction or a function call. (If the result
6220 * comes back in a register other than r0, you can override "result".)
6221 *
6222 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6223 * vCC (r1). Useful for integer division and modulus.
6224 *
6225 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6226 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6227 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6228 * rem-double/2addr
6229 */
6230 /* binop/2addr vA, vB */
6231 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006232 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006233 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006234 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006235 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6236 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6237 .if 0
6238 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6239 beq common_errDivideByZero
6240 .endif
buzbee50cf6002016-02-10 08:59:12 -08006241 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006242 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006243 orr r0, r0, r2 @ optional op; may set condition codes
6244 orr r1, r1, r3 @ result<- op, r0-r3 changed
6245 GET_INST_OPCODE ip @ extract opcode from rINST
6246 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6247 GOTO_OPCODE ip @ jump to next instruction
6248 /* 12-15 instructions */
6249
6250
6251/* ------------------------------ */
6252 .balign 128
6253.L_op_xor_long_2addr: /* 0xc2 */
6254/* File: arm/op_xor_long_2addr.S */
6255/* File: arm/binopWide2addr.S */
6256 /*
6257 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6258 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6259 * This could be an ARM instruction or a function call. (If the result
6260 * comes back in a register other than r0, you can override "result".)
6261 *
6262 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6263 * vCC (r1). Useful for integer division and modulus.
6264 *
6265 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6266 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6267 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6268 * rem-double/2addr
6269 */
6270 /* binop/2addr vA, vB */
6271 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006272 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006273 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006274 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006275 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6276 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6277 .if 0
6278 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6279 beq common_errDivideByZero
6280 .endif
buzbee50cf6002016-02-10 08:59:12 -08006281 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006282 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006283 eor r0, r0, r2 @ optional op; may set condition codes
6284 eor r1, r1, r3 @ result<- op, r0-r3 changed
6285 GET_INST_OPCODE ip @ extract opcode from rINST
6286 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6287 GOTO_OPCODE ip @ jump to next instruction
6288 /* 12-15 instructions */
6289
6290
6291/* ------------------------------ */
6292 .balign 128
6293.L_op_shl_long_2addr: /* 0xc3 */
6294/* File: arm/op_shl_long_2addr.S */
6295 /*
6296 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6297 * 32-bit shift distance.
6298 */
6299 /* shl-long/2addr vA, vB */
6300 mov r3, rINST, lsr #12 @ r3<- B
6301 ubfx r9, rINST, #8, #4 @ r9<- A
6302 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006303 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006304 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6305 and r2, r2, #63 @ r2<- r2 & 0x3f
6306 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006307 mov r1, r1, asl r2 @ r1<- r1 << r2
6308 rsb r3, r2, #32 @ r3<- 32 - r2
6309 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
6310 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006311 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006312 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
6313 mov r0, r0, asl r2 @ r0<- r0 << r2
buzbee1452bee2015-03-06 14:43:04 -08006314 GET_INST_OPCODE ip @ extract opcode from rINST
6315 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6316 GOTO_OPCODE ip @ jump to next instruction
6317
6318/* ------------------------------ */
6319 .balign 128
6320.L_op_shr_long_2addr: /* 0xc4 */
6321/* File: arm/op_shr_long_2addr.S */
6322 /*
6323 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6324 * 32-bit shift distance.
6325 */
6326 /* shr-long/2addr vA, vB */
6327 mov r3, rINST, lsr #12 @ r3<- B
6328 ubfx r9, rINST, #8, #4 @ r9<- A
6329 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006330 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006331 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6332 and r2, r2, #63 @ r2<- r2 & 0x3f
6333 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006334 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6335 rsb r3, r2, #32 @ r3<- 32 - r2
6336 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6337 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006338 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006339 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
6340 mov r1, r1, asr r2 @ r1<- r1 >> r2
buzbee1452bee2015-03-06 14:43:04 -08006341 GET_INST_OPCODE ip @ extract opcode from rINST
6342 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6343 GOTO_OPCODE ip @ jump to next instruction
6344
6345/* ------------------------------ */
6346 .balign 128
6347.L_op_ushr_long_2addr: /* 0xc5 */
6348/* File: arm/op_ushr_long_2addr.S */
6349 /*
6350 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6351 * 32-bit shift distance.
6352 */
6353 /* ushr-long/2addr vA, vB */
6354 mov r3, rINST, lsr #12 @ r3<- B
6355 ubfx r9, rINST, #8, #4 @ r9<- A
6356 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006357 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006358 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6359 and r2, r2, #63 @ r2<- r2 & 0x3f
6360 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006361 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6362 rsb r3, r2, #32 @ r3<- 32 - r2
6363 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6364 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006365 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006366 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
6367 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
buzbee1452bee2015-03-06 14:43:04 -08006368 GET_INST_OPCODE ip @ extract opcode from rINST
6369 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6370 GOTO_OPCODE ip @ jump to next instruction
6371
6372/* ------------------------------ */
6373 .balign 128
6374.L_op_add_float_2addr: /* 0xc6 */
6375/* File: arm/op_add_float_2addr.S */
6376/* File: arm/fbinop2addr.S */
6377 /*
6378 * Generic 32-bit floating point "/2addr" binary operation. Provide
6379 * an "instr" line that specifies an instruction that performs
6380 * "s2 = s0 op s1".
6381 *
6382 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6383 */
6384 /* binop/2addr vA, vB */
6385 mov r3, rINST, lsr #12 @ r3<- B
6386 mov r9, rINST, lsr #8 @ r9<- A+
6387 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6388 and r9, r9, #15 @ r9<- A
6389 flds s1, [r3] @ s1<- vB
6390 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6391 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6392 flds s0, [r9] @ s0<- vA
6393
6394 fadds s2, s0, s1 @ s2<- op
6395 GET_INST_OPCODE ip @ extract opcode from rINST
6396 fsts s2, [r9] @ vAA<- s2
6397 GOTO_OPCODE ip @ jump to next instruction
6398
6399
6400/* ------------------------------ */
6401 .balign 128
6402.L_op_sub_float_2addr: /* 0xc7 */
6403/* File: arm/op_sub_float_2addr.S */
6404/* File: arm/fbinop2addr.S */
6405 /*
6406 * Generic 32-bit floating point "/2addr" binary operation. Provide
6407 * an "instr" line that specifies an instruction that performs
6408 * "s2 = s0 op s1".
6409 *
6410 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6411 */
6412 /* binop/2addr vA, vB */
6413 mov r3, rINST, lsr #12 @ r3<- B
6414 mov r9, rINST, lsr #8 @ r9<- A+
6415 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6416 and r9, r9, #15 @ r9<- A
6417 flds s1, [r3] @ s1<- vB
6418 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6419 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6420 flds s0, [r9] @ s0<- vA
6421
6422 fsubs s2, s0, s1 @ s2<- op
6423 GET_INST_OPCODE ip @ extract opcode from rINST
6424 fsts s2, [r9] @ vAA<- s2
6425 GOTO_OPCODE ip @ jump to next instruction
6426
6427
6428/* ------------------------------ */
6429 .balign 128
6430.L_op_mul_float_2addr: /* 0xc8 */
6431/* File: arm/op_mul_float_2addr.S */
6432/* File: arm/fbinop2addr.S */
6433 /*
6434 * Generic 32-bit floating point "/2addr" binary operation. Provide
6435 * an "instr" line that specifies an instruction that performs
6436 * "s2 = s0 op s1".
6437 *
6438 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6439 */
6440 /* binop/2addr vA, vB */
6441 mov r3, rINST, lsr #12 @ r3<- B
6442 mov r9, rINST, lsr #8 @ r9<- A+
6443 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6444 and r9, r9, #15 @ r9<- A
6445 flds s1, [r3] @ s1<- vB
6446 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6447 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6448 flds s0, [r9] @ s0<- vA
6449
6450 fmuls s2, s0, s1 @ s2<- op
6451 GET_INST_OPCODE ip @ extract opcode from rINST
6452 fsts s2, [r9] @ vAA<- s2
6453 GOTO_OPCODE ip @ jump to next instruction
6454
6455
6456/* ------------------------------ */
6457 .balign 128
6458.L_op_div_float_2addr: /* 0xc9 */
6459/* File: arm/op_div_float_2addr.S */
6460/* File: arm/fbinop2addr.S */
6461 /*
6462 * Generic 32-bit floating point "/2addr" binary operation. Provide
6463 * an "instr" line that specifies an instruction that performs
6464 * "s2 = s0 op s1".
6465 *
6466 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6467 */
6468 /* binop/2addr vA, vB */
6469 mov r3, rINST, lsr #12 @ r3<- B
6470 mov r9, rINST, lsr #8 @ r9<- A+
6471 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6472 and r9, r9, #15 @ r9<- A
6473 flds s1, [r3] @ s1<- vB
6474 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6475 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6476 flds s0, [r9] @ s0<- vA
6477
6478 fdivs s2, s0, s1 @ s2<- op
6479 GET_INST_OPCODE ip @ extract opcode from rINST
6480 fsts s2, [r9] @ vAA<- s2
6481 GOTO_OPCODE ip @ jump to next instruction
6482
6483
6484/* ------------------------------ */
6485 .balign 128
6486.L_op_rem_float_2addr: /* 0xca */
6487/* File: arm/op_rem_float_2addr.S */
6488/* EABI doesn't define a float remainder function, but libm does */
6489/* File: arm/binop2addr.S */
6490 /*
6491 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
6492 * that specifies an instruction that performs "result = r0 op r1".
6493 * This could be an ARM instruction or a function call. (If the result
6494 * comes back in a register other than r0, you can override "result".)
6495 *
6496 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6497 * vCC (r1). Useful for integer division and modulus.
6498 *
6499 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6500 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6501 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6502 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6503 */
6504 /* binop/2addr vA, vB */
6505 mov r3, rINST, lsr #12 @ r3<- B
6506 ubfx r9, rINST, #8, #4 @ r9<- A
6507 GET_VREG r1, r3 @ r1<- vB
6508 GET_VREG r0, r9 @ r0<- vA
6509 .if 0
6510 cmp r1, #0 @ is second operand zero?
6511 beq common_errDivideByZero
6512 .endif
6513 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6514
6515 @ optional op; may set condition codes
6516 bl fmodf @ r0<- op, r0-r3 changed
6517 GET_INST_OPCODE ip @ extract opcode from rINST
6518 SET_VREG r0, r9 @ vAA<- r0
6519 GOTO_OPCODE ip @ jump to next instruction
6520 /* 10-13 instructions */
6521
6522
6523/* ------------------------------ */
6524 .balign 128
6525.L_op_add_double_2addr: /* 0xcb */
6526/* File: arm/op_add_double_2addr.S */
6527/* File: arm/fbinopWide2addr.S */
6528 /*
6529 * Generic 64-bit floating point "/2addr" binary operation. Provide
6530 * an "instr" line that specifies an instruction that performs
6531 * "d2 = d0 op d1".
6532 *
6533 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6534 * div-double/2addr
6535 */
6536 /* binop/2addr vA, vB */
6537 mov r3, rINST, lsr #12 @ r3<- B
6538 mov r9, rINST, lsr #8 @ r9<- A+
6539 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6540 and r9, r9, #15 @ r9<- A
6541 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006542 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006543 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6544 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6545 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006546 faddd d2, d0, d1 @ d2<- op
6547 GET_INST_OPCODE ip @ extract opcode from rINST
6548 fstd d2, [r9] @ vAA<- d2
6549 GOTO_OPCODE ip @ jump to next instruction
6550
6551
6552/* ------------------------------ */
6553 .balign 128
6554.L_op_sub_double_2addr: /* 0xcc */
6555/* File: arm/op_sub_double_2addr.S */
6556/* File: arm/fbinopWide2addr.S */
6557 /*
6558 * Generic 64-bit floating point "/2addr" binary operation. Provide
6559 * an "instr" line that specifies an instruction that performs
6560 * "d2 = d0 op d1".
6561 *
6562 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6563 * div-double/2addr
6564 */
6565 /* binop/2addr vA, vB */
6566 mov r3, rINST, lsr #12 @ r3<- B
6567 mov r9, rINST, lsr #8 @ r9<- A+
6568 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6569 and r9, r9, #15 @ r9<- A
6570 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006571 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006572 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6573 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6574 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006575 fsubd d2, d0, d1 @ d2<- op
6576 GET_INST_OPCODE ip @ extract opcode from rINST
6577 fstd d2, [r9] @ vAA<- d2
6578 GOTO_OPCODE ip @ jump to next instruction
6579
6580
6581/* ------------------------------ */
6582 .balign 128
6583.L_op_mul_double_2addr: /* 0xcd */
6584/* File: arm/op_mul_double_2addr.S */
6585/* File: arm/fbinopWide2addr.S */
6586 /*
6587 * Generic 64-bit floating point "/2addr" binary operation. Provide
6588 * an "instr" line that specifies an instruction that performs
6589 * "d2 = d0 op d1".
6590 *
6591 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6592 * div-double/2addr
6593 */
6594 /* binop/2addr vA, vB */
6595 mov r3, rINST, lsr #12 @ r3<- B
6596 mov r9, rINST, lsr #8 @ r9<- A+
6597 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6598 and r9, r9, #15 @ r9<- A
6599 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006600 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006601 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6602 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6603 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006604 fmuld d2, d0, d1 @ d2<- op
6605 GET_INST_OPCODE ip @ extract opcode from rINST
6606 fstd d2, [r9] @ vAA<- d2
6607 GOTO_OPCODE ip @ jump to next instruction
6608
6609
6610/* ------------------------------ */
6611 .balign 128
6612.L_op_div_double_2addr: /* 0xce */
6613/* File: arm/op_div_double_2addr.S */
6614/* File: arm/fbinopWide2addr.S */
6615 /*
6616 * Generic 64-bit floating point "/2addr" binary operation. Provide
6617 * an "instr" line that specifies an instruction that performs
6618 * "d2 = d0 op d1".
6619 *
6620 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6621 * div-double/2addr
6622 */
6623 /* binop/2addr vA, vB */
6624 mov r3, rINST, lsr #12 @ r3<- B
6625 mov r9, rINST, lsr #8 @ r9<- A+
6626 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6627 and r9, r9, #15 @ r9<- A
6628 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006629 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006630 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6631 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6632 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006633 fdivd d2, d0, d1 @ d2<- op
6634 GET_INST_OPCODE ip @ extract opcode from rINST
6635 fstd d2, [r9] @ vAA<- d2
6636 GOTO_OPCODE ip @ jump to next instruction
6637
6638
6639/* ------------------------------ */
6640 .balign 128
6641.L_op_rem_double_2addr: /* 0xcf */
6642/* File: arm/op_rem_double_2addr.S */
6643/* EABI doesn't define a double remainder function, but libm does */
6644/* File: arm/binopWide2addr.S */
6645 /*
6646 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6647 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6648 * This could be an ARM instruction or a function call. (If the result
6649 * comes back in a register other than r0, you can override "result".)
6650 *
6651 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6652 * vCC (r1). Useful for integer division and modulus.
6653 *
6654 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6655 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6656 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6657 * rem-double/2addr
6658 */
6659 /* binop/2addr vA, vB */
6660 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006661 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006662 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006663 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006664 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6665 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6666 .if 0
6667 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6668 beq common_errDivideByZero
6669 .endif
buzbee50cf6002016-02-10 08:59:12 -08006670 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006671 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006672 @ optional op; may set condition codes
6673 bl fmod @ result<- op, r0-r3 changed
6674 GET_INST_OPCODE ip @ extract opcode from rINST
6675 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6676 GOTO_OPCODE ip @ jump to next instruction
6677 /* 12-15 instructions */
6678
6679
6680/* ------------------------------ */
6681 .balign 128
6682.L_op_add_int_lit16: /* 0xd0 */
6683/* File: arm/op_add_int_lit16.S */
6684/* File: arm/binopLit16.S */
6685 /*
6686 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6687 * that specifies an instruction that performs "result = r0 op r1".
6688 * This could be an ARM instruction or a function call. (If the result
6689 * comes back in a register other than r0, you can override "result".)
6690 *
6691 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6692 * vCC (r1). Useful for integer division and modulus.
6693 *
6694 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6695 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6696 */
6697 /* binop/lit16 vA, vB, #+CCCC */
6698 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6699 mov r2, rINST, lsr #12 @ r2<- B
6700 ubfx r9, rINST, #8, #4 @ r9<- A
6701 GET_VREG r0, r2 @ r0<- vB
6702 .if 0
6703 cmp r1, #0 @ is second operand zero?
6704 beq common_errDivideByZero
6705 .endif
6706 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6707
6708 add r0, r0, r1 @ r0<- op, r0-r3 changed
6709 GET_INST_OPCODE ip @ extract opcode from rINST
6710 SET_VREG r0, r9 @ vAA<- r0
6711 GOTO_OPCODE ip @ jump to next instruction
6712 /* 10-13 instructions */
6713
6714
6715/* ------------------------------ */
6716 .balign 128
6717.L_op_rsub_int: /* 0xd1 */
6718/* File: arm/op_rsub_int.S */
6719/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6720/* File: arm/binopLit16.S */
6721 /*
6722 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6723 * that specifies an instruction that performs "result = r0 op r1".
6724 * This could be an ARM instruction or a function call. (If the result
6725 * comes back in a register other than r0, you can override "result".)
6726 *
6727 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6728 * vCC (r1). Useful for integer division and modulus.
6729 *
6730 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6731 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6732 */
6733 /* binop/lit16 vA, vB, #+CCCC */
6734 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6735 mov r2, rINST, lsr #12 @ r2<- B
6736 ubfx r9, rINST, #8, #4 @ r9<- A
6737 GET_VREG r0, r2 @ r0<- vB
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 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6745 GET_INST_OPCODE ip @ extract opcode from rINST
6746 SET_VREG r0, r9 @ vAA<- r0
6747 GOTO_OPCODE ip @ jump to next instruction
6748 /* 10-13 instructions */
6749
6750
6751/* ------------------------------ */
6752 .balign 128
6753.L_op_mul_int_lit16: /* 0xd2 */
6754/* File: arm/op_mul_int_lit16.S */
6755/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6756/* File: arm/binopLit16.S */
6757 /*
6758 * Generic 32-bit "lit16" 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/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6767 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6768 */
6769 /* binop/lit16 vA, vB, #+CCCC */
6770 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6771 mov r2, rINST, lsr #12 @ r2<- B
6772 ubfx r9, rINST, #8, #4 @ r9<- A
6773 GET_VREG r0, r2 @ r0<- vB
6774 .if 0
6775 cmp r1, #0 @ is second operand zero?
6776 beq common_errDivideByZero
6777 .endif
6778 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6779
6780 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6781 GET_INST_OPCODE ip @ extract opcode from rINST
6782 SET_VREG r0, r9 @ vAA<- r0
6783 GOTO_OPCODE ip @ jump to next instruction
6784 /* 10-13 instructions */
6785
6786
6787/* ------------------------------ */
6788 .balign 128
6789.L_op_div_int_lit16: /* 0xd3 */
6790/* File: arm/op_div_int_lit16.S */
6791 /*
6792 * Specialized 32-bit binary operation
6793 *
6794 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6795 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6796 * ARMv7 CPUs that have hardware division support).
6797 *
6798 * div-int/lit16
6799 *
6800 */
6801 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6802 mov r2, rINST, lsr #12 @ r2<- B
6803 ubfx r9, rINST, #8, #4 @ r9<- A
6804 GET_VREG r0, r2 @ r0<- vB
6805 cmp r1, #0 @ is second operand zero?
6806 beq common_errDivideByZero
6807 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6808
6809#ifdef __ARM_ARCH_EXT_IDIV__
6810 sdiv r0, r0, r1 @ r0<- op
6811#else
6812 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6813#endif
6814 GET_INST_OPCODE ip @ extract opcode from rINST
6815 SET_VREG r0, r9 @ vAA<- r0
6816 GOTO_OPCODE ip @ jump to next instruction
6817 /* 10-13 instructions */
6818
6819/* ------------------------------ */
6820 .balign 128
6821.L_op_rem_int_lit16: /* 0xd4 */
6822/* File: arm/op_rem_int_lit16.S */
6823 /*
6824 * Specialized 32-bit binary operation
6825 *
6826 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6827 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6828 * ARMv7 CPUs that have hardware division support).
6829 *
6830 * NOTE: idivmod returns quotient in r0 and remainder in r1
6831 *
6832 * rem-int/lit16
6833 *
6834 */
6835 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6836 mov r2, rINST, lsr #12 @ r2<- B
6837 ubfx r9, rINST, #8, #4 @ r9<- A
6838 GET_VREG r0, r2 @ r0<- vB
6839 cmp r1, #0 @ is second operand zero?
6840 beq common_errDivideByZero
6841 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6842
6843#ifdef __ARM_ARCH_EXT_IDIV__
6844 sdiv r2, r0, r1
6845 mls r1, r1, r2, r0 @ r1<- op
6846#else
6847 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6848#endif
6849 GET_INST_OPCODE ip @ extract opcode from rINST
6850 SET_VREG r1, r9 @ vAA<- r1
6851 GOTO_OPCODE ip @ jump to next instruction
6852 /* 10-13 instructions */
6853
6854/* ------------------------------ */
6855 .balign 128
6856.L_op_and_int_lit16: /* 0xd5 */
6857/* File: arm/op_and_int_lit16.S */
6858/* File: arm/binopLit16.S */
6859 /*
6860 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6861 * that specifies an instruction that performs "result = r0 op r1".
6862 * This could be an ARM instruction or a function call. (If the result
6863 * comes back in a register other than r0, you can override "result".)
6864 *
6865 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6866 * vCC (r1). Useful for integer division and modulus.
6867 *
6868 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6869 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6870 */
6871 /* binop/lit16 vA, vB, #+CCCC */
6872 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6873 mov r2, rINST, lsr #12 @ r2<- B
6874 ubfx r9, rINST, #8, #4 @ r9<- A
6875 GET_VREG r0, r2 @ r0<- vB
6876 .if 0
6877 cmp r1, #0 @ is second operand zero?
6878 beq common_errDivideByZero
6879 .endif
6880 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6881
6882 and r0, r0, r1 @ r0<- op, r0-r3 changed
6883 GET_INST_OPCODE ip @ extract opcode from rINST
6884 SET_VREG r0, r9 @ vAA<- r0
6885 GOTO_OPCODE ip @ jump to next instruction
6886 /* 10-13 instructions */
6887
6888
6889/* ------------------------------ */
6890 .balign 128
6891.L_op_or_int_lit16: /* 0xd6 */
6892/* File: arm/op_or_int_lit16.S */
6893/* File: arm/binopLit16.S */
6894 /*
6895 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6896 * that specifies an instruction that performs "result = r0 op r1".
6897 * This could be an ARM instruction or a function call. (If the result
6898 * comes back in a register other than r0, you can override "result".)
6899 *
6900 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6901 * vCC (r1). Useful for integer division and modulus.
6902 *
6903 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6904 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6905 */
6906 /* binop/lit16 vA, vB, #+CCCC */
6907 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6908 mov r2, rINST, lsr #12 @ r2<- B
6909 ubfx r9, rINST, #8, #4 @ r9<- A
6910 GET_VREG r0, r2 @ r0<- vB
6911 .if 0
6912 cmp r1, #0 @ is second operand zero?
6913 beq common_errDivideByZero
6914 .endif
6915 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6916
6917 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6918 GET_INST_OPCODE ip @ extract opcode from rINST
6919 SET_VREG r0, r9 @ vAA<- r0
6920 GOTO_OPCODE ip @ jump to next instruction
6921 /* 10-13 instructions */
6922
6923
6924/* ------------------------------ */
6925 .balign 128
6926.L_op_xor_int_lit16: /* 0xd7 */
6927/* File: arm/op_xor_int_lit16.S */
6928/* File: arm/binopLit16.S */
6929 /*
6930 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6931 * that specifies an instruction that performs "result = r0 op r1".
6932 * This could be an ARM instruction or a function call. (If the result
6933 * comes back in a register other than r0, you can override "result".)
6934 *
6935 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6936 * vCC (r1). Useful for integer division and modulus.
6937 *
6938 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6939 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6940 */
6941 /* binop/lit16 vA, vB, #+CCCC */
6942 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6943 mov r2, rINST, lsr #12 @ r2<- B
6944 ubfx r9, rINST, #8, #4 @ r9<- A
6945 GET_VREG r0, r2 @ r0<- vB
6946 .if 0
6947 cmp r1, #0 @ is second operand zero?
6948 beq common_errDivideByZero
6949 .endif
6950 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6951
6952 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6953 GET_INST_OPCODE ip @ extract opcode from rINST
6954 SET_VREG r0, r9 @ vAA<- r0
6955 GOTO_OPCODE ip @ jump to next instruction
6956 /* 10-13 instructions */
6957
6958
6959/* ------------------------------ */
6960 .balign 128
6961.L_op_add_int_lit8: /* 0xd8 */
6962/* File: arm/op_add_int_lit8.S */
6963/* File: arm/binopLit8.S */
6964 /*
6965 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6966 * that specifies an instruction that performs "result = r0 op r1".
6967 * This could be an ARM instruction or a function call. (If the result
6968 * comes back in a register other than r0, you can override "result".)
6969 *
6970 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6971 * vCC (r1). Useful for integer division and modulus.
6972 *
6973 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6974 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6975 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6976 */
6977 /* binop/lit8 vAA, vBB, #+CC */
6978 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6979 mov r9, rINST, lsr #8 @ r9<- AA
6980 and r2, r3, #255 @ r2<- BB
6981 GET_VREG r0, r2 @ r0<- vBB
6982 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6983 .if 0
6984 @cmp r1, #0 @ is second operand zero?
6985 beq common_errDivideByZero
6986 .endif
6987 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6988
6989 @ optional op; may set condition codes
6990 add r0, r0, r1 @ r0<- op, r0-r3 changed
6991 GET_INST_OPCODE ip @ extract opcode from rINST
6992 SET_VREG r0, r9 @ vAA<- r0
6993 GOTO_OPCODE ip @ jump to next instruction
6994 /* 10-12 instructions */
6995
6996
6997/* ------------------------------ */
6998 .balign 128
6999.L_op_rsub_int_lit8: /* 0xd9 */
7000/* File: arm/op_rsub_int_lit8.S */
7001/* File: arm/binopLit8.S */
7002 /*
7003 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7004 * that specifies an instruction that performs "result = r0 op r1".
7005 * This could be an ARM instruction or a function call. (If the result
7006 * comes back in a register other than r0, you can override "result".)
7007 *
7008 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7009 * vCC (r1). Useful for integer division and modulus.
7010 *
7011 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7012 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7013 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7014 */
7015 /* binop/lit8 vAA, vBB, #+CC */
7016 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7017 mov r9, rINST, lsr #8 @ r9<- AA
7018 and r2, r3, #255 @ r2<- BB
7019 GET_VREG r0, r2 @ r0<- vBB
7020 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7021 .if 0
7022 @cmp r1, #0 @ is second operand zero?
7023 beq common_errDivideByZero
7024 .endif
7025 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7026
7027 @ optional op; may set condition codes
7028 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
7029 GET_INST_OPCODE ip @ extract opcode from rINST
7030 SET_VREG r0, r9 @ vAA<- r0
7031 GOTO_OPCODE ip @ jump to next instruction
7032 /* 10-12 instructions */
7033
7034
7035/* ------------------------------ */
7036 .balign 128
7037.L_op_mul_int_lit8: /* 0xda */
7038/* File: arm/op_mul_int_lit8.S */
7039/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
7040/* File: arm/binopLit8.S */
7041 /*
7042 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7043 * that specifies an instruction that performs "result = r0 op r1".
7044 * This could be an ARM instruction or a function call. (If the result
7045 * comes back in a register other than r0, you can override "result".)
7046 *
7047 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7048 * vCC (r1). Useful for integer division and modulus.
7049 *
7050 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7051 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7052 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7053 */
7054 /* binop/lit8 vAA, vBB, #+CC */
7055 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7056 mov r9, rINST, lsr #8 @ r9<- AA
7057 and r2, r3, #255 @ r2<- BB
7058 GET_VREG r0, r2 @ r0<- vBB
7059 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7060 .if 0
7061 @cmp r1, #0 @ is second operand zero?
7062 beq common_errDivideByZero
7063 .endif
7064 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7065
7066 @ optional op; may set condition codes
7067 mul r0, r1, r0 @ r0<- op, r0-r3 changed
7068 GET_INST_OPCODE ip @ extract opcode from rINST
7069 SET_VREG r0, r9 @ vAA<- r0
7070 GOTO_OPCODE ip @ jump to next instruction
7071 /* 10-12 instructions */
7072
7073
7074/* ------------------------------ */
7075 .balign 128
7076.L_op_div_int_lit8: /* 0xdb */
7077/* File: arm/op_div_int_lit8.S */
7078 /*
7079 * Specialized 32-bit binary operation
7080 *
7081 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
7082 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
7083 * ARMv7 CPUs that have hardware division support).
7084 *
7085 * div-int/lit8
7086 *
7087 */
7088 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7089 mov r9, rINST, lsr #8 @ r9<- AA
7090 and r2, r3, #255 @ r2<- BB
7091 GET_VREG r0, r2 @ r0<- vBB
7092 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7093 @cmp r1, #0 @ is second operand zero?
7094 beq common_errDivideByZero
7095 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7096
7097#ifdef __ARM_ARCH_EXT_IDIV__
7098 sdiv r0, r0, r1 @ r0<- op
7099#else
7100 bl __aeabi_idiv @ r0<- op, r0-r3 changed
7101#endif
7102 GET_INST_OPCODE ip @ extract opcode from rINST
7103 SET_VREG r0, r9 @ vAA<- r0
7104 GOTO_OPCODE ip @ jump to next instruction
7105 /* 10-12 instructions */
7106
7107/* ------------------------------ */
7108 .balign 128
7109.L_op_rem_int_lit8: /* 0xdc */
7110/* File: arm/op_rem_int_lit8.S */
7111 /*
7112 * Specialized 32-bit binary operation
7113 *
7114 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
7115 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
7116 * ARMv7 CPUs that have hardware division support).
7117 *
7118 * NOTE: idivmod returns quotient in r0 and remainder in r1
7119 *
7120 * rem-int/lit8
7121 *
7122 */
7123 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
7124 mov r9, rINST, lsr #8 @ r9<- AA
7125 and r2, r3, #255 @ r2<- BB
7126 GET_VREG r0, r2 @ r0<- vBB
7127 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7128 @cmp r1, #0 @ is second operand zero?
7129 beq common_errDivideByZero
7130 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7131
7132#ifdef __ARM_ARCH_EXT_IDIV__
7133 sdiv r2, r0, r1
7134 mls r1, r1, r2, r0 @ r1<- op
7135#else
7136 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
7137#endif
7138 GET_INST_OPCODE ip @ extract opcode from rINST
7139 SET_VREG r1, r9 @ vAA<- r1
7140 GOTO_OPCODE ip @ jump to next instruction
7141 /* 10-12 instructions */
7142
7143/* ------------------------------ */
7144 .balign 128
7145.L_op_and_int_lit8: /* 0xdd */
7146/* File: arm/op_and_int_lit8.S */
7147/* File: arm/binopLit8.S */
7148 /*
7149 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7150 * that specifies an instruction that performs "result = r0 op r1".
7151 * This could be an ARM instruction or a function call. (If the result
7152 * comes back in a register other than r0, you can override "result".)
7153 *
7154 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7155 * vCC (r1). Useful for integer division and modulus.
7156 *
7157 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7158 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7159 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7160 */
7161 /* binop/lit8 vAA, vBB, #+CC */
7162 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7163 mov r9, rINST, lsr #8 @ r9<- AA
7164 and r2, r3, #255 @ r2<- BB
7165 GET_VREG r0, r2 @ r0<- vBB
7166 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7167 .if 0
7168 @cmp r1, #0 @ is second operand zero?
7169 beq common_errDivideByZero
7170 .endif
7171 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7172
7173 @ optional op; may set condition codes
7174 and r0, r0, r1 @ r0<- op, r0-r3 changed
7175 GET_INST_OPCODE ip @ extract opcode from rINST
7176 SET_VREG r0, r9 @ vAA<- r0
7177 GOTO_OPCODE ip @ jump to next instruction
7178 /* 10-12 instructions */
7179
7180
7181/* ------------------------------ */
7182 .balign 128
7183.L_op_or_int_lit8: /* 0xde */
7184/* File: arm/op_or_int_lit8.S */
7185/* File: arm/binopLit8.S */
7186 /*
7187 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7188 * that specifies an instruction that performs "result = r0 op r1".
7189 * This could be an ARM instruction or a function call. (If the result
7190 * comes back in a register other than r0, you can override "result".)
7191 *
7192 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7193 * vCC (r1). Useful for integer division and modulus.
7194 *
7195 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7196 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7197 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7198 */
7199 /* binop/lit8 vAA, vBB, #+CC */
7200 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7201 mov r9, rINST, lsr #8 @ r9<- AA
7202 and r2, r3, #255 @ r2<- BB
7203 GET_VREG r0, r2 @ r0<- vBB
7204 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7205 .if 0
7206 @cmp r1, #0 @ is second operand zero?
7207 beq common_errDivideByZero
7208 .endif
7209 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7210
7211 @ optional op; may set condition codes
7212 orr r0, r0, r1 @ r0<- op, r0-r3 changed
7213 GET_INST_OPCODE ip @ extract opcode from rINST
7214 SET_VREG r0, r9 @ vAA<- r0
7215 GOTO_OPCODE ip @ jump to next instruction
7216 /* 10-12 instructions */
7217
7218
7219/* ------------------------------ */
7220 .balign 128
7221.L_op_xor_int_lit8: /* 0xdf */
7222/* File: arm/op_xor_int_lit8.S */
7223/* File: arm/binopLit8.S */
7224 /*
7225 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7226 * that specifies an instruction that performs "result = r0 op r1".
7227 * This could be an ARM instruction or a function call. (If the result
7228 * comes back in a register other than r0, you can override "result".)
7229 *
7230 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7231 * vCC (r1). Useful for integer division and modulus.
7232 *
7233 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7234 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7235 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7236 */
7237 /* binop/lit8 vAA, vBB, #+CC */
7238 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7239 mov r9, rINST, lsr #8 @ r9<- AA
7240 and r2, r3, #255 @ r2<- BB
7241 GET_VREG r0, r2 @ r0<- vBB
7242 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7243 .if 0
7244 @cmp r1, #0 @ is second operand zero?
7245 beq common_errDivideByZero
7246 .endif
7247 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7248
7249 @ optional op; may set condition codes
7250 eor r0, r0, r1 @ r0<- op, r0-r3 changed
7251 GET_INST_OPCODE ip @ extract opcode from rINST
7252 SET_VREG r0, r9 @ vAA<- r0
7253 GOTO_OPCODE ip @ jump to next instruction
7254 /* 10-12 instructions */
7255
7256
7257/* ------------------------------ */
7258 .balign 128
7259.L_op_shl_int_lit8: /* 0xe0 */
7260/* File: arm/op_shl_int_lit8.S */
7261/* File: arm/binopLit8.S */
7262 /*
7263 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7264 * that specifies an instruction that performs "result = r0 op r1".
7265 * This could be an ARM instruction or a function call. (If the result
7266 * comes back in a register other than r0, you can override "result".)
7267 *
7268 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7269 * vCC (r1). Useful for integer division and modulus.
7270 *
7271 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7272 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7273 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7274 */
7275 /* binop/lit8 vAA, vBB, #+CC */
7276 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7277 mov r9, rINST, lsr #8 @ r9<- AA
7278 and r2, r3, #255 @ r2<- BB
7279 GET_VREG r0, r2 @ r0<- vBB
7280 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7281 .if 0
7282 @cmp r1, #0 @ is second operand zero?
7283 beq common_errDivideByZero
7284 .endif
7285 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7286
7287 and r1, r1, #31 @ optional op; may set condition codes
7288 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
7289 GET_INST_OPCODE ip @ extract opcode from rINST
7290 SET_VREG r0, r9 @ vAA<- r0
7291 GOTO_OPCODE ip @ jump to next instruction
7292 /* 10-12 instructions */
7293
7294
7295/* ------------------------------ */
7296 .balign 128
7297.L_op_shr_int_lit8: /* 0xe1 */
7298/* File: arm/op_shr_int_lit8.S */
7299/* File: arm/binopLit8.S */
7300 /*
7301 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7302 * that specifies an instruction that performs "result = r0 op r1".
7303 * This could be an ARM instruction or a function call. (If the result
7304 * comes back in a register other than r0, you can override "result".)
7305 *
7306 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7307 * vCC (r1). Useful for integer division and modulus.
7308 *
7309 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7310 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7311 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7312 */
7313 /* binop/lit8 vAA, vBB, #+CC */
7314 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7315 mov r9, rINST, lsr #8 @ r9<- AA
7316 and r2, r3, #255 @ r2<- BB
7317 GET_VREG r0, r2 @ r0<- vBB
7318 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7319 .if 0
7320 @cmp r1, #0 @ is second operand zero?
7321 beq common_errDivideByZero
7322 .endif
7323 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7324
7325 and r1, r1, #31 @ optional op; may set condition codes
7326 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
7327 GET_INST_OPCODE ip @ extract opcode from rINST
7328 SET_VREG r0, r9 @ vAA<- r0
7329 GOTO_OPCODE ip @ jump to next instruction
7330 /* 10-12 instructions */
7331
7332
7333/* ------------------------------ */
7334 .balign 128
7335.L_op_ushr_int_lit8: /* 0xe2 */
7336/* File: arm/op_ushr_int_lit8.S */
7337/* File: arm/binopLit8.S */
7338 /*
7339 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7340 * that specifies an instruction that performs "result = r0 op r1".
7341 * This could be an ARM instruction or a function call. (If the result
7342 * comes back in a register other than r0, you can override "result".)
7343 *
7344 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7345 * vCC (r1). Useful for integer division and modulus.
7346 *
7347 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7348 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7349 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7350 */
7351 /* binop/lit8 vAA, vBB, #+CC */
7352 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7353 mov r9, rINST, lsr #8 @ r9<- AA
7354 and r2, r3, #255 @ r2<- BB
7355 GET_VREG r0, r2 @ r0<- vBB
7356 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7357 .if 0
7358 @cmp r1, #0 @ is second operand zero?
7359 beq common_errDivideByZero
7360 .endif
7361 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7362
7363 and r1, r1, #31 @ optional op; may set condition codes
7364 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
7365 GET_INST_OPCODE ip @ extract opcode from rINST
7366 SET_VREG r0, r9 @ vAA<- r0
7367 GOTO_OPCODE ip @ jump to next instruction
7368 /* 10-12 instructions */
7369
7370
7371/* ------------------------------ */
7372 .balign 128
7373.L_op_iget_quick: /* 0xe3 */
7374/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007375 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007376 /* op vA, vB, offset@CCCC */
7377 mov r2, rINST, lsr #12 @ r2<- B
7378 FETCH r1, 1 @ r1<- field byte offset
7379 GET_VREG r3, r2 @ r3<- object we're operating on
7380 ubfx r2, rINST, #8, #4 @ r2<- A
7381 cmp r3, #0 @ check object for null
7382 beq common_errNullObject @ object was null
7383 ldr r0, [r3, r1] @ r0<- obj.field
7384 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007385 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007386 GET_INST_OPCODE ip @ extract opcode from rINST
7387 GOTO_OPCODE ip @ jump to next instruction
7388
7389/* ------------------------------ */
7390 .balign 128
7391.L_op_iget_wide_quick: /* 0xe4 */
7392/* File: arm/op_iget_wide_quick.S */
7393 /* iget-wide-quick vA, vB, offset@CCCC */
7394 mov r2, rINST, lsr #12 @ r2<- B
7395 FETCH ip, 1 @ ip<- field byte offset
7396 GET_VREG r3, r2 @ r3<- object we're operating on
7397 ubfx r2, rINST, #8, #4 @ r2<- A
7398 cmp r3, #0 @ check object for null
7399 beq common_errNullObject @ object was null
7400 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
7401 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7402 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
buzbee50cf6002016-02-10 08:59:12 -08007403 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08007404 GET_INST_OPCODE ip @ extract opcode from rINST
7405 stmia r3, {r0-r1} @ fp[A]<- r0/r1
7406 GOTO_OPCODE ip @ jump to next instruction
7407
7408/* ------------------------------ */
7409 .balign 128
7410.L_op_iget_object_quick: /* 0xe5 */
7411/* File: arm/op_iget_object_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007412 /* For: iget-object-quick */
buzbee1452bee2015-03-06 14:43:04 -08007413 /* op vA, vB, offset@CCCC */
7414 mov r2, rINST, lsr #12 @ r2<- B
7415 FETCH r1, 1 @ r1<- field byte offset
buzbeebb6e7262016-01-14 05:34:34 -08007416 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -08007417 GET_VREG r0, r2 @ r0<- object we're operating on
buzbee76833da2016-01-13 13:06:22 -08007418 bl artIGetObjectFromMterp @ (obj, offset)
7419 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
7420 ubfx r2, rINST, #8, #4 @ r2<- A
7421 PREFETCH_INST 2
7422 cmp r3, #0
7423 bne MterpPossibleException @ bail out
buzbee1452bee2015-03-06 14:43:04 -08007424 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
buzbee76833da2016-01-13 13:06:22 -08007425 ADVANCE 2 @ advance rPC
buzbee1452bee2015-03-06 14:43:04 -08007426 GET_INST_OPCODE ip @ extract opcode from rINST
7427 GOTO_OPCODE ip @ jump to next instruction
7428
buzbee1452bee2015-03-06 14:43:04 -08007429/* ------------------------------ */
7430 .balign 128
7431.L_op_iput_quick: /* 0xe6 */
7432/* File: arm/op_iput_quick.S */
7433 /* For: iput-quick, iput-object-quick */
7434 /* op vA, vB, offset@CCCC */
7435 mov r2, rINST, lsr #12 @ r2<- B
7436 FETCH r1, 1 @ r1<- field byte offset
7437 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7438 ubfx r2, rINST, #8, #4 @ r2<- A
7439 cmp r3, #0 @ check object for null
7440 beq common_errNullObject @ object was null
7441 GET_VREG r0, r2 @ r0<- fp[A]
7442 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7443 str r0, [r3, r1] @ obj.field<- r0
7444 GET_INST_OPCODE ip @ extract opcode from rINST
7445 GOTO_OPCODE ip @ jump to next instruction
7446
7447/* ------------------------------ */
7448 .balign 128
7449.L_op_iput_wide_quick: /* 0xe7 */
7450/* File: arm/op_iput_wide_quick.S */
7451 /* iput-wide-quick vA, vB, offset@CCCC */
7452 mov r2, rINST, lsr #12 @ r2<- B
7453 FETCH r3, 1 @ r3<- field byte offset
7454 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7455 ubfx r0, rINST, #8, #4 @ r0<- A
7456 cmp r2, #0 @ check object for null
7457 beq common_errNullObject @ object was null
7458 add r0, rFP, r0, lsl #2 @ r0<- &fp[A]
7459 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7460 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7461 strd r0, [r2, r3] @ obj.field<- r0/r1
7462 GET_INST_OPCODE ip @ extract opcode from rINST
7463 GOTO_OPCODE ip @ jump to next instruction
7464
7465/* ------------------------------ */
7466 .balign 128
7467.L_op_iput_object_quick: /* 0xe8 */
7468/* File: arm/op_iput_object_quick.S */
7469 EXPORT_PC
7470 add r0, rFP, #OFF_FP_SHADOWFRAME
7471 mov r1, rPC
7472 mov r2, rINST
7473 bl MterpIputObjectQuick
7474 cmp r0, #0
7475 beq MterpException
7476 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7477 GET_INST_OPCODE ip @ extract opcode from rINST
7478 GOTO_OPCODE ip @ jump to next instruction
7479
7480/* ------------------------------ */
7481 .balign 128
7482.L_op_invoke_virtual_quick: /* 0xe9 */
7483/* File: arm/op_invoke_virtual_quick.S */
7484/* File: arm/invoke.S */
7485 /*
7486 * Generic invoke handler wrapper.
7487 */
7488 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7489 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7490 .extern MterpInvokeVirtualQuick
7491 EXPORT_PC
7492 mov r0, rSELF
7493 add r1, rFP, #OFF_FP_SHADOWFRAME
7494 mov r2, rPC
7495 mov r3, rINST
7496 bl MterpInvokeVirtualQuick
7497 cmp r0, #0
7498 beq MterpException
7499 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00007500 bl MterpShouldSwitchInterpreters
7501 cmp r0, #0
7502 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08007503 GET_INST_OPCODE ip
7504 GOTO_OPCODE ip
7505
7506
7507
7508/* ------------------------------ */
7509 .balign 128
7510.L_op_invoke_virtual_range_quick: /* 0xea */
7511/* File: arm/op_invoke_virtual_range_quick.S */
7512/* File: arm/invoke.S */
7513 /*
7514 * Generic invoke handler wrapper.
7515 */
7516 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7517 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7518 .extern MterpInvokeVirtualQuickRange
7519 EXPORT_PC
7520 mov r0, rSELF
7521 add r1, rFP, #OFF_FP_SHADOWFRAME
7522 mov r2, rPC
7523 mov r3, rINST
7524 bl MterpInvokeVirtualQuickRange
7525 cmp r0, #0
7526 beq MterpException
7527 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00007528 bl MterpShouldSwitchInterpreters
7529 cmp r0, #0
7530 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08007531 GET_INST_OPCODE ip
7532 GOTO_OPCODE ip
7533
7534
7535
7536/* ------------------------------ */
7537 .balign 128
7538.L_op_iput_boolean_quick: /* 0xeb */
7539/* File: arm/op_iput_boolean_quick.S */
7540/* File: arm/op_iput_quick.S */
7541 /* For: iput-quick, iput-object-quick */
7542 /* op vA, vB, offset@CCCC */
7543 mov r2, rINST, lsr #12 @ r2<- B
7544 FETCH r1, 1 @ r1<- field byte offset
7545 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7546 ubfx r2, rINST, #8, #4 @ r2<- A
7547 cmp r3, #0 @ check object for null
7548 beq common_errNullObject @ object was null
7549 GET_VREG r0, r2 @ r0<- fp[A]
7550 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7551 strb r0, [r3, r1] @ obj.field<- r0
7552 GET_INST_OPCODE ip @ extract opcode from rINST
7553 GOTO_OPCODE ip @ jump to next instruction
7554
7555
7556/* ------------------------------ */
7557 .balign 128
7558.L_op_iput_byte_quick: /* 0xec */
7559/* File: arm/op_iput_byte_quick.S */
7560/* File: arm/op_iput_quick.S */
7561 /* For: iput-quick, iput-object-quick */
7562 /* op vA, vB, offset@CCCC */
7563 mov r2, rINST, lsr #12 @ r2<- B
7564 FETCH r1, 1 @ r1<- field byte offset
7565 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7566 ubfx r2, rINST, #8, #4 @ r2<- A
7567 cmp r3, #0 @ check object for null
7568 beq common_errNullObject @ object was null
7569 GET_VREG r0, r2 @ r0<- fp[A]
7570 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7571 strb r0, [r3, r1] @ obj.field<- r0
7572 GET_INST_OPCODE ip @ extract opcode from rINST
7573 GOTO_OPCODE ip @ jump to next instruction
7574
7575
7576/* ------------------------------ */
7577 .balign 128
7578.L_op_iput_char_quick: /* 0xed */
7579/* File: arm/op_iput_char_quick.S */
7580/* File: arm/op_iput_quick.S */
7581 /* For: iput-quick, iput-object-quick */
7582 /* op vA, vB, offset@CCCC */
7583 mov r2, rINST, lsr #12 @ r2<- B
7584 FETCH r1, 1 @ r1<- field byte offset
7585 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7586 ubfx r2, rINST, #8, #4 @ r2<- A
7587 cmp r3, #0 @ check object for null
7588 beq common_errNullObject @ object was null
7589 GET_VREG r0, r2 @ r0<- fp[A]
7590 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7591 strh r0, [r3, r1] @ obj.field<- r0
7592 GET_INST_OPCODE ip @ extract opcode from rINST
7593 GOTO_OPCODE ip @ jump to next instruction
7594
7595
7596/* ------------------------------ */
7597 .balign 128
7598.L_op_iput_short_quick: /* 0xee */
7599/* File: arm/op_iput_short_quick.S */
7600/* File: arm/op_iput_quick.S */
7601 /* For: iput-quick, iput-object-quick */
7602 /* op vA, vB, offset@CCCC */
7603 mov r2, rINST, lsr #12 @ r2<- B
7604 FETCH r1, 1 @ r1<- field byte offset
7605 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7606 ubfx r2, rINST, #8, #4 @ r2<- A
7607 cmp r3, #0 @ check object for null
7608 beq common_errNullObject @ object was null
7609 GET_VREG r0, r2 @ r0<- fp[A]
7610 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7611 strh r0, [r3, r1] @ obj.field<- r0
7612 GET_INST_OPCODE ip @ extract opcode from rINST
7613 GOTO_OPCODE ip @ jump to next instruction
7614
7615
7616/* ------------------------------ */
7617 .balign 128
7618.L_op_iget_boolean_quick: /* 0xef */
7619/* File: arm/op_iget_boolean_quick.S */
7620/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007621 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007622 /* op vA, vB, offset@CCCC */
7623 mov r2, rINST, lsr #12 @ r2<- B
7624 FETCH r1, 1 @ r1<- field byte offset
7625 GET_VREG r3, r2 @ r3<- object we're operating on
7626 ubfx r2, rINST, #8, #4 @ r2<- A
7627 cmp r3, #0 @ check object for null
7628 beq common_errNullObject @ object was null
7629 ldrb r0, [r3, r1] @ r0<- obj.field
7630 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007631 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007632 GET_INST_OPCODE ip @ extract opcode from rINST
7633 GOTO_OPCODE ip @ jump to next instruction
7634
7635
7636/* ------------------------------ */
7637 .balign 128
7638.L_op_iget_byte_quick: /* 0xf0 */
7639/* File: arm/op_iget_byte_quick.S */
7640/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007641 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007642 /* op vA, vB, offset@CCCC */
7643 mov r2, rINST, lsr #12 @ r2<- B
7644 FETCH r1, 1 @ r1<- field byte offset
7645 GET_VREG r3, r2 @ r3<- object we're operating on
7646 ubfx r2, rINST, #8, #4 @ r2<- A
7647 cmp r3, #0 @ check object for null
7648 beq common_errNullObject @ object was null
7649 ldrsb r0, [r3, r1] @ r0<- obj.field
7650 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007651 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007652 GET_INST_OPCODE ip @ extract opcode from rINST
7653 GOTO_OPCODE ip @ jump to next instruction
7654
7655
7656/* ------------------------------ */
7657 .balign 128
7658.L_op_iget_char_quick: /* 0xf1 */
7659/* File: arm/op_iget_char_quick.S */
7660/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007661 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007662 /* op vA, vB, offset@CCCC */
7663 mov r2, rINST, lsr #12 @ r2<- B
7664 FETCH r1, 1 @ r1<- field byte offset
7665 GET_VREG r3, r2 @ r3<- object we're operating on
7666 ubfx r2, rINST, #8, #4 @ r2<- A
7667 cmp r3, #0 @ check object for null
7668 beq common_errNullObject @ object was null
7669 ldrh r0, [r3, r1] @ r0<- obj.field
7670 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007671 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007672 GET_INST_OPCODE ip @ extract opcode from rINST
7673 GOTO_OPCODE ip @ jump to next instruction
7674
7675
7676/* ------------------------------ */
7677 .balign 128
7678.L_op_iget_short_quick: /* 0xf2 */
7679/* File: arm/op_iget_short_quick.S */
7680/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007681 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007682 /* op vA, vB, offset@CCCC */
7683 mov r2, rINST, lsr #12 @ r2<- B
7684 FETCH r1, 1 @ r1<- field byte offset
7685 GET_VREG r3, r2 @ r3<- object we're operating on
7686 ubfx r2, rINST, #8, #4 @ r2<- A
7687 cmp r3, #0 @ check object for null
7688 beq common_errNullObject @ object was null
7689 ldrsh r0, [r3, r1] @ r0<- obj.field
7690 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007691 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007692 GET_INST_OPCODE ip @ extract opcode from rINST
7693 GOTO_OPCODE ip @ jump to next instruction
7694
7695
7696/* ------------------------------ */
7697 .balign 128
7698.L_op_invoke_lambda: /* 0xf3 */
7699/* Transfer stub to alternate interpreter */
7700 b MterpFallback
7701
7702
7703/* ------------------------------ */
7704 .balign 128
7705.L_op_unused_f4: /* 0xf4 */
7706/* File: arm/op_unused_f4.S */
7707/* File: arm/unused.S */
7708/*
7709 * Bail to reference interpreter to throw.
7710 */
7711 b MterpFallback
7712
7713
7714/* ------------------------------ */
7715 .balign 128
7716.L_op_capture_variable: /* 0xf5 */
7717/* Transfer stub to alternate interpreter */
7718 b MterpFallback
7719
7720
7721/* ------------------------------ */
7722 .balign 128
7723.L_op_create_lambda: /* 0xf6 */
7724/* Transfer stub to alternate interpreter */
7725 b MterpFallback
7726
7727
7728/* ------------------------------ */
7729 .balign 128
7730.L_op_liberate_variable: /* 0xf7 */
7731/* Transfer stub to alternate interpreter */
7732 b MterpFallback
7733
7734
7735/* ------------------------------ */
7736 .balign 128
7737.L_op_box_lambda: /* 0xf8 */
7738/* Transfer stub to alternate interpreter */
7739 b MterpFallback
7740
7741
7742/* ------------------------------ */
7743 .balign 128
7744.L_op_unbox_lambda: /* 0xf9 */
7745/* Transfer stub to alternate interpreter */
7746 b MterpFallback
7747
7748
7749/* ------------------------------ */
7750 .balign 128
7751.L_op_unused_fa: /* 0xfa */
7752/* File: arm/op_unused_fa.S */
7753/* File: arm/unused.S */
7754/*
7755 * Bail to reference interpreter to throw.
7756 */
7757 b MterpFallback
7758
7759
7760/* ------------------------------ */
7761 .balign 128
7762.L_op_unused_fb: /* 0xfb */
7763/* File: arm/op_unused_fb.S */
7764/* File: arm/unused.S */
7765/*
7766 * Bail to reference interpreter to throw.
7767 */
7768 b MterpFallback
7769
7770
7771/* ------------------------------ */
7772 .balign 128
7773.L_op_unused_fc: /* 0xfc */
7774/* File: arm/op_unused_fc.S */
7775/* File: arm/unused.S */
7776/*
7777 * Bail to reference interpreter to throw.
7778 */
7779 b MterpFallback
7780
7781
7782/* ------------------------------ */
7783 .balign 128
7784.L_op_unused_fd: /* 0xfd */
7785/* File: arm/op_unused_fd.S */
7786/* File: arm/unused.S */
7787/*
7788 * Bail to reference interpreter to throw.
7789 */
7790 b MterpFallback
7791
7792
7793/* ------------------------------ */
7794 .balign 128
7795.L_op_unused_fe: /* 0xfe */
7796/* File: arm/op_unused_fe.S */
7797/* File: arm/unused.S */
7798/*
7799 * Bail to reference interpreter to throw.
7800 */
7801 b MterpFallback
7802
7803
7804/* ------------------------------ */
7805 .balign 128
7806.L_op_unused_ff: /* 0xff */
7807/* File: arm/op_unused_ff.S */
7808/* File: arm/unused.S */
7809/*
7810 * Bail to reference interpreter to throw.
7811 */
7812 b MterpFallback
7813
7814
7815 .balign 128
7816 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7817 .global artMterpAsmInstructionEnd
7818artMterpAsmInstructionEnd:
7819
7820/*
7821 * ===========================================================================
7822 * Sister implementations
7823 * ===========================================================================
7824 */
7825 .global artMterpAsmSisterStart
7826 .type artMterpAsmSisterStart, %function
7827 .text
7828 .balign 4
7829artMterpAsmSisterStart:
7830
7831/* continuation for op_cmp_long */
7832
7833.Lop_cmp_long_less:
7834 mvn r1, #0 @ r1<- -1
7835 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7836 @ instead, we just replicate the tail end.
7837 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7838 SET_VREG r1, r9 @ vAA<- r1
7839 GET_INST_OPCODE ip @ extract opcode from rINST
7840 GOTO_OPCODE ip @ jump to next instruction
7841
7842.Lop_cmp_long_greater:
7843 mov r1, #1 @ r1<- 1
7844 @ fall through to _finish
7845
7846.Lop_cmp_long_finish:
7847 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7848 SET_VREG r1, r9 @ vAA<- r1
7849 GET_INST_OPCODE ip @ extract opcode from rINST
7850 GOTO_OPCODE ip @ jump to next instruction
7851
7852/* continuation for op_float_to_long */
7853/*
7854 * Convert the float in r0 to a long in r0/r1.
7855 *
7856 * We have to clip values to long min/max per the specification. The
7857 * expected common case is a "reasonable" value that converts directly
7858 * to modest integer. The EABI convert function isn't doing this for us.
7859 */
7860f2l_doconv:
7861 stmfd sp!, {r4, lr}
7862 mov r1, #0x5f000000 @ (float)maxlong
7863 mov r4, r0
7864 bl __aeabi_fcmpge @ is arg >= maxlong?
7865 cmp r0, #0 @ nonzero == yes
7866 mvnne r0, #0 @ return maxlong (7fffffff)
7867 mvnne r1, #0x80000000
7868 ldmnefd sp!, {r4, pc}
7869
7870 mov r0, r4 @ recover arg
7871 mov r1, #0xdf000000 @ (float)minlong
7872 bl __aeabi_fcmple @ is arg <= minlong?
7873 cmp r0, #0 @ nonzero == yes
7874 movne r0, #0 @ return minlong (80000000)
7875 movne r1, #0x80000000
7876 ldmnefd sp!, {r4, pc}
7877
7878 mov r0, r4 @ recover arg
7879 mov r1, r4
7880 bl __aeabi_fcmpeq @ is arg == self?
7881 cmp r0, #0 @ zero == no
7882 moveq r1, #0 @ return zero for NaN
7883 ldmeqfd sp!, {r4, pc}
7884
7885 mov r0, r4 @ recover arg
7886 bl __aeabi_f2lz @ convert float to long
7887 ldmfd sp!, {r4, pc}
7888
7889/* continuation for op_double_to_long */
7890/*
7891 * Convert the double in r0/r1 to a long in r0/r1.
7892 *
7893 * We have to clip values to long min/max per the specification. The
7894 * expected common case is a "reasonable" value that converts directly
7895 * to modest integer. The EABI convert function isn't doing this for us.
7896 */
7897d2l_doconv:
7898 stmfd sp!, {r4, r5, lr} @ save regs
7899 mov r3, #0x43000000 @ maxlong, as a double (high word)
7900 add r3, #0x00e00000 @ 0x43e00000
7901 mov r2, #0 @ maxlong, as a double (low word)
7902 sub sp, sp, #4 @ align for EABI
7903 mov r4, r0 @ save a copy of r0
7904 mov r5, r1 @ and r1
7905 bl __aeabi_dcmpge @ is arg >= maxlong?
7906 cmp r0, #0 @ nonzero == yes
7907 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7908 mvnne r1, #0x80000000
7909 bne 1f
7910
7911 mov r0, r4 @ recover arg
7912 mov r1, r5
7913 mov r3, #0xc3000000 @ minlong, as a double (high word)
7914 add r3, #0x00e00000 @ 0xc3e00000
7915 mov r2, #0 @ minlong, as a double (low word)
7916 bl __aeabi_dcmple @ is arg <= minlong?
7917 cmp r0, #0 @ nonzero == yes
7918 movne r0, #0 @ return minlong (8000000000000000)
7919 movne r1, #0x80000000
7920 bne 1f
7921
7922 mov r0, r4 @ recover arg
7923 mov r1, r5
7924 mov r2, r4 @ compare against self
7925 mov r3, r5
7926 bl __aeabi_dcmpeq @ is arg == self?
7927 cmp r0, #0 @ zero == no
7928 moveq r1, #0 @ return zero for NaN
7929 beq 1f
7930
7931 mov r0, r4 @ recover arg
7932 mov r1, r5
7933 bl __aeabi_d2lz @ convert double to long
7934
79351:
7936 add sp, sp, #4
7937 ldmfd sp!, {r4, r5, pc}
7938
7939 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7940 .global artMterpAsmSisterEnd
7941artMterpAsmSisterEnd:
7942
7943
7944 .global artMterpAsmAltInstructionStart
7945 .type artMterpAsmAltInstructionStart, %function
7946 .text
7947
7948artMterpAsmAltInstructionStart = .L_ALT_op_nop
7949/* ------------------------------ */
7950 .balign 128
7951.L_ALT_op_nop: /* 0x00 */
7952/* File: arm/alt_stub.S */
7953/*
7954 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7955 * any interesting requests and then jump to the real instruction
7956 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7957 */
7958 .extern MterpCheckBefore
7959 EXPORT_PC
7960 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7961 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7962 mov r0, rSELF
7963 add r1, rFP, #OFF_FP_SHADOWFRAME
7964 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7965
7966/* ------------------------------ */
7967 .balign 128
7968.L_ALT_op_move: /* 0x01 */
7969/* File: arm/alt_stub.S */
7970/*
7971 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7972 * any interesting requests and then jump to the real instruction
7973 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7974 */
7975 .extern MterpCheckBefore
7976 EXPORT_PC
7977 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7978 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7979 mov r0, rSELF
7980 add r1, rFP, #OFF_FP_SHADOWFRAME
7981 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7982
7983/* ------------------------------ */
7984 .balign 128
7985.L_ALT_op_move_from16: /* 0x02 */
7986/* File: arm/alt_stub.S */
7987/*
7988 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7989 * any interesting requests and then jump to the real instruction
7990 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7991 */
7992 .extern MterpCheckBefore
7993 EXPORT_PC
7994 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7995 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7996 mov r0, rSELF
7997 add r1, rFP, #OFF_FP_SHADOWFRAME
7998 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7999
8000/* ------------------------------ */
8001 .balign 128
8002.L_ALT_op_move_16: /* 0x03 */
8003/* File: arm/alt_stub.S */
8004/*
8005 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8006 * any interesting requests and then jump to the real instruction
8007 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8008 */
8009 .extern MterpCheckBefore
8010 EXPORT_PC
8011 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8012 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
8013 mov r0, rSELF
8014 add r1, rFP, #OFF_FP_SHADOWFRAME
8015 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8016
8017/* ------------------------------ */
8018 .balign 128
8019.L_ALT_op_move_wide: /* 0x04 */
8020/* File: arm/alt_stub.S */
8021/*
8022 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8023 * any interesting requests and then jump to the real instruction
8024 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8025 */
8026 .extern MterpCheckBefore
8027 EXPORT_PC
8028 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8029 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
8030 mov r0, rSELF
8031 add r1, rFP, #OFF_FP_SHADOWFRAME
8032 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8033
8034/* ------------------------------ */
8035 .balign 128
8036.L_ALT_op_move_wide_from16: /* 0x05 */
8037/* File: arm/alt_stub.S */
8038/*
8039 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8040 * any interesting requests and then jump to the real instruction
8041 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8042 */
8043 .extern MterpCheckBefore
8044 EXPORT_PC
8045 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8046 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
8047 mov r0, rSELF
8048 add r1, rFP, #OFF_FP_SHADOWFRAME
8049 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8050
8051/* ------------------------------ */
8052 .balign 128
8053.L_ALT_op_move_wide_16: /* 0x06 */
8054/* File: arm/alt_stub.S */
8055/*
8056 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8057 * any interesting requests and then jump to the real instruction
8058 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8059 */
8060 .extern MterpCheckBefore
8061 EXPORT_PC
8062 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8063 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
8064 mov r0, rSELF
8065 add r1, rFP, #OFF_FP_SHADOWFRAME
8066 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8067
8068/* ------------------------------ */
8069 .balign 128
8070.L_ALT_op_move_object: /* 0x07 */
8071/* File: arm/alt_stub.S */
8072/*
8073 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8074 * any interesting requests and then jump to the real instruction
8075 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8076 */
8077 .extern MterpCheckBefore
8078 EXPORT_PC
8079 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8080 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
8081 mov r0, rSELF
8082 add r1, rFP, #OFF_FP_SHADOWFRAME
8083 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8084
8085/* ------------------------------ */
8086 .balign 128
8087.L_ALT_op_move_object_from16: /* 0x08 */
8088/* File: arm/alt_stub.S */
8089/*
8090 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8091 * any interesting requests and then jump to the real instruction
8092 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8093 */
8094 .extern MterpCheckBefore
8095 EXPORT_PC
8096 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8097 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
8098 mov r0, rSELF
8099 add r1, rFP, #OFF_FP_SHADOWFRAME
8100 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8101
8102/* ------------------------------ */
8103 .balign 128
8104.L_ALT_op_move_object_16: /* 0x09 */
8105/* File: arm/alt_stub.S */
8106/*
8107 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8108 * any interesting requests and then jump to the real instruction
8109 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8110 */
8111 .extern MterpCheckBefore
8112 EXPORT_PC
8113 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8114 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
8115 mov r0, rSELF
8116 add r1, rFP, #OFF_FP_SHADOWFRAME
8117 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8118
8119/* ------------------------------ */
8120 .balign 128
8121.L_ALT_op_move_result: /* 0x0a */
8122/* File: arm/alt_stub.S */
8123/*
8124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8125 * any interesting requests and then jump to the real instruction
8126 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8127 */
8128 .extern MterpCheckBefore
8129 EXPORT_PC
8130 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8131 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
8132 mov r0, rSELF
8133 add r1, rFP, #OFF_FP_SHADOWFRAME
8134 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8135
8136/* ------------------------------ */
8137 .balign 128
8138.L_ALT_op_move_result_wide: /* 0x0b */
8139/* File: arm/alt_stub.S */
8140/*
8141 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8142 * any interesting requests and then jump to the real instruction
8143 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8144 */
8145 .extern MterpCheckBefore
8146 EXPORT_PC
8147 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8148 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
8149 mov r0, rSELF
8150 add r1, rFP, #OFF_FP_SHADOWFRAME
8151 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8152
8153/* ------------------------------ */
8154 .balign 128
8155.L_ALT_op_move_result_object: /* 0x0c */
8156/* File: arm/alt_stub.S */
8157/*
8158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8159 * any interesting requests and then jump to the real instruction
8160 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8161 */
8162 .extern MterpCheckBefore
8163 EXPORT_PC
8164 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8165 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
8166 mov r0, rSELF
8167 add r1, rFP, #OFF_FP_SHADOWFRAME
8168 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8169
8170/* ------------------------------ */
8171 .balign 128
8172.L_ALT_op_move_exception: /* 0x0d */
8173/* File: arm/alt_stub.S */
8174/*
8175 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8176 * any interesting requests and then jump to the real instruction
8177 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8178 */
8179 .extern MterpCheckBefore
8180 EXPORT_PC
8181 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8182 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
8183 mov r0, rSELF
8184 add r1, rFP, #OFF_FP_SHADOWFRAME
8185 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8186
8187/* ------------------------------ */
8188 .balign 128
8189.L_ALT_op_return_void: /* 0x0e */
8190/* File: arm/alt_stub.S */
8191/*
8192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8193 * any interesting requests and then jump to the real instruction
8194 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8195 */
8196 .extern MterpCheckBefore
8197 EXPORT_PC
8198 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8199 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
8200 mov r0, rSELF
8201 add r1, rFP, #OFF_FP_SHADOWFRAME
8202 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8203
8204/* ------------------------------ */
8205 .balign 128
8206.L_ALT_op_return: /* 0x0f */
8207/* File: arm/alt_stub.S */
8208/*
8209 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8210 * any interesting requests and then jump to the real instruction
8211 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8212 */
8213 .extern MterpCheckBefore
8214 EXPORT_PC
8215 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8216 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
8217 mov r0, rSELF
8218 add r1, rFP, #OFF_FP_SHADOWFRAME
8219 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8220
8221/* ------------------------------ */
8222 .balign 128
8223.L_ALT_op_return_wide: /* 0x10 */
8224/* File: arm/alt_stub.S */
8225/*
8226 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8227 * any interesting requests and then jump to the real instruction
8228 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8229 */
8230 .extern MterpCheckBefore
8231 EXPORT_PC
8232 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8233 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
8234 mov r0, rSELF
8235 add r1, rFP, #OFF_FP_SHADOWFRAME
8236 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8237
8238/* ------------------------------ */
8239 .balign 128
8240.L_ALT_op_return_object: /* 0x11 */
8241/* File: arm/alt_stub.S */
8242/*
8243 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8244 * any interesting requests and then jump to the real instruction
8245 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8246 */
8247 .extern MterpCheckBefore
8248 EXPORT_PC
8249 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8250 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
8251 mov r0, rSELF
8252 add r1, rFP, #OFF_FP_SHADOWFRAME
8253 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8254
8255/* ------------------------------ */
8256 .balign 128
8257.L_ALT_op_const_4: /* 0x12 */
8258/* File: arm/alt_stub.S */
8259/*
8260 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8261 * any interesting requests and then jump to the real instruction
8262 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8263 */
8264 .extern MterpCheckBefore
8265 EXPORT_PC
8266 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8267 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
8268 mov r0, rSELF
8269 add r1, rFP, #OFF_FP_SHADOWFRAME
8270 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8271
8272/* ------------------------------ */
8273 .balign 128
8274.L_ALT_op_const_16: /* 0x13 */
8275/* File: arm/alt_stub.S */
8276/*
8277 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8278 * any interesting requests and then jump to the real instruction
8279 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8280 */
8281 .extern MterpCheckBefore
8282 EXPORT_PC
8283 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8284 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8285 mov r0, rSELF
8286 add r1, rFP, #OFF_FP_SHADOWFRAME
8287 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8288
8289/* ------------------------------ */
8290 .balign 128
8291.L_ALT_op_const: /* 0x14 */
8292/* File: arm/alt_stub.S */
8293/*
8294 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8295 * any interesting requests and then jump to the real instruction
8296 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8297 */
8298 .extern MterpCheckBefore
8299 EXPORT_PC
8300 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8301 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8302 mov r0, rSELF
8303 add r1, rFP, #OFF_FP_SHADOWFRAME
8304 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8305
8306/* ------------------------------ */
8307 .balign 128
8308.L_ALT_op_const_high16: /* 0x15 */
8309/* File: arm/alt_stub.S */
8310/*
8311 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8312 * any interesting requests and then jump to the real instruction
8313 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8314 */
8315 .extern MterpCheckBefore
8316 EXPORT_PC
8317 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8318 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8319 mov r0, rSELF
8320 add r1, rFP, #OFF_FP_SHADOWFRAME
8321 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8322
8323/* ------------------------------ */
8324 .balign 128
8325.L_ALT_op_const_wide_16: /* 0x16 */
8326/* File: arm/alt_stub.S */
8327/*
8328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8329 * any interesting requests and then jump to the real instruction
8330 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8331 */
8332 .extern MterpCheckBefore
8333 EXPORT_PC
8334 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8335 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8336 mov r0, rSELF
8337 add r1, rFP, #OFF_FP_SHADOWFRAME
8338 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8339
8340/* ------------------------------ */
8341 .balign 128
8342.L_ALT_op_const_wide_32: /* 0x17 */
8343/* File: arm/alt_stub.S */
8344/*
8345 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8346 * any interesting requests and then jump to the real instruction
8347 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8348 */
8349 .extern MterpCheckBefore
8350 EXPORT_PC
8351 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8352 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8353 mov r0, rSELF
8354 add r1, rFP, #OFF_FP_SHADOWFRAME
8355 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8356
8357/* ------------------------------ */
8358 .balign 128
8359.L_ALT_op_const_wide: /* 0x18 */
8360/* File: arm/alt_stub.S */
8361/*
8362 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8363 * any interesting requests and then jump to the real instruction
8364 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8365 */
8366 .extern MterpCheckBefore
8367 EXPORT_PC
8368 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8369 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8370 mov r0, rSELF
8371 add r1, rFP, #OFF_FP_SHADOWFRAME
8372 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8373
8374/* ------------------------------ */
8375 .balign 128
8376.L_ALT_op_const_wide_high16: /* 0x19 */
8377/* File: arm/alt_stub.S */
8378/*
8379 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8380 * any interesting requests and then jump to the real instruction
8381 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8382 */
8383 .extern MterpCheckBefore
8384 EXPORT_PC
8385 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8386 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8387 mov r0, rSELF
8388 add r1, rFP, #OFF_FP_SHADOWFRAME
8389 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8390
8391/* ------------------------------ */
8392 .balign 128
8393.L_ALT_op_const_string: /* 0x1a */
8394/* File: arm/alt_stub.S */
8395/*
8396 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8397 * any interesting requests and then jump to the real instruction
8398 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8399 */
8400 .extern MterpCheckBefore
8401 EXPORT_PC
8402 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8403 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8404 mov r0, rSELF
8405 add r1, rFP, #OFF_FP_SHADOWFRAME
8406 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8407
8408/* ------------------------------ */
8409 .balign 128
8410.L_ALT_op_const_string_jumbo: /* 0x1b */
8411/* File: arm/alt_stub.S */
8412/*
8413 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8414 * any interesting requests and then jump to the real instruction
8415 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8416 */
8417 .extern MterpCheckBefore
8418 EXPORT_PC
8419 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8420 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8421 mov r0, rSELF
8422 add r1, rFP, #OFF_FP_SHADOWFRAME
8423 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8424
8425/* ------------------------------ */
8426 .balign 128
8427.L_ALT_op_const_class: /* 0x1c */
8428/* File: arm/alt_stub.S */
8429/*
8430 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8431 * any interesting requests and then jump to the real instruction
8432 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8433 */
8434 .extern MterpCheckBefore
8435 EXPORT_PC
8436 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8437 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8438 mov r0, rSELF
8439 add r1, rFP, #OFF_FP_SHADOWFRAME
8440 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8441
8442/* ------------------------------ */
8443 .balign 128
8444.L_ALT_op_monitor_enter: /* 0x1d */
8445/* File: arm/alt_stub.S */
8446/*
8447 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8448 * any interesting requests and then jump to the real instruction
8449 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8450 */
8451 .extern MterpCheckBefore
8452 EXPORT_PC
8453 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8454 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8455 mov r0, rSELF
8456 add r1, rFP, #OFF_FP_SHADOWFRAME
8457 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8458
8459/* ------------------------------ */
8460 .balign 128
8461.L_ALT_op_monitor_exit: /* 0x1e */
8462/* File: arm/alt_stub.S */
8463/*
8464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8465 * any interesting requests and then jump to the real instruction
8466 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8467 */
8468 .extern MterpCheckBefore
8469 EXPORT_PC
8470 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8471 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8472 mov r0, rSELF
8473 add r1, rFP, #OFF_FP_SHADOWFRAME
8474 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8475
8476/* ------------------------------ */
8477 .balign 128
8478.L_ALT_op_check_cast: /* 0x1f */
8479/* File: arm/alt_stub.S */
8480/*
8481 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8482 * any interesting requests and then jump to the real instruction
8483 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8484 */
8485 .extern MterpCheckBefore
8486 EXPORT_PC
8487 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8488 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8489 mov r0, rSELF
8490 add r1, rFP, #OFF_FP_SHADOWFRAME
8491 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8492
8493/* ------------------------------ */
8494 .balign 128
8495.L_ALT_op_instance_of: /* 0x20 */
8496/* File: arm/alt_stub.S */
8497/*
8498 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8499 * any interesting requests and then jump to the real instruction
8500 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8501 */
8502 .extern MterpCheckBefore
8503 EXPORT_PC
8504 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8505 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8506 mov r0, rSELF
8507 add r1, rFP, #OFF_FP_SHADOWFRAME
8508 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8509
8510/* ------------------------------ */
8511 .balign 128
8512.L_ALT_op_array_length: /* 0x21 */
8513/* File: arm/alt_stub.S */
8514/*
8515 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8516 * any interesting requests and then jump to the real instruction
8517 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8518 */
8519 .extern MterpCheckBefore
8520 EXPORT_PC
8521 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8522 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8523 mov r0, rSELF
8524 add r1, rFP, #OFF_FP_SHADOWFRAME
8525 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8526
8527/* ------------------------------ */
8528 .balign 128
8529.L_ALT_op_new_instance: /* 0x22 */
8530/* File: arm/alt_stub.S */
8531/*
8532 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8533 * any interesting requests and then jump to the real instruction
8534 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8535 */
8536 .extern MterpCheckBefore
8537 EXPORT_PC
8538 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8539 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8540 mov r0, rSELF
8541 add r1, rFP, #OFF_FP_SHADOWFRAME
8542 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8543
8544/* ------------------------------ */
8545 .balign 128
8546.L_ALT_op_new_array: /* 0x23 */
8547/* File: arm/alt_stub.S */
8548/*
8549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8550 * any interesting requests and then jump to the real instruction
8551 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8552 */
8553 .extern MterpCheckBefore
8554 EXPORT_PC
8555 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8556 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8557 mov r0, rSELF
8558 add r1, rFP, #OFF_FP_SHADOWFRAME
8559 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8560
8561/* ------------------------------ */
8562 .balign 128
8563.L_ALT_op_filled_new_array: /* 0x24 */
8564/* File: arm/alt_stub.S */
8565/*
8566 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8567 * any interesting requests and then jump to the real instruction
8568 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8569 */
8570 .extern MterpCheckBefore
8571 EXPORT_PC
8572 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8573 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8574 mov r0, rSELF
8575 add r1, rFP, #OFF_FP_SHADOWFRAME
8576 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8577
8578/* ------------------------------ */
8579 .balign 128
8580.L_ALT_op_filled_new_array_range: /* 0x25 */
8581/* File: arm/alt_stub.S */
8582/*
8583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8584 * any interesting requests and then jump to the real instruction
8585 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8586 */
8587 .extern MterpCheckBefore
8588 EXPORT_PC
8589 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8590 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8591 mov r0, rSELF
8592 add r1, rFP, #OFF_FP_SHADOWFRAME
8593 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8594
8595/* ------------------------------ */
8596 .balign 128
8597.L_ALT_op_fill_array_data: /* 0x26 */
8598/* File: arm/alt_stub.S */
8599/*
8600 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8601 * any interesting requests and then jump to the real instruction
8602 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8603 */
8604 .extern MterpCheckBefore
8605 EXPORT_PC
8606 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8607 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8608 mov r0, rSELF
8609 add r1, rFP, #OFF_FP_SHADOWFRAME
8610 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8611
8612/* ------------------------------ */
8613 .balign 128
8614.L_ALT_op_throw: /* 0x27 */
8615/* File: arm/alt_stub.S */
8616/*
8617 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8618 * any interesting requests and then jump to the real instruction
8619 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8620 */
8621 .extern MterpCheckBefore
8622 EXPORT_PC
8623 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8624 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8625 mov r0, rSELF
8626 add r1, rFP, #OFF_FP_SHADOWFRAME
8627 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8628
8629/* ------------------------------ */
8630 .balign 128
8631.L_ALT_op_goto: /* 0x28 */
8632/* File: arm/alt_stub.S */
8633/*
8634 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8635 * any interesting requests and then jump to the real instruction
8636 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8637 */
8638 .extern MterpCheckBefore
8639 EXPORT_PC
8640 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8641 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8642 mov r0, rSELF
8643 add r1, rFP, #OFF_FP_SHADOWFRAME
8644 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8645
8646/* ------------------------------ */
8647 .balign 128
8648.L_ALT_op_goto_16: /* 0x29 */
8649/* File: arm/alt_stub.S */
8650/*
8651 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8652 * any interesting requests and then jump to the real instruction
8653 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8654 */
8655 .extern MterpCheckBefore
8656 EXPORT_PC
8657 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8658 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8659 mov r0, rSELF
8660 add r1, rFP, #OFF_FP_SHADOWFRAME
8661 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8662
8663/* ------------------------------ */
8664 .balign 128
8665.L_ALT_op_goto_32: /* 0x2a */
8666/* File: arm/alt_stub.S */
8667/*
8668 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8669 * any interesting requests and then jump to the real instruction
8670 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8671 */
8672 .extern MterpCheckBefore
8673 EXPORT_PC
8674 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8675 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8676 mov r0, rSELF
8677 add r1, rFP, #OFF_FP_SHADOWFRAME
8678 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8679
8680/* ------------------------------ */
8681 .balign 128
8682.L_ALT_op_packed_switch: /* 0x2b */
8683/* File: arm/alt_stub.S */
8684/*
8685 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8686 * any interesting requests and then jump to the real instruction
8687 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8688 */
8689 .extern MterpCheckBefore
8690 EXPORT_PC
8691 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8692 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8693 mov r0, rSELF
8694 add r1, rFP, #OFF_FP_SHADOWFRAME
8695 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8696
8697/* ------------------------------ */
8698 .balign 128
8699.L_ALT_op_sparse_switch: /* 0x2c */
8700/* File: arm/alt_stub.S */
8701/*
8702 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8703 * any interesting requests and then jump to the real instruction
8704 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8705 */
8706 .extern MterpCheckBefore
8707 EXPORT_PC
8708 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8709 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8710 mov r0, rSELF
8711 add r1, rFP, #OFF_FP_SHADOWFRAME
8712 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8713
8714/* ------------------------------ */
8715 .balign 128
8716.L_ALT_op_cmpl_float: /* 0x2d */
8717/* File: arm/alt_stub.S */
8718/*
8719 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8720 * any interesting requests and then jump to the real instruction
8721 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8722 */
8723 .extern MterpCheckBefore
8724 EXPORT_PC
8725 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8726 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8727 mov r0, rSELF
8728 add r1, rFP, #OFF_FP_SHADOWFRAME
8729 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8730
8731/* ------------------------------ */
8732 .balign 128
8733.L_ALT_op_cmpg_float: /* 0x2e */
8734/* File: arm/alt_stub.S */
8735/*
8736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8737 * any interesting requests and then jump to the real instruction
8738 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8739 */
8740 .extern MterpCheckBefore
8741 EXPORT_PC
8742 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8743 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8744 mov r0, rSELF
8745 add r1, rFP, #OFF_FP_SHADOWFRAME
8746 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8747
8748/* ------------------------------ */
8749 .balign 128
8750.L_ALT_op_cmpl_double: /* 0x2f */
8751/* File: arm/alt_stub.S */
8752/*
8753 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8754 * any interesting requests and then jump to the real instruction
8755 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8756 */
8757 .extern MterpCheckBefore
8758 EXPORT_PC
8759 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8760 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8761 mov r0, rSELF
8762 add r1, rFP, #OFF_FP_SHADOWFRAME
8763 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8764
8765/* ------------------------------ */
8766 .balign 128
8767.L_ALT_op_cmpg_double: /* 0x30 */
8768/* File: arm/alt_stub.S */
8769/*
8770 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8771 * any interesting requests and then jump to the real instruction
8772 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8773 */
8774 .extern MterpCheckBefore
8775 EXPORT_PC
8776 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8777 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8778 mov r0, rSELF
8779 add r1, rFP, #OFF_FP_SHADOWFRAME
8780 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8781
8782/* ------------------------------ */
8783 .balign 128
8784.L_ALT_op_cmp_long: /* 0x31 */
8785/* File: arm/alt_stub.S */
8786/*
8787 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8788 * any interesting requests and then jump to the real instruction
8789 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8790 */
8791 .extern MterpCheckBefore
8792 EXPORT_PC
8793 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8794 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8795 mov r0, rSELF
8796 add r1, rFP, #OFF_FP_SHADOWFRAME
8797 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8798
8799/* ------------------------------ */
8800 .balign 128
8801.L_ALT_op_if_eq: /* 0x32 */
8802/* File: arm/alt_stub.S */
8803/*
8804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8805 * any interesting requests and then jump to the real instruction
8806 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8807 */
8808 .extern MterpCheckBefore
8809 EXPORT_PC
8810 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8811 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8812 mov r0, rSELF
8813 add r1, rFP, #OFF_FP_SHADOWFRAME
8814 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8815
8816/* ------------------------------ */
8817 .balign 128
8818.L_ALT_op_if_ne: /* 0x33 */
8819/* File: arm/alt_stub.S */
8820/*
8821 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8822 * any interesting requests and then jump to the real instruction
8823 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8824 */
8825 .extern MterpCheckBefore
8826 EXPORT_PC
8827 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8828 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8829 mov r0, rSELF
8830 add r1, rFP, #OFF_FP_SHADOWFRAME
8831 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8832
8833/* ------------------------------ */
8834 .balign 128
8835.L_ALT_op_if_lt: /* 0x34 */
8836/* File: arm/alt_stub.S */
8837/*
8838 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8839 * any interesting requests and then jump to the real instruction
8840 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8841 */
8842 .extern MterpCheckBefore
8843 EXPORT_PC
8844 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8845 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8846 mov r0, rSELF
8847 add r1, rFP, #OFF_FP_SHADOWFRAME
8848 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8849
8850/* ------------------------------ */
8851 .balign 128
8852.L_ALT_op_if_ge: /* 0x35 */
8853/* File: arm/alt_stub.S */
8854/*
8855 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8856 * any interesting requests and then jump to the real instruction
8857 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8858 */
8859 .extern MterpCheckBefore
8860 EXPORT_PC
8861 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8862 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8863 mov r0, rSELF
8864 add r1, rFP, #OFF_FP_SHADOWFRAME
8865 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8866
8867/* ------------------------------ */
8868 .balign 128
8869.L_ALT_op_if_gt: /* 0x36 */
8870/* File: arm/alt_stub.S */
8871/*
8872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8873 * any interesting requests and then jump to the real instruction
8874 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8875 */
8876 .extern MterpCheckBefore
8877 EXPORT_PC
8878 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8879 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8880 mov r0, rSELF
8881 add r1, rFP, #OFF_FP_SHADOWFRAME
8882 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8883
8884/* ------------------------------ */
8885 .balign 128
8886.L_ALT_op_if_le: /* 0x37 */
8887/* File: arm/alt_stub.S */
8888/*
8889 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8890 * any interesting requests and then jump to the real instruction
8891 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8892 */
8893 .extern MterpCheckBefore
8894 EXPORT_PC
8895 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8896 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8897 mov r0, rSELF
8898 add r1, rFP, #OFF_FP_SHADOWFRAME
8899 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8900
8901/* ------------------------------ */
8902 .balign 128
8903.L_ALT_op_if_eqz: /* 0x38 */
8904/* File: arm/alt_stub.S */
8905/*
8906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8907 * any interesting requests and then jump to the real instruction
8908 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8909 */
8910 .extern MterpCheckBefore
8911 EXPORT_PC
8912 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8913 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8914 mov r0, rSELF
8915 add r1, rFP, #OFF_FP_SHADOWFRAME
8916 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8917
8918/* ------------------------------ */
8919 .balign 128
8920.L_ALT_op_if_nez: /* 0x39 */
8921/* File: arm/alt_stub.S */
8922/*
8923 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8924 * any interesting requests and then jump to the real instruction
8925 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8926 */
8927 .extern MterpCheckBefore
8928 EXPORT_PC
8929 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8930 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8931 mov r0, rSELF
8932 add r1, rFP, #OFF_FP_SHADOWFRAME
8933 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8934
8935/* ------------------------------ */
8936 .balign 128
8937.L_ALT_op_if_ltz: /* 0x3a */
8938/* File: arm/alt_stub.S */
8939/*
8940 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8941 * any interesting requests and then jump to the real instruction
8942 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8943 */
8944 .extern MterpCheckBefore
8945 EXPORT_PC
8946 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8947 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8948 mov r0, rSELF
8949 add r1, rFP, #OFF_FP_SHADOWFRAME
8950 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8951
8952/* ------------------------------ */
8953 .balign 128
8954.L_ALT_op_if_gez: /* 0x3b */
8955/* File: arm/alt_stub.S */
8956/*
8957 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8958 * any interesting requests and then jump to the real instruction
8959 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8960 */
8961 .extern MterpCheckBefore
8962 EXPORT_PC
8963 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8964 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8965 mov r0, rSELF
8966 add r1, rFP, #OFF_FP_SHADOWFRAME
8967 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8968
8969/* ------------------------------ */
8970 .balign 128
8971.L_ALT_op_if_gtz: /* 0x3c */
8972/* File: arm/alt_stub.S */
8973/*
8974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8975 * any interesting requests and then jump to the real instruction
8976 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8977 */
8978 .extern MterpCheckBefore
8979 EXPORT_PC
8980 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8981 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8982 mov r0, rSELF
8983 add r1, rFP, #OFF_FP_SHADOWFRAME
8984 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8985
8986/* ------------------------------ */
8987 .balign 128
8988.L_ALT_op_if_lez: /* 0x3d */
8989/* File: arm/alt_stub.S */
8990/*
8991 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8992 * any interesting requests and then jump to the real instruction
8993 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8994 */
8995 .extern MterpCheckBefore
8996 EXPORT_PC
8997 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8998 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8999 mov r0, rSELF
9000 add r1, rFP, #OFF_FP_SHADOWFRAME
9001 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9002
9003/* ------------------------------ */
9004 .balign 128
9005.L_ALT_op_unused_3e: /* 0x3e */
9006/* File: arm/alt_stub.S */
9007/*
9008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9009 * any interesting requests and then jump to the real instruction
9010 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9011 */
9012 .extern MterpCheckBefore
9013 EXPORT_PC
9014 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9015 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
9016 mov r0, rSELF
9017 add r1, rFP, #OFF_FP_SHADOWFRAME
9018 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9019
9020/* ------------------------------ */
9021 .balign 128
9022.L_ALT_op_unused_3f: /* 0x3f */
9023/* File: arm/alt_stub.S */
9024/*
9025 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9026 * any interesting requests and then jump to the real instruction
9027 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9028 */
9029 .extern MterpCheckBefore
9030 EXPORT_PC
9031 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9032 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
9033 mov r0, rSELF
9034 add r1, rFP, #OFF_FP_SHADOWFRAME
9035 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9036
9037/* ------------------------------ */
9038 .balign 128
9039.L_ALT_op_unused_40: /* 0x40 */
9040/* File: arm/alt_stub.S */
9041/*
9042 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9043 * any interesting requests and then jump to the real instruction
9044 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9045 */
9046 .extern MterpCheckBefore
9047 EXPORT_PC
9048 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9049 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
9050 mov r0, rSELF
9051 add r1, rFP, #OFF_FP_SHADOWFRAME
9052 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9053
9054/* ------------------------------ */
9055 .balign 128
9056.L_ALT_op_unused_41: /* 0x41 */
9057/* File: arm/alt_stub.S */
9058/*
9059 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9060 * any interesting requests and then jump to the real instruction
9061 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9062 */
9063 .extern MterpCheckBefore
9064 EXPORT_PC
9065 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9066 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
9067 mov r0, rSELF
9068 add r1, rFP, #OFF_FP_SHADOWFRAME
9069 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9070
9071/* ------------------------------ */
9072 .balign 128
9073.L_ALT_op_unused_42: /* 0x42 */
9074/* File: arm/alt_stub.S */
9075/*
9076 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9077 * any interesting requests and then jump to the real instruction
9078 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9079 */
9080 .extern MterpCheckBefore
9081 EXPORT_PC
9082 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9083 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
9084 mov r0, rSELF
9085 add r1, rFP, #OFF_FP_SHADOWFRAME
9086 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9087
9088/* ------------------------------ */
9089 .balign 128
9090.L_ALT_op_unused_43: /* 0x43 */
9091/* File: arm/alt_stub.S */
9092/*
9093 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9094 * any interesting requests and then jump to the real instruction
9095 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9096 */
9097 .extern MterpCheckBefore
9098 EXPORT_PC
9099 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9100 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
9101 mov r0, rSELF
9102 add r1, rFP, #OFF_FP_SHADOWFRAME
9103 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9104
9105/* ------------------------------ */
9106 .balign 128
9107.L_ALT_op_aget: /* 0x44 */
9108/* File: arm/alt_stub.S */
9109/*
9110 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9111 * any interesting requests and then jump to the real instruction
9112 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9113 */
9114 .extern MterpCheckBefore
9115 EXPORT_PC
9116 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9117 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
9118 mov r0, rSELF
9119 add r1, rFP, #OFF_FP_SHADOWFRAME
9120 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9121
9122/* ------------------------------ */
9123 .balign 128
9124.L_ALT_op_aget_wide: /* 0x45 */
9125/* File: arm/alt_stub.S */
9126/*
9127 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9128 * any interesting requests and then jump to the real instruction
9129 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9130 */
9131 .extern MterpCheckBefore
9132 EXPORT_PC
9133 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9134 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
9135 mov r0, rSELF
9136 add r1, rFP, #OFF_FP_SHADOWFRAME
9137 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9138
9139/* ------------------------------ */
9140 .balign 128
9141.L_ALT_op_aget_object: /* 0x46 */
9142/* File: arm/alt_stub.S */
9143/*
9144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9145 * any interesting requests and then jump to the real instruction
9146 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9147 */
9148 .extern MterpCheckBefore
9149 EXPORT_PC
9150 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9151 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
9152 mov r0, rSELF
9153 add r1, rFP, #OFF_FP_SHADOWFRAME
9154 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9155
9156/* ------------------------------ */
9157 .balign 128
9158.L_ALT_op_aget_boolean: /* 0x47 */
9159/* File: arm/alt_stub.S */
9160/*
9161 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9162 * any interesting requests and then jump to the real instruction
9163 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9164 */
9165 .extern MterpCheckBefore
9166 EXPORT_PC
9167 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9168 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
9169 mov r0, rSELF
9170 add r1, rFP, #OFF_FP_SHADOWFRAME
9171 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9172
9173/* ------------------------------ */
9174 .balign 128
9175.L_ALT_op_aget_byte: /* 0x48 */
9176/* File: arm/alt_stub.S */
9177/*
9178 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9179 * any interesting requests and then jump to the real instruction
9180 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9181 */
9182 .extern MterpCheckBefore
9183 EXPORT_PC
9184 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9185 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
9186 mov r0, rSELF
9187 add r1, rFP, #OFF_FP_SHADOWFRAME
9188 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9189
9190/* ------------------------------ */
9191 .balign 128
9192.L_ALT_op_aget_char: /* 0x49 */
9193/* File: arm/alt_stub.S */
9194/*
9195 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9196 * any interesting requests and then jump to the real instruction
9197 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9198 */
9199 .extern MterpCheckBefore
9200 EXPORT_PC
9201 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9202 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
9203 mov r0, rSELF
9204 add r1, rFP, #OFF_FP_SHADOWFRAME
9205 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9206
9207/* ------------------------------ */
9208 .balign 128
9209.L_ALT_op_aget_short: /* 0x4a */
9210/* File: arm/alt_stub.S */
9211/*
9212 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9213 * any interesting requests and then jump to the real instruction
9214 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9215 */
9216 .extern MterpCheckBefore
9217 EXPORT_PC
9218 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9219 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
9220 mov r0, rSELF
9221 add r1, rFP, #OFF_FP_SHADOWFRAME
9222 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9223
9224/* ------------------------------ */
9225 .balign 128
9226.L_ALT_op_aput: /* 0x4b */
9227/* File: arm/alt_stub.S */
9228/*
9229 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9230 * any interesting requests and then jump to the real instruction
9231 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9232 */
9233 .extern MterpCheckBefore
9234 EXPORT_PC
9235 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9236 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
9237 mov r0, rSELF
9238 add r1, rFP, #OFF_FP_SHADOWFRAME
9239 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9240
9241/* ------------------------------ */
9242 .balign 128
9243.L_ALT_op_aput_wide: /* 0x4c */
9244/* File: arm/alt_stub.S */
9245/*
9246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9247 * any interesting requests and then jump to the real instruction
9248 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9249 */
9250 .extern MterpCheckBefore
9251 EXPORT_PC
9252 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9253 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
9254 mov r0, rSELF
9255 add r1, rFP, #OFF_FP_SHADOWFRAME
9256 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9257
9258/* ------------------------------ */
9259 .balign 128
9260.L_ALT_op_aput_object: /* 0x4d */
9261/* File: arm/alt_stub.S */
9262/*
9263 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9264 * any interesting requests and then jump to the real instruction
9265 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9266 */
9267 .extern MterpCheckBefore
9268 EXPORT_PC
9269 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9270 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
9271 mov r0, rSELF
9272 add r1, rFP, #OFF_FP_SHADOWFRAME
9273 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9274
9275/* ------------------------------ */
9276 .balign 128
9277.L_ALT_op_aput_boolean: /* 0x4e */
9278/* File: arm/alt_stub.S */
9279/*
9280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9281 * any interesting requests and then jump to the real instruction
9282 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9283 */
9284 .extern MterpCheckBefore
9285 EXPORT_PC
9286 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9287 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9288 mov r0, rSELF
9289 add r1, rFP, #OFF_FP_SHADOWFRAME
9290 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9291
9292/* ------------------------------ */
9293 .balign 128
9294.L_ALT_op_aput_byte: /* 0x4f */
9295/* File: arm/alt_stub.S */
9296/*
9297 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9298 * any interesting requests and then jump to the real instruction
9299 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9300 */
9301 .extern MterpCheckBefore
9302 EXPORT_PC
9303 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9304 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9305 mov r0, rSELF
9306 add r1, rFP, #OFF_FP_SHADOWFRAME
9307 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9308
9309/* ------------------------------ */
9310 .balign 128
9311.L_ALT_op_aput_char: /* 0x50 */
9312/* File: arm/alt_stub.S */
9313/*
9314 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9315 * any interesting requests and then jump to the real instruction
9316 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9317 */
9318 .extern MterpCheckBefore
9319 EXPORT_PC
9320 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9321 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9322 mov r0, rSELF
9323 add r1, rFP, #OFF_FP_SHADOWFRAME
9324 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9325
9326/* ------------------------------ */
9327 .balign 128
9328.L_ALT_op_aput_short: /* 0x51 */
9329/* File: arm/alt_stub.S */
9330/*
9331 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9332 * any interesting requests and then jump to the real instruction
9333 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9334 */
9335 .extern MterpCheckBefore
9336 EXPORT_PC
9337 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9338 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9339 mov r0, rSELF
9340 add r1, rFP, #OFF_FP_SHADOWFRAME
9341 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9342
9343/* ------------------------------ */
9344 .balign 128
9345.L_ALT_op_iget: /* 0x52 */
9346/* File: arm/alt_stub.S */
9347/*
9348 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9349 * any interesting requests and then jump to the real instruction
9350 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9351 */
9352 .extern MterpCheckBefore
9353 EXPORT_PC
9354 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9355 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9356 mov r0, rSELF
9357 add r1, rFP, #OFF_FP_SHADOWFRAME
9358 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9359
9360/* ------------------------------ */
9361 .balign 128
9362.L_ALT_op_iget_wide: /* 0x53 */
9363/* File: arm/alt_stub.S */
9364/*
9365 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9366 * any interesting requests and then jump to the real instruction
9367 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9368 */
9369 .extern MterpCheckBefore
9370 EXPORT_PC
9371 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9372 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9373 mov r0, rSELF
9374 add r1, rFP, #OFF_FP_SHADOWFRAME
9375 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9376
9377/* ------------------------------ */
9378 .balign 128
9379.L_ALT_op_iget_object: /* 0x54 */
9380/* File: arm/alt_stub.S */
9381/*
9382 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9383 * any interesting requests and then jump to the real instruction
9384 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9385 */
9386 .extern MterpCheckBefore
9387 EXPORT_PC
9388 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9389 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9390 mov r0, rSELF
9391 add r1, rFP, #OFF_FP_SHADOWFRAME
9392 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9393
9394/* ------------------------------ */
9395 .balign 128
9396.L_ALT_op_iget_boolean: /* 0x55 */
9397/* File: arm/alt_stub.S */
9398/*
9399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9400 * any interesting requests and then jump to the real instruction
9401 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9402 */
9403 .extern MterpCheckBefore
9404 EXPORT_PC
9405 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9406 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9407 mov r0, rSELF
9408 add r1, rFP, #OFF_FP_SHADOWFRAME
9409 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9410
9411/* ------------------------------ */
9412 .balign 128
9413.L_ALT_op_iget_byte: /* 0x56 */
9414/* File: arm/alt_stub.S */
9415/*
9416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9417 * any interesting requests and then jump to the real instruction
9418 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9419 */
9420 .extern MterpCheckBefore
9421 EXPORT_PC
9422 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9423 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9424 mov r0, rSELF
9425 add r1, rFP, #OFF_FP_SHADOWFRAME
9426 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9427
9428/* ------------------------------ */
9429 .balign 128
9430.L_ALT_op_iget_char: /* 0x57 */
9431/* File: arm/alt_stub.S */
9432/*
9433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9434 * any interesting requests and then jump to the real instruction
9435 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9436 */
9437 .extern MterpCheckBefore
9438 EXPORT_PC
9439 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9440 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9441 mov r0, rSELF
9442 add r1, rFP, #OFF_FP_SHADOWFRAME
9443 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9444
9445/* ------------------------------ */
9446 .balign 128
9447.L_ALT_op_iget_short: /* 0x58 */
9448/* File: arm/alt_stub.S */
9449/*
9450 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9451 * any interesting requests and then jump to the real instruction
9452 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9453 */
9454 .extern MterpCheckBefore
9455 EXPORT_PC
9456 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9457 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9458 mov r0, rSELF
9459 add r1, rFP, #OFF_FP_SHADOWFRAME
9460 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9461
9462/* ------------------------------ */
9463 .balign 128
9464.L_ALT_op_iput: /* 0x59 */
9465/* File: arm/alt_stub.S */
9466/*
9467 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9468 * any interesting requests and then jump to the real instruction
9469 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9470 */
9471 .extern MterpCheckBefore
9472 EXPORT_PC
9473 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9474 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9475 mov r0, rSELF
9476 add r1, rFP, #OFF_FP_SHADOWFRAME
9477 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9478
9479/* ------------------------------ */
9480 .balign 128
9481.L_ALT_op_iput_wide: /* 0x5a */
9482/* File: arm/alt_stub.S */
9483/*
9484 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9485 * any interesting requests and then jump to the real instruction
9486 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9487 */
9488 .extern MterpCheckBefore
9489 EXPORT_PC
9490 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9491 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9492 mov r0, rSELF
9493 add r1, rFP, #OFF_FP_SHADOWFRAME
9494 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9495
9496/* ------------------------------ */
9497 .balign 128
9498.L_ALT_op_iput_object: /* 0x5b */
9499/* File: arm/alt_stub.S */
9500/*
9501 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9502 * any interesting requests and then jump to the real instruction
9503 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9504 */
9505 .extern MterpCheckBefore
9506 EXPORT_PC
9507 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9508 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9509 mov r0, rSELF
9510 add r1, rFP, #OFF_FP_SHADOWFRAME
9511 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9512
9513/* ------------------------------ */
9514 .balign 128
9515.L_ALT_op_iput_boolean: /* 0x5c */
9516/* File: arm/alt_stub.S */
9517/*
9518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9519 * any interesting requests and then jump to the real instruction
9520 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9521 */
9522 .extern MterpCheckBefore
9523 EXPORT_PC
9524 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9525 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9526 mov r0, rSELF
9527 add r1, rFP, #OFF_FP_SHADOWFRAME
9528 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9529
9530/* ------------------------------ */
9531 .balign 128
9532.L_ALT_op_iput_byte: /* 0x5d */
9533/* File: arm/alt_stub.S */
9534/*
9535 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9536 * any interesting requests and then jump to the real instruction
9537 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9538 */
9539 .extern MterpCheckBefore
9540 EXPORT_PC
9541 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9542 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9543 mov r0, rSELF
9544 add r1, rFP, #OFF_FP_SHADOWFRAME
9545 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9546
9547/* ------------------------------ */
9548 .balign 128
9549.L_ALT_op_iput_char: /* 0x5e */
9550/* File: arm/alt_stub.S */
9551/*
9552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9553 * any interesting requests and then jump to the real instruction
9554 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9555 */
9556 .extern MterpCheckBefore
9557 EXPORT_PC
9558 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9559 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9560 mov r0, rSELF
9561 add r1, rFP, #OFF_FP_SHADOWFRAME
9562 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9563
9564/* ------------------------------ */
9565 .balign 128
9566.L_ALT_op_iput_short: /* 0x5f */
9567/* File: arm/alt_stub.S */
9568/*
9569 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9570 * any interesting requests and then jump to the real instruction
9571 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9572 */
9573 .extern MterpCheckBefore
9574 EXPORT_PC
9575 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9576 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9577 mov r0, rSELF
9578 add r1, rFP, #OFF_FP_SHADOWFRAME
9579 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9580
9581/* ------------------------------ */
9582 .balign 128
9583.L_ALT_op_sget: /* 0x60 */
9584/* File: arm/alt_stub.S */
9585/*
9586 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9587 * any interesting requests and then jump to the real instruction
9588 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9589 */
9590 .extern MterpCheckBefore
9591 EXPORT_PC
9592 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9593 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9594 mov r0, rSELF
9595 add r1, rFP, #OFF_FP_SHADOWFRAME
9596 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9597
9598/* ------------------------------ */
9599 .balign 128
9600.L_ALT_op_sget_wide: /* 0x61 */
9601/* File: arm/alt_stub.S */
9602/*
9603 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9604 * any interesting requests and then jump to the real instruction
9605 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9606 */
9607 .extern MterpCheckBefore
9608 EXPORT_PC
9609 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9610 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9611 mov r0, rSELF
9612 add r1, rFP, #OFF_FP_SHADOWFRAME
9613 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9614
9615/* ------------------------------ */
9616 .balign 128
9617.L_ALT_op_sget_object: /* 0x62 */
9618/* File: arm/alt_stub.S */
9619/*
9620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9621 * any interesting requests and then jump to the real instruction
9622 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9623 */
9624 .extern MterpCheckBefore
9625 EXPORT_PC
9626 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9627 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9628 mov r0, rSELF
9629 add r1, rFP, #OFF_FP_SHADOWFRAME
9630 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9631
9632/* ------------------------------ */
9633 .balign 128
9634.L_ALT_op_sget_boolean: /* 0x63 */
9635/* File: arm/alt_stub.S */
9636/*
9637 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9638 * any interesting requests and then jump to the real instruction
9639 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9640 */
9641 .extern MterpCheckBefore
9642 EXPORT_PC
9643 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9644 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9645 mov r0, rSELF
9646 add r1, rFP, #OFF_FP_SHADOWFRAME
9647 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9648
9649/* ------------------------------ */
9650 .balign 128
9651.L_ALT_op_sget_byte: /* 0x64 */
9652/* File: arm/alt_stub.S */
9653/*
9654 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9655 * any interesting requests and then jump to the real instruction
9656 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9657 */
9658 .extern MterpCheckBefore
9659 EXPORT_PC
9660 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9661 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9662 mov r0, rSELF
9663 add r1, rFP, #OFF_FP_SHADOWFRAME
9664 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9665
9666/* ------------------------------ */
9667 .balign 128
9668.L_ALT_op_sget_char: /* 0x65 */
9669/* File: arm/alt_stub.S */
9670/*
9671 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9672 * any interesting requests and then jump to the real instruction
9673 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9674 */
9675 .extern MterpCheckBefore
9676 EXPORT_PC
9677 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9678 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9679 mov r0, rSELF
9680 add r1, rFP, #OFF_FP_SHADOWFRAME
9681 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9682
9683/* ------------------------------ */
9684 .balign 128
9685.L_ALT_op_sget_short: /* 0x66 */
9686/* File: arm/alt_stub.S */
9687/*
9688 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9689 * any interesting requests and then jump to the real instruction
9690 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9691 */
9692 .extern MterpCheckBefore
9693 EXPORT_PC
9694 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9695 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9696 mov r0, rSELF
9697 add r1, rFP, #OFF_FP_SHADOWFRAME
9698 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9699
9700/* ------------------------------ */
9701 .balign 128
9702.L_ALT_op_sput: /* 0x67 */
9703/* File: arm/alt_stub.S */
9704/*
9705 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9706 * any interesting requests and then jump to the real instruction
9707 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9708 */
9709 .extern MterpCheckBefore
9710 EXPORT_PC
9711 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9712 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9713 mov r0, rSELF
9714 add r1, rFP, #OFF_FP_SHADOWFRAME
9715 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9716
9717/* ------------------------------ */
9718 .balign 128
9719.L_ALT_op_sput_wide: /* 0x68 */
9720/* File: arm/alt_stub.S */
9721/*
9722 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9723 * any interesting requests and then jump to the real instruction
9724 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9725 */
9726 .extern MterpCheckBefore
9727 EXPORT_PC
9728 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9729 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9730 mov r0, rSELF
9731 add r1, rFP, #OFF_FP_SHADOWFRAME
9732 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9733
9734/* ------------------------------ */
9735 .balign 128
9736.L_ALT_op_sput_object: /* 0x69 */
9737/* File: arm/alt_stub.S */
9738/*
9739 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9740 * any interesting requests and then jump to the real instruction
9741 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9742 */
9743 .extern MterpCheckBefore
9744 EXPORT_PC
9745 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9746 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9747 mov r0, rSELF
9748 add r1, rFP, #OFF_FP_SHADOWFRAME
9749 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9750
9751/* ------------------------------ */
9752 .balign 128
9753.L_ALT_op_sput_boolean: /* 0x6a */
9754/* File: arm/alt_stub.S */
9755/*
9756 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9757 * any interesting requests and then jump to the real instruction
9758 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9759 */
9760 .extern MterpCheckBefore
9761 EXPORT_PC
9762 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9763 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9764 mov r0, rSELF
9765 add r1, rFP, #OFF_FP_SHADOWFRAME
9766 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9767
9768/* ------------------------------ */
9769 .balign 128
9770.L_ALT_op_sput_byte: /* 0x6b */
9771/* File: arm/alt_stub.S */
9772/*
9773 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9774 * any interesting requests and then jump to the real instruction
9775 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9776 */
9777 .extern MterpCheckBefore
9778 EXPORT_PC
9779 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9780 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9781 mov r0, rSELF
9782 add r1, rFP, #OFF_FP_SHADOWFRAME
9783 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9784
9785/* ------------------------------ */
9786 .balign 128
9787.L_ALT_op_sput_char: /* 0x6c */
9788/* File: arm/alt_stub.S */
9789/*
9790 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9791 * any interesting requests and then jump to the real instruction
9792 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9793 */
9794 .extern MterpCheckBefore
9795 EXPORT_PC
9796 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9797 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9798 mov r0, rSELF
9799 add r1, rFP, #OFF_FP_SHADOWFRAME
9800 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9801
9802/* ------------------------------ */
9803 .balign 128
9804.L_ALT_op_sput_short: /* 0x6d */
9805/* File: arm/alt_stub.S */
9806/*
9807 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9808 * any interesting requests and then jump to the real instruction
9809 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9810 */
9811 .extern MterpCheckBefore
9812 EXPORT_PC
9813 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9814 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9815 mov r0, rSELF
9816 add r1, rFP, #OFF_FP_SHADOWFRAME
9817 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9818
9819/* ------------------------------ */
9820 .balign 128
9821.L_ALT_op_invoke_virtual: /* 0x6e */
9822/* File: arm/alt_stub.S */
9823/*
9824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9825 * any interesting requests and then jump to the real instruction
9826 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9827 */
9828 .extern MterpCheckBefore
9829 EXPORT_PC
9830 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9831 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9832 mov r0, rSELF
9833 add r1, rFP, #OFF_FP_SHADOWFRAME
9834 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9835
9836/* ------------------------------ */
9837 .balign 128
9838.L_ALT_op_invoke_super: /* 0x6f */
9839/* File: arm/alt_stub.S */
9840/*
9841 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9842 * any interesting requests and then jump to the real instruction
9843 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9844 */
9845 .extern MterpCheckBefore
9846 EXPORT_PC
9847 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9848 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9849 mov r0, rSELF
9850 add r1, rFP, #OFF_FP_SHADOWFRAME
9851 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9852
9853/* ------------------------------ */
9854 .balign 128
9855.L_ALT_op_invoke_direct: /* 0x70 */
9856/* File: arm/alt_stub.S */
9857/*
9858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9859 * any interesting requests and then jump to the real instruction
9860 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9861 */
9862 .extern MterpCheckBefore
9863 EXPORT_PC
9864 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9865 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9866 mov r0, rSELF
9867 add r1, rFP, #OFF_FP_SHADOWFRAME
9868 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9869
9870/* ------------------------------ */
9871 .balign 128
9872.L_ALT_op_invoke_static: /* 0x71 */
9873/* File: arm/alt_stub.S */
9874/*
9875 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9876 * any interesting requests and then jump to the real instruction
9877 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9878 */
9879 .extern MterpCheckBefore
9880 EXPORT_PC
9881 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9882 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9883 mov r0, rSELF
9884 add r1, rFP, #OFF_FP_SHADOWFRAME
9885 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9886
9887/* ------------------------------ */
9888 .balign 128
9889.L_ALT_op_invoke_interface: /* 0x72 */
9890/* File: arm/alt_stub.S */
9891/*
9892 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9893 * any interesting requests and then jump to the real instruction
9894 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9895 */
9896 .extern MterpCheckBefore
9897 EXPORT_PC
9898 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9899 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9900 mov r0, rSELF
9901 add r1, rFP, #OFF_FP_SHADOWFRAME
9902 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9903
9904/* ------------------------------ */
9905 .balign 128
9906.L_ALT_op_return_void_no_barrier: /* 0x73 */
9907/* File: arm/alt_stub.S */
9908/*
9909 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9910 * any interesting requests and then jump to the real instruction
9911 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9912 */
9913 .extern MterpCheckBefore
9914 EXPORT_PC
9915 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9916 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9917 mov r0, rSELF
9918 add r1, rFP, #OFF_FP_SHADOWFRAME
9919 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9920
9921/* ------------------------------ */
9922 .balign 128
9923.L_ALT_op_invoke_virtual_range: /* 0x74 */
9924/* File: arm/alt_stub.S */
9925/*
9926 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9927 * any interesting requests and then jump to the real instruction
9928 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9929 */
9930 .extern MterpCheckBefore
9931 EXPORT_PC
9932 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9933 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9934 mov r0, rSELF
9935 add r1, rFP, #OFF_FP_SHADOWFRAME
9936 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9937
9938/* ------------------------------ */
9939 .balign 128
9940.L_ALT_op_invoke_super_range: /* 0x75 */
9941/* File: arm/alt_stub.S */
9942/*
9943 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9944 * any interesting requests and then jump to the real instruction
9945 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9946 */
9947 .extern MterpCheckBefore
9948 EXPORT_PC
9949 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9950 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9951 mov r0, rSELF
9952 add r1, rFP, #OFF_FP_SHADOWFRAME
9953 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9954
9955/* ------------------------------ */
9956 .balign 128
9957.L_ALT_op_invoke_direct_range: /* 0x76 */
9958/* File: arm/alt_stub.S */
9959/*
9960 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9961 * any interesting requests and then jump to the real instruction
9962 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9963 */
9964 .extern MterpCheckBefore
9965 EXPORT_PC
9966 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9967 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9968 mov r0, rSELF
9969 add r1, rFP, #OFF_FP_SHADOWFRAME
9970 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9971
9972/* ------------------------------ */
9973 .balign 128
9974.L_ALT_op_invoke_static_range: /* 0x77 */
9975/* File: arm/alt_stub.S */
9976/*
9977 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9978 * any interesting requests and then jump to the real instruction
9979 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9980 */
9981 .extern MterpCheckBefore
9982 EXPORT_PC
9983 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9984 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9985 mov r0, rSELF
9986 add r1, rFP, #OFF_FP_SHADOWFRAME
9987 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9988
9989/* ------------------------------ */
9990 .balign 128
9991.L_ALT_op_invoke_interface_range: /* 0x78 */
9992/* File: arm/alt_stub.S */
9993/*
9994 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9995 * any interesting requests and then jump to the real instruction
9996 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9997 */
9998 .extern MterpCheckBefore
9999 EXPORT_PC
10000 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10001 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
10002 mov r0, rSELF
10003 add r1, rFP, #OFF_FP_SHADOWFRAME
10004 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10005
10006/* ------------------------------ */
10007 .balign 128
10008.L_ALT_op_unused_79: /* 0x79 */
10009/* File: arm/alt_stub.S */
10010/*
10011 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10012 * any interesting requests and then jump to the real instruction
10013 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10014 */
10015 .extern MterpCheckBefore
10016 EXPORT_PC
10017 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10018 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
10019 mov r0, rSELF
10020 add r1, rFP, #OFF_FP_SHADOWFRAME
10021 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10022
10023/* ------------------------------ */
10024 .balign 128
10025.L_ALT_op_unused_7a: /* 0x7a */
10026/* File: arm/alt_stub.S */
10027/*
10028 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10029 * any interesting requests and then jump to the real instruction
10030 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10031 */
10032 .extern MterpCheckBefore
10033 EXPORT_PC
10034 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10035 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
10036 mov r0, rSELF
10037 add r1, rFP, #OFF_FP_SHADOWFRAME
10038 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10039
10040/* ------------------------------ */
10041 .balign 128
10042.L_ALT_op_neg_int: /* 0x7b */
10043/* File: arm/alt_stub.S */
10044/*
10045 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10046 * any interesting requests and then jump to the real instruction
10047 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10048 */
10049 .extern MterpCheckBefore
10050 EXPORT_PC
10051 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10052 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
10053 mov r0, rSELF
10054 add r1, rFP, #OFF_FP_SHADOWFRAME
10055 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10056
10057/* ------------------------------ */
10058 .balign 128
10059.L_ALT_op_not_int: /* 0x7c */
10060/* File: arm/alt_stub.S */
10061/*
10062 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10063 * any interesting requests and then jump to the real instruction
10064 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10065 */
10066 .extern MterpCheckBefore
10067 EXPORT_PC
10068 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10069 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
10070 mov r0, rSELF
10071 add r1, rFP, #OFF_FP_SHADOWFRAME
10072 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10073
10074/* ------------------------------ */
10075 .balign 128
10076.L_ALT_op_neg_long: /* 0x7d */
10077/* File: arm/alt_stub.S */
10078/*
10079 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10080 * any interesting requests and then jump to the real instruction
10081 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10082 */
10083 .extern MterpCheckBefore
10084 EXPORT_PC
10085 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10086 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
10087 mov r0, rSELF
10088 add r1, rFP, #OFF_FP_SHADOWFRAME
10089 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10090
10091/* ------------------------------ */
10092 .balign 128
10093.L_ALT_op_not_long: /* 0x7e */
10094/* File: arm/alt_stub.S */
10095/*
10096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10097 * any interesting requests and then jump to the real instruction
10098 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10099 */
10100 .extern MterpCheckBefore
10101 EXPORT_PC
10102 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10103 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
10104 mov r0, rSELF
10105 add r1, rFP, #OFF_FP_SHADOWFRAME
10106 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10107
10108/* ------------------------------ */
10109 .balign 128
10110.L_ALT_op_neg_float: /* 0x7f */
10111/* File: arm/alt_stub.S */
10112/*
10113 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10114 * any interesting requests and then jump to the real instruction
10115 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10116 */
10117 .extern MterpCheckBefore
10118 EXPORT_PC
10119 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10120 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
10121 mov r0, rSELF
10122 add r1, rFP, #OFF_FP_SHADOWFRAME
10123 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10124
10125/* ------------------------------ */
10126 .balign 128
10127.L_ALT_op_neg_double: /* 0x80 */
10128/* File: arm/alt_stub.S */
10129/*
10130 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10131 * any interesting requests and then jump to the real instruction
10132 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10133 */
10134 .extern MterpCheckBefore
10135 EXPORT_PC
10136 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10137 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
10138 mov r0, rSELF
10139 add r1, rFP, #OFF_FP_SHADOWFRAME
10140 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10141
10142/* ------------------------------ */
10143 .balign 128
10144.L_ALT_op_int_to_long: /* 0x81 */
10145/* File: arm/alt_stub.S */
10146/*
10147 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10148 * any interesting requests and then jump to the real instruction
10149 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10150 */
10151 .extern MterpCheckBefore
10152 EXPORT_PC
10153 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10154 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
10155 mov r0, rSELF
10156 add r1, rFP, #OFF_FP_SHADOWFRAME
10157 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10158
10159/* ------------------------------ */
10160 .balign 128
10161.L_ALT_op_int_to_float: /* 0x82 */
10162/* File: arm/alt_stub.S */
10163/*
10164 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10165 * any interesting requests and then jump to the real instruction
10166 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10167 */
10168 .extern MterpCheckBefore
10169 EXPORT_PC
10170 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10171 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
10172 mov r0, rSELF
10173 add r1, rFP, #OFF_FP_SHADOWFRAME
10174 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10175
10176/* ------------------------------ */
10177 .balign 128
10178.L_ALT_op_int_to_double: /* 0x83 */
10179/* File: arm/alt_stub.S */
10180/*
10181 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10182 * any interesting requests and then jump to the real instruction
10183 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10184 */
10185 .extern MterpCheckBefore
10186 EXPORT_PC
10187 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10188 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
10189 mov r0, rSELF
10190 add r1, rFP, #OFF_FP_SHADOWFRAME
10191 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10192
10193/* ------------------------------ */
10194 .balign 128
10195.L_ALT_op_long_to_int: /* 0x84 */
10196/* File: arm/alt_stub.S */
10197/*
10198 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10199 * any interesting requests and then jump to the real instruction
10200 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10201 */
10202 .extern MterpCheckBefore
10203 EXPORT_PC
10204 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10205 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
10206 mov r0, rSELF
10207 add r1, rFP, #OFF_FP_SHADOWFRAME
10208 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10209
10210/* ------------------------------ */
10211 .balign 128
10212.L_ALT_op_long_to_float: /* 0x85 */
10213/* File: arm/alt_stub.S */
10214/*
10215 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10216 * any interesting requests and then jump to the real instruction
10217 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10218 */
10219 .extern MterpCheckBefore
10220 EXPORT_PC
10221 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10222 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
10223 mov r0, rSELF
10224 add r1, rFP, #OFF_FP_SHADOWFRAME
10225 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10226
10227/* ------------------------------ */
10228 .balign 128
10229.L_ALT_op_long_to_double: /* 0x86 */
10230/* File: arm/alt_stub.S */
10231/*
10232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10233 * any interesting requests and then jump to the real instruction
10234 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10235 */
10236 .extern MterpCheckBefore
10237 EXPORT_PC
10238 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10239 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
10240 mov r0, rSELF
10241 add r1, rFP, #OFF_FP_SHADOWFRAME
10242 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10243
10244/* ------------------------------ */
10245 .balign 128
10246.L_ALT_op_float_to_int: /* 0x87 */
10247/* File: arm/alt_stub.S */
10248/*
10249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10250 * any interesting requests and then jump to the real instruction
10251 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10252 */
10253 .extern MterpCheckBefore
10254 EXPORT_PC
10255 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10256 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
10257 mov r0, rSELF
10258 add r1, rFP, #OFF_FP_SHADOWFRAME
10259 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10260
10261/* ------------------------------ */
10262 .balign 128
10263.L_ALT_op_float_to_long: /* 0x88 */
10264/* File: arm/alt_stub.S */
10265/*
10266 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10267 * any interesting requests and then jump to the real instruction
10268 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10269 */
10270 .extern MterpCheckBefore
10271 EXPORT_PC
10272 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10273 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10274 mov r0, rSELF
10275 add r1, rFP, #OFF_FP_SHADOWFRAME
10276 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10277
10278/* ------------------------------ */
10279 .balign 128
10280.L_ALT_op_float_to_double: /* 0x89 */
10281/* File: arm/alt_stub.S */
10282/*
10283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10284 * any interesting requests and then jump to the real instruction
10285 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10286 */
10287 .extern MterpCheckBefore
10288 EXPORT_PC
10289 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10290 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10291 mov r0, rSELF
10292 add r1, rFP, #OFF_FP_SHADOWFRAME
10293 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10294
10295/* ------------------------------ */
10296 .balign 128
10297.L_ALT_op_double_to_int: /* 0x8a */
10298/* File: arm/alt_stub.S */
10299/*
10300 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10301 * any interesting requests and then jump to the real instruction
10302 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10303 */
10304 .extern MterpCheckBefore
10305 EXPORT_PC
10306 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10307 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10308 mov r0, rSELF
10309 add r1, rFP, #OFF_FP_SHADOWFRAME
10310 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10311
10312/* ------------------------------ */
10313 .balign 128
10314.L_ALT_op_double_to_long: /* 0x8b */
10315/* File: arm/alt_stub.S */
10316/*
10317 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10318 * any interesting requests and then jump to the real instruction
10319 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10320 */
10321 .extern MterpCheckBefore
10322 EXPORT_PC
10323 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10324 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10325 mov r0, rSELF
10326 add r1, rFP, #OFF_FP_SHADOWFRAME
10327 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10328
10329/* ------------------------------ */
10330 .balign 128
10331.L_ALT_op_double_to_float: /* 0x8c */
10332/* File: arm/alt_stub.S */
10333/*
10334 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10335 * any interesting requests and then jump to the real instruction
10336 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10337 */
10338 .extern MterpCheckBefore
10339 EXPORT_PC
10340 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10341 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10342 mov r0, rSELF
10343 add r1, rFP, #OFF_FP_SHADOWFRAME
10344 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10345
10346/* ------------------------------ */
10347 .balign 128
10348.L_ALT_op_int_to_byte: /* 0x8d */
10349/* File: arm/alt_stub.S */
10350/*
10351 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10352 * any interesting requests and then jump to the real instruction
10353 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10354 */
10355 .extern MterpCheckBefore
10356 EXPORT_PC
10357 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10358 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10359 mov r0, rSELF
10360 add r1, rFP, #OFF_FP_SHADOWFRAME
10361 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10362
10363/* ------------------------------ */
10364 .balign 128
10365.L_ALT_op_int_to_char: /* 0x8e */
10366/* File: arm/alt_stub.S */
10367/*
10368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10369 * any interesting requests and then jump to the real instruction
10370 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10371 */
10372 .extern MterpCheckBefore
10373 EXPORT_PC
10374 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10375 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10376 mov r0, rSELF
10377 add r1, rFP, #OFF_FP_SHADOWFRAME
10378 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10379
10380/* ------------------------------ */
10381 .balign 128
10382.L_ALT_op_int_to_short: /* 0x8f */
10383/* File: arm/alt_stub.S */
10384/*
10385 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10386 * any interesting requests and then jump to the real instruction
10387 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10388 */
10389 .extern MterpCheckBefore
10390 EXPORT_PC
10391 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10392 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10393 mov r0, rSELF
10394 add r1, rFP, #OFF_FP_SHADOWFRAME
10395 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10396
10397/* ------------------------------ */
10398 .balign 128
10399.L_ALT_op_add_int: /* 0x90 */
10400/* File: arm/alt_stub.S */
10401/*
10402 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10403 * any interesting requests and then jump to the real instruction
10404 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10405 */
10406 .extern MterpCheckBefore
10407 EXPORT_PC
10408 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10409 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10410 mov r0, rSELF
10411 add r1, rFP, #OFF_FP_SHADOWFRAME
10412 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10413
10414/* ------------------------------ */
10415 .balign 128
10416.L_ALT_op_sub_int: /* 0x91 */
10417/* File: arm/alt_stub.S */
10418/*
10419 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10420 * any interesting requests and then jump to the real instruction
10421 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10422 */
10423 .extern MterpCheckBefore
10424 EXPORT_PC
10425 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10426 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10427 mov r0, rSELF
10428 add r1, rFP, #OFF_FP_SHADOWFRAME
10429 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10430
10431/* ------------------------------ */
10432 .balign 128
10433.L_ALT_op_mul_int: /* 0x92 */
10434/* File: arm/alt_stub.S */
10435/*
10436 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10437 * any interesting requests and then jump to the real instruction
10438 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10439 */
10440 .extern MterpCheckBefore
10441 EXPORT_PC
10442 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10443 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10444 mov r0, rSELF
10445 add r1, rFP, #OFF_FP_SHADOWFRAME
10446 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10447
10448/* ------------------------------ */
10449 .balign 128
10450.L_ALT_op_div_int: /* 0x93 */
10451/* File: arm/alt_stub.S */
10452/*
10453 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10454 * any interesting requests and then jump to the real instruction
10455 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10456 */
10457 .extern MterpCheckBefore
10458 EXPORT_PC
10459 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10460 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10461 mov r0, rSELF
10462 add r1, rFP, #OFF_FP_SHADOWFRAME
10463 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10464
10465/* ------------------------------ */
10466 .balign 128
10467.L_ALT_op_rem_int: /* 0x94 */
10468/* File: arm/alt_stub.S */
10469/*
10470 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10471 * any interesting requests and then jump to the real instruction
10472 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10473 */
10474 .extern MterpCheckBefore
10475 EXPORT_PC
10476 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10477 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10478 mov r0, rSELF
10479 add r1, rFP, #OFF_FP_SHADOWFRAME
10480 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10481
10482/* ------------------------------ */
10483 .balign 128
10484.L_ALT_op_and_int: /* 0x95 */
10485/* File: arm/alt_stub.S */
10486/*
10487 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10488 * any interesting requests and then jump to the real instruction
10489 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10490 */
10491 .extern MterpCheckBefore
10492 EXPORT_PC
10493 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10494 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10495 mov r0, rSELF
10496 add r1, rFP, #OFF_FP_SHADOWFRAME
10497 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10498
10499/* ------------------------------ */
10500 .balign 128
10501.L_ALT_op_or_int: /* 0x96 */
10502/* File: arm/alt_stub.S */
10503/*
10504 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10505 * any interesting requests and then jump to the real instruction
10506 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10507 */
10508 .extern MterpCheckBefore
10509 EXPORT_PC
10510 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10511 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10512 mov r0, rSELF
10513 add r1, rFP, #OFF_FP_SHADOWFRAME
10514 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10515
10516/* ------------------------------ */
10517 .balign 128
10518.L_ALT_op_xor_int: /* 0x97 */
10519/* File: arm/alt_stub.S */
10520/*
10521 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10522 * any interesting requests and then jump to the real instruction
10523 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10524 */
10525 .extern MterpCheckBefore
10526 EXPORT_PC
10527 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10528 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10529 mov r0, rSELF
10530 add r1, rFP, #OFF_FP_SHADOWFRAME
10531 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10532
10533/* ------------------------------ */
10534 .balign 128
10535.L_ALT_op_shl_int: /* 0x98 */
10536/* File: arm/alt_stub.S */
10537/*
10538 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10539 * any interesting requests and then jump to the real instruction
10540 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10541 */
10542 .extern MterpCheckBefore
10543 EXPORT_PC
10544 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10545 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10546 mov r0, rSELF
10547 add r1, rFP, #OFF_FP_SHADOWFRAME
10548 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10549
10550/* ------------------------------ */
10551 .balign 128
10552.L_ALT_op_shr_int: /* 0x99 */
10553/* File: arm/alt_stub.S */
10554/*
10555 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10556 * any interesting requests and then jump to the real instruction
10557 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10558 */
10559 .extern MterpCheckBefore
10560 EXPORT_PC
10561 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10562 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10563 mov r0, rSELF
10564 add r1, rFP, #OFF_FP_SHADOWFRAME
10565 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10566
10567/* ------------------------------ */
10568 .balign 128
10569.L_ALT_op_ushr_int: /* 0x9a */
10570/* File: arm/alt_stub.S */
10571/*
10572 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10573 * any interesting requests and then jump to the real instruction
10574 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10575 */
10576 .extern MterpCheckBefore
10577 EXPORT_PC
10578 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10579 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10580 mov r0, rSELF
10581 add r1, rFP, #OFF_FP_SHADOWFRAME
10582 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10583
10584/* ------------------------------ */
10585 .balign 128
10586.L_ALT_op_add_long: /* 0x9b */
10587/* File: arm/alt_stub.S */
10588/*
10589 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10590 * any interesting requests and then jump to the real instruction
10591 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10592 */
10593 .extern MterpCheckBefore
10594 EXPORT_PC
10595 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10596 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10597 mov r0, rSELF
10598 add r1, rFP, #OFF_FP_SHADOWFRAME
10599 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10600
10601/* ------------------------------ */
10602 .balign 128
10603.L_ALT_op_sub_long: /* 0x9c */
10604/* File: arm/alt_stub.S */
10605/*
10606 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10607 * any interesting requests and then jump to the real instruction
10608 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10609 */
10610 .extern MterpCheckBefore
10611 EXPORT_PC
10612 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10613 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10614 mov r0, rSELF
10615 add r1, rFP, #OFF_FP_SHADOWFRAME
10616 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10617
10618/* ------------------------------ */
10619 .balign 128
10620.L_ALT_op_mul_long: /* 0x9d */
10621/* File: arm/alt_stub.S */
10622/*
10623 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10624 * any interesting requests and then jump to the real instruction
10625 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10626 */
10627 .extern MterpCheckBefore
10628 EXPORT_PC
10629 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10630 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10631 mov r0, rSELF
10632 add r1, rFP, #OFF_FP_SHADOWFRAME
10633 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10634
10635/* ------------------------------ */
10636 .balign 128
10637.L_ALT_op_div_long: /* 0x9e */
10638/* File: arm/alt_stub.S */
10639/*
10640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10641 * any interesting requests and then jump to the real instruction
10642 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10643 */
10644 .extern MterpCheckBefore
10645 EXPORT_PC
10646 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10647 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10648 mov r0, rSELF
10649 add r1, rFP, #OFF_FP_SHADOWFRAME
10650 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10651
10652/* ------------------------------ */
10653 .balign 128
10654.L_ALT_op_rem_long: /* 0x9f */
10655/* File: arm/alt_stub.S */
10656/*
10657 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10658 * any interesting requests and then jump to the real instruction
10659 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10660 */
10661 .extern MterpCheckBefore
10662 EXPORT_PC
10663 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10664 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10665 mov r0, rSELF
10666 add r1, rFP, #OFF_FP_SHADOWFRAME
10667 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10668
10669/* ------------------------------ */
10670 .balign 128
10671.L_ALT_op_and_long: /* 0xa0 */
10672/* File: arm/alt_stub.S */
10673/*
10674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10675 * any interesting requests and then jump to the real instruction
10676 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10677 */
10678 .extern MterpCheckBefore
10679 EXPORT_PC
10680 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10681 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10682 mov r0, rSELF
10683 add r1, rFP, #OFF_FP_SHADOWFRAME
10684 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10685
10686/* ------------------------------ */
10687 .balign 128
10688.L_ALT_op_or_long: /* 0xa1 */
10689/* File: arm/alt_stub.S */
10690/*
10691 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10692 * any interesting requests and then jump to the real instruction
10693 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10694 */
10695 .extern MterpCheckBefore
10696 EXPORT_PC
10697 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10698 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10699 mov r0, rSELF
10700 add r1, rFP, #OFF_FP_SHADOWFRAME
10701 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10702
10703/* ------------------------------ */
10704 .balign 128
10705.L_ALT_op_xor_long: /* 0xa2 */
10706/* File: arm/alt_stub.S */
10707/*
10708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10709 * any interesting requests and then jump to the real instruction
10710 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10711 */
10712 .extern MterpCheckBefore
10713 EXPORT_PC
10714 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10715 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10716 mov r0, rSELF
10717 add r1, rFP, #OFF_FP_SHADOWFRAME
10718 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10719
10720/* ------------------------------ */
10721 .balign 128
10722.L_ALT_op_shl_long: /* 0xa3 */
10723/* File: arm/alt_stub.S */
10724/*
10725 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10726 * any interesting requests and then jump to the real instruction
10727 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10728 */
10729 .extern MterpCheckBefore
10730 EXPORT_PC
10731 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10732 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10733 mov r0, rSELF
10734 add r1, rFP, #OFF_FP_SHADOWFRAME
10735 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10736
10737/* ------------------------------ */
10738 .balign 128
10739.L_ALT_op_shr_long: /* 0xa4 */
10740/* File: arm/alt_stub.S */
10741/*
10742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10743 * any interesting requests and then jump to the real instruction
10744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10745 */
10746 .extern MterpCheckBefore
10747 EXPORT_PC
10748 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10749 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10750 mov r0, rSELF
10751 add r1, rFP, #OFF_FP_SHADOWFRAME
10752 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10753
10754/* ------------------------------ */
10755 .balign 128
10756.L_ALT_op_ushr_long: /* 0xa5 */
10757/* File: arm/alt_stub.S */
10758/*
10759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10760 * any interesting requests and then jump to the real instruction
10761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10762 */
10763 .extern MterpCheckBefore
10764 EXPORT_PC
10765 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10766 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10767 mov r0, rSELF
10768 add r1, rFP, #OFF_FP_SHADOWFRAME
10769 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10770
10771/* ------------------------------ */
10772 .balign 128
10773.L_ALT_op_add_float: /* 0xa6 */
10774/* File: arm/alt_stub.S */
10775/*
10776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10777 * any interesting requests and then jump to the real instruction
10778 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10779 */
10780 .extern MterpCheckBefore
10781 EXPORT_PC
10782 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10783 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10784 mov r0, rSELF
10785 add r1, rFP, #OFF_FP_SHADOWFRAME
10786 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10787
10788/* ------------------------------ */
10789 .balign 128
10790.L_ALT_op_sub_float: /* 0xa7 */
10791/* File: arm/alt_stub.S */
10792/*
10793 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10794 * any interesting requests and then jump to the real instruction
10795 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10796 */
10797 .extern MterpCheckBefore
10798 EXPORT_PC
10799 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10800 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10801 mov r0, rSELF
10802 add r1, rFP, #OFF_FP_SHADOWFRAME
10803 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10804
10805/* ------------------------------ */
10806 .balign 128
10807.L_ALT_op_mul_float: /* 0xa8 */
10808/* File: arm/alt_stub.S */
10809/*
10810 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10811 * any interesting requests and then jump to the real instruction
10812 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10813 */
10814 .extern MterpCheckBefore
10815 EXPORT_PC
10816 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10817 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10818 mov r0, rSELF
10819 add r1, rFP, #OFF_FP_SHADOWFRAME
10820 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10821
10822/* ------------------------------ */
10823 .balign 128
10824.L_ALT_op_div_float: /* 0xa9 */
10825/* File: arm/alt_stub.S */
10826/*
10827 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10828 * any interesting requests and then jump to the real instruction
10829 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10830 */
10831 .extern MterpCheckBefore
10832 EXPORT_PC
10833 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10834 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10835 mov r0, rSELF
10836 add r1, rFP, #OFF_FP_SHADOWFRAME
10837 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10838
10839/* ------------------------------ */
10840 .balign 128
10841.L_ALT_op_rem_float: /* 0xaa */
10842/* File: arm/alt_stub.S */
10843/*
10844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10845 * any interesting requests and then jump to the real instruction
10846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10847 */
10848 .extern MterpCheckBefore
10849 EXPORT_PC
10850 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10851 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10852 mov r0, rSELF
10853 add r1, rFP, #OFF_FP_SHADOWFRAME
10854 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10855
10856/* ------------------------------ */
10857 .balign 128
10858.L_ALT_op_add_double: /* 0xab */
10859/* File: arm/alt_stub.S */
10860/*
10861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10862 * any interesting requests and then jump to the real instruction
10863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10864 */
10865 .extern MterpCheckBefore
10866 EXPORT_PC
10867 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10868 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10869 mov r0, rSELF
10870 add r1, rFP, #OFF_FP_SHADOWFRAME
10871 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10872
10873/* ------------------------------ */
10874 .balign 128
10875.L_ALT_op_sub_double: /* 0xac */
10876/* File: arm/alt_stub.S */
10877/*
10878 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10879 * any interesting requests and then jump to the real instruction
10880 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10881 */
10882 .extern MterpCheckBefore
10883 EXPORT_PC
10884 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10885 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10886 mov r0, rSELF
10887 add r1, rFP, #OFF_FP_SHADOWFRAME
10888 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10889
10890/* ------------------------------ */
10891 .balign 128
10892.L_ALT_op_mul_double: /* 0xad */
10893/* File: arm/alt_stub.S */
10894/*
10895 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10896 * any interesting requests and then jump to the real instruction
10897 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10898 */
10899 .extern MterpCheckBefore
10900 EXPORT_PC
10901 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10902 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10903 mov r0, rSELF
10904 add r1, rFP, #OFF_FP_SHADOWFRAME
10905 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10906
10907/* ------------------------------ */
10908 .balign 128
10909.L_ALT_op_div_double: /* 0xae */
10910/* File: arm/alt_stub.S */
10911/*
10912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10913 * any interesting requests and then jump to the real instruction
10914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10915 */
10916 .extern MterpCheckBefore
10917 EXPORT_PC
10918 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10919 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10920 mov r0, rSELF
10921 add r1, rFP, #OFF_FP_SHADOWFRAME
10922 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10923
10924/* ------------------------------ */
10925 .balign 128
10926.L_ALT_op_rem_double: /* 0xaf */
10927/* File: arm/alt_stub.S */
10928/*
10929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10930 * any interesting requests and then jump to the real instruction
10931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10932 */
10933 .extern MterpCheckBefore
10934 EXPORT_PC
10935 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10936 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10937 mov r0, rSELF
10938 add r1, rFP, #OFF_FP_SHADOWFRAME
10939 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10940
10941/* ------------------------------ */
10942 .balign 128
10943.L_ALT_op_add_int_2addr: /* 0xb0 */
10944/* File: arm/alt_stub.S */
10945/*
10946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10947 * any interesting requests and then jump to the real instruction
10948 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10949 */
10950 .extern MterpCheckBefore
10951 EXPORT_PC
10952 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10953 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10954 mov r0, rSELF
10955 add r1, rFP, #OFF_FP_SHADOWFRAME
10956 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10957
10958/* ------------------------------ */
10959 .balign 128
10960.L_ALT_op_sub_int_2addr: /* 0xb1 */
10961/* File: arm/alt_stub.S */
10962/*
10963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10964 * any interesting requests and then jump to the real instruction
10965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10966 */
10967 .extern MterpCheckBefore
10968 EXPORT_PC
10969 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10970 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10971 mov r0, rSELF
10972 add r1, rFP, #OFF_FP_SHADOWFRAME
10973 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10974
10975/* ------------------------------ */
10976 .balign 128
10977.L_ALT_op_mul_int_2addr: /* 0xb2 */
10978/* File: arm/alt_stub.S */
10979/*
10980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10981 * any interesting requests and then jump to the real instruction
10982 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10983 */
10984 .extern MterpCheckBefore
10985 EXPORT_PC
10986 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10987 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10988 mov r0, rSELF
10989 add r1, rFP, #OFF_FP_SHADOWFRAME
10990 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10991
10992/* ------------------------------ */
10993 .balign 128
10994.L_ALT_op_div_int_2addr: /* 0xb3 */
10995/* File: arm/alt_stub.S */
10996/*
10997 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10998 * any interesting requests and then jump to the real instruction
10999 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11000 */
11001 .extern MterpCheckBefore
11002 EXPORT_PC
11003 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11004 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
11005 mov r0, rSELF
11006 add r1, rFP, #OFF_FP_SHADOWFRAME
11007 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11008
11009/* ------------------------------ */
11010 .balign 128
11011.L_ALT_op_rem_int_2addr: /* 0xb4 */
11012/* File: arm/alt_stub.S */
11013/*
11014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11015 * any interesting requests and then jump to the real instruction
11016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11017 */
11018 .extern MterpCheckBefore
11019 EXPORT_PC
11020 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11021 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
11022 mov r0, rSELF
11023 add r1, rFP, #OFF_FP_SHADOWFRAME
11024 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11025
11026/* ------------------------------ */
11027 .balign 128
11028.L_ALT_op_and_int_2addr: /* 0xb5 */
11029/* File: arm/alt_stub.S */
11030/*
11031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11032 * any interesting requests and then jump to the real instruction
11033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11034 */
11035 .extern MterpCheckBefore
11036 EXPORT_PC
11037 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11038 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
11039 mov r0, rSELF
11040 add r1, rFP, #OFF_FP_SHADOWFRAME
11041 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11042
11043/* ------------------------------ */
11044 .balign 128
11045.L_ALT_op_or_int_2addr: /* 0xb6 */
11046/* File: arm/alt_stub.S */
11047/*
11048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11049 * any interesting requests and then jump to the real instruction
11050 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11051 */
11052 .extern MterpCheckBefore
11053 EXPORT_PC
11054 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11055 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
11056 mov r0, rSELF
11057 add r1, rFP, #OFF_FP_SHADOWFRAME
11058 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11059
11060/* ------------------------------ */
11061 .balign 128
11062.L_ALT_op_xor_int_2addr: /* 0xb7 */
11063/* File: arm/alt_stub.S */
11064/*
11065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11066 * any interesting requests and then jump to the real instruction
11067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11068 */
11069 .extern MterpCheckBefore
11070 EXPORT_PC
11071 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11072 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
11073 mov r0, rSELF
11074 add r1, rFP, #OFF_FP_SHADOWFRAME
11075 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11076
11077/* ------------------------------ */
11078 .balign 128
11079.L_ALT_op_shl_int_2addr: /* 0xb8 */
11080/* File: arm/alt_stub.S */
11081/*
11082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11083 * any interesting requests and then jump to the real instruction
11084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11085 */
11086 .extern MterpCheckBefore
11087 EXPORT_PC
11088 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11089 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
11090 mov r0, rSELF
11091 add r1, rFP, #OFF_FP_SHADOWFRAME
11092 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11093
11094/* ------------------------------ */
11095 .balign 128
11096.L_ALT_op_shr_int_2addr: /* 0xb9 */
11097/* File: arm/alt_stub.S */
11098/*
11099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11100 * any interesting requests and then jump to the real instruction
11101 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11102 */
11103 .extern MterpCheckBefore
11104 EXPORT_PC
11105 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11106 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
11107 mov r0, rSELF
11108 add r1, rFP, #OFF_FP_SHADOWFRAME
11109 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11110
11111/* ------------------------------ */
11112 .balign 128
11113.L_ALT_op_ushr_int_2addr: /* 0xba */
11114/* File: arm/alt_stub.S */
11115/*
11116 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11117 * any interesting requests and then jump to the real instruction
11118 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11119 */
11120 .extern MterpCheckBefore
11121 EXPORT_PC
11122 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11123 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
11124 mov r0, rSELF
11125 add r1, rFP, #OFF_FP_SHADOWFRAME
11126 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11127
11128/* ------------------------------ */
11129 .balign 128
11130.L_ALT_op_add_long_2addr: /* 0xbb */
11131/* File: arm/alt_stub.S */
11132/*
11133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11134 * any interesting requests and then jump to the real instruction
11135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11136 */
11137 .extern MterpCheckBefore
11138 EXPORT_PC
11139 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11140 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
11141 mov r0, rSELF
11142 add r1, rFP, #OFF_FP_SHADOWFRAME
11143 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11144
11145/* ------------------------------ */
11146 .balign 128
11147.L_ALT_op_sub_long_2addr: /* 0xbc */
11148/* File: arm/alt_stub.S */
11149/*
11150 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11151 * any interesting requests and then jump to the real instruction
11152 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11153 */
11154 .extern MterpCheckBefore
11155 EXPORT_PC
11156 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11157 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
11158 mov r0, rSELF
11159 add r1, rFP, #OFF_FP_SHADOWFRAME
11160 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11161
11162/* ------------------------------ */
11163 .balign 128
11164.L_ALT_op_mul_long_2addr: /* 0xbd */
11165/* File: arm/alt_stub.S */
11166/*
11167 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11168 * any interesting requests and then jump to the real instruction
11169 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11170 */
11171 .extern MterpCheckBefore
11172 EXPORT_PC
11173 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11174 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
11175 mov r0, rSELF
11176 add r1, rFP, #OFF_FP_SHADOWFRAME
11177 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11178
11179/* ------------------------------ */
11180 .balign 128
11181.L_ALT_op_div_long_2addr: /* 0xbe */
11182/* File: arm/alt_stub.S */
11183/*
11184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11185 * any interesting requests and then jump to the real instruction
11186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11187 */
11188 .extern MterpCheckBefore
11189 EXPORT_PC
11190 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11191 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
11192 mov r0, rSELF
11193 add r1, rFP, #OFF_FP_SHADOWFRAME
11194 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11195
11196/* ------------------------------ */
11197 .balign 128
11198.L_ALT_op_rem_long_2addr: /* 0xbf */
11199/* File: arm/alt_stub.S */
11200/*
11201 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11202 * any interesting requests and then jump to the real instruction
11203 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11204 */
11205 .extern MterpCheckBefore
11206 EXPORT_PC
11207 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11208 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
11209 mov r0, rSELF
11210 add r1, rFP, #OFF_FP_SHADOWFRAME
11211 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11212
11213/* ------------------------------ */
11214 .balign 128
11215.L_ALT_op_and_long_2addr: /* 0xc0 */
11216/* File: arm/alt_stub.S */
11217/*
11218 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11219 * any interesting requests and then jump to the real instruction
11220 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11221 */
11222 .extern MterpCheckBefore
11223 EXPORT_PC
11224 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11225 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
11226 mov r0, rSELF
11227 add r1, rFP, #OFF_FP_SHADOWFRAME
11228 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11229
11230/* ------------------------------ */
11231 .balign 128
11232.L_ALT_op_or_long_2addr: /* 0xc1 */
11233/* File: arm/alt_stub.S */
11234/*
11235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11236 * any interesting requests and then jump to the real instruction
11237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11238 */
11239 .extern MterpCheckBefore
11240 EXPORT_PC
11241 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11242 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
11243 mov r0, rSELF
11244 add r1, rFP, #OFF_FP_SHADOWFRAME
11245 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11246
11247/* ------------------------------ */
11248 .balign 128
11249.L_ALT_op_xor_long_2addr: /* 0xc2 */
11250/* File: arm/alt_stub.S */
11251/*
11252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11253 * any interesting requests and then jump to the real instruction
11254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11255 */
11256 .extern MterpCheckBefore
11257 EXPORT_PC
11258 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11259 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
11260 mov r0, rSELF
11261 add r1, rFP, #OFF_FP_SHADOWFRAME
11262 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11263
11264/* ------------------------------ */
11265 .balign 128
11266.L_ALT_op_shl_long_2addr: /* 0xc3 */
11267/* File: arm/alt_stub.S */
11268/*
11269 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11270 * any interesting requests and then jump to the real instruction
11271 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11272 */
11273 .extern MterpCheckBefore
11274 EXPORT_PC
11275 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11276 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11277 mov r0, rSELF
11278 add r1, rFP, #OFF_FP_SHADOWFRAME
11279 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11280
11281/* ------------------------------ */
11282 .balign 128
11283.L_ALT_op_shr_long_2addr: /* 0xc4 */
11284/* File: arm/alt_stub.S */
11285/*
11286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11287 * any interesting requests and then jump to the real instruction
11288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11289 */
11290 .extern MterpCheckBefore
11291 EXPORT_PC
11292 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11293 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11294 mov r0, rSELF
11295 add r1, rFP, #OFF_FP_SHADOWFRAME
11296 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11297
11298/* ------------------------------ */
11299 .balign 128
11300.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11301/* File: arm/alt_stub.S */
11302/*
11303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11304 * any interesting requests and then jump to the real instruction
11305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11306 */
11307 .extern MterpCheckBefore
11308 EXPORT_PC
11309 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11310 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11311 mov r0, rSELF
11312 add r1, rFP, #OFF_FP_SHADOWFRAME
11313 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11314
11315/* ------------------------------ */
11316 .balign 128
11317.L_ALT_op_add_float_2addr: /* 0xc6 */
11318/* File: arm/alt_stub.S */
11319/*
11320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11321 * any interesting requests and then jump to the real instruction
11322 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11323 */
11324 .extern MterpCheckBefore
11325 EXPORT_PC
11326 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11327 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11328 mov r0, rSELF
11329 add r1, rFP, #OFF_FP_SHADOWFRAME
11330 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11331
11332/* ------------------------------ */
11333 .balign 128
11334.L_ALT_op_sub_float_2addr: /* 0xc7 */
11335/* File: arm/alt_stub.S */
11336/*
11337 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11338 * any interesting requests and then jump to the real instruction
11339 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11340 */
11341 .extern MterpCheckBefore
11342 EXPORT_PC
11343 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11344 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11345 mov r0, rSELF
11346 add r1, rFP, #OFF_FP_SHADOWFRAME
11347 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11348
11349/* ------------------------------ */
11350 .balign 128
11351.L_ALT_op_mul_float_2addr: /* 0xc8 */
11352/* File: arm/alt_stub.S */
11353/*
11354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11355 * any interesting requests and then jump to the real instruction
11356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11357 */
11358 .extern MterpCheckBefore
11359 EXPORT_PC
11360 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11361 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11362 mov r0, rSELF
11363 add r1, rFP, #OFF_FP_SHADOWFRAME
11364 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11365
11366/* ------------------------------ */
11367 .balign 128
11368.L_ALT_op_div_float_2addr: /* 0xc9 */
11369/* File: arm/alt_stub.S */
11370/*
11371 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11372 * any interesting requests and then jump to the real instruction
11373 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11374 */
11375 .extern MterpCheckBefore
11376 EXPORT_PC
11377 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11378 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11379 mov r0, rSELF
11380 add r1, rFP, #OFF_FP_SHADOWFRAME
11381 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11382
11383/* ------------------------------ */
11384 .balign 128
11385.L_ALT_op_rem_float_2addr: /* 0xca */
11386/* File: arm/alt_stub.S */
11387/*
11388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11389 * any interesting requests and then jump to the real instruction
11390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11391 */
11392 .extern MterpCheckBefore
11393 EXPORT_PC
11394 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11395 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11396 mov r0, rSELF
11397 add r1, rFP, #OFF_FP_SHADOWFRAME
11398 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11399
11400/* ------------------------------ */
11401 .balign 128
11402.L_ALT_op_add_double_2addr: /* 0xcb */
11403/* File: arm/alt_stub.S */
11404/*
11405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11406 * any interesting requests and then jump to the real instruction
11407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11408 */
11409 .extern MterpCheckBefore
11410 EXPORT_PC
11411 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11412 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11413 mov r0, rSELF
11414 add r1, rFP, #OFF_FP_SHADOWFRAME
11415 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11416
11417/* ------------------------------ */
11418 .balign 128
11419.L_ALT_op_sub_double_2addr: /* 0xcc */
11420/* File: arm/alt_stub.S */
11421/*
11422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11423 * any interesting requests and then jump to the real instruction
11424 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11425 */
11426 .extern MterpCheckBefore
11427 EXPORT_PC
11428 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11429 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11430 mov r0, rSELF
11431 add r1, rFP, #OFF_FP_SHADOWFRAME
11432 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11433
11434/* ------------------------------ */
11435 .balign 128
11436.L_ALT_op_mul_double_2addr: /* 0xcd */
11437/* File: arm/alt_stub.S */
11438/*
11439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11440 * any interesting requests and then jump to the real instruction
11441 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11442 */
11443 .extern MterpCheckBefore
11444 EXPORT_PC
11445 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11446 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11447 mov r0, rSELF
11448 add r1, rFP, #OFF_FP_SHADOWFRAME
11449 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11450
11451/* ------------------------------ */
11452 .balign 128
11453.L_ALT_op_div_double_2addr: /* 0xce */
11454/* File: arm/alt_stub.S */
11455/*
11456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11457 * any interesting requests and then jump to the real instruction
11458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11459 */
11460 .extern MterpCheckBefore
11461 EXPORT_PC
11462 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11463 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11464 mov r0, rSELF
11465 add r1, rFP, #OFF_FP_SHADOWFRAME
11466 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11467
11468/* ------------------------------ */
11469 .balign 128
11470.L_ALT_op_rem_double_2addr: /* 0xcf */
11471/* File: arm/alt_stub.S */
11472/*
11473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11474 * any interesting requests and then jump to the real instruction
11475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11476 */
11477 .extern MterpCheckBefore
11478 EXPORT_PC
11479 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11480 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11481 mov r0, rSELF
11482 add r1, rFP, #OFF_FP_SHADOWFRAME
11483 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11484
11485/* ------------------------------ */
11486 .balign 128
11487.L_ALT_op_add_int_lit16: /* 0xd0 */
11488/* File: arm/alt_stub.S */
11489/*
11490 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11491 * any interesting requests and then jump to the real instruction
11492 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11493 */
11494 .extern MterpCheckBefore
11495 EXPORT_PC
11496 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11497 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11498 mov r0, rSELF
11499 add r1, rFP, #OFF_FP_SHADOWFRAME
11500 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11501
11502/* ------------------------------ */
11503 .balign 128
11504.L_ALT_op_rsub_int: /* 0xd1 */
11505/* File: arm/alt_stub.S */
11506/*
11507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11508 * any interesting requests and then jump to the real instruction
11509 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11510 */
11511 .extern MterpCheckBefore
11512 EXPORT_PC
11513 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11514 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11515 mov r0, rSELF
11516 add r1, rFP, #OFF_FP_SHADOWFRAME
11517 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11518
11519/* ------------------------------ */
11520 .balign 128
11521.L_ALT_op_mul_int_lit16: /* 0xd2 */
11522/* File: arm/alt_stub.S */
11523/*
11524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11525 * any interesting requests and then jump to the real instruction
11526 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11527 */
11528 .extern MterpCheckBefore
11529 EXPORT_PC
11530 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11531 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11532 mov r0, rSELF
11533 add r1, rFP, #OFF_FP_SHADOWFRAME
11534 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11535
11536/* ------------------------------ */
11537 .balign 128
11538.L_ALT_op_div_int_lit16: /* 0xd3 */
11539/* File: arm/alt_stub.S */
11540/*
11541 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11542 * any interesting requests and then jump to the real instruction
11543 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11544 */
11545 .extern MterpCheckBefore
11546 EXPORT_PC
11547 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11548 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11549 mov r0, rSELF
11550 add r1, rFP, #OFF_FP_SHADOWFRAME
11551 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11552
11553/* ------------------------------ */
11554 .balign 128
11555.L_ALT_op_rem_int_lit16: /* 0xd4 */
11556/* File: arm/alt_stub.S */
11557/*
11558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11559 * any interesting requests and then jump to the real instruction
11560 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11561 */
11562 .extern MterpCheckBefore
11563 EXPORT_PC
11564 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11565 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11566 mov r0, rSELF
11567 add r1, rFP, #OFF_FP_SHADOWFRAME
11568 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11569
11570/* ------------------------------ */
11571 .balign 128
11572.L_ALT_op_and_int_lit16: /* 0xd5 */
11573/* File: arm/alt_stub.S */
11574/*
11575 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11576 * any interesting requests and then jump to the real instruction
11577 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11578 */
11579 .extern MterpCheckBefore
11580 EXPORT_PC
11581 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11582 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11583 mov r0, rSELF
11584 add r1, rFP, #OFF_FP_SHADOWFRAME
11585 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11586
11587/* ------------------------------ */
11588 .balign 128
11589.L_ALT_op_or_int_lit16: /* 0xd6 */
11590/* File: arm/alt_stub.S */
11591/*
11592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11593 * any interesting requests and then jump to the real instruction
11594 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11595 */
11596 .extern MterpCheckBefore
11597 EXPORT_PC
11598 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11599 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11600 mov r0, rSELF
11601 add r1, rFP, #OFF_FP_SHADOWFRAME
11602 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11603
11604/* ------------------------------ */
11605 .balign 128
11606.L_ALT_op_xor_int_lit16: /* 0xd7 */
11607/* File: arm/alt_stub.S */
11608/*
11609 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11610 * any interesting requests and then jump to the real instruction
11611 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11612 */
11613 .extern MterpCheckBefore
11614 EXPORT_PC
11615 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11616 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11617 mov r0, rSELF
11618 add r1, rFP, #OFF_FP_SHADOWFRAME
11619 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11620
11621/* ------------------------------ */
11622 .balign 128
11623.L_ALT_op_add_int_lit8: /* 0xd8 */
11624/* File: arm/alt_stub.S */
11625/*
11626 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11627 * any interesting requests and then jump to the real instruction
11628 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11629 */
11630 .extern MterpCheckBefore
11631 EXPORT_PC
11632 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11633 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11634 mov r0, rSELF
11635 add r1, rFP, #OFF_FP_SHADOWFRAME
11636 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11637
11638/* ------------------------------ */
11639 .balign 128
11640.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11641/* File: arm/alt_stub.S */
11642/*
11643 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11644 * any interesting requests and then jump to the real instruction
11645 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11646 */
11647 .extern MterpCheckBefore
11648 EXPORT_PC
11649 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11650 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11651 mov r0, rSELF
11652 add r1, rFP, #OFF_FP_SHADOWFRAME
11653 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11654
11655/* ------------------------------ */
11656 .balign 128
11657.L_ALT_op_mul_int_lit8: /* 0xda */
11658/* File: arm/alt_stub.S */
11659/*
11660 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11661 * any interesting requests and then jump to the real instruction
11662 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11663 */
11664 .extern MterpCheckBefore
11665 EXPORT_PC
11666 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11667 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11668 mov r0, rSELF
11669 add r1, rFP, #OFF_FP_SHADOWFRAME
11670 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11671
11672/* ------------------------------ */
11673 .balign 128
11674.L_ALT_op_div_int_lit8: /* 0xdb */
11675/* File: arm/alt_stub.S */
11676/*
11677 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11678 * any interesting requests and then jump to the real instruction
11679 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11680 */
11681 .extern MterpCheckBefore
11682 EXPORT_PC
11683 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11684 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11685 mov r0, rSELF
11686 add r1, rFP, #OFF_FP_SHADOWFRAME
11687 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11688
11689/* ------------------------------ */
11690 .balign 128
11691.L_ALT_op_rem_int_lit8: /* 0xdc */
11692/* File: arm/alt_stub.S */
11693/*
11694 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11695 * any interesting requests and then jump to the real instruction
11696 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11697 */
11698 .extern MterpCheckBefore
11699 EXPORT_PC
11700 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11701 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11702 mov r0, rSELF
11703 add r1, rFP, #OFF_FP_SHADOWFRAME
11704 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11705
11706/* ------------------------------ */
11707 .balign 128
11708.L_ALT_op_and_int_lit8: /* 0xdd */
11709/* File: arm/alt_stub.S */
11710/*
11711 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11712 * any interesting requests and then jump to the real instruction
11713 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11714 */
11715 .extern MterpCheckBefore
11716 EXPORT_PC
11717 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11718 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11719 mov r0, rSELF
11720 add r1, rFP, #OFF_FP_SHADOWFRAME
11721 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11722
11723/* ------------------------------ */
11724 .balign 128
11725.L_ALT_op_or_int_lit8: /* 0xde */
11726/* File: arm/alt_stub.S */
11727/*
11728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11729 * any interesting requests and then jump to the real instruction
11730 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11731 */
11732 .extern MterpCheckBefore
11733 EXPORT_PC
11734 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11735 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11736 mov r0, rSELF
11737 add r1, rFP, #OFF_FP_SHADOWFRAME
11738 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11739
11740/* ------------------------------ */
11741 .balign 128
11742.L_ALT_op_xor_int_lit8: /* 0xdf */
11743/* File: arm/alt_stub.S */
11744/*
11745 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11746 * any interesting requests and then jump to the real instruction
11747 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11748 */
11749 .extern MterpCheckBefore
11750 EXPORT_PC
11751 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11752 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11753 mov r0, rSELF
11754 add r1, rFP, #OFF_FP_SHADOWFRAME
11755 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11756
11757/* ------------------------------ */
11758 .balign 128
11759.L_ALT_op_shl_int_lit8: /* 0xe0 */
11760/* File: arm/alt_stub.S */
11761/*
11762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11763 * any interesting requests and then jump to the real instruction
11764 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11765 */
11766 .extern MterpCheckBefore
11767 EXPORT_PC
11768 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11769 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11770 mov r0, rSELF
11771 add r1, rFP, #OFF_FP_SHADOWFRAME
11772 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11773
11774/* ------------------------------ */
11775 .balign 128
11776.L_ALT_op_shr_int_lit8: /* 0xe1 */
11777/* File: arm/alt_stub.S */
11778/*
11779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11780 * any interesting requests and then jump to the real instruction
11781 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11782 */
11783 .extern MterpCheckBefore
11784 EXPORT_PC
11785 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11786 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11787 mov r0, rSELF
11788 add r1, rFP, #OFF_FP_SHADOWFRAME
11789 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11790
11791/* ------------------------------ */
11792 .balign 128
11793.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11794/* File: arm/alt_stub.S */
11795/*
11796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11797 * any interesting requests and then jump to the real instruction
11798 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11799 */
11800 .extern MterpCheckBefore
11801 EXPORT_PC
11802 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11803 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11804 mov r0, rSELF
11805 add r1, rFP, #OFF_FP_SHADOWFRAME
11806 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11807
11808/* ------------------------------ */
11809 .balign 128
11810.L_ALT_op_iget_quick: /* 0xe3 */
11811/* File: arm/alt_stub.S */
11812/*
11813 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11814 * any interesting requests and then jump to the real instruction
11815 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11816 */
11817 .extern MterpCheckBefore
11818 EXPORT_PC
11819 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11820 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11821 mov r0, rSELF
11822 add r1, rFP, #OFF_FP_SHADOWFRAME
11823 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11824
11825/* ------------------------------ */
11826 .balign 128
11827.L_ALT_op_iget_wide_quick: /* 0xe4 */
11828/* File: arm/alt_stub.S */
11829/*
11830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11831 * any interesting requests and then jump to the real instruction
11832 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11833 */
11834 .extern MterpCheckBefore
11835 EXPORT_PC
11836 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11837 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11838 mov r0, rSELF
11839 add r1, rFP, #OFF_FP_SHADOWFRAME
11840 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11841
11842/* ------------------------------ */
11843 .balign 128
11844.L_ALT_op_iget_object_quick: /* 0xe5 */
11845/* File: arm/alt_stub.S */
11846/*
11847 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11848 * any interesting requests and then jump to the real instruction
11849 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11850 */
11851 .extern MterpCheckBefore
11852 EXPORT_PC
11853 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11854 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11855 mov r0, rSELF
11856 add r1, rFP, #OFF_FP_SHADOWFRAME
11857 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11858
11859/* ------------------------------ */
11860 .balign 128
11861.L_ALT_op_iput_quick: /* 0xe6 */
11862/* File: arm/alt_stub.S */
11863/*
11864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11865 * any interesting requests and then jump to the real instruction
11866 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11867 */
11868 .extern MterpCheckBefore
11869 EXPORT_PC
11870 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11871 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11872 mov r0, rSELF
11873 add r1, rFP, #OFF_FP_SHADOWFRAME
11874 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11875
11876/* ------------------------------ */
11877 .balign 128
11878.L_ALT_op_iput_wide_quick: /* 0xe7 */
11879/* File: arm/alt_stub.S */
11880/*
11881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11882 * any interesting requests and then jump to the real instruction
11883 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11884 */
11885 .extern MterpCheckBefore
11886 EXPORT_PC
11887 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11888 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11889 mov r0, rSELF
11890 add r1, rFP, #OFF_FP_SHADOWFRAME
11891 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11892
11893/* ------------------------------ */
11894 .balign 128
11895.L_ALT_op_iput_object_quick: /* 0xe8 */
11896/* File: arm/alt_stub.S */
11897/*
11898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11899 * any interesting requests and then jump to the real instruction
11900 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11901 */
11902 .extern MterpCheckBefore
11903 EXPORT_PC
11904 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11905 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11906 mov r0, rSELF
11907 add r1, rFP, #OFF_FP_SHADOWFRAME
11908 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11909
11910/* ------------------------------ */
11911 .balign 128
11912.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11913/* File: arm/alt_stub.S */
11914/*
11915 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11916 * any interesting requests and then jump to the real instruction
11917 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11918 */
11919 .extern MterpCheckBefore
11920 EXPORT_PC
11921 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11922 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11923 mov r0, rSELF
11924 add r1, rFP, #OFF_FP_SHADOWFRAME
11925 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11926
11927/* ------------------------------ */
11928 .balign 128
11929.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11930/* File: arm/alt_stub.S */
11931/*
11932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11933 * any interesting requests and then jump to the real instruction
11934 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11935 */
11936 .extern MterpCheckBefore
11937 EXPORT_PC
11938 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11939 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11940 mov r0, rSELF
11941 add r1, rFP, #OFF_FP_SHADOWFRAME
11942 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11943
11944/* ------------------------------ */
11945 .balign 128
11946.L_ALT_op_iput_boolean_quick: /* 0xeb */
11947/* File: arm/alt_stub.S */
11948/*
11949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11950 * any interesting requests and then jump to the real instruction
11951 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11952 */
11953 .extern MterpCheckBefore
11954 EXPORT_PC
11955 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11956 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11957 mov r0, rSELF
11958 add r1, rFP, #OFF_FP_SHADOWFRAME
11959 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11960
11961/* ------------------------------ */
11962 .balign 128
11963.L_ALT_op_iput_byte_quick: /* 0xec */
11964/* File: arm/alt_stub.S */
11965/*
11966 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11967 * any interesting requests and then jump to the real instruction
11968 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11969 */
11970 .extern MterpCheckBefore
11971 EXPORT_PC
11972 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11973 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11974 mov r0, rSELF
11975 add r1, rFP, #OFF_FP_SHADOWFRAME
11976 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11977
11978/* ------------------------------ */
11979 .balign 128
11980.L_ALT_op_iput_char_quick: /* 0xed */
11981/* File: arm/alt_stub.S */
11982/*
11983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11984 * any interesting requests and then jump to the real instruction
11985 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11986 */
11987 .extern MterpCheckBefore
11988 EXPORT_PC
11989 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11990 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11991 mov r0, rSELF
11992 add r1, rFP, #OFF_FP_SHADOWFRAME
11993 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11994
11995/* ------------------------------ */
11996 .balign 128
11997.L_ALT_op_iput_short_quick: /* 0xee */
11998/* File: arm/alt_stub.S */
11999/*
12000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12001 * any interesting requests and then jump to the real instruction
12002 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12003 */
12004 .extern MterpCheckBefore
12005 EXPORT_PC
12006 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12007 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
12008 mov r0, rSELF
12009 add r1, rFP, #OFF_FP_SHADOWFRAME
12010 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12011
12012/* ------------------------------ */
12013 .balign 128
12014.L_ALT_op_iget_boolean_quick: /* 0xef */
12015/* File: arm/alt_stub.S */
12016/*
12017 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12018 * any interesting requests and then jump to the real instruction
12019 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12020 */
12021 .extern MterpCheckBefore
12022 EXPORT_PC
12023 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12024 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
12025 mov r0, rSELF
12026 add r1, rFP, #OFF_FP_SHADOWFRAME
12027 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12028
12029/* ------------------------------ */
12030 .balign 128
12031.L_ALT_op_iget_byte_quick: /* 0xf0 */
12032/* File: arm/alt_stub.S */
12033/*
12034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12035 * any interesting requests and then jump to the real instruction
12036 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12037 */
12038 .extern MterpCheckBefore
12039 EXPORT_PC
12040 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12041 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
12042 mov r0, rSELF
12043 add r1, rFP, #OFF_FP_SHADOWFRAME
12044 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12045
12046/* ------------------------------ */
12047 .balign 128
12048.L_ALT_op_iget_char_quick: /* 0xf1 */
12049/* File: arm/alt_stub.S */
12050/*
12051 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12052 * any interesting requests and then jump to the real instruction
12053 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12054 */
12055 .extern MterpCheckBefore
12056 EXPORT_PC
12057 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12058 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
12059 mov r0, rSELF
12060 add r1, rFP, #OFF_FP_SHADOWFRAME
12061 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12062
12063/* ------------------------------ */
12064 .balign 128
12065.L_ALT_op_iget_short_quick: /* 0xf2 */
12066/* File: arm/alt_stub.S */
12067/*
12068 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12069 * any interesting requests and then jump to the real instruction
12070 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12071 */
12072 .extern MterpCheckBefore
12073 EXPORT_PC
12074 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12075 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
12076 mov r0, rSELF
12077 add r1, rFP, #OFF_FP_SHADOWFRAME
12078 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12079
12080/* ------------------------------ */
12081 .balign 128
12082.L_ALT_op_invoke_lambda: /* 0xf3 */
12083/* File: arm/alt_stub.S */
12084/*
12085 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12086 * any interesting requests and then jump to the real instruction
12087 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12088 */
12089 .extern MterpCheckBefore
12090 EXPORT_PC
12091 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12092 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
12093 mov r0, rSELF
12094 add r1, rFP, #OFF_FP_SHADOWFRAME
12095 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12096
12097/* ------------------------------ */
12098 .balign 128
12099.L_ALT_op_unused_f4: /* 0xf4 */
12100/* File: arm/alt_stub.S */
12101/*
12102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12103 * any interesting requests and then jump to the real instruction
12104 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12105 */
12106 .extern MterpCheckBefore
12107 EXPORT_PC
12108 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12109 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
12110 mov r0, rSELF
12111 add r1, rFP, #OFF_FP_SHADOWFRAME
12112 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12113
12114/* ------------------------------ */
12115 .balign 128
12116.L_ALT_op_capture_variable: /* 0xf5 */
12117/* File: arm/alt_stub.S */
12118/*
12119 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12120 * any interesting requests and then jump to the real instruction
12121 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12122 */
12123 .extern MterpCheckBefore
12124 EXPORT_PC
12125 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12126 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
12127 mov r0, rSELF
12128 add r1, rFP, #OFF_FP_SHADOWFRAME
12129 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12130
12131/* ------------------------------ */
12132 .balign 128
12133.L_ALT_op_create_lambda: /* 0xf6 */
12134/* File: arm/alt_stub.S */
12135/*
12136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12137 * any interesting requests and then jump to the real instruction
12138 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12139 */
12140 .extern MterpCheckBefore
12141 EXPORT_PC
12142 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12143 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
12144 mov r0, rSELF
12145 add r1, rFP, #OFF_FP_SHADOWFRAME
12146 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12147
12148/* ------------------------------ */
12149 .balign 128
12150.L_ALT_op_liberate_variable: /* 0xf7 */
12151/* File: arm/alt_stub.S */
12152/*
12153 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12154 * any interesting requests and then jump to the real instruction
12155 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12156 */
12157 .extern MterpCheckBefore
12158 EXPORT_PC
12159 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12160 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
12161 mov r0, rSELF
12162 add r1, rFP, #OFF_FP_SHADOWFRAME
12163 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12164
12165/* ------------------------------ */
12166 .balign 128
12167.L_ALT_op_box_lambda: /* 0xf8 */
12168/* File: arm/alt_stub.S */
12169/*
12170 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12171 * any interesting requests and then jump to the real instruction
12172 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12173 */
12174 .extern MterpCheckBefore
12175 EXPORT_PC
12176 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12177 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
12178 mov r0, rSELF
12179 add r1, rFP, #OFF_FP_SHADOWFRAME
12180 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12181
12182/* ------------------------------ */
12183 .balign 128
12184.L_ALT_op_unbox_lambda: /* 0xf9 */
12185/* File: arm/alt_stub.S */
12186/*
12187 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12188 * any interesting requests and then jump to the real instruction
12189 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12190 */
12191 .extern MterpCheckBefore
12192 EXPORT_PC
12193 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12194 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
12195 mov r0, rSELF
12196 add r1, rFP, #OFF_FP_SHADOWFRAME
12197 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12198
12199/* ------------------------------ */
12200 .balign 128
12201.L_ALT_op_unused_fa: /* 0xfa */
12202/* File: arm/alt_stub.S */
12203/*
12204 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12205 * any interesting requests and then jump to the real instruction
12206 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12207 */
12208 .extern MterpCheckBefore
12209 EXPORT_PC
12210 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12211 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
12212 mov r0, rSELF
12213 add r1, rFP, #OFF_FP_SHADOWFRAME
12214 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12215
12216/* ------------------------------ */
12217 .balign 128
12218.L_ALT_op_unused_fb: /* 0xfb */
12219/* File: arm/alt_stub.S */
12220/*
12221 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12222 * any interesting requests and then jump to the real instruction
12223 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12224 */
12225 .extern MterpCheckBefore
12226 EXPORT_PC
12227 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12228 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
12229 mov r0, rSELF
12230 add r1, rFP, #OFF_FP_SHADOWFRAME
12231 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12232
12233/* ------------------------------ */
12234 .balign 128
12235.L_ALT_op_unused_fc: /* 0xfc */
12236/* File: arm/alt_stub.S */
12237/*
12238 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12239 * any interesting requests and then jump to the real instruction
12240 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12241 */
12242 .extern MterpCheckBefore
12243 EXPORT_PC
12244 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12245 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
12246 mov r0, rSELF
12247 add r1, rFP, #OFF_FP_SHADOWFRAME
12248 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12249
12250/* ------------------------------ */
12251 .balign 128
12252.L_ALT_op_unused_fd: /* 0xfd */
12253/* File: arm/alt_stub.S */
12254/*
12255 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12256 * any interesting requests and then jump to the real instruction
12257 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12258 */
12259 .extern MterpCheckBefore
12260 EXPORT_PC
12261 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12262 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
12263 mov r0, rSELF
12264 add r1, rFP, #OFF_FP_SHADOWFRAME
12265 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12266
12267/* ------------------------------ */
12268 .balign 128
12269.L_ALT_op_unused_fe: /* 0xfe */
12270/* File: arm/alt_stub.S */
12271/*
12272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12273 * any interesting requests and then jump to the real instruction
12274 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12275 */
12276 .extern MterpCheckBefore
12277 EXPORT_PC
12278 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12279 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12280 mov r0, rSELF
12281 add r1, rFP, #OFF_FP_SHADOWFRAME
12282 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12283
12284/* ------------------------------ */
12285 .balign 128
12286.L_ALT_op_unused_ff: /* 0xff */
12287/* File: arm/alt_stub.S */
12288/*
12289 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12290 * any interesting requests and then jump to the real instruction
12291 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12292 */
12293 .extern MterpCheckBefore
12294 EXPORT_PC
12295 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12296 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12297 mov r0, rSELF
12298 add r1, rFP, #OFF_FP_SHADOWFRAME
12299 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12300
12301 .balign 128
12302 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12303 .global artMterpAsmAltInstructionEnd
12304artMterpAsmAltInstructionEnd:
12305/* File: arm/footer.S */
12306/*
12307 * ===========================================================================
12308 * Common subroutines and data
12309 * ===========================================================================
12310 */
12311
12312 .text
12313 .align 2
12314
12315/*
12316 * We've detected a condition that will result in an exception, but the exception
12317 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12318 * TUNING: for consistency, we may want to just go ahead and handle these here.
12319 */
buzbee1452bee2015-03-06 14:43:04 -080012320common_errDivideByZero:
12321 EXPORT_PC
12322#if MTERP_LOGGING
12323 mov r0, rSELF
12324 add r1, rFP, #OFF_FP_SHADOWFRAME
12325 bl MterpLogDivideByZeroException
12326#endif
12327 b MterpCommonFallback
12328
12329common_errArrayIndex:
12330 EXPORT_PC
12331#if MTERP_LOGGING
12332 mov r0, rSELF
12333 add r1, rFP, #OFF_FP_SHADOWFRAME
12334 bl MterpLogArrayIndexException
12335#endif
12336 b MterpCommonFallback
12337
12338common_errNegativeArraySize:
12339 EXPORT_PC
12340#if MTERP_LOGGING
12341 mov r0, rSELF
12342 add r1, rFP, #OFF_FP_SHADOWFRAME
12343 bl MterpLogNegativeArraySizeException
12344#endif
12345 b MterpCommonFallback
12346
12347common_errNoSuchMethod:
12348 EXPORT_PC
12349#if MTERP_LOGGING
12350 mov r0, rSELF
12351 add r1, rFP, #OFF_FP_SHADOWFRAME
12352 bl MterpLogNoSuchMethodException
12353#endif
12354 b MterpCommonFallback
12355
12356common_errNullObject:
12357 EXPORT_PC
12358#if MTERP_LOGGING
12359 mov r0, rSELF
12360 add r1, rFP, #OFF_FP_SHADOWFRAME
12361 bl MterpLogNullObjectException
12362#endif
12363 b MterpCommonFallback
12364
12365common_exceptionThrown:
12366 EXPORT_PC
12367#if MTERP_LOGGING
12368 mov r0, rSELF
12369 add r1, rFP, #OFF_FP_SHADOWFRAME
12370 bl MterpLogExceptionThrownException
12371#endif
12372 b MterpCommonFallback
12373
12374MterpSuspendFallback:
12375 EXPORT_PC
12376#if MTERP_LOGGING
12377 mov r0, rSELF
12378 add r1, rFP, #OFF_FP_SHADOWFRAME
12379 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12380 bl MterpLogSuspendFallback
12381#endif
12382 b MterpCommonFallback
12383
12384/*
12385 * If we're here, something is out of the ordinary. If there is a pending
12386 * exception, handle it. Otherwise, roll back and retry with the reference
12387 * interpreter.
12388 */
12389MterpPossibleException:
12390 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12391 cmp r0, #0 @ Exception pending?
12392 beq MterpFallback @ If not, fall back to reference interpreter.
12393 /* intentional fallthrough - handle pending exception. */
12394/*
12395 * On return from a runtime helper routine, we've found a pending exception.
12396 * Can we handle it here - or need to bail out to caller?
12397 *
12398 */
12399MterpException:
12400 mov r0, rSELF
12401 add r1, rFP, #OFF_FP_SHADOWFRAME
12402 bl MterpHandleException @ (self, shadow_frame)
12403 cmp r0, #0
12404 beq MterpExceptionReturn @ no local catch, back to caller.
12405 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12406 ldr r1, [rFP, #OFF_FP_DEX_PC]
12407 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12408 add rPC, r0, #CODEITEM_INSNS_OFFSET
12409 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
Bill Buzbeefd522f92016-02-11 22:37:42 +000012410 /* Do we need to switch interpreters? */
12411 bl MterpShouldSwitchInterpreters
12412 cmp r0, #0
12413 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -080012414 /* resume execution at catch block */
Bill Buzbeefd522f92016-02-11 22:37:42 +000012415 EXPORT_PC
buzbee1452bee2015-03-06 14:43:04 -080012416 FETCH_INST
12417 GET_INST_OPCODE ip
12418 GOTO_OPCODE ip
12419 /* NOTE: no fallthrough */
12420
12421/*
12422 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12423 * still needs to get the opcode and branch to it, and flags are in lr.
12424 */
12425MterpCheckSuspendAndContinue:
12426 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -080012427 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
Bill Buzbeefd522f92016-02-11 22:37:42 +000012428 bne 1f
buzbee1452bee2015-03-06 14:43:04 -080012429 GET_INST_OPCODE ip @ extract opcode from rINST
12430 GOTO_OPCODE ip @ jump to next instruction
Bill Buzbeefd522f92016-02-11 22:37:42 +0000124311:
12432 EXPORT_PC
12433 mov r0, rSELF
12434 bl MterpSuspendCheck @ (self)
12435 cmp r0, #0
12436 bne MterpFallback
12437 GET_INST_OPCODE ip @ extract opcode from rINST
12438 GOTO_OPCODE ip @ jump to next instruction
12439
12440/*
12441 * On-stack replacement has happened, and now we've returned from the compiled method.
12442 */
12443MterpOnStackReplacement:
12444#if MTERP_LOGGING
12445 mov r0, rSELF
12446 add r1, rFP, #OFF_FP_SHADOWFRAME
12447 mov r2, rINST
12448 bl MterpLogOSR
12449#endif
12450 mov r0, #1 @ Signal normal return
12451 b MterpDone
buzbee1452bee2015-03-06 14:43:04 -080012452
12453/*
12454 * Bail out to reference interpreter.
12455 */
12456MterpFallback:
12457 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -080012458#if MTERP_LOGGING
buzbee1452bee2015-03-06 14:43:04 -080012459 mov r0, rSELF
12460 add r1, rFP, #OFF_FP_SHADOWFRAME
12461 bl MterpLogFallback
buzbee76833da2016-01-13 13:06:22 -080012462#endif
buzbee1452bee2015-03-06 14:43:04 -080012463MterpCommonFallback:
12464 mov r0, #0 @ signal retry with reference interpreter.
12465 b MterpDone
12466
12467/*
12468 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12469 * SP and LR. Here we restore SP, restore the registers, and then restore
12470 * LR to PC.
12471 *
12472 * On entry:
12473 * uint32_t* rFP (should still be live, pointer to base of vregs)
12474 */
12475MterpExceptionReturn:
buzbee1452bee2015-03-06 14:43:04 -080012476 mov r0, #1 @ signal return to caller.
12477 b MterpDone
12478MterpReturn:
12479 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
buzbee1452bee2015-03-06 14:43:04 -080012480 str r0, [r2]
12481 str r1, [r2, #4]
buzbee1452bee2015-03-06 14:43:04 -080012482 mov r0, #1 @ signal return to caller.
12483MterpDone:
12484 add sp, sp, #4 @ un-align 64
12485 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12486
12487
12488 .fnend
12489 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12490
12491