blob: b26a63a5ee55a17814254167e60d2045481781c5 [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
buzbee96530d32016-03-04 08:03:51 -08001356 vcmpe.f32 s0, s1 @ compare (vBB, vCC)
buzbee1452bee2015-03-06 14:43:04 -08001357 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
buzbee96530d32016-03-04 08:03:51 -08001395 vcmpe.f32 s0, s1 @ compare (vBB, vCC)
buzbee1452bee2015-03-06 14:43:04 -08001396 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
buzbee96530d32016-03-04 08:03:51 -08001434 vcmpe.f64 d0, d1 @ compare (vBB, vCC)
buzbee1452bee2015-03-06 14:43:04 -08001435 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
buzbee96530d32016-03-04 08:03:51 -08001473 vcmpe.f64 d0, d1 @ compare (vBB, vCC)
buzbee1452bee2015-03-06 14:43:04 -08001474 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 */
buzbee1452bee2015-03-06 14:43:04 -08001537 mov r1, rINST, lsr #12 @ r1<- B
1538 ubfx r0, rINST, #8, #4 @ r0<- A
1539 GET_VREG r3, r1 @ r3<- vB
1540 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001541 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001542 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001543 movne rINST, #2
1544#if MTERP_PROFILE_BRANCHES
1545 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001546 EXPORT_PC
1547 mov r0, rSELF
1548 add r1, rFP, #OFF_FP_SHADOWFRAME
1549 mov r2, rINST
1550 bl MterpProfileBranch @ (self, shadow_frame, offset)
1551 cmp r0, #0
1552 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001553#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001554 adds r2, rINST, rINST @ convert to bytes, check sign
1555 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1556 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1557 bmi MterpCheckSuspendAndContinue
1558 GET_INST_OPCODE ip @ extract opcode from rINST
1559 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001560
1561
1562/* ------------------------------ */
1563 .balign 128
1564.L_op_if_ne: /* 0x33 */
1565/* File: arm/op_if_ne.S */
1566/* File: arm/bincmp.S */
1567 /*
1568 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1569 * fragment that specifies the *reverse* comparison to perform, e.g.
1570 * for "if-le" you would use "gt".
1571 *
1572 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1573 */
1574 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001575 mov r1, rINST, lsr #12 @ r1<- B
1576 ubfx r0, rINST, #8, #4 @ r0<- A
1577 GET_VREG r3, r1 @ r3<- vB
1578 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001579 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001580 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001581 moveq rINST, #2
1582#if MTERP_PROFILE_BRANCHES
1583 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001584 EXPORT_PC
1585 mov r0, rSELF
1586 add r1, rFP, #OFF_FP_SHADOWFRAME
1587 mov r2, rINST
1588 bl MterpProfileBranch @ (self, shadow_frame, offset)
1589 cmp r0, #0
1590 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001591#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001592 adds r2, rINST, rINST @ convert to bytes, check sign
1593 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1594 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1595 bmi MterpCheckSuspendAndContinue
1596 GET_INST_OPCODE ip @ extract opcode from rINST
1597 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001598
1599
1600/* ------------------------------ */
1601 .balign 128
1602.L_op_if_lt: /* 0x34 */
1603/* File: arm/op_if_lt.S */
1604/* File: arm/bincmp.S */
1605 /*
1606 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1607 * fragment that specifies the *reverse* comparison to perform, e.g.
1608 * for "if-le" you would use "gt".
1609 *
1610 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1611 */
1612 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001613 mov r1, rINST, lsr #12 @ r1<- B
1614 ubfx r0, rINST, #8, #4 @ r0<- A
1615 GET_VREG r3, r1 @ r3<- vB
1616 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001617 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001618 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001619 movge rINST, #2
1620#if MTERP_PROFILE_BRANCHES
1621 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001622 EXPORT_PC
1623 mov r0, rSELF
1624 add r1, rFP, #OFF_FP_SHADOWFRAME
1625 mov r2, rINST
1626 bl MterpProfileBranch @ (self, shadow_frame, offset)
1627 cmp r0, #0
1628 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001629#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001630 adds r2, rINST, rINST @ convert to bytes, check sign
1631 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1632 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1633 bmi MterpCheckSuspendAndContinue
1634 GET_INST_OPCODE ip @ extract opcode from rINST
1635 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001636
1637
1638/* ------------------------------ */
1639 .balign 128
1640.L_op_if_ge: /* 0x35 */
1641/* File: arm/op_if_ge.S */
1642/* File: arm/bincmp.S */
1643 /*
1644 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1645 * fragment that specifies the *reverse* comparison to perform, e.g.
1646 * for "if-le" you would use "gt".
1647 *
1648 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1649 */
1650 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001651 mov r1, rINST, lsr #12 @ r1<- B
1652 ubfx r0, rINST, #8, #4 @ r0<- A
1653 GET_VREG r3, r1 @ r3<- vB
1654 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001655 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001656 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001657 movlt rINST, #2
1658#if MTERP_PROFILE_BRANCHES
1659 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001660 EXPORT_PC
1661 mov r0, rSELF
1662 add r1, rFP, #OFF_FP_SHADOWFRAME
1663 mov r2, rINST
1664 bl MterpProfileBranch @ (self, shadow_frame, offset)
1665 cmp r0, #0
1666 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001667#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001668 adds r2, rINST, rINST @ convert to bytes, check sign
1669 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1670 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1671 bmi MterpCheckSuspendAndContinue
1672 GET_INST_OPCODE ip @ extract opcode from rINST
1673 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001674
1675
1676/* ------------------------------ */
1677 .balign 128
1678.L_op_if_gt: /* 0x36 */
1679/* File: arm/op_if_gt.S */
1680/* File: arm/bincmp.S */
1681 /*
1682 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1683 * fragment that specifies the *reverse* comparison to perform, e.g.
1684 * for "if-le" you would use "gt".
1685 *
1686 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1687 */
1688 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001689 mov r1, rINST, lsr #12 @ r1<- B
1690 ubfx r0, rINST, #8, #4 @ r0<- A
1691 GET_VREG r3, r1 @ r3<- vB
1692 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001693 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001694 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001695 movle rINST, #2
1696#if MTERP_PROFILE_BRANCHES
1697 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001698 EXPORT_PC
1699 mov r0, rSELF
1700 add r1, rFP, #OFF_FP_SHADOWFRAME
1701 mov r2, rINST
1702 bl MterpProfileBranch @ (self, shadow_frame, offset)
1703 cmp r0, #0
1704 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001705#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001706 adds r2, rINST, rINST @ convert to bytes, check sign
1707 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1708 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1709 bmi MterpCheckSuspendAndContinue
1710 GET_INST_OPCODE ip @ extract opcode from rINST
1711 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001712
1713
1714/* ------------------------------ */
1715 .balign 128
1716.L_op_if_le: /* 0x37 */
1717/* File: arm/op_if_le.S */
1718/* File: arm/bincmp.S */
1719 /*
1720 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1721 * fragment that specifies the *reverse* comparison to perform, e.g.
1722 * for "if-le" you would use "gt".
1723 *
1724 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1725 */
1726 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001727 mov r1, rINST, lsr #12 @ r1<- B
1728 ubfx r0, rINST, #8, #4 @ r0<- A
1729 GET_VREG r3, r1 @ r3<- vB
1730 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001731 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001732 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001733 movgt rINST, #2
1734#if MTERP_PROFILE_BRANCHES
1735 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001736 EXPORT_PC
1737 mov r0, rSELF
1738 add r1, rFP, #OFF_FP_SHADOWFRAME
1739 mov r2, rINST
1740 bl MterpProfileBranch @ (self, shadow_frame, offset)
1741 cmp r0, #0
1742 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001743#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001744 adds r2, rINST, rINST @ convert to bytes, check sign
1745 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1746 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1747 bmi MterpCheckSuspendAndContinue
1748 GET_INST_OPCODE ip @ extract opcode from rINST
1749 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001750
1751
1752/* ------------------------------ */
1753 .balign 128
1754.L_op_if_eqz: /* 0x38 */
1755/* File: arm/op_if_eqz.S */
1756/* File: arm/zcmp.S */
1757 /*
1758 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1759 * fragment that specifies the *reverse* comparison to perform, e.g.
1760 * for "if-le" you would use "gt".
1761 *
1762 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1763 */
1764 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001765 mov r0, rINST, lsr #8 @ r0<- AA
1766 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001767 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1768 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001769 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001770 movne rINST, #2
1771#if MTERP_PROFILE_BRANCHES
1772 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001773 EXPORT_PC
1774 mov r0, rSELF
1775 add r1, rFP, #OFF_FP_SHADOWFRAME
1776 mov r2, rINST
1777 bl MterpProfileBranch @ (self, shadow_frame, offset)
1778 cmp r0, #0
1779 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001780#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001781 adds r1, rINST, rINST @ convert to bytes & set flags
1782 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1783 bmi MterpCheckSuspendAndContinue
1784 GET_INST_OPCODE ip @ extract opcode from rINST
1785 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001786
1787
1788/* ------------------------------ */
1789 .balign 128
1790.L_op_if_nez: /* 0x39 */
1791/* File: arm/op_if_nez.S */
1792/* File: arm/zcmp.S */
1793 /*
1794 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1795 * fragment that specifies the *reverse* comparison to perform, e.g.
1796 * for "if-le" you would use "gt".
1797 *
1798 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1799 */
1800 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001801 mov r0, rINST, lsr #8 @ r0<- AA
1802 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001803 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1804 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001805 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001806 moveq rINST, #2
1807#if MTERP_PROFILE_BRANCHES
1808 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001809 EXPORT_PC
1810 mov r0, rSELF
1811 add r1, rFP, #OFF_FP_SHADOWFRAME
1812 mov r2, rINST
1813 bl MterpProfileBranch @ (self, shadow_frame, offset)
1814 cmp r0, #0
1815 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001816#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001817 adds r1, rINST, rINST @ convert to bytes & set flags
1818 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1819 bmi MterpCheckSuspendAndContinue
1820 GET_INST_OPCODE ip @ extract opcode from rINST
1821 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001822
1823
1824/* ------------------------------ */
1825 .balign 128
1826.L_op_if_ltz: /* 0x3a */
1827/* File: arm/op_if_ltz.S */
1828/* File: arm/zcmp.S */
1829 /*
1830 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1831 * fragment that specifies the *reverse* comparison to perform, e.g.
1832 * for "if-le" you would use "gt".
1833 *
1834 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1835 */
1836 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001837 mov r0, rINST, lsr #8 @ r0<- AA
1838 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001839 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1840 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001841 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001842 movge rINST, #2
1843#if MTERP_PROFILE_BRANCHES
1844 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001845 EXPORT_PC
1846 mov r0, rSELF
1847 add r1, rFP, #OFF_FP_SHADOWFRAME
1848 mov r2, rINST
1849 bl MterpProfileBranch @ (self, shadow_frame, offset)
1850 cmp r0, #0
1851 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001852#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001853 adds r1, rINST, rINST @ convert to bytes & set flags
1854 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1855 bmi MterpCheckSuspendAndContinue
1856 GET_INST_OPCODE ip @ extract opcode from rINST
1857 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001858
1859
1860/* ------------------------------ */
1861 .balign 128
1862.L_op_if_gez: /* 0x3b */
1863/* File: arm/op_if_gez.S */
1864/* File: arm/zcmp.S */
1865 /*
1866 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1867 * fragment that specifies the *reverse* comparison to perform, e.g.
1868 * for "if-le" you would use "gt".
1869 *
1870 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1871 */
1872 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001873 mov r0, rINST, lsr #8 @ r0<- AA
1874 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001875 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1876 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001877 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001878 movlt rINST, #2
1879#if MTERP_PROFILE_BRANCHES
1880 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001881 EXPORT_PC
1882 mov r0, rSELF
1883 add r1, rFP, #OFF_FP_SHADOWFRAME
1884 mov r2, rINST
1885 bl MterpProfileBranch @ (self, shadow_frame, offset)
1886 cmp r0, #0
1887 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001888#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001889 adds r1, rINST, rINST @ convert to bytes & set flags
1890 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1891 bmi MterpCheckSuspendAndContinue
1892 GET_INST_OPCODE ip @ extract opcode from rINST
1893 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001894
1895
1896/* ------------------------------ */
1897 .balign 128
1898.L_op_if_gtz: /* 0x3c */
1899/* File: arm/op_if_gtz.S */
1900/* File: arm/zcmp.S */
1901 /*
1902 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1903 * fragment that specifies the *reverse* comparison to perform, e.g.
1904 * for "if-le" you would use "gt".
1905 *
1906 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1907 */
1908 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001909 mov r0, rINST, lsr #8 @ r0<- AA
1910 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001911 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1912 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001913 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001914 movle rINST, #2
1915#if MTERP_PROFILE_BRANCHES
1916 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001917 EXPORT_PC
1918 mov r0, rSELF
1919 add r1, rFP, #OFF_FP_SHADOWFRAME
1920 mov r2, rINST
1921 bl MterpProfileBranch @ (self, shadow_frame, offset)
1922 cmp r0, #0
1923 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001924#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001925 adds r1, rINST, rINST @ convert to bytes & set flags
1926 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1927 bmi MterpCheckSuspendAndContinue
1928 GET_INST_OPCODE ip @ extract opcode from rINST
1929 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001930
1931
1932/* ------------------------------ */
1933 .balign 128
1934.L_op_if_lez: /* 0x3d */
1935/* File: arm/op_if_lez.S */
1936/* File: arm/zcmp.S */
1937 /*
1938 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1939 * fragment that specifies the *reverse* comparison to perform, e.g.
1940 * for "if-le" you would use "gt".
1941 *
1942 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1943 */
1944 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001945 mov r0, rINST, lsr #8 @ r0<- AA
1946 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001947 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1948 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001949 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001950 movgt rINST, #2
1951#if MTERP_PROFILE_BRANCHES
1952 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001953 EXPORT_PC
1954 mov r0, rSELF
1955 add r1, rFP, #OFF_FP_SHADOWFRAME
1956 mov r2, rINST
1957 bl MterpProfileBranch @ (self, shadow_frame, offset)
1958 cmp r0, #0
1959 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001960#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001961 adds r1, rINST, rINST @ convert to bytes & set flags
1962 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1963 bmi MterpCheckSuspendAndContinue
1964 GET_INST_OPCODE ip @ extract opcode from rINST
1965 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001966
1967
1968/* ------------------------------ */
1969 .balign 128
1970.L_op_unused_3e: /* 0x3e */
1971/* File: arm/op_unused_3e.S */
1972/* File: arm/unused.S */
1973/*
1974 * Bail to reference interpreter to throw.
1975 */
1976 b MterpFallback
1977
1978
1979/* ------------------------------ */
1980 .balign 128
1981.L_op_unused_3f: /* 0x3f */
1982/* File: arm/op_unused_3f.S */
1983/* File: arm/unused.S */
1984/*
1985 * Bail to reference interpreter to throw.
1986 */
1987 b MterpFallback
1988
1989
1990/* ------------------------------ */
1991 .balign 128
1992.L_op_unused_40: /* 0x40 */
1993/* File: arm/op_unused_40.S */
1994/* File: arm/unused.S */
1995/*
1996 * Bail to reference interpreter to throw.
1997 */
1998 b MterpFallback
1999
2000
2001/* ------------------------------ */
2002 .balign 128
2003.L_op_unused_41: /* 0x41 */
2004/* File: arm/op_unused_41.S */
2005/* File: arm/unused.S */
2006/*
2007 * Bail to reference interpreter to throw.
2008 */
2009 b MterpFallback
2010
2011
2012/* ------------------------------ */
2013 .balign 128
2014.L_op_unused_42: /* 0x42 */
2015/* File: arm/op_unused_42.S */
2016/* File: arm/unused.S */
2017/*
2018 * Bail to reference interpreter to throw.
2019 */
2020 b MterpFallback
2021
2022
2023/* ------------------------------ */
2024 .balign 128
2025.L_op_unused_43: /* 0x43 */
2026/* File: arm/op_unused_43.S */
2027/* File: arm/unused.S */
2028/*
2029 * Bail to reference interpreter to throw.
2030 */
2031 b MterpFallback
2032
2033
2034/* ------------------------------ */
2035 .balign 128
2036.L_op_aget: /* 0x44 */
2037/* File: arm/op_aget.S */
2038 /*
2039 * Array get, 32 bits or less. vAA <- vBB[vCC].
2040 *
2041 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2042 * instructions. We use a pair of FETCH_Bs instead.
2043 *
buzbee76833da2016-01-13 13:06:22 -08002044 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002045 *
2046 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2047 * If this changes, specialize.
2048 */
2049 /* op vAA, vBB, vCC */
2050 FETCH_B r2, 1, 0 @ r2<- BB
2051 mov r9, rINST, lsr #8 @ r9<- AA
2052 FETCH_B r3, 1, 1 @ r3<- CC
2053 GET_VREG r0, r2 @ r0<- vBB (array object)
2054 GET_VREG r1, r3 @ r1<- vCC (requested index)
2055 cmp r0, #0 @ null array object?
2056 beq common_errNullObject @ yes, bail
2057 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2058 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2059 cmp r1, r3 @ compare unsigned index, length
2060 bcs common_errArrayIndex @ index >= length, bail
2061 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2062 ldr r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2063 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002064 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002065 GOTO_OPCODE ip @ jump to next instruction
2066
2067/* ------------------------------ */
2068 .balign 128
2069.L_op_aget_wide: /* 0x45 */
2070/* File: arm/op_aget_wide.S */
2071 /*
2072 * Array get, 64 bits. vAA <- vBB[vCC].
2073 *
2074 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2075 */
2076 /* aget-wide vAA, vBB, vCC */
2077 FETCH r0, 1 @ r0<- CCBB
2078 mov r9, rINST, lsr #8 @ r9<- AA
2079 and r2, r0, #255 @ r2<- BB
2080 mov r3, r0, lsr #8 @ r3<- CC
2081 GET_VREG r0, r2 @ r0<- vBB (array object)
2082 GET_VREG r1, r3 @ r1<- vCC (requested index)
buzbee50cf6002016-02-10 08:59:12 -08002083 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08002084 cmp r0, #0 @ null array object?
2085 beq common_errNullObject @ yes, bail
2086 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2087 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2088 cmp r1, r3 @ compare unsigned index, length
2089 bcs common_errArrayIndex @ index >= length, bail
2090 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2091 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2092 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2093 GET_INST_OPCODE ip @ extract opcode from rINST
2094 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3
2095 GOTO_OPCODE ip @ jump to next instruction
2096
2097/* ------------------------------ */
2098 .balign 128
2099.L_op_aget_object: /* 0x46 */
2100/* File: arm/op_aget_object.S */
2101 /*
2102 * Array object get. vAA <- vBB[vCC].
2103 *
2104 * for: aget-object
2105 */
2106 /* op vAA, vBB, vCC */
2107 FETCH_B r2, 1, 0 @ r2<- BB
2108 mov r9, rINST, lsr #8 @ r9<- AA
2109 FETCH_B r3, 1, 1 @ r3<- CC
2110 EXPORT_PC
2111 GET_VREG r0, r2 @ r0<- vBB (array object)
2112 GET_VREG r1, r3 @ r1<- vCC (requested index)
2113 bl artAGetObjectFromMterp @ (array, index)
2114 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
2115 PREFETCH_INST 2
2116 cmp r1, #0
2117 bne MterpException
2118 SET_VREG_OBJECT r0, r9
2119 ADVANCE 2
2120 GET_INST_OPCODE ip
2121 GOTO_OPCODE ip @ jump to next instruction
2122
2123/* ------------------------------ */
2124 .balign 128
2125.L_op_aget_boolean: /* 0x47 */
2126/* File: arm/op_aget_boolean.S */
2127/* File: arm/op_aget.S */
2128 /*
2129 * Array get, 32 bits or less. vAA <- vBB[vCC].
2130 *
2131 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2132 * instructions. We use a pair of FETCH_Bs instead.
2133 *
buzbee76833da2016-01-13 13:06:22 -08002134 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002135 *
2136 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2137 * If this changes, specialize.
2138 */
2139 /* op vAA, vBB, vCC */
2140 FETCH_B r2, 1, 0 @ r2<- BB
2141 mov r9, rINST, lsr #8 @ r9<- AA
2142 FETCH_B r3, 1, 1 @ r3<- CC
2143 GET_VREG r0, r2 @ r0<- vBB (array object)
2144 GET_VREG r1, r3 @ r1<- vCC (requested index)
2145 cmp r0, #0 @ null array object?
2146 beq common_errNullObject @ yes, bail
2147 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2148 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2149 cmp r1, r3 @ compare unsigned index, length
2150 bcs common_errArrayIndex @ index >= length, bail
2151 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2152 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2153 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002154 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002155 GOTO_OPCODE ip @ jump to next instruction
2156
2157
2158/* ------------------------------ */
2159 .balign 128
2160.L_op_aget_byte: /* 0x48 */
2161/* File: arm/op_aget_byte.S */
2162/* File: arm/op_aget.S */
2163 /*
2164 * Array get, 32 bits or less. vAA <- vBB[vCC].
2165 *
2166 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2167 * instructions. We use a pair of FETCH_Bs instead.
2168 *
buzbee76833da2016-01-13 13:06:22 -08002169 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002170 *
2171 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2172 * If this changes, specialize.
2173 */
2174 /* op vAA, vBB, vCC */
2175 FETCH_B r2, 1, 0 @ r2<- BB
2176 mov r9, rINST, lsr #8 @ r9<- AA
2177 FETCH_B r3, 1, 1 @ r3<- CC
2178 GET_VREG r0, r2 @ r0<- vBB (array object)
2179 GET_VREG r1, r3 @ r1<- vCC (requested index)
2180 cmp r0, #0 @ null array object?
2181 beq common_errNullObject @ yes, bail
2182 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2183 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2184 cmp r1, r3 @ compare unsigned index, length
2185 bcs common_errArrayIndex @ index >= length, bail
2186 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2187 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2188 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002189 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002190 GOTO_OPCODE ip @ jump to next instruction
2191
2192
2193/* ------------------------------ */
2194 .balign 128
2195.L_op_aget_char: /* 0x49 */
2196/* File: arm/op_aget_char.S */
2197/* File: arm/op_aget.S */
2198 /*
2199 * Array get, 32 bits or less. vAA <- vBB[vCC].
2200 *
2201 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2202 * instructions. We use a pair of FETCH_Bs instead.
2203 *
buzbee76833da2016-01-13 13:06:22 -08002204 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002205 *
2206 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2207 * If this changes, specialize.
2208 */
2209 /* op vAA, vBB, vCC */
2210 FETCH_B r2, 1, 0 @ r2<- BB
2211 mov r9, rINST, lsr #8 @ r9<- AA
2212 FETCH_B r3, 1, 1 @ r3<- CC
2213 GET_VREG r0, r2 @ r0<- vBB (array object)
2214 GET_VREG r1, r3 @ r1<- vCC (requested index)
2215 cmp r0, #0 @ null array object?
2216 beq common_errNullObject @ yes, bail
2217 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2218 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2219 cmp r1, r3 @ compare unsigned index, length
2220 bcs common_errArrayIndex @ index >= length, bail
2221 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2222 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2223 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002224 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002225 GOTO_OPCODE ip @ jump to next instruction
2226
2227
2228/* ------------------------------ */
2229 .balign 128
2230.L_op_aget_short: /* 0x4a */
2231/* File: arm/op_aget_short.S */
2232/* File: arm/op_aget.S */
2233 /*
2234 * Array get, 32 bits or less. vAA <- vBB[vCC].
2235 *
2236 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2237 * instructions. We use a pair of FETCH_Bs instead.
2238 *
buzbee76833da2016-01-13 13:06:22 -08002239 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002240 *
2241 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2242 * If this changes, specialize.
2243 */
2244 /* op vAA, vBB, vCC */
2245 FETCH_B r2, 1, 0 @ r2<- BB
2246 mov r9, rINST, lsr #8 @ r9<- AA
2247 FETCH_B r3, 1, 1 @ r3<- CC
2248 GET_VREG r0, r2 @ r0<- vBB (array object)
2249 GET_VREG r1, r3 @ r1<- vCC (requested index)
2250 cmp r0, #0 @ null array object?
2251 beq common_errNullObject @ yes, bail
2252 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2253 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2254 cmp r1, r3 @ compare unsigned index, length
2255 bcs common_errArrayIndex @ index >= length, bail
2256 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2257 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2258 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002259 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002260 GOTO_OPCODE ip @ jump to next instruction
2261
2262
2263/* ------------------------------ */
2264 .balign 128
2265.L_op_aput: /* 0x4b */
2266/* File: arm/op_aput.S */
2267 /*
2268 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2269 *
2270 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2271 * instructions. We use a pair of FETCH_Bs instead.
2272 *
2273 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2274 *
2275 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2276 * If this changes, specialize.
2277 */
2278 /* op vAA, vBB, vCC */
2279 FETCH_B r2, 1, 0 @ r2<- BB
2280 mov r9, rINST, lsr #8 @ r9<- AA
2281 FETCH_B r3, 1, 1 @ r3<- CC
2282 GET_VREG r0, r2 @ r0<- vBB (array object)
2283 GET_VREG r1, r3 @ r1<- vCC (requested index)
2284 cmp r0, #0 @ null array object?
2285 beq common_errNullObject @ yes, bail
2286 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2287 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2288 cmp r1, r3 @ compare unsigned index, length
2289 bcs common_errArrayIndex @ index >= length, bail
2290 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2291 GET_VREG r2, r9 @ r2<- vAA
2292 GET_INST_OPCODE ip @ extract opcode from rINST
2293 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2294 GOTO_OPCODE ip @ jump to next instruction
2295
2296/* ------------------------------ */
2297 .balign 128
2298.L_op_aput_wide: /* 0x4c */
2299/* File: arm/op_aput_wide.S */
2300 /*
2301 * Array put, 64 bits. vBB[vCC] <- vAA.
2302 *
2303 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2304 */
2305 /* aput-wide vAA, vBB, vCC */
2306 FETCH r0, 1 @ r0<- CCBB
2307 mov r9, rINST, lsr #8 @ r9<- AA
2308 and r2, r0, #255 @ r2<- BB
2309 mov r3, r0, lsr #8 @ r3<- CC
2310 GET_VREG r0, r2 @ r0<- vBB (array object)
2311 GET_VREG r1, r3 @ r1<- vCC (requested index)
2312 cmp r0, #0 @ null array object?
2313 beq common_errNullObject @ yes, bail
2314 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2315 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2316 cmp r1, r3 @ compare unsigned index, length
2317 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2318 bcs common_errArrayIndex @ index >= length, bail
2319 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2320 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1
2321 GET_INST_OPCODE ip @ extract opcode from rINST
2322 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2323 GOTO_OPCODE ip @ jump to next instruction
2324
2325/* ------------------------------ */
2326 .balign 128
2327.L_op_aput_object: /* 0x4d */
2328/* File: arm/op_aput_object.S */
2329 /*
2330 * Store an object into an array. vBB[vCC] <- vAA.
2331 */
2332 /* op vAA, vBB, vCC */
2333 EXPORT_PC
2334 add r0, rFP, #OFF_FP_SHADOWFRAME
2335 mov r1, rPC
2336 mov r2, rINST
2337 bl MterpAputObject
2338 cmp r0, #0
2339 beq MterpPossibleException
2340 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2341 GET_INST_OPCODE ip @ extract opcode from rINST
2342 GOTO_OPCODE ip @ jump to next instruction
2343
2344/* ------------------------------ */
2345 .balign 128
2346.L_op_aput_boolean: /* 0x4e */
2347/* File: arm/op_aput_boolean.S */
2348/* File: arm/op_aput.S */
2349 /*
2350 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2351 *
2352 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2353 * instructions. We use a pair of FETCH_Bs instead.
2354 *
2355 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2356 *
2357 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2358 * If this changes, specialize.
2359 */
2360 /* op vAA, vBB, vCC */
2361 FETCH_B r2, 1, 0 @ r2<- BB
2362 mov r9, rINST, lsr #8 @ r9<- AA
2363 FETCH_B r3, 1, 1 @ r3<- CC
2364 GET_VREG r0, r2 @ r0<- vBB (array object)
2365 GET_VREG r1, r3 @ r1<- vCC (requested index)
2366 cmp r0, #0 @ null array object?
2367 beq common_errNullObject @ yes, bail
2368 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2369 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2370 cmp r1, r3 @ compare unsigned index, length
2371 bcs common_errArrayIndex @ index >= length, bail
2372 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2373 GET_VREG r2, r9 @ r2<- vAA
2374 GET_INST_OPCODE ip @ extract opcode from rINST
2375 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2376 GOTO_OPCODE ip @ jump to next instruction
2377
2378
2379/* ------------------------------ */
2380 .balign 128
2381.L_op_aput_byte: /* 0x4f */
2382/* File: arm/op_aput_byte.S */
2383/* File: arm/op_aput.S */
2384 /*
2385 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2386 *
2387 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2388 * instructions. We use a pair of FETCH_Bs instead.
2389 *
2390 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2391 *
2392 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2393 * If this changes, specialize.
2394 */
2395 /* op vAA, vBB, vCC */
2396 FETCH_B r2, 1, 0 @ r2<- BB
2397 mov r9, rINST, lsr #8 @ r9<- AA
2398 FETCH_B r3, 1, 1 @ r3<- CC
2399 GET_VREG r0, r2 @ r0<- vBB (array object)
2400 GET_VREG r1, r3 @ r1<- vCC (requested index)
2401 cmp r0, #0 @ null array object?
2402 beq common_errNullObject @ yes, bail
2403 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2404 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2405 cmp r1, r3 @ compare unsigned index, length
2406 bcs common_errArrayIndex @ index >= length, bail
2407 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2408 GET_VREG r2, r9 @ r2<- vAA
2409 GET_INST_OPCODE ip @ extract opcode from rINST
2410 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2411 GOTO_OPCODE ip @ jump to next instruction
2412
2413
2414/* ------------------------------ */
2415 .balign 128
2416.L_op_aput_char: /* 0x50 */
2417/* File: arm/op_aput_char.S */
2418/* File: arm/op_aput.S */
2419 /*
2420 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2421 *
2422 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2423 * instructions. We use a pair of FETCH_Bs instead.
2424 *
2425 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2426 *
2427 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2428 * If this changes, specialize.
2429 */
2430 /* op vAA, vBB, vCC */
2431 FETCH_B r2, 1, 0 @ r2<- BB
2432 mov r9, rINST, lsr #8 @ r9<- AA
2433 FETCH_B r3, 1, 1 @ r3<- CC
2434 GET_VREG r0, r2 @ r0<- vBB (array object)
2435 GET_VREG r1, r3 @ r1<- vCC (requested index)
2436 cmp r0, #0 @ null array object?
2437 beq common_errNullObject @ yes, bail
2438 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2439 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2440 cmp r1, r3 @ compare unsigned index, length
2441 bcs common_errArrayIndex @ index >= length, bail
2442 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2443 GET_VREG r2, r9 @ r2<- vAA
2444 GET_INST_OPCODE ip @ extract opcode from rINST
2445 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2446 GOTO_OPCODE ip @ jump to next instruction
2447
2448
2449/* ------------------------------ */
2450 .balign 128
2451.L_op_aput_short: /* 0x51 */
2452/* File: arm/op_aput_short.S */
2453/* File: arm/op_aput.S */
2454 /*
2455 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2456 *
2457 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2458 * instructions. We use a pair of FETCH_Bs instead.
2459 *
2460 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2461 *
2462 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2463 * If this changes, specialize.
2464 */
2465 /* op vAA, vBB, vCC */
2466 FETCH_B r2, 1, 0 @ r2<- BB
2467 mov r9, rINST, lsr #8 @ r9<- AA
2468 FETCH_B r3, 1, 1 @ r3<- CC
2469 GET_VREG r0, r2 @ r0<- vBB (array object)
2470 GET_VREG r1, r3 @ r1<- vCC (requested index)
2471 cmp r0, #0 @ null array object?
2472 beq common_errNullObject @ yes, bail
2473 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2474 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2475 cmp r1, r3 @ compare unsigned index, length
2476 bcs common_errArrayIndex @ index >= length, bail
2477 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2478 GET_VREG r2, r9 @ r2<- vAA
2479 GET_INST_OPCODE ip @ extract opcode from rINST
2480 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2481 GOTO_OPCODE ip @ jump to next instruction
2482
2483
2484/* ------------------------------ */
2485 .balign 128
2486.L_op_iget: /* 0x52 */
2487/* File: arm/op_iget.S */
2488 /*
2489 * General instance field get.
2490 *
2491 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2492 */
2493 EXPORT_PC
2494 FETCH r0, 1 @ r0<- field ref CCCC
2495 mov r1, rINST, lsr #12 @ r1<- B
2496 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2497 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2498 mov r3, rSELF @ r3<- self
2499 bl artGet32InstanceFromCode
2500 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2501 ubfx r2, rINST, #8, #4 @ r2<- A
2502 PREFETCH_INST 2
2503 cmp r3, #0
2504 bne MterpPossibleException @ bail out
2505 .if 0
2506 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2507 .else
2508 SET_VREG r0, r2 @ fp[A]<- r0
2509 .endif
2510 ADVANCE 2
2511 GET_INST_OPCODE ip @ extract opcode from rINST
2512 GOTO_OPCODE ip @ jump to next instruction
2513
2514/* ------------------------------ */
2515 .balign 128
2516.L_op_iget_wide: /* 0x53 */
2517/* File: arm/op_iget_wide.S */
2518 /*
2519 * 64-bit instance field get.
2520 *
2521 * for: iget-wide
2522 */
2523 EXPORT_PC
2524 FETCH r0, 1 @ r0<- field ref CCCC
2525 mov r1, rINST, lsr #12 @ r1<- B
2526 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2527 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2528 mov r3, rSELF @ r3<- self
2529 bl artGet64InstanceFromCode
2530 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2531 ubfx r2, rINST, #8, #4 @ r2<- A
2532 PREFETCH_INST 2
2533 cmp r3, #0
2534 bne MterpException @ bail out
buzbee50cf6002016-02-10 08:59:12 -08002535 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
2536 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
2537 stmia r3, {r0-r1} @ fp[A]<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -08002538 ADVANCE 2
2539 GET_INST_OPCODE ip @ extract opcode from rINST
2540 GOTO_OPCODE ip @ jump to next instruction
2541
2542/* ------------------------------ */
2543 .balign 128
2544.L_op_iget_object: /* 0x54 */
2545/* File: arm/op_iget_object.S */
2546/* File: arm/op_iget.S */
2547 /*
2548 * General instance field get.
2549 *
2550 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2551 */
2552 EXPORT_PC
2553 FETCH r0, 1 @ r0<- field ref CCCC
2554 mov r1, rINST, lsr #12 @ r1<- B
2555 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2556 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2557 mov r3, rSELF @ r3<- self
2558 bl artGetObjInstanceFromCode
2559 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2560 ubfx r2, rINST, #8, #4 @ r2<- A
2561 PREFETCH_INST 2
2562 cmp r3, #0
2563 bne MterpPossibleException @ bail out
2564 .if 1
2565 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2566 .else
2567 SET_VREG r0, r2 @ fp[A]<- r0
2568 .endif
2569 ADVANCE 2
2570 GET_INST_OPCODE ip @ extract opcode from rINST
2571 GOTO_OPCODE ip @ jump to next instruction
2572
2573
2574/* ------------------------------ */
2575 .balign 128
2576.L_op_iget_boolean: /* 0x55 */
2577/* File: arm/op_iget_boolean.S */
2578/* File: arm/op_iget.S */
2579 /*
2580 * General instance field get.
2581 *
2582 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2583 */
2584 EXPORT_PC
2585 FETCH r0, 1 @ r0<- field ref CCCC
2586 mov r1, rINST, lsr #12 @ r1<- B
2587 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2588 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2589 mov r3, rSELF @ r3<- self
2590 bl artGetBooleanInstanceFromCode
2591 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2592 ubfx r2, rINST, #8, #4 @ r2<- A
2593 PREFETCH_INST 2
2594 cmp r3, #0
2595 bne MterpPossibleException @ bail out
2596 .if 0
2597 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2598 .else
2599 SET_VREG r0, r2 @ fp[A]<- r0
2600 .endif
2601 ADVANCE 2
2602 GET_INST_OPCODE ip @ extract opcode from rINST
2603 GOTO_OPCODE ip @ jump to next instruction
2604
2605
2606/* ------------------------------ */
2607 .balign 128
2608.L_op_iget_byte: /* 0x56 */
2609/* File: arm/op_iget_byte.S */
2610/* File: arm/op_iget.S */
2611 /*
2612 * General instance field get.
2613 *
2614 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2615 */
2616 EXPORT_PC
2617 FETCH r0, 1 @ r0<- field ref CCCC
2618 mov r1, rINST, lsr #12 @ r1<- B
2619 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2620 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2621 mov r3, rSELF @ r3<- self
2622 bl artGetByteInstanceFromCode
2623 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2624 ubfx r2, rINST, #8, #4 @ r2<- A
2625 PREFETCH_INST 2
2626 cmp r3, #0
2627 bne MterpPossibleException @ bail out
2628 .if 0
2629 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2630 .else
2631 SET_VREG r0, r2 @ fp[A]<- r0
2632 .endif
2633 ADVANCE 2
2634 GET_INST_OPCODE ip @ extract opcode from rINST
2635 GOTO_OPCODE ip @ jump to next instruction
2636
2637
2638/* ------------------------------ */
2639 .balign 128
2640.L_op_iget_char: /* 0x57 */
2641/* File: arm/op_iget_char.S */
2642/* File: arm/op_iget.S */
2643 /*
2644 * General instance field get.
2645 *
2646 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2647 */
2648 EXPORT_PC
2649 FETCH r0, 1 @ r0<- field ref CCCC
2650 mov r1, rINST, lsr #12 @ r1<- B
2651 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2652 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2653 mov r3, rSELF @ r3<- self
2654 bl artGetCharInstanceFromCode
2655 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2656 ubfx r2, rINST, #8, #4 @ r2<- A
2657 PREFETCH_INST 2
2658 cmp r3, #0
2659 bne MterpPossibleException @ bail out
2660 .if 0
2661 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2662 .else
2663 SET_VREG r0, r2 @ fp[A]<- r0
2664 .endif
2665 ADVANCE 2
2666 GET_INST_OPCODE ip @ extract opcode from rINST
2667 GOTO_OPCODE ip @ jump to next instruction
2668
2669
2670/* ------------------------------ */
2671 .balign 128
2672.L_op_iget_short: /* 0x58 */
2673/* File: arm/op_iget_short.S */
2674/* File: arm/op_iget.S */
2675 /*
2676 * General instance field get.
2677 *
2678 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2679 */
2680 EXPORT_PC
2681 FETCH r0, 1 @ r0<- field ref CCCC
2682 mov r1, rINST, lsr #12 @ r1<- B
2683 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2684 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2685 mov r3, rSELF @ r3<- self
2686 bl artGetShortInstanceFromCode
2687 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2688 ubfx r2, rINST, #8, #4 @ r2<- A
2689 PREFETCH_INST 2
2690 cmp r3, #0
2691 bne MterpPossibleException @ bail out
2692 .if 0
2693 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2694 .else
2695 SET_VREG r0, r2 @ fp[A]<- r0
2696 .endif
2697 ADVANCE 2
2698 GET_INST_OPCODE ip @ extract opcode from rINST
2699 GOTO_OPCODE ip @ jump to next instruction
2700
2701
2702/* ------------------------------ */
2703 .balign 128
2704.L_op_iput: /* 0x59 */
2705/* File: arm/op_iput.S */
2706 /*
2707 * General 32-bit instance field put.
2708 *
2709 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2710 */
2711 /* op vA, vB, field@CCCC */
2712 .extern artSet32InstanceFromMterp
2713 EXPORT_PC
2714 FETCH r0, 1 @ r0<- field ref CCCC
2715 mov r1, rINST, lsr #12 @ r1<- B
2716 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2717 ubfx r2, rINST, #8, #4 @ r2<- A
2718 GET_VREG r2, r2 @ r2<- fp[A]
2719 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2720 PREFETCH_INST 2
2721 bl artSet32InstanceFromMterp
2722 cmp r0, #0
2723 bne MterpPossibleException
2724 ADVANCE 2 @ advance rPC
2725 GET_INST_OPCODE ip @ extract opcode from rINST
2726 GOTO_OPCODE ip @ jump to next instruction
2727
2728/* ------------------------------ */
2729 .balign 128
2730.L_op_iput_wide: /* 0x5a */
2731/* File: arm/op_iput_wide.S */
2732 /* iput-wide vA, vB, field@CCCC */
2733 .extern artSet64InstanceFromMterp
2734 EXPORT_PC
2735 FETCH r0, 1 @ r0<- field ref CCCC
2736 mov r1, rINST, lsr #12 @ r1<- B
2737 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2738 ubfx r2, rINST, #8, #4 @ r2<- A
2739 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
2740 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2741 PREFETCH_INST 2
2742 bl artSet64InstanceFromMterp
2743 cmp r0, #0
2744 bne MterpPossibleException
2745 ADVANCE 2 @ advance rPC
2746 GET_INST_OPCODE ip @ extract opcode from rINST
2747 GOTO_OPCODE ip @ jump to next instruction
2748
2749/* ------------------------------ */
2750 .balign 128
2751.L_op_iput_object: /* 0x5b */
2752/* File: arm/op_iput_object.S */
2753 EXPORT_PC
2754 add r0, rFP, #OFF_FP_SHADOWFRAME
2755 mov r1, rPC
2756 mov r2, rINST
2757 mov r3, rSELF
2758 bl MterpIputObject
2759 cmp r0, #0
2760 beq MterpException
2761 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2762 GET_INST_OPCODE ip @ extract opcode from rINST
2763 GOTO_OPCODE ip @ jump to next instruction
2764
2765/* ------------------------------ */
2766 .balign 128
2767.L_op_iput_boolean: /* 0x5c */
2768/* File: arm/op_iput_boolean.S */
2769/* File: arm/op_iput.S */
2770 /*
2771 * General 32-bit instance field put.
2772 *
2773 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2774 */
2775 /* op vA, vB, field@CCCC */
2776 .extern artSet8InstanceFromMterp
2777 EXPORT_PC
2778 FETCH r0, 1 @ r0<- field ref CCCC
2779 mov r1, rINST, lsr #12 @ r1<- B
2780 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2781 ubfx r2, rINST, #8, #4 @ r2<- A
2782 GET_VREG r2, r2 @ r2<- fp[A]
2783 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2784 PREFETCH_INST 2
2785 bl artSet8InstanceFromMterp
2786 cmp r0, #0
2787 bne MterpPossibleException
2788 ADVANCE 2 @ advance rPC
2789 GET_INST_OPCODE ip @ extract opcode from rINST
2790 GOTO_OPCODE ip @ jump to next instruction
2791
2792
2793/* ------------------------------ */
2794 .balign 128
2795.L_op_iput_byte: /* 0x5d */
2796/* File: arm/op_iput_byte.S */
2797/* File: arm/op_iput.S */
2798 /*
2799 * General 32-bit instance field put.
2800 *
2801 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2802 */
2803 /* op vA, vB, field@CCCC */
2804 .extern artSet8InstanceFromMterp
2805 EXPORT_PC
2806 FETCH r0, 1 @ r0<- field ref CCCC
2807 mov r1, rINST, lsr #12 @ r1<- B
2808 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2809 ubfx r2, rINST, #8, #4 @ r2<- A
2810 GET_VREG r2, r2 @ r2<- fp[A]
2811 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2812 PREFETCH_INST 2
2813 bl artSet8InstanceFromMterp
2814 cmp r0, #0
2815 bne MterpPossibleException
2816 ADVANCE 2 @ advance rPC
2817 GET_INST_OPCODE ip @ extract opcode from rINST
2818 GOTO_OPCODE ip @ jump to next instruction
2819
2820
2821/* ------------------------------ */
2822 .balign 128
2823.L_op_iput_char: /* 0x5e */
2824/* File: arm/op_iput_char.S */
2825/* File: arm/op_iput.S */
2826 /*
2827 * General 32-bit instance field put.
2828 *
2829 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2830 */
2831 /* op vA, vB, field@CCCC */
2832 .extern artSet16InstanceFromMterp
2833 EXPORT_PC
2834 FETCH r0, 1 @ r0<- field ref CCCC
2835 mov r1, rINST, lsr #12 @ r1<- B
2836 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2837 ubfx r2, rINST, #8, #4 @ r2<- A
2838 GET_VREG r2, r2 @ r2<- fp[A]
2839 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2840 PREFETCH_INST 2
2841 bl artSet16InstanceFromMterp
2842 cmp r0, #0
2843 bne MterpPossibleException
2844 ADVANCE 2 @ advance rPC
2845 GET_INST_OPCODE ip @ extract opcode from rINST
2846 GOTO_OPCODE ip @ jump to next instruction
2847
2848
2849/* ------------------------------ */
2850 .balign 128
2851.L_op_iput_short: /* 0x5f */
2852/* File: arm/op_iput_short.S */
2853/* File: arm/op_iput.S */
2854 /*
2855 * General 32-bit instance field put.
2856 *
2857 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2858 */
2859 /* op vA, vB, field@CCCC */
2860 .extern artSet16InstanceFromMterp
2861 EXPORT_PC
2862 FETCH r0, 1 @ r0<- field ref CCCC
2863 mov r1, rINST, lsr #12 @ r1<- B
2864 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2865 ubfx r2, rINST, #8, #4 @ r2<- A
2866 GET_VREG r2, r2 @ r2<- fp[A]
2867 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2868 PREFETCH_INST 2
2869 bl artSet16InstanceFromMterp
2870 cmp r0, #0
2871 bne MterpPossibleException
2872 ADVANCE 2 @ advance rPC
2873 GET_INST_OPCODE ip @ extract opcode from rINST
2874 GOTO_OPCODE ip @ jump to next instruction
2875
2876
2877/* ------------------------------ */
2878 .balign 128
2879.L_op_sget: /* 0x60 */
2880/* File: arm/op_sget.S */
2881 /*
2882 * General SGET handler wrapper.
2883 *
2884 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2885 */
2886 /* op vAA, field@BBBB */
2887
2888 .extern artGet32StaticFromCode
2889 EXPORT_PC
2890 FETCH r0, 1 @ r0<- field ref BBBB
2891 ldr r1, [rFP, #OFF_FP_METHOD]
2892 mov r2, rSELF
2893 bl artGet32StaticFromCode
2894 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2895 mov r2, rINST, lsr #8 @ r2<- AA
2896 PREFETCH_INST 2
2897 cmp r3, #0 @ Fail to resolve?
2898 bne MterpException @ bail out
2899.if 0
2900 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2901.else
2902 SET_VREG r0, r2 @ fp[AA]<- r0
2903.endif
2904 ADVANCE 2
2905 GET_INST_OPCODE ip @ extract opcode from rINST
2906 GOTO_OPCODE ip
2907
2908/* ------------------------------ */
2909 .balign 128
2910.L_op_sget_wide: /* 0x61 */
2911/* File: arm/op_sget_wide.S */
2912 /*
2913 * SGET_WIDE handler wrapper.
2914 *
2915 */
2916 /* sget-wide vAA, field@BBBB */
2917
2918 .extern artGet64StaticFromCode
2919 EXPORT_PC
2920 FETCH r0, 1 @ r0<- field ref BBBB
2921 ldr r1, [rFP, #OFF_FP_METHOD]
2922 mov r2, rSELF
2923 bl artGet64StaticFromCode
2924 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2925 mov r9, rINST, lsr #8 @ r9<- AA
buzbee50cf6002016-02-10 08:59:12 -08002926 add lr, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08002927 cmp r3, #0 @ Fail to resolve?
2928 bne MterpException @ bail out
2929 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -08002930 CLEAR_SHADOW_PAIR r9, r2, ip @ Zero out the shadow regs
2931 stmia lr, {r0-r1} @ vAA/vAA+1<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -08002932 GET_INST_OPCODE ip @ extract opcode from rINST
2933 GOTO_OPCODE ip @ jump to next instruction
2934
2935/* ------------------------------ */
2936 .balign 128
2937.L_op_sget_object: /* 0x62 */
2938/* File: arm/op_sget_object.S */
2939/* File: arm/op_sget.S */
2940 /*
2941 * General SGET handler wrapper.
2942 *
2943 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2944 */
2945 /* op vAA, field@BBBB */
2946
2947 .extern artGetObjStaticFromCode
2948 EXPORT_PC
2949 FETCH r0, 1 @ r0<- field ref BBBB
2950 ldr r1, [rFP, #OFF_FP_METHOD]
2951 mov r2, rSELF
2952 bl artGetObjStaticFromCode
2953 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2954 mov r2, rINST, lsr #8 @ r2<- AA
2955 PREFETCH_INST 2
2956 cmp r3, #0 @ Fail to resolve?
2957 bne MterpException @ bail out
2958.if 1
2959 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2960.else
2961 SET_VREG r0, r2 @ fp[AA]<- r0
2962.endif
2963 ADVANCE 2
2964 GET_INST_OPCODE ip @ extract opcode from rINST
2965 GOTO_OPCODE ip
2966
2967
2968/* ------------------------------ */
2969 .balign 128
2970.L_op_sget_boolean: /* 0x63 */
2971/* File: arm/op_sget_boolean.S */
2972/* File: arm/op_sget.S */
2973 /*
2974 * General SGET handler wrapper.
2975 *
2976 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2977 */
2978 /* op vAA, field@BBBB */
2979
2980 .extern artGetBooleanStaticFromCode
2981 EXPORT_PC
2982 FETCH r0, 1 @ r0<- field ref BBBB
2983 ldr r1, [rFP, #OFF_FP_METHOD]
2984 mov r2, rSELF
2985 bl artGetBooleanStaticFromCode
2986 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2987 mov r2, rINST, lsr #8 @ r2<- AA
2988 PREFETCH_INST 2
2989 cmp r3, #0 @ Fail to resolve?
2990 bne MterpException @ bail out
2991.if 0
2992 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2993.else
2994 SET_VREG r0, r2 @ fp[AA]<- r0
2995.endif
2996 ADVANCE 2
2997 GET_INST_OPCODE ip @ extract opcode from rINST
2998 GOTO_OPCODE ip
2999
3000
3001/* ------------------------------ */
3002 .balign 128
3003.L_op_sget_byte: /* 0x64 */
3004/* File: arm/op_sget_byte.S */
3005/* File: arm/op_sget.S */
3006 /*
3007 * General SGET handler wrapper.
3008 *
3009 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3010 */
3011 /* op vAA, field@BBBB */
3012
3013 .extern artGetByteStaticFromCode
3014 EXPORT_PC
3015 FETCH r0, 1 @ r0<- field ref BBBB
3016 ldr r1, [rFP, #OFF_FP_METHOD]
3017 mov r2, rSELF
3018 bl artGetByteStaticFromCode
3019 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3020 mov r2, rINST, lsr #8 @ r2<- AA
3021 PREFETCH_INST 2
3022 cmp r3, #0 @ Fail to resolve?
3023 bne MterpException @ bail out
3024.if 0
3025 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3026.else
3027 SET_VREG r0, r2 @ fp[AA]<- r0
3028.endif
3029 ADVANCE 2
3030 GET_INST_OPCODE ip @ extract opcode from rINST
3031 GOTO_OPCODE ip
3032
3033
3034/* ------------------------------ */
3035 .balign 128
3036.L_op_sget_char: /* 0x65 */
3037/* File: arm/op_sget_char.S */
3038/* File: arm/op_sget.S */
3039 /*
3040 * General SGET handler wrapper.
3041 *
3042 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3043 */
3044 /* op vAA, field@BBBB */
3045
3046 .extern artGetCharStaticFromCode
3047 EXPORT_PC
3048 FETCH r0, 1 @ r0<- field ref BBBB
3049 ldr r1, [rFP, #OFF_FP_METHOD]
3050 mov r2, rSELF
3051 bl artGetCharStaticFromCode
3052 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3053 mov r2, rINST, lsr #8 @ r2<- AA
3054 PREFETCH_INST 2
3055 cmp r3, #0 @ Fail to resolve?
3056 bne MterpException @ bail out
3057.if 0
3058 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3059.else
3060 SET_VREG r0, r2 @ fp[AA]<- r0
3061.endif
3062 ADVANCE 2
3063 GET_INST_OPCODE ip @ extract opcode from rINST
3064 GOTO_OPCODE ip
3065
3066
3067/* ------------------------------ */
3068 .balign 128
3069.L_op_sget_short: /* 0x66 */
3070/* File: arm/op_sget_short.S */
3071/* File: arm/op_sget.S */
3072 /*
3073 * General SGET handler wrapper.
3074 *
3075 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3076 */
3077 /* op vAA, field@BBBB */
3078
3079 .extern artGetShortStaticFromCode
3080 EXPORT_PC
3081 FETCH r0, 1 @ r0<- field ref BBBB
3082 ldr r1, [rFP, #OFF_FP_METHOD]
3083 mov r2, rSELF
3084 bl artGetShortStaticFromCode
3085 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3086 mov r2, rINST, lsr #8 @ r2<- AA
3087 PREFETCH_INST 2
3088 cmp r3, #0 @ Fail to resolve?
3089 bne MterpException @ bail out
3090.if 0
3091 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3092.else
3093 SET_VREG r0, r2 @ fp[AA]<- r0
3094.endif
3095 ADVANCE 2
3096 GET_INST_OPCODE ip @ extract opcode from rINST
3097 GOTO_OPCODE ip
3098
3099
3100/* ------------------------------ */
3101 .balign 128
3102.L_op_sput: /* 0x67 */
3103/* File: arm/op_sput.S */
3104 /*
3105 * General SPUT handler wrapper.
3106 *
3107 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3108 */
3109 /* op vAA, field@BBBB */
3110 EXPORT_PC
3111 FETCH r0, 1 @ r0<- field ref BBBB
3112 mov r3, rINST, lsr #8 @ r3<- AA
3113 GET_VREG r1, r3 @ r1<= fp[AA]
3114 ldr r2, [rFP, #OFF_FP_METHOD]
3115 mov r3, rSELF
3116 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3117 bl artSet32StaticFromCode
3118 cmp r0, #0 @ 0 on success, -1 on failure
3119 bne MterpException
3120 ADVANCE 2 @ Past exception point - now advance rPC
3121 GET_INST_OPCODE ip @ extract opcode from rINST
3122 GOTO_OPCODE ip @ jump to next instruction
3123
3124/* ------------------------------ */
3125 .balign 128
3126.L_op_sput_wide: /* 0x68 */
3127/* File: arm/op_sput_wide.S */
3128 /*
3129 * SPUT_WIDE handler wrapper.
3130 *
3131 */
3132 /* sput-wide vAA, field@BBBB */
3133 .extern artSet64IndirectStaticFromMterp
3134 EXPORT_PC
3135 FETCH r0, 1 @ r0<- field ref BBBB
3136 ldr r1, [rFP, #OFF_FP_METHOD]
3137 mov r2, rINST, lsr #8 @ r3<- AA
3138 add r2, rFP, r2, lsl #2
3139 mov r3, rSELF
3140 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3141 bl artSet64IndirectStaticFromMterp
3142 cmp r0, #0 @ 0 on success, -1 on failure
3143 bne MterpException
3144 ADVANCE 2 @ Past exception point - now advance rPC
3145 GET_INST_OPCODE ip @ extract opcode from rINST
3146 GOTO_OPCODE ip @ jump to next instruction
3147
3148/* ------------------------------ */
3149 .balign 128
3150.L_op_sput_object: /* 0x69 */
3151/* File: arm/op_sput_object.S */
3152 EXPORT_PC
3153 add r0, rFP, #OFF_FP_SHADOWFRAME
3154 mov r1, rPC
3155 mov r2, rINST
3156 mov r3, rSELF
3157 bl MterpSputObject
3158 cmp r0, #0
3159 beq MterpException
3160 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3161 GET_INST_OPCODE ip @ extract opcode from rINST
3162 GOTO_OPCODE ip @ jump to next instruction
3163
3164/* ------------------------------ */
3165 .balign 128
3166.L_op_sput_boolean: /* 0x6a */
3167/* File: arm/op_sput_boolean.S */
3168/* File: arm/op_sput.S */
3169 /*
3170 * General SPUT handler wrapper.
3171 *
3172 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3173 */
3174 /* op vAA, field@BBBB */
3175 EXPORT_PC
3176 FETCH r0, 1 @ r0<- field ref BBBB
3177 mov r3, rINST, lsr #8 @ r3<- AA
3178 GET_VREG r1, r3 @ r1<= fp[AA]
3179 ldr r2, [rFP, #OFF_FP_METHOD]
3180 mov r3, rSELF
3181 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3182 bl artSet8StaticFromCode
3183 cmp r0, #0 @ 0 on success, -1 on failure
3184 bne MterpException
3185 ADVANCE 2 @ Past exception point - now advance rPC
3186 GET_INST_OPCODE ip @ extract opcode from rINST
3187 GOTO_OPCODE ip @ jump to next instruction
3188
3189
3190/* ------------------------------ */
3191 .balign 128
3192.L_op_sput_byte: /* 0x6b */
3193/* File: arm/op_sput_byte.S */
3194/* File: arm/op_sput.S */
3195 /*
3196 * General SPUT handler wrapper.
3197 *
3198 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3199 */
3200 /* op vAA, field@BBBB */
3201 EXPORT_PC
3202 FETCH r0, 1 @ r0<- field ref BBBB
3203 mov r3, rINST, lsr #8 @ r3<- AA
3204 GET_VREG r1, r3 @ r1<= fp[AA]
3205 ldr r2, [rFP, #OFF_FP_METHOD]
3206 mov r3, rSELF
3207 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3208 bl artSet8StaticFromCode
3209 cmp r0, #0 @ 0 on success, -1 on failure
3210 bne MterpException
3211 ADVANCE 2 @ Past exception point - now advance rPC
3212 GET_INST_OPCODE ip @ extract opcode from rINST
3213 GOTO_OPCODE ip @ jump to next instruction
3214
3215
3216/* ------------------------------ */
3217 .balign 128
3218.L_op_sput_char: /* 0x6c */
3219/* File: arm/op_sput_char.S */
3220/* File: arm/op_sput.S */
3221 /*
3222 * General SPUT handler wrapper.
3223 *
3224 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3225 */
3226 /* op vAA, field@BBBB */
3227 EXPORT_PC
3228 FETCH r0, 1 @ r0<- field ref BBBB
3229 mov r3, rINST, lsr #8 @ r3<- AA
3230 GET_VREG r1, r3 @ r1<= fp[AA]
3231 ldr r2, [rFP, #OFF_FP_METHOD]
3232 mov r3, rSELF
3233 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3234 bl artSet16StaticFromCode
3235 cmp r0, #0 @ 0 on success, -1 on failure
3236 bne MterpException
3237 ADVANCE 2 @ Past exception point - now advance rPC
3238 GET_INST_OPCODE ip @ extract opcode from rINST
3239 GOTO_OPCODE ip @ jump to next instruction
3240
3241
3242/* ------------------------------ */
3243 .balign 128
3244.L_op_sput_short: /* 0x6d */
3245/* File: arm/op_sput_short.S */
3246/* File: arm/op_sput.S */
3247 /*
3248 * General SPUT handler wrapper.
3249 *
3250 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3251 */
3252 /* op vAA, field@BBBB */
3253 EXPORT_PC
3254 FETCH r0, 1 @ r0<- field ref BBBB
3255 mov r3, rINST, lsr #8 @ r3<- AA
3256 GET_VREG r1, r3 @ r1<= fp[AA]
3257 ldr r2, [rFP, #OFF_FP_METHOD]
3258 mov r3, rSELF
3259 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3260 bl artSet16StaticFromCode
3261 cmp r0, #0 @ 0 on success, -1 on failure
3262 bne MterpException
3263 ADVANCE 2 @ Past exception point - now advance rPC
3264 GET_INST_OPCODE ip @ extract opcode from rINST
3265 GOTO_OPCODE ip @ jump to next instruction
3266
3267
3268/* ------------------------------ */
3269 .balign 128
3270.L_op_invoke_virtual: /* 0x6e */
3271/* File: arm/op_invoke_virtual.S */
3272/* File: arm/invoke.S */
3273 /*
3274 * Generic invoke handler wrapper.
3275 */
3276 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3277 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3278 .extern MterpInvokeVirtual
3279 EXPORT_PC
3280 mov r0, rSELF
3281 add r1, rFP, #OFF_FP_SHADOWFRAME
3282 mov r2, rPC
3283 mov r3, rINST
3284 bl MterpInvokeVirtual
3285 cmp r0, #0
3286 beq MterpException
3287 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003288 bl MterpShouldSwitchInterpreters
3289 cmp r0, #0
3290 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003291 GET_INST_OPCODE ip
3292 GOTO_OPCODE ip
3293
3294
3295 /*
3296 * Handle a virtual method call.
3297 *
3298 * for: invoke-virtual, invoke-virtual/range
3299 */
3300 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3301 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3302
3303/* ------------------------------ */
3304 .balign 128
3305.L_op_invoke_super: /* 0x6f */
3306/* File: arm/op_invoke_super.S */
3307/* File: arm/invoke.S */
3308 /*
3309 * Generic invoke handler wrapper.
3310 */
3311 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3312 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3313 .extern MterpInvokeSuper
3314 EXPORT_PC
3315 mov r0, rSELF
3316 add r1, rFP, #OFF_FP_SHADOWFRAME
3317 mov r2, rPC
3318 mov r3, rINST
3319 bl MterpInvokeSuper
3320 cmp r0, #0
3321 beq MterpException
3322 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003323 bl MterpShouldSwitchInterpreters
3324 cmp r0, #0
3325 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003326 GET_INST_OPCODE ip
3327 GOTO_OPCODE ip
3328
3329
3330 /*
3331 * Handle a "super" method call.
3332 *
3333 * for: invoke-super, invoke-super/range
3334 */
3335 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3336 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3337
3338/* ------------------------------ */
3339 .balign 128
3340.L_op_invoke_direct: /* 0x70 */
3341/* File: arm/op_invoke_direct.S */
3342/* File: arm/invoke.S */
3343 /*
3344 * Generic invoke handler wrapper.
3345 */
3346 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3347 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3348 .extern MterpInvokeDirect
3349 EXPORT_PC
3350 mov r0, rSELF
3351 add r1, rFP, #OFF_FP_SHADOWFRAME
3352 mov r2, rPC
3353 mov r3, rINST
3354 bl MterpInvokeDirect
3355 cmp r0, #0
3356 beq MterpException
3357 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003358 bl MterpShouldSwitchInterpreters
3359 cmp r0, #0
3360 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003361 GET_INST_OPCODE ip
3362 GOTO_OPCODE ip
3363
3364
3365
3366/* ------------------------------ */
3367 .balign 128
3368.L_op_invoke_static: /* 0x71 */
3369/* File: arm/op_invoke_static.S */
3370/* File: arm/invoke.S */
3371 /*
3372 * Generic invoke handler wrapper.
3373 */
3374 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3375 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3376 .extern MterpInvokeStatic
3377 EXPORT_PC
3378 mov r0, rSELF
3379 add r1, rFP, #OFF_FP_SHADOWFRAME
3380 mov r2, rPC
3381 mov r3, rINST
3382 bl MterpInvokeStatic
3383 cmp r0, #0
3384 beq MterpException
3385 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003386 bl MterpShouldSwitchInterpreters
3387 cmp r0, #0
3388 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003389 GET_INST_OPCODE ip
3390 GOTO_OPCODE ip
3391
3392
3393
3394
3395/* ------------------------------ */
3396 .balign 128
3397.L_op_invoke_interface: /* 0x72 */
3398/* File: arm/op_invoke_interface.S */
3399/* File: arm/invoke.S */
3400 /*
3401 * Generic invoke handler wrapper.
3402 */
3403 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3404 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3405 .extern MterpInvokeInterface
3406 EXPORT_PC
3407 mov r0, rSELF
3408 add r1, rFP, #OFF_FP_SHADOWFRAME
3409 mov r2, rPC
3410 mov r3, rINST
3411 bl MterpInvokeInterface
3412 cmp r0, #0
3413 beq MterpException
3414 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003415 bl MterpShouldSwitchInterpreters
3416 cmp r0, #0
3417 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003418 GET_INST_OPCODE ip
3419 GOTO_OPCODE ip
3420
3421
3422 /*
3423 * Handle an interface method call.
3424 *
3425 * for: invoke-interface, invoke-interface/range
3426 */
3427 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3428 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3429
3430/* ------------------------------ */
3431 .balign 128
3432.L_op_return_void_no_barrier: /* 0x73 */
3433/* File: arm/op_return_void_no_barrier.S */
buzbeea2c97a92016-01-25 15:41:24 -08003434 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
3435 mov r0, rSELF
3436 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3437 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -08003438 mov r0, #0
3439 mov r1, #0
3440 b MterpReturn
3441
3442/* ------------------------------ */
3443 .balign 128
3444.L_op_invoke_virtual_range: /* 0x74 */
3445/* File: arm/op_invoke_virtual_range.S */
3446/* File: arm/invoke.S */
3447 /*
3448 * Generic invoke handler wrapper.
3449 */
3450 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3451 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3452 .extern MterpInvokeVirtualRange
3453 EXPORT_PC
3454 mov r0, rSELF
3455 add r1, rFP, #OFF_FP_SHADOWFRAME
3456 mov r2, rPC
3457 mov r3, rINST
3458 bl MterpInvokeVirtualRange
3459 cmp r0, #0
3460 beq MterpException
3461 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003462 bl MterpShouldSwitchInterpreters
3463 cmp r0, #0
3464 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003465 GET_INST_OPCODE ip
3466 GOTO_OPCODE ip
3467
3468
3469
3470/* ------------------------------ */
3471 .balign 128
3472.L_op_invoke_super_range: /* 0x75 */
3473/* File: arm/op_invoke_super_range.S */
3474/* File: arm/invoke.S */
3475 /*
3476 * Generic invoke handler wrapper.
3477 */
3478 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3479 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3480 .extern MterpInvokeSuperRange
3481 EXPORT_PC
3482 mov r0, rSELF
3483 add r1, rFP, #OFF_FP_SHADOWFRAME
3484 mov r2, rPC
3485 mov r3, rINST
3486 bl MterpInvokeSuperRange
3487 cmp r0, #0
3488 beq MterpException
3489 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003490 bl MterpShouldSwitchInterpreters
3491 cmp r0, #0
3492 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003493 GET_INST_OPCODE ip
3494 GOTO_OPCODE ip
3495
3496
3497
3498/* ------------------------------ */
3499 .balign 128
3500.L_op_invoke_direct_range: /* 0x76 */
3501/* File: arm/op_invoke_direct_range.S */
3502/* File: arm/invoke.S */
3503 /*
3504 * Generic invoke handler wrapper.
3505 */
3506 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3507 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3508 .extern MterpInvokeDirectRange
3509 EXPORT_PC
3510 mov r0, rSELF
3511 add r1, rFP, #OFF_FP_SHADOWFRAME
3512 mov r2, rPC
3513 mov r3, rINST
3514 bl MterpInvokeDirectRange
3515 cmp r0, #0
3516 beq MterpException
3517 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003518 bl MterpShouldSwitchInterpreters
3519 cmp r0, #0
3520 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003521 GET_INST_OPCODE ip
3522 GOTO_OPCODE ip
3523
3524
3525
3526/* ------------------------------ */
3527 .balign 128
3528.L_op_invoke_static_range: /* 0x77 */
3529/* File: arm/op_invoke_static_range.S */
3530/* File: arm/invoke.S */
3531 /*
3532 * Generic invoke handler wrapper.
3533 */
3534 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3535 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3536 .extern MterpInvokeStaticRange
3537 EXPORT_PC
3538 mov r0, rSELF
3539 add r1, rFP, #OFF_FP_SHADOWFRAME
3540 mov r2, rPC
3541 mov r3, rINST
3542 bl MterpInvokeStaticRange
3543 cmp r0, #0
3544 beq MterpException
3545 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003546 bl MterpShouldSwitchInterpreters
3547 cmp r0, #0
3548 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003549 GET_INST_OPCODE ip
3550 GOTO_OPCODE ip
3551
3552
3553
3554/* ------------------------------ */
3555 .balign 128
3556.L_op_invoke_interface_range: /* 0x78 */
3557/* File: arm/op_invoke_interface_range.S */
3558/* File: arm/invoke.S */
3559 /*
3560 * Generic invoke handler wrapper.
3561 */
3562 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3563 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3564 .extern MterpInvokeInterfaceRange
3565 EXPORT_PC
3566 mov r0, rSELF
3567 add r1, rFP, #OFF_FP_SHADOWFRAME
3568 mov r2, rPC
3569 mov r3, rINST
3570 bl MterpInvokeInterfaceRange
3571 cmp r0, #0
3572 beq MterpException
3573 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003574 bl MterpShouldSwitchInterpreters
3575 cmp r0, #0
3576 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003577 GET_INST_OPCODE ip
3578 GOTO_OPCODE ip
3579
3580
3581
3582/* ------------------------------ */
3583 .balign 128
3584.L_op_unused_79: /* 0x79 */
3585/* File: arm/op_unused_79.S */
3586/* File: arm/unused.S */
3587/*
3588 * Bail to reference interpreter to throw.
3589 */
3590 b MterpFallback
3591
3592
3593/* ------------------------------ */
3594 .balign 128
3595.L_op_unused_7a: /* 0x7a */
3596/* File: arm/op_unused_7a.S */
3597/* File: arm/unused.S */
3598/*
3599 * Bail to reference interpreter to throw.
3600 */
3601 b MterpFallback
3602
3603
3604/* ------------------------------ */
3605 .balign 128
3606.L_op_neg_int: /* 0x7b */
3607/* File: arm/op_neg_int.S */
3608/* File: arm/unop.S */
3609 /*
3610 * Generic 32-bit unary operation. Provide an "instr" line that
3611 * specifies an instruction that performs "result = op r0".
3612 * This could be an ARM instruction or a function call.
3613 *
3614 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3615 * int-to-byte, int-to-char, int-to-short
3616 */
3617 /* unop vA, vB */
3618 mov r3, rINST, lsr #12 @ r3<- B
3619 ubfx r9, rINST, #8, #4 @ r9<- A
3620 GET_VREG r0, r3 @ r0<- vB
3621 @ optional op; may set condition codes
3622 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3623 rsb r0, r0, #0 @ r0<- op, r0-r3 changed
3624 GET_INST_OPCODE ip @ extract opcode from rINST
3625 SET_VREG r0, r9 @ vAA<- r0
3626 GOTO_OPCODE ip @ jump to next instruction
3627 /* 8-9 instructions */
3628
3629
3630/* ------------------------------ */
3631 .balign 128
3632.L_op_not_int: /* 0x7c */
3633/* File: arm/op_not_int.S */
3634/* File: arm/unop.S */
3635 /*
3636 * Generic 32-bit unary operation. Provide an "instr" line that
3637 * specifies an instruction that performs "result = op r0".
3638 * This could be an ARM instruction or a function call.
3639 *
3640 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3641 * int-to-byte, int-to-char, int-to-short
3642 */
3643 /* unop vA, vB */
3644 mov r3, rINST, lsr #12 @ r3<- B
3645 ubfx r9, rINST, #8, #4 @ r9<- A
3646 GET_VREG r0, r3 @ r0<- vB
3647 @ optional op; may set condition codes
3648 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3649 mvn r0, r0 @ r0<- op, r0-r3 changed
3650 GET_INST_OPCODE ip @ extract opcode from rINST
3651 SET_VREG r0, r9 @ vAA<- r0
3652 GOTO_OPCODE ip @ jump to next instruction
3653 /* 8-9 instructions */
3654
3655
3656/* ------------------------------ */
3657 .balign 128
3658.L_op_neg_long: /* 0x7d */
3659/* File: arm/op_neg_long.S */
3660/* File: arm/unopWide.S */
3661 /*
3662 * Generic 64-bit unary operation. Provide an "instr" line that
3663 * specifies an instruction that performs "result = op r0/r1".
3664 * This could be an ARM instruction or a function call.
3665 *
3666 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3667 */
3668 /* unop vA, vB */
3669 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003670 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003671 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003672 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003673 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003674 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003675 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3676 rsbs r0, r0, #0 @ optional op; may set condition codes
3677 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed
3678 GET_INST_OPCODE ip @ extract opcode from rINST
3679 stmia r9, {r0-r1} @ vAA<- r0/r1
3680 GOTO_OPCODE ip @ jump to next instruction
3681 /* 10-11 instructions */
3682
3683
3684/* ------------------------------ */
3685 .balign 128
3686.L_op_not_long: /* 0x7e */
3687/* File: arm/op_not_long.S */
3688/* File: arm/unopWide.S */
3689 /*
3690 * Generic 64-bit unary operation. Provide an "instr" line that
3691 * specifies an instruction that performs "result = op r0/r1".
3692 * This could be an ARM instruction or a function call.
3693 *
3694 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3695 */
3696 /* unop vA, vB */
3697 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003698 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003699 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003700 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003701 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003702 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003703 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3704 mvn r0, r0 @ optional op; may set condition codes
3705 mvn r1, r1 @ r0/r1<- op, r2-r3 changed
3706 GET_INST_OPCODE ip @ extract opcode from rINST
3707 stmia r9, {r0-r1} @ vAA<- r0/r1
3708 GOTO_OPCODE ip @ jump to next instruction
3709 /* 10-11 instructions */
3710
3711
3712/* ------------------------------ */
3713 .balign 128
3714.L_op_neg_float: /* 0x7f */
3715/* File: arm/op_neg_float.S */
3716/* File: arm/unop.S */
3717 /*
3718 * Generic 32-bit unary operation. Provide an "instr" line that
3719 * specifies an instruction that performs "result = op r0".
3720 * This could be an ARM instruction or a function call.
3721 *
3722 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3723 * int-to-byte, int-to-char, int-to-short
3724 */
3725 /* unop vA, vB */
3726 mov r3, rINST, lsr #12 @ r3<- B
3727 ubfx r9, rINST, #8, #4 @ r9<- A
3728 GET_VREG r0, r3 @ r0<- vB
3729 @ optional op; may set condition codes
3730 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3731 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed
3732 GET_INST_OPCODE ip @ extract opcode from rINST
3733 SET_VREG r0, r9 @ vAA<- r0
3734 GOTO_OPCODE ip @ jump to next instruction
3735 /* 8-9 instructions */
3736
3737
3738/* ------------------------------ */
3739 .balign 128
3740.L_op_neg_double: /* 0x80 */
3741/* File: arm/op_neg_double.S */
3742/* File: arm/unopWide.S */
3743 /*
3744 * Generic 64-bit unary operation. Provide an "instr" line that
3745 * specifies an instruction that performs "result = op r0/r1".
3746 * This could be an ARM instruction or a function call.
3747 *
3748 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3749 */
3750 /* unop vA, vB */
3751 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003752 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003753 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003754 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003755 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003756 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003757 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3758 @ optional op; may set condition codes
3759 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed
3760 GET_INST_OPCODE ip @ extract opcode from rINST
3761 stmia r9, {r0-r1} @ vAA<- r0/r1
3762 GOTO_OPCODE ip @ jump to next instruction
3763 /* 10-11 instructions */
3764
3765
3766/* ------------------------------ */
3767 .balign 128
3768.L_op_int_to_long: /* 0x81 */
3769/* File: arm/op_int_to_long.S */
3770/* File: arm/unopWider.S */
3771 /*
3772 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3773 * that specifies an instruction that performs "result = op r0", where
3774 * "result" is a 64-bit quantity in r0/r1.
3775 *
3776 * For: int-to-long, int-to-double, float-to-long, float-to-double
3777 */
3778 /* unop vA, vB */
3779 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003780 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003781 GET_VREG r0, r3 @ r0<- vB
buzbee50cf6002016-02-10 08:59:12 -08003782 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003783 @ optional op; may set condition codes
buzbee50cf6002016-02-10 08:59:12 -08003784 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003785 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3786 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed
3787 GET_INST_OPCODE ip @ extract opcode from rINST
3788 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3789 GOTO_OPCODE ip @ jump to next instruction
3790 /* 9-10 instructions */
3791
3792
3793/* ------------------------------ */
3794 .balign 128
3795.L_op_int_to_float: /* 0x82 */
3796/* File: arm/op_int_to_float.S */
3797/* File: arm/funop.S */
3798 /*
3799 * Generic 32-bit unary floating-point operation. Provide an "instr"
3800 * line that specifies an instruction that performs "s1 = op s0".
3801 *
3802 * for: int-to-float, float-to-int
3803 */
3804 /* unop vA, vB */
3805 mov r3, rINST, lsr #12 @ r3<- B
3806 mov r9, rINST, lsr #8 @ r9<- A+
3807 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3808 flds s0, [r3] @ s0<- vB
3809 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3810 and r9, r9, #15 @ r9<- A
3811 fsitos s1, s0 @ s1<- op
3812 GET_INST_OPCODE ip @ extract opcode from rINST
3813 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3814 fsts s1, [r9] @ vA<- s1
3815 GOTO_OPCODE ip @ jump to next instruction
3816
3817
3818/* ------------------------------ */
3819 .balign 128
3820.L_op_int_to_double: /* 0x83 */
3821/* File: arm/op_int_to_double.S */
3822/* File: arm/funopWider.S */
3823 /*
3824 * Generic 32bit-to-64bit floating point unary operation. Provide an
3825 * "instr" line that specifies an instruction that performs "d0 = op s0".
3826 *
3827 * For: int-to-double, float-to-double
3828 */
3829 /* unop vA, vB */
3830 mov r3, rINST, lsr #12 @ r3<- B
3831 mov r9, rINST, lsr #8 @ r9<- A+
3832 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3833 flds s0, [r3] @ s0<- vB
3834 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3835 and r9, r9, #15 @ r9<- A
3836 fsitod d0, s0 @ d0<- op
buzbee50cf6002016-02-10 08:59:12 -08003837 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003838 GET_INST_OPCODE ip @ extract opcode from rINST
3839 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3840 fstd d0, [r9] @ vA<- d0
3841 GOTO_OPCODE ip @ jump to next instruction
3842
3843
3844/* ------------------------------ */
3845 .balign 128
3846.L_op_long_to_int: /* 0x84 */
3847/* File: arm/op_long_to_int.S */
3848/* we ignore the high word, making this equivalent to a 32-bit reg move */
3849/* File: arm/op_move.S */
3850 /* for move, move-object, long-to-int */
3851 /* op vA, vB */
3852 mov r1, rINST, lsr #12 @ r1<- B from 15:12
3853 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
3854 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3855 GET_VREG r2, r1 @ r2<- fp[B]
3856 GET_INST_OPCODE ip @ ip<- opcode from rINST
3857 .if 0
3858 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
3859 .else
3860 SET_VREG r2, r0 @ fp[A]<- r2
3861 .endif
3862 GOTO_OPCODE ip @ execute next instruction
3863
3864
3865/* ------------------------------ */
3866 .balign 128
3867.L_op_long_to_float: /* 0x85 */
3868/* File: arm/op_long_to_float.S */
3869/* File: arm/unopNarrower.S */
3870 /*
3871 * Generic 64bit-to-32bit unary operation. Provide an "instr" line
3872 * that specifies an instruction that performs "result = op r0/r1", where
3873 * "result" is a 32-bit quantity in r0.
3874 *
3875 * For: long-to-float, double-to-int, double-to-float
3876 *
3877 * (This would work for long-to-int, but that instruction is actually
3878 * an exact match for op_move.)
3879 */
3880 /* unop vA, vB */
3881 mov r3, rINST, lsr #12 @ r3<- B
3882 ubfx r9, rINST, #8, #4 @ r9<- A
3883 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3884 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1
3885 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3886 @ optional op; may set condition codes
3887 bl __aeabi_l2f @ r0<- op, r0-r3 changed
3888 GET_INST_OPCODE ip @ extract opcode from rINST
3889 SET_VREG r0, r9 @ vA<- r0
3890 GOTO_OPCODE ip @ jump to next instruction
3891 /* 9-10 instructions */
3892
3893
3894/* ------------------------------ */
3895 .balign 128
3896.L_op_long_to_double: /* 0x86 */
3897/* File: arm/op_long_to_double.S */
3898 /*
3899 * Specialised 64-bit floating point operation.
3900 *
3901 * Note: The result will be returned in d2.
3902 *
3903 * For: long-to-double
3904 */
3905 mov r3, rINST, lsr #12 @ r3<- B
3906 ubfx r9, rINST, #8, #4 @ r9<- A
3907 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3908 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3909 vldr d0, [r3] @ d0<- vAA
3910 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3911
3912 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh)
3913 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl)
3914 vldr d3, constvalop_long_to_double
3915 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl
3916
3917 GET_INST_OPCODE ip @ extract opcode from rINST
3918 vstr.64 d2, [r9] @ vAA<- d2
3919 GOTO_OPCODE ip @ jump to next instruction
3920
3921 /* literal pool helper */
3922constvalop_long_to_double:
3923 .8byte 0x41f0000000000000
3924
3925/* ------------------------------ */
3926 .balign 128
3927.L_op_float_to_int: /* 0x87 */
3928/* File: arm/op_float_to_int.S */
3929/* File: arm/funop.S */
3930 /*
3931 * Generic 32-bit unary floating-point operation. Provide an "instr"
3932 * line that specifies an instruction that performs "s1 = op s0".
3933 *
3934 * for: int-to-float, float-to-int
3935 */
3936 /* unop vA, vB */
3937 mov r3, rINST, lsr #12 @ r3<- B
3938 mov r9, rINST, lsr #8 @ r9<- A+
3939 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3940 flds s0, [r3] @ s0<- vB
3941 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3942 and r9, r9, #15 @ r9<- A
3943 ftosizs s1, s0 @ s1<- op
3944 GET_INST_OPCODE ip @ extract opcode from rINST
3945 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3946 fsts s1, [r9] @ vA<- s1
3947 GOTO_OPCODE ip @ jump to next instruction
3948
3949
3950/* ------------------------------ */
3951 .balign 128
3952.L_op_float_to_long: /* 0x88 */
3953/* File: arm/op_float_to_long.S */
3954@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"}
3955/* File: arm/unopWider.S */
3956 /*
3957 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3958 * that specifies an instruction that performs "result = op r0", where
3959 * "result" is a 64-bit quantity in r0/r1.
3960 *
3961 * For: int-to-long, int-to-double, float-to-long, float-to-double
3962 */
3963 /* unop vA, vB */
3964 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003965 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003966 GET_VREG r0, r3 @ r0<- vB
buzbee50cf6002016-02-10 08:59:12 -08003967 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003968 @ optional op; may set condition codes
buzbee50cf6002016-02-10 08:59:12 -08003969 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003970 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3971 bl f2l_doconv @ r0<- op, r0-r3 changed
3972 GET_INST_OPCODE ip @ extract opcode from rINST
3973 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3974 GOTO_OPCODE ip @ jump to next instruction
3975 /* 9-10 instructions */
3976
3977
3978
3979/* ------------------------------ */
3980 .balign 128
3981.L_op_float_to_double: /* 0x89 */
3982/* File: arm/op_float_to_double.S */
3983/* File: arm/funopWider.S */
3984 /*
3985 * Generic 32bit-to-64bit floating point unary operation. Provide an
3986 * "instr" line that specifies an instruction that performs "d0 = op s0".
3987 *
3988 * For: int-to-double, float-to-double
3989 */
3990 /* unop vA, vB */
3991 mov r3, rINST, lsr #12 @ r3<- B
3992 mov r9, rINST, lsr #8 @ r9<- A+
3993 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3994 flds s0, [r3] @ s0<- vB
3995 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3996 and r9, r9, #15 @ r9<- A
buzbee96530d32016-03-04 08:03:51 -08003997 vcvt.f64.f32 d0, s0 @ d0<- op
buzbee50cf6002016-02-10 08:59:12 -08003998 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003999 GET_INST_OPCODE ip @ extract opcode from rINST
4000 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4001 fstd d0, [r9] @ vA<- d0
4002 GOTO_OPCODE ip @ jump to next instruction
4003
4004
4005/* ------------------------------ */
4006 .balign 128
4007.L_op_double_to_int: /* 0x8a */
4008/* File: arm/op_double_to_int.S */
4009/* File: arm/funopNarrower.S */
4010 /*
4011 * Generic 64bit-to-32bit unary floating point operation. Provide an
4012 * "instr" line that specifies an instruction that performs "s0 = op d0".
4013 *
4014 * For: double-to-int, double-to-float
4015 */
4016 /* unop vA, vB */
4017 mov r3, rINST, lsr #12 @ r3<- B
4018 mov r9, rINST, lsr #8 @ r9<- A+
4019 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4020 fldd d0, [r3] @ d0<- vB
4021 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4022 and r9, r9, #15 @ r9<- A
4023 ftosizd s0, d0 @ s0<- op
4024 GET_INST_OPCODE ip @ extract opcode from rINST
4025 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4026 fsts s0, [r9] @ vA<- s0
4027 GOTO_OPCODE ip @ jump to next instruction
4028
4029
4030/* ------------------------------ */
4031 .balign 128
4032.L_op_double_to_long: /* 0x8b */
4033/* File: arm/op_double_to_long.S */
4034@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"}
4035/* File: arm/unopWide.S */
4036 /*
4037 * Generic 64-bit unary operation. Provide an "instr" line that
4038 * specifies an instruction that performs "result = op r0/r1".
4039 * This could be an ARM instruction or a function call.
4040 *
4041 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
4042 */
4043 /* unop vA, vB */
4044 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08004045 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08004046 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08004047 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08004048 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08004049 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004050 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4051 @ optional op; may set condition codes
4052 bl d2l_doconv @ r0/r1<- op, r2-r3 changed
4053 GET_INST_OPCODE ip @ extract opcode from rINST
4054 stmia r9, {r0-r1} @ vAA<- r0/r1
4055 GOTO_OPCODE ip @ jump to next instruction
4056 /* 10-11 instructions */
4057
4058
4059
4060/* ------------------------------ */
4061 .balign 128
4062.L_op_double_to_float: /* 0x8c */
4063/* File: arm/op_double_to_float.S */
4064/* File: arm/funopNarrower.S */
4065 /*
4066 * Generic 64bit-to-32bit unary floating point operation. Provide an
4067 * "instr" line that specifies an instruction that performs "s0 = op d0".
4068 *
4069 * For: double-to-int, double-to-float
4070 */
4071 /* unop vA, vB */
4072 mov r3, rINST, lsr #12 @ r3<- B
4073 mov r9, rINST, lsr #8 @ r9<- A+
4074 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4075 fldd d0, [r3] @ d0<- vB
4076 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4077 and r9, r9, #15 @ r9<- A
buzbee96530d32016-03-04 08:03:51 -08004078 vcvt.f32.f64 s0, d0 @ s0<- op
buzbee1452bee2015-03-06 14:43:04 -08004079 GET_INST_OPCODE ip @ extract opcode from rINST
4080 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4081 fsts s0, [r9] @ vA<- s0
4082 GOTO_OPCODE ip @ jump to next instruction
4083
4084
4085/* ------------------------------ */
4086 .balign 128
4087.L_op_int_to_byte: /* 0x8d */
4088/* File: arm/op_int_to_byte.S */
4089/* File: arm/unop.S */
4090 /*
4091 * Generic 32-bit unary operation. Provide an "instr" line that
4092 * specifies an instruction that performs "result = op r0".
4093 * This could be an ARM instruction or a function call.
4094 *
4095 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4096 * int-to-byte, int-to-char, int-to-short
4097 */
4098 /* unop vA, vB */
4099 mov r3, rINST, lsr #12 @ r3<- B
4100 ubfx r9, rINST, #8, #4 @ r9<- A
4101 GET_VREG r0, r3 @ r0<- vB
4102 @ optional op; may set condition codes
4103 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4104 sxtb r0, r0 @ r0<- op, r0-r3 changed
4105 GET_INST_OPCODE ip @ extract opcode from rINST
4106 SET_VREG r0, r9 @ vAA<- r0
4107 GOTO_OPCODE ip @ jump to next instruction
4108 /* 8-9 instructions */
4109
4110
4111/* ------------------------------ */
4112 .balign 128
4113.L_op_int_to_char: /* 0x8e */
4114/* File: arm/op_int_to_char.S */
4115/* File: arm/unop.S */
4116 /*
4117 * Generic 32-bit unary operation. Provide an "instr" line that
4118 * specifies an instruction that performs "result = op r0".
4119 * This could be an ARM instruction or a function call.
4120 *
4121 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4122 * int-to-byte, int-to-char, int-to-short
4123 */
4124 /* unop vA, vB */
4125 mov r3, rINST, lsr #12 @ r3<- B
4126 ubfx r9, rINST, #8, #4 @ r9<- A
4127 GET_VREG r0, r3 @ r0<- vB
4128 @ optional op; may set condition codes
4129 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4130 uxth r0, r0 @ r0<- op, r0-r3 changed
4131 GET_INST_OPCODE ip @ extract opcode from rINST
4132 SET_VREG r0, r9 @ vAA<- r0
4133 GOTO_OPCODE ip @ jump to next instruction
4134 /* 8-9 instructions */
4135
4136
4137/* ------------------------------ */
4138 .balign 128
4139.L_op_int_to_short: /* 0x8f */
4140/* File: arm/op_int_to_short.S */
4141/* File: arm/unop.S */
4142 /*
4143 * Generic 32-bit unary operation. Provide an "instr" line that
4144 * specifies an instruction that performs "result = op r0".
4145 * This could be an ARM instruction or a function call.
4146 *
4147 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4148 * int-to-byte, int-to-char, int-to-short
4149 */
4150 /* unop vA, vB */
4151 mov r3, rINST, lsr #12 @ r3<- B
4152 ubfx r9, rINST, #8, #4 @ r9<- A
4153 GET_VREG r0, r3 @ r0<- vB
4154 @ optional op; may set condition codes
4155 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4156 sxth r0, r0 @ r0<- op, r0-r3 changed
4157 GET_INST_OPCODE ip @ extract opcode from rINST
4158 SET_VREG r0, r9 @ vAA<- r0
4159 GOTO_OPCODE ip @ jump to next instruction
4160 /* 8-9 instructions */
4161
4162
4163/* ------------------------------ */
4164 .balign 128
4165.L_op_add_int: /* 0x90 */
4166/* File: arm/op_add_int.S */
4167/* File: arm/binop.S */
4168 /*
4169 * Generic 32-bit binary operation. Provide an "instr" line that
4170 * specifies an instruction that performs "result = r0 op r1".
4171 * This could be an ARM instruction or a function call. (If the result
4172 * comes back in a register other than r0, you can override "result".)
4173 *
4174 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4175 * vCC (r1). Useful for integer division and modulus. Note that we
4176 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4177 * handles it correctly.
4178 *
4179 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4180 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4181 * mul-float, div-float, rem-float
4182 */
4183 /* binop vAA, vBB, vCC */
4184 FETCH r0, 1 @ r0<- CCBB
4185 mov r9, rINST, lsr #8 @ r9<- AA
4186 mov r3, r0, lsr #8 @ r3<- CC
4187 and r2, r0, #255 @ r2<- BB
4188 GET_VREG r1, r3 @ r1<- vCC
4189 GET_VREG r0, r2 @ r0<- vBB
4190 .if 0
4191 cmp r1, #0 @ is second operand zero?
4192 beq common_errDivideByZero
4193 .endif
4194
4195 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4196 @ optional op; may set condition codes
4197 add r0, r0, r1 @ r0<- op, r0-r3 changed
4198 GET_INST_OPCODE ip @ extract opcode from rINST
4199 SET_VREG r0, r9 @ vAA<- r0
4200 GOTO_OPCODE ip @ jump to next instruction
4201 /* 11-14 instructions */
4202
4203
4204/* ------------------------------ */
4205 .balign 128
4206.L_op_sub_int: /* 0x91 */
4207/* File: arm/op_sub_int.S */
4208/* File: arm/binop.S */
4209 /*
4210 * Generic 32-bit binary operation. Provide an "instr" line that
4211 * specifies an instruction that performs "result = r0 op r1".
4212 * This could be an ARM instruction or a function call. (If the result
4213 * comes back in a register other than r0, you can override "result".)
4214 *
4215 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4216 * vCC (r1). Useful for integer division and modulus. Note that we
4217 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4218 * handles it correctly.
4219 *
4220 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4221 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4222 * mul-float, div-float, rem-float
4223 */
4224 /* binop vAA, vBB, vCC */
4225 FETCH r0, 1 @ r0<- CCBB
4226 mov r9, rINST, lsr #8 @ r9<- AA
4227 mov r3, r0, lsr #8 @ r3<- CC
4228 and r2, r0, #255 @ r2<- BB
4229 GET_VREG r1, r3 @ r1<- vCC
4230 GET_VREG r0, r2 @ r0<- vBB
4231 .if 0
4232 cmp r1, #0 @ is second operand zero?
4233 beq common_errDivideByZero
4234 .endif
4235
4236 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4237 @ optional op; may set condition codes
4238 sub r0, r0, r1 @ r0<- op, r0-r3 changed
4239 GET_INST_OPCODE ip @ extract opcode from rINST
4240 SET_VREG r0, r9 @ vAA<- r0
4241 GOTO_OPCODE ip @ jump to next instruction
4242 /* 11-14 instructions */
4243
4244
4245/* ------------------------------ */
4246 .balign 128
4247.L_op_mul_int: /* 0x92 */
4248/* File: arm/op_mul_int.S */
4249/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4250/* File: arm/binop.S */
4251 /*
4252 * Generic 32-bit binary operation. Provide an "instr" line that
4253 * specifies an instruction that performs "result = r0 op r1".
4254 * This could be an ARM instruction or a function call. (If the result
4255 * comes back in a register other than r0, you can override "result".)
4256 *
4257 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4258 * vCC (r1). Useful for integer division and modulus. Note that we
4259 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4260 * handles it correctly.
4261 *
4262 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4263 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4264 * mul-float, div-float, rem-float
4265 */
4266 /* binop vAA, vBB, vCC */
4267 FETCH r0, 1 @ r0<- CCBB
4268 mov r9, rINST, lsr #8 @ r9<- AA
4269 mov r3, r0, lsr #8 @ r3<- CC
4270 and r2, r0, #255 @ r2<- BB
4271 GET_VREG r1, r3 @ r1<- vCC
4272 GET_VREG r0, r2 @ r0<- vBB
4273 .if 0
4274 cmp r1, #0 @ is second operand zero?
4275 beq common_errDivideByZero
4276 .endif
4277
4278 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4279 @ optional op; may set condition codes
4280 mul r0, r1, r0 @ r0<- op, r0-r3 changed
4281 GET_INST_OPCODE ip @ extract opcode from rINST
4282 SET_VREG r0, r9 @ vAA<- r0
4283 GOTO_OPCODE ip @ jump to next instruction
4284 /* 11-14 instructions */
4285
4286
4287/* ------------------------------ */
4288 .balign 128
4289.L_op_div_int: /* 0x93 */
4290/* File: arm/op_div_int.S */
4291 /*
4292 * Specialized 32-bit binary operation
4293 *
4294 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4295 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4296 * ARMv7 CPUs that have hardware division support).
4297 *
4298 * div-int
4299 *
4300 */
4301 FETCH r0, 1 @ r0<- CCBB
4302 mov r9, rINST, lsr #8 @ r9<- AA
4303 mov r3, r0, lsr #8 @ r3<- CC
4304 and r2, r0, #255 @ r2<- BB
4305 GET_VREG r1, r3 @ r1<- vCC
4306 GET_VREG r0, r2 @ r0<- vBB
4307 cmp r1, #0 @ is second operand zero?
4308 beq common_errDivideByZero
4309
4310 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4311#ifdef __ARM_ARCH_EXT_IDIV__
4312 sdiv r0, r0, r1 @ r0<- op
4313#else
4314 bl __aeabi_idiv @ r0<- op, r0-r3 changed
4315#endif
4316 GET_INST_OPCODE ip @ extract opcode from rINST
4317 SET_VREG r0, r9 @ vAA<- r0
4318 GOTO_OPCODE ip @ jump to next instruction
4319 /* 11-14 instructions */
4320
4321/* ------------------------------ */
4322 .balign 128
4323.L_op_rem_int: /* 0x94 */
4324/* File: arm/op_rem_int.S */
4325 /*
4326 * Specialized 32-bit binary operation
4327 *
4328 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4329 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4330 * ARMv7 CPUs that have hardware division support).
4331 *
4332 * NOTE: idivmod returns quotient in r0 and remainder in r1
4333 *
4334 * rem-int
4335 *
4336 */
4337 FETCH r0, 1 @ r0<- CCBB
4338 mov r9, rINST, lsr #8 @ r9<- AA
4339 mov r3, r0, lsr #8 @ r3<- CC
4340 and r2, r0, #255 @ r2<- BB
4341 GET_VREG r1, r3 @ r1<- vCC
4342 GET_VREG r0, r2 @ r0<- vBB
4343 cmp r1, #0 @ is second operand zero?
4344 beq common_errDivideByZero
4345
4346 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4347#ifdef __ARM_ARCH_EXT_IDIV__
4348 sdiv r2, r0, r1
4349 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed
4350#else
4351 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
4352#endif
4353 GET_INST_OPCODE ip @ extract opcode from rINST
4354 SET_VREG r1, r9 @ vAA<- r1
4355 GOTO_OPCODE ip @ jump to next instruction
4356 /* 11-14 instructions */
4357
4358/* ------------------------------ */
4359 .balign 128
4360.L_op_and_int: /* 0x95 */
4361/* File: arm/op_and_int.S */
4362/* File: arm/binop.S */
4363 /*
4364 * Generic 32-bit binary operation. Provide an "instr" line that
4365 * specifies an instruction that performs "result = r0 op r1".
4366 * This could be an ARM instruction or a function call. (If the result
4367 * comes back in a register other than r0, you can override "result".)
4368 *
4369 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4370 * vCC (r1). Useful for integer division and modulus. Note that we
4371 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4372 * handles it correctly.
4373 *
4374 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4375 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4376 * mul-float, div-float, rem-float
4377 */
4378 /* binop vAA, vBB, vCC */
4379 FETCH r0, 1 @ r0<- CCBB
4380 mov r9, rINST, lsr #8 @ r9<- AA
4381 mov r3, r0, lsr #8 @ r3<- CC
4382 and r2, r0, #255 @ r2<- BB
4383 GET_VREG r1, r3 @ r1<- vCC
4384 GET_VREG r0, r2 @ r0<- vBB
4385 .if 0
4386 cmp r1, #0 @ is second operand zero?
4387 beq common_errDivideByZero
4388 .endif
4389
4390 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4391 @ optional op; may set condition codes
4392 and r0, r0, r1 @ r0<- op, r0-r3 changed
4393 GET_INST_OPCODE ip @ extract opcode from rINST
4394 SET_VREG r0, r9 @ vAA<- r0
4395 GOTO_OPCODE ip @ jump to next instruction
4396 /* 11-14 instructions */
4397
4398
4399/* ------------------------------ */
4400 .balign 128
4401.L_op_or_int: /* 0x96 */
4402/* File: arm/op_or_int.S */
4403/* File: arm/binop.S */
4404 /*
4405 * Generic 32-bit binary operation. Provide an "instr" line that
4406 * specifies an instruction that performs "result = r0 op r1".
4407 * This could be an ARM instruction or a function call. (If the result
4408 * comes back in a register other than r0, you can override "result".)
4409 *
4410 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4411 * vCC (r1). Useful for integer division and modulus. Note that we
4412 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4413 * handles it correctly.
4414 *
4415 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4416 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4417 * mul-float, div-float, rem-float
4418 */
4419 /* binop vAA, vBB, vCC */
4420 FETCH r0, 1 @ r0<- CCBB
4421 mov r9, rINST, lsr #8 @ r9<- AA
4422 mov r3, r0, lsr #8 @ r3<- CC
4423 and r2, r0, #255 @ r2<- BB
4424 GET_VREG r1, r3 @ r1<- vCC
4425 GET_VREG r0, r2 @ r0<- vBB
4426 .if 0
4427 cmp r1, #0 @ is second operand zero?
4428 beq common_errDivideByZero
4429 .endif
4430
4431 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4432 @ optional op; may set condition codes
4433 orr r0, r0, r1 @ r0<- op, r0-r3 changed
4434 GET_INST_OPCODE ip @ extract opcode from rINST
4435 SET_VREG r0, r9 @ vAA<- r0
4436 GOTO_OPCODE ip @ jump to next instruction
4437 /* 11-14 instructions */
4438
4439
4440/* ------------------------------ */
4441 .balign 128
4442.L_op_xor_int: /* 0x97 */
4443/* File: arm/op_xor_int.S */
4444/* File: arm/binop.S */
4445 /*
4446 * Generic 32-bit binary operation. Provide an "instr" line that
4447 * specifies an instruction that performs "result = r0 op r1".
4448 * This could be an ARM instruction or a function call. (If the result
4449 * comes back in a register other than r0, you can override "result".)
4450 *
4451 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4452 * vCC (r1). Useful for integer division and modulus. Note that we
4453 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4454 * handles it correctly.
4455 *
4456 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4457 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4458 * mul-float, div-float, rem-float
4459 */
4460 /* binop vAA, vBB, vCC */
4461 FETCH r0, 1 @ r0<- CCBB
4462 mov r9, rINST, lsr #8 @ r9<- AA
4463 mov r3, r0, lsr #8 @ r3<- CC
4464 and r2, r0, #255 @ r2<- BB
4465 GET_VREG r1, r3 @ r1<- vCC
4466 GET_VREG r0, r2 @ r0<- vBB
4467 .if 0
4468 cmp r1, #0 @ is second operand zero?
4469 beq common_errDivideByZero
4470 .endif
4471
4472 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4473 @ optional op; may set condition codes
4474 eor r0, r0, r1 @ r0<- op, r0-r3 changed
4475 GET_INST_OPCODE ip @ extract opcode from rINST
4476 SET_VREG r0, r9 @ vAA<- r0
4477 GOTO_OPCODE ip @ jump to next instruction
4478 /* 11-14 instructions */
4479
4480
4481/* ------------------------------ */
4482 .balign 128
4483.L_op_shl_int: /* 0x98 */
4484/* File: arm/op_shl_int.S */
4485/* File: arm/binop.S */
4486 /*
4487 * Generic 32-bit binary operation. Provide an "instr" line that
4488 * specifies an instruction that performs "result = r0 op r1".
4489 * This could be an ARM instruction or a function call. (If the result
4490 * comes back in a register other than r0, you can override "result".)
4491 *
4492 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4493 * vCC (r1). Useful for integer division and modulus. Note that we
4494 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4495 * handles it correctly.
4496 *
4497 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4498 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4499 * mul-float, div-float, rem-float
4500 */
4501 /* binop vAA, vBB, vCC */
4502 FETCH r0, 1 @ r0<- CCBB
4503 mov r9, rINST, lsr #8 @ r9<- AA
4504 mov r3, r0, lsr #8 @ r3<- CC
4505 and r2, r0, #255 @ r2<- BB
4506 GET_VREG r1, r3 @ r1<- vCC
4507 GET_VREG r0, r2 @ r0<- vBB
4508 .if 0
4509 cmp r1, #0 @ is second operand zero?
4510 beq common_errDivideByZero
4511 .endif
4512
4513 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4514 and r1, r1, #31 @ optional op; may set condition codes
4515 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
4516 GET_INST_OPCODE ip @ extract opcode from rINST
4517 SET_VREG r0, r9 @ vAA<- r0
4518 GOTO_OPCODE ip @ jump to next instruction
4519 /* 11-14 instructions */
4520
4521
4522/* ------------------------------ */
4523 .balign 128
4524.L_op_shr_int: /* 0x99 */
4525/* File: arm/op_shr_int.S */
4526/* File: arm/binop.S */
4527 /*
4528 * Generic 32-bit binary operation. Provide an "instr" line that
4529 * specifies an instruction that performs "result = r0 op r1".
4530 * This could be an ARM instruction or a function call. (If the result
4531 * comes back in a register other than r0, you can override "result".)
4532 *
4533 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4534 * vCC (r1). Useful for integer division and modulus. Note that we
4535 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4536 * handles it correctly.
4537 *
4538 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4539 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4540 * mul-float, div-float, rem-float
4541 */
4542 /* binop vAA, vBB, vCC */
4543 FETCH r0, 1 @ r0<- CCBB
4544 mov r9, rINST, lsr #8 @ r9<- AA
4545 mov r3, r0, lsr #8 @ r3<- CC
4546 and r2, r0, #255 @ r2<- BB
4547 GET_VREG r1, r3 @ r1<- vCC
4548 GET_VREG r0, r2 @ r0<- vBB
4549 .if 0
4550 cmp r1, #0 @ is second operand zero?
4551 beq common_errDivideByZero
4552 .endif
4553
4554 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4555 and r1, r1, #31 @ optional op; may set condition codes
4556 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
4557 GET_INST_OPCODE ip @ extract opcode from rINST
4558 SET_VREG r0, r9 @ vAA<- r0
4559 GOTO_OPCODE ip @ jump to next instruction
4560 /* 11-14 instructions */
4561
4562
4563/* ------------------------------ */
4564 .balign 128
4565.L_op_ushr_int: /* 0x9a */
4566/* File: arm/op_ushr_int.S */
4567/* File: arm/binop.S */
4568 /*
4569 * Generic 32-bit binary operation. Provide an "instr" line that
4570 * specifies an instruction that performs "result = r0 op r1".
4571 * This could be an ARM instruction or a function call. (If the result
4572 * comes back in a register other than r0, you can override "result".)
4573 *
4574 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4575 * vCC (r1). Useful for integer division and modulus. Note that we
4576 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4577 * handles it correctly.
4578 *
4579 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4580 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4581 * mul-float, div-float, rem-float
4582 */
4583 /* binop vAA, vBB, vCC */
4584 FETCH r0, 1 @ r0<- CCBB
4585 mov r9, rINST, lsr #8 @ r9<- AA
4586 mov r3, r0, lsr #8 @ r3<- CC
4587 and r2, r0, #255 @ r2<- BB
4588 GET_VREG r1, r3 @ r1<- vCC
4589 GET_VREG r0, r2 @ r0<- vBB
4590 .if 0
4591 cmp r1, #0 @ is second operand zero?
4592 beq common_errDivideByZero
4593 .endif
4594
4595 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4596 and r1, r1, #31 @ optional op; may set condition codes
4597 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
4598 GET_INST_OPCODE ip @ extract opcode from rINST
4599 SET_VREG r0, r9 @ vAA<- r0
4600 GOTO_OPCODE ip @ jump to next instruction
4601 /* 11-14 instructions */
4602
4603
4604/* ------------------------------ */
4605 .balign 128
4606.L_op_add_long: /* 0x9b */
4607/* File: arm/op_add_long.S */
4608/* File: arm/binopWide.S */
4609 /*
4610 * Generic 64-bit binary operation. Provide an "instr" line that
4611 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4612 * This could be an ARM instruction or a function call. (If the result
4613 * comes back in a register other than r0, you can override "result".)
4614 *
4615 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4616 * vCC (r1). Useful for integer division and modulus.
4617 *
4618 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4619 * xor-long, add-double, sub-double, mul-double, div-double,
4620 * rem-double
4621 *
4622 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4623 */
4624 /* binop vAA, vBB, vCC */
4625 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004626 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004627 and r2, r0, #255 @ r2<- BB
4628 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004629 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004630 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4631 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4632 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4633 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4634 .if 0
4635 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4636 beq common_errDivideByZero
4637 .endif
buzbee50cf6002016-02-10 08:59:12 -08004638 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004639 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004640 adds r0, r0, r2 @ optional op; may set condition codes
4641 adc r1, r1, r3 @ result<- op, r0-r3 changed
4642 GET_INST_OPCODE ip @ extract opcode from rINST
4643 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4644 GOTO_OPCODE ip @ jump to next instruction
4645 /* 14-17 instructions */
4646
4647
4648/* ------------------------------ */
4649 .balign 128
4650.L_op_sub_long: /* 0x9c */
4651/* File: arm/op_sub_long.S */
4652/* File: arm/binopWide.S */
4653 /*
4654 * Generic 64-bit binary operation. Provide an "instr" line that
4655 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4656 * This could be an ARM instruction or a function call. (If the result
4657 * comes back in a register other than r0, you can override "result".)
4658 *
4659 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4660 * vCC (r1). Useful for integer division and modulus.
4661 *
4662 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4663 * xor-long, add-double, sub-double, mul-double, div-double,
4664 * rem-double
4665 *
4666 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4667 */
4668 /* binop vAA, vBB, vCC */
4669 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004670 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004671 and r2, r0, #255 @ r2<- BB
4672 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004673 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004674 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4675 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4676 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4677 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4678 .if 0
4679 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4680 beq common_errDivideByZero
4681 .endif
buzbee50cf6002016-02-10 08:59:12 -08004682 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004683 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004684 subs r0, r0, r2 @ optional op; may set condition codes
4685 sbc r1, r1, r3 @ result<- op, r0-r3 changed
4686 GET_INST_OPCODE ip @ extract opcode from rINST
4687 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4688 GOTO_OPCODE ip @ jump to next instruction
4689 /* 14-17 instructions */
4690
4691
4692/* ------------------------------ */
4693 .balign 128
4694.L_op_mul_long: /* 0x9d */
4695/* File: arm/op_mul_long.S */
4696 /*
4697 * Signed 64-bit integer multiply.
4698 *
4699 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4700 * WX
4701 * x YZ
4702 * --------
4703 * ZW ZX
4704 * YW YX
4705 *
4706 * The low word of the result holds ZX, the high word holds
4707 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
4708 * it doesn't fit in the low 64 bits.
4709 *
4710 * Unlike most ARM math operations, multiply instructions have
4711 * restrictions on using the same register more than once (Rd and Rm
4712 * cannot be the same).
4713 */
4714 /* mul-long vAA, vBB, vCC */
4715 FETCH r0, 1 @ r0<- CCBB
4716 and r2, r0, #255 @ r2<- BB
4717 mov r3, r0, lsr #8 @ r3<- CC
4718 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4719 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4720 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4721 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4722 mul ip, r2, r1 @ ip<- ZxW
4723 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
4724 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
4725 mov r0, rINST, lsr #8 @ r0<- AA
4726 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
4727 add r0, rFP, r0, lsl #2 @ r0<- &fp[AA]
4728 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4729 GET_INST_OPCODE ip @ extract opcode from rINST
4730 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
4731 GOTO_OPCODE ip @ jump to next instruction
4732
4733/* ------------------------------ */
4734 .balign 128
4735.L_op_div_long: /* 0x9e */
4736/* File: arm/op_div_long.S */
4737/* File: arm/binopWide.S */
4738 /*
4739 * Generic 64-bit binary operation. Provide an "instr" line that
4740 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4741 * This could be an ARM instruction or a function call. (If the result
4742 * comes back in a register other than r0, you can override "result".)
4743 *
4744 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4745 * vCC (r1). Useful for integer division and modulus.
4746 *
4747 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4748 * xor-long, add-double, sub-double, mul-double, div-double,
4749 * rem-double
4750 *
4751 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4752 */
4753 /* binop vAA, vBB, vCC */
4754 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004755 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004756 and r2, r0, #255 @ r2<- BB
4757 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004758 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004759 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4760 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4761 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4762 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4763 .if 1
4764 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4765 beq common_errDivideByZero
4766 .endif
buzbee50cf6002016-02-10 08:59:12 -08004767 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004768 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004769 @ optional op; may set condition codes
4770 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4771 GET_INST_OPCODE ip @ extract opcode from rINST
4772 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4773 GOTO_OPCODE ip @ jump to next instruction
4774 /* 14-17 instructions */
4775
4776
4777/* ------------------------------ */
4778 .balign 128
4779.L_op_rem_long: /* 0x9f */
4780/* File: arm/op_rem_long.S */
4781/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4782/* File: arm/binopWide.S */
4783 /*
4784 * Generic 64-bit binary operation. Provide an "instr" line that
4785 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4786 * This could be an ARM instruction or a function call. (If the result
4787 * comes back in a register other than r0, you can override "result".)
4788 *
4789 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4790 * vCC (r1). Useful for integer division and modulus.
4791 *
4792 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4793 * xor-long, add-double, sub-double, mul-double, div-double,
4794 * rem-double
4795 *
4796 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4797 */
4798 /* binop vAA, vBB, vCC */
4799 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004800 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004801 and r2, r0, #255 @ r2<- BB
4802 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004803 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004804 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4805 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4806 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4807 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4808 .if 1
4809 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4810 beq common_errDivideByZero
4811 .endif
buzbee50cf6002016-02-10 08:59:12 -08004812 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004813 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004814 @ optional op; may set condition codes
4815 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4816 GET_INST_OPCODE ip @ extract opcode from rINST
4817 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
4818 GOTO_OPCODE ip @ jump to next instruction
4819 /* 14-17 instructions */
4820
4821
4822/* ------------------------------ */
4823 .balign 128
4824.L_op_and_long: /* 0xa0 */
4825/* File: arm/op_and_long.S */
4826/* File: arm/binopWide.S */
4827 /*
4828 * Generic 64-bit binary operation. Provide an "instr" line that
4829 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4830 * This could be an ARM instruction or a function call. (If the result
4831 * comes back in a register other than r0, you can override "result".)
4832 *
4833 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4834 * vCC (r1). Useful for integer division and modulus.
4835 *
4836 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4837 * xor-long, add-double, sub-double, mul-double, div-double,
4838 * rem-double
4839 *
4840 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4841 */
4842 /* binop vAA, vBB, vCC */
4843 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004844 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004845 and r2, r0, #255 @ r2<- BB
4846 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004847 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004848 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4849 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4850 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4851 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4852 .if 0
4853 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4854 beq common_errDivideByZero
4855 .endif
buzbee50cf6002016-02-10 08:59:12 -08004856 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004857 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004858 and r0, r0, r2 @ optional op; may set condition codes
4859 and r1, r1, r3 @ result<- op, r0-r3 changed
4860 GET_INST_OPCODE ip @ extract opcode from rINST
4861 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4862 GOTO_OPCODE ip @ jump to next instruction
4863 /* 14-17 instructions */
4864
4865
4866/* ------------------------------ */
4867 .balign 128
4868.L_op_or_long: /* 0xa1 */
4869/* File: arm/op_or_long.S */
4870/* File: arm/binopWide.S */
4871 /*
4872 * Generic 64-bit binary operation. Provide an "instr" line that
4873 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4874 * This could be an ARM instruction or a function call. (If the result
4875 * comes back in a register other than r0, you can override "result".)
4876 *
4877 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4878 * vCC (r1). Useful for integer division and modulus.
4879 *
4880 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4881 * xor-long, add-double, sub-double, mul-double, div-double,
4882 * rem-double
4883 *
4884 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4885 */
4886 /* binop vAA, vBB, vCC */
4887 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004888 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004889 and r2, r0, #255 @ r2<- BB
4890 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004891 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004892 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4893 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4894 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4895 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4896 .if 0
4897 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4898 beq common_errDivideByZero
4899 .endif
buzbee50cf6002016-02-10 08:59:12 -08004900 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004901 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004902 orr r0, r0, r2 @ optional op; may set condition codes
4903 orr r1, r1, r3 @ result<- op, r0-r3 changed
4904 GET_INST_OPCODE ip @ extract opcode from rINST
4905 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4906 GOTO_OPCODE ip @ jump to next instruction
4907 /* 14-17 instructions */
4908
4909
4910/* ------------------------------ */
4911 .balign 128
4912.L_op_xor_long: /* 0xa2 */
4913/* File: arm/op_xor_long.S */
4914/* File: arm/binopWide.S */
4915 /*
4916 * Generic 64-bit binary operation. Provide an "instr" line that
4917 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4918 * This could be an ARM instruction or a function call. (If the result
4919 * comes back in a register other than r0, you can override "result".)
4920 *
4921 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4922 * vCC (r1). Useful for integer division and modulus.
4923 *
4924 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4925 * xor-long, add-double, sub-double, mul-double, div-double,
4926 * rem-double
4927 *
4928 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4929 */
4930 /* binop vAA, vBB, vCC */
4931 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004932 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004933 and r2, r0, #255 @ r2<- BB
4934 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004935 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004936 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4937 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4938 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4939 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4940 .if 0
4941 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4942 beq common_errDivideByZero
4943 .endif
buzbee50cf6002016-02-10 08:59:12 -08004944 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004945 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004946 eor r0, r0, r2 @ optional op; may set condition codes
4947 eor r1, r1, r3 @ result<- op, r0-r3 changed
4948 GET_INST_OPCODE ip @ extract opcode from rINST
4949 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4950 GOTO_OPCODE ip @ jump to next instruction
4951 /* 14-17 instructions */
4952
4953
4954/* ------------------------------ */
4955 .balign 128
4956.L_op_shl_long: /* 0xa3 */
4957/* File: arm/op_shl_long.S */
4958 /*
4959 * Long integer shift. This is different from the generic 32/64-bit
4960 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4961 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4962 * 6 bits of the shift distance.
4963 */
4964 /* shl-long vAA, vBB, vCC */
4965 FETCH r0, 1 @ r0<- CCBB
4966 mov r9, rINST, lsr #8 @ r9<- AA
4967 and r3, r0, #255 @ r3<- BB
4968 mov r0, r0, lsr #8 @ r0<- CC
4969 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4970 GET_VREG r2, r0 @ r2<- vCC
4971 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08004972 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004973 and r2, r2, #63 @ r2<- r2 & 0x3f
4974 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08004975 mov r1, r1, asl r2 @ r1<- r1 << r2
4976 rsb r3, r2, #32 @ r3<- 32 - r2
4977 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
4978 subs ip, r2, #32 @ ip<- r2 - 32
4979 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08004980 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08004981 mov r0, r0, asl r2 @ r0<- r0 << r2
buzbee1452bee2015-03-06 14:43:04 -08004982 GET_INST_OPCODE ip @ extract opcode from rINST
4983 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4984 GOTO_OPCODE ip @ jump to next instruction
4985
4986/* ------------------------------ */
4987 .balign 128
4988.L_op_shr_long: /* 0xa4 */
4989/* File: arm/op_shr_long.S */
4990 /*
4991 * Long integer shift. This is different from the generic 32/64-bit
4992 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4993 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4994 * 6 bits of the shift distance.
4995 */
4996 /* shr-long vAA, vBB, vCC */
4997 FETCH r0, 1 @ r0<- CCBB
4998 mov r9, rINST, lsr #8 @ r9<- AA
4999 and r3, r0, #255 @ r3<- BB
5000 mov r0, r0, lsr #8 @ r0<- CC
5001 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5002 GET_VREG r2, r0 @ r2<- vCC
5003 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08005004 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005005 and r2, r2, #63 @ r0<- r0 & 0x3f
5006 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08005007 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5008 rsb r3, r2, #32 @ r3<- 32 - r2
5009 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5010 subs ip, r2, #32 @ ip<- r2 - 32
5011 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08005012 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08005013 mov r1, r1, asr r2 @ r1<- r1 >> r2
buzbee1452bee2015-03-06 14:43:04 -08005014 GET_INST_OPCODE ip @ extract opcode from rINST
5015 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5016 GOTO_OPCODE ip @ jump to next instruction
5017
5018/* ------------------------------ */
5019 .balign 128
5020.L_op_ushr_long: /* 0xa5 */
5021/* File: arm/op_ushr_long.S */
5022 /*
5023 * Long integer shift. This is different from the generic 32/64-bit
5024 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5025 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5026 * 6 bits of the shift distance.
5027 */
5028 /* ushr-long vAA, vBB, vCC */
5029 FETCH r0, 1 @ r0<- CCBB
5030 mov r9, rINST, lsr #8 @ r9<- AA
5031 and r3, r0, #255 @ r3<- BB
5032 mov r0, r0, lsr #8 @ r0<- CC
5033 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5034 GET_VREG r2, r0 @ r2<- vCC
5035 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08005036 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005037 and r2, r2, #63 @ r0<- r0 & 0x3f
5038 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08005039 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5040 rsb r3, r2, #32 @ r3<- 32 - r2
5041 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5042 subs ip, r2, #32 @ ip<- r2 - 32
5043 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08005044 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08005045 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
buzbee1452bee2015-03-06 14:43:04 -08005046 GET_INST_OPCODE ip @ extract opcode from rINST
5047 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5048 GOTO_OPCODE ip @ jump to next instruction
5049
5050/* ------------------------------ */
5051 .balign 128
5052.L_op_add_float: /* 0xa6 */
5053/* File: arm/op_add_float.S */
5054/* File: arm/fbinop.S */
5055 /*
5056 * Generic 32-bit floating-point operation. Provide an "instr" line that
5057 * specifies an instruction that performs "s2 = s0 op s1". Because we
5058 * use the "softfp" ABI, this must be an instruction, not a function call.
5059 *
5060 * For: add-float, sub-float, mul-float, div-float
5061 */
5062 /* floatop vAA, vBB, vCC */
5063 FETCH r0, 1 @ r0<- CCBB
5064 mov r9, rINST, lsr #8 @ r9<- AA
5065 mov r3, r0, lsr #8 @ r3<- CC
5066 and r2, r0, #255 @ r2<- BB
5067 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5068 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5069 flds s1, [r3] @ s1<- vCC
5070 flds s0, [r2] @ s0<- vBB
5071
5072 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5073 fadds s2, s0, s1 @ s2<- op
5074 GET_INST_OPCODE ip @ extract opcode from rINST
5075 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5076 fsts s2, [r9] @ vAA<- s2
5077 GOTO_OPCODE ip @ jump to next instruction
5078
5079
5080/* ------------------------------ */
5081 .balign 128
5082.L_op_sub_float: /* 0xa7 */
5083/* File: arm/op_sub_float.S */
5084/* File: arm/fbinop.S */
5085 /*
5086 * Generic 32-bit floating-point operation. Provide an "instr" line that
5087 * specifies an instruction that performs "s2 = s0 op s1". Because we
5088 * use the "softfp" ABI, this must be an instruction, not a function call.
5089 *
5090 * For: add-float, sub-float, mul-float, div-float
5091 */
5092 /* floatop vAA, vBB, vCC */
5093 FETCH r0, 1 @ r0<- CCBB
5094 mov r9, rINST, lsr #8 @ r9<- AA
5095 mov r3, r0, lsr #8 @ r3<- CC
5096 and r2, r0, #255 @ r2<- BB
5097 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5098 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5099 flds s1, [r3] @ s1<- vCC
5100 flds s0, [r2] @ s0<- vBB
5101
5102 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5103 fsubs s2, s0, s1 @ s2<- op
5104 GET_INST_OPCODE ip @ extract opcode from rINST
5105 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5106 fsts s2, [r9] @ vAA<- s2
5107 GOTO_OPCODE ip @ jump to next instruction
5108
5109
5110/* ------------------------------ */
5111 .balign 128
5112.L_op_mul_float: /* 0xa8 */
5113/* File: arm/op_mul_float.S */
5114/* File: arm/fbinop.S */
5115 /*
5116 * Generic 32-bit floating-point operation. Provide an "instr" line that
5117 * specifies an instruction that performs "s2 = s0 op s1". Because we
5118 * use the "softfp" ABI, this must be an instruction, not a function call.
5119 *
5120 * For: add-float, sub-float, mul-float, div-float
5121 */
5122 /* floatop vAA, vBB, vCC */
5123 FETCH r0, 1 @ r0<- CCBB
5124 mov r9, rINST, lsr #8 @ r9<- AA
5125 mov r3, r0, lsr #8 @ r3<- CC
5126 and r2, r0, #255 @ r2<- BB
5127 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5128 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5129 flds s1, [r3] @ s1<- vCC
5130 flds s0, [r2] @ s0<- vBB
5131
5132 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5133 fmuls s2, s0, s1 @ s2<- op
5134 GET_INST_OPCODE ip @ extract opcode from rINST
5135 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5136 fsts s2, [r9] @ vAA<- s2
5137 GOTO_OPCODE ip @ jump to next instruction
5138
5139
5140/* ------------------------------ */
5141 .balign 128
5142.L_op_div_float: /* 0xa9 */
5143/* File: arm/op_div_float.S */
5144/* File: arm/fbinop.S */
5145 /*
5146 * Generic 32-bit floating-point operation. Provide an "instr" line that
5147 * specifies an instruction that performs "s2 = s0 op s1". Because we
5148 * use the "softfp" ABI, this must be an instruction, not a function call.
5149 *
5150 * For: add-float, sub-float, mul-float, div-float
5151 */
5152 /* floatop vAA, vBB, vCC */
5153 FETCH r0, 1 @ r0<- CCBB
5154 mov r9, rINST, lsr #8 @ r9<- AA
5155 mov r3, r0, lsr #8 @ r3<- CC
5156 and r2, r0, #255 @ r2<- BB
5157 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5158 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5159 flds s1, [r3] @ s1<- vCC
5160 flds s0, [r2] @ s0<- vBB
5161
5162 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5163 fdivs s2, s0, s1 @ s2<- op
5164 GET_INST_OPCODE ip @ extract opcode from rINST
5165 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5166 fsts s2, [r9] @ vAA<- s2
5167 GOTO_OPCODE ip @ jump to next instruction
5168
5169
5170/* ------------------------------ */
5171 .balign 128
5172.L_op_rem_float: /* 0xaa */
5173/* File: arm/op_rem_float.S */
5174/* EABI doesn't define a float remainder function, but libm does */
5175/* File: arm/binop.S */
5176 /*
5177 * Generic 32-bit binary operation. Provide an "instr" line that
5178 * specifies an instruction that performs "result = r0 op r1".
5179 * This could be an ARM instruction or a function call. (If the result
5180 * comes back in a register other than r0, you can override "result".)
5181 *
5182 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5183 * vCC (r1). Useful for integer division and modulus. Note that we
5184 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5185 * handles it correctly.
5186 *
5187 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5188 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5189 * mul-float, div-float, rem-float
5190 */
5191 /* binop vAA, vBB, vCC */
5192 FETCH r0, 1 @ r0<- CCBB
5193 mov r9, rINST, lsr #8 @ r9<- AA
5194 mov r3, r0, lsr #8 @ r3<- CC
5195 and r2, r0, #255 @ r2<- BB
5196 GET_VREG r1, r3 @ r1<- vCC
5197 GET_VREG r0, r2 @ r0<- vBB
5198 .if 0
5199 cmp r1, #0 @ is second operand zero?
5200 beq common_errDivideByZero
5201 .endif
5202
5203 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5204 @ optional op; may set condition codes
5205 bl fmodf @ r0<- op, r0-r3 changed
5206 GET_INST_OPCODE ip @ extract opcode from rINST
5207 SET_VREG r0, r9 @ vAA<- r0
5208 GOTO_OPCODE ip @ jump to next instruction
5209 /* 11-14 instructions */
5210
5211
5212/* ------------------------------ */
5213 .balign 128
5214.L_op_add_double: /* 0xab */
5215/* File: arm/op_add_double.S */
5216/* File: arm/fbinopWide.S */
5217 /*
5218 * Generic 64-bit double-precision floating point binary operation.
5219 * Provide an "instr" line that specifies an instruction that performs
5220 * "d2 = d0 op d1".
5221 *
5222 * for: add-double, sub-double, mul-double, div-double
5223 */
5224 /* doubleop vAA, vBB, vCC */
5225 FETCH r0, 1 @ r0<- CCBB
5226 mov r9, rINST, lsr #8 @ r9<- AA
5227 mov r3, r0, lsr #8 @ r3<- CC
5228 and r2, r0, #255 @ r2<- BB
5229 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5230 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5231 fldd d1, [r3] @ d1<- vCC
5232 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005233 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5234 faddd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005235 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005236 GET_INST_OPCODE ip @ extract opcode from rINST
5237 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5238 fstd d2, [r9] @ vAA<- d2
5239 GOTO_OPCODE ip @ jump to next instruction
5240
5241
5242/* ------------------------------ */
5243 .balign 128
5244.L_op_sub_double: /* 0xac */
5245/* File: arm/op_sub_double.S */
5246/* File: arm/fbinopWide.S */
5247 /*
5248 * Generic 64-bit double-precision floating point binary operation.
5249 * Provide an "instr" line that specifies an instruction that performs
5250 * "d2 = d0 op d1".
5251 *
5252 * for: add-double, sub-double, mul-double, div-double
5253 */
5254 /* doubleop 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 fldd d1, [r3] @ d1<- vCC
5262 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005263 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5264 fsubd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005265 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005266 GET_INST_OPCODE ip @ extract opcode from rINST
5267 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5268 fstd d2, [r9] @ vAA<- d2
5269 GOTO_OPCODE ip @ jump to next instruction
5270
5271
5272/* ------------------------------ */
5273 .balign 128
5274.L_op_mul_double: /* 0xad */
5275/* File: arm/op_mul_double.S */
5276/* File: arm/fbinopWide.S */
5277 /*
5278 * Generic 64-bit double-precision floating point binary operation.
5279 * Provide an "instr" line that specifies an instruction that performs
5280 * "d2 = d0 op d1".
5281 *
5282 * for: add-double, sub-double, mul-double, div-double
5283 */
5284 /* doubleop 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 fldd d1, [r3] @ d1<- vCC
5292 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005293 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5294 fmuld d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005295 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005296 GET_INST_OPCODE ip @ extract opcode from rINST
5297 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5298 fstd d2, [r9] @ vAA<- d2
5299 GOTO_OPCODE ip @ jump to next instruction
5300
5301
5302/* ------------------------------ */
5303 .balign 128
5304.L_op_div_double: /* 0xae */
5305/* File: arm/op_div_double.S */
5306/* File: arm/fbinopWide.S */
5307 /*
5308 * Generic 64-bit double-precision floating point binary operation.
5309 * Provide an "instr" line that specifies an instruction that performs
5310 * "d2 = d0 op d1".
5311 *
5312 * for: add-double, sub-double, mul-double, div-double
5313 */
5314 /* doubleop 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 fldd d1, [r3] @ d1<- vCC
5322 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005323 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5324 fdivd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005325 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005326 GET_INST_OPCODE ip @ extract opcode from rINST
5327 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5328 fstd d2, [r9] @ vAA<- d2
5329 GOTO_OPCODE ip @ jump to next instruction
5330
5331
5332/* ------------------------------ */
5333 .balign 128
5334.L_op_rem_double: /* 0xaf */
5335/* File: arm/op_rem_double.S */
5336/* EABI doesn't define a double remainder function, but libm does */
5337/* File: arm/binopWide.S */
5338 /*
5339 * Generic 64-bit binary operation. Provide an "instr" line that
5340 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5341 * This could be an ARM instruction or a function call. (If the result
5342 * comes back in a register other than r0, you can override "result".)
5343 *
5344 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5345 * vCC (r1). Useful for integer division and modulus.
5346 *
5347 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5348 * xor-long, add-double, sub-double, mul-double, div-double,
5349 * rem-double
5350 *
5351 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5352 */
5353 /* binop vAA, vBB, vCC */
5354 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08005355 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08005356 and r2, r0, #255 @ r2<- BB
5357 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08005358 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08005359 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5360 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5361 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5362 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5363 .if 0
5364 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5365 beq common_errDivideByZero
5366 .endif
buzbee50cf6002016-02-10 08:59:12 -08005367 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005368 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005369 @ optional op; may set condition codes
5370 bl fmod @ result<- op, r0-r3 changed
5371 GET_INST_OPCODE ip @ extract opcode from rINST
5372 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5373 GOTO_OPCODE ip @ jump to next instruction
5374 /* 14-17 instructions */
5375
5376
5377/* ------------------------------ */
5378 .balign 128
5379.L_op_add_int_2addr: /* 0xb0 */
5380/* File: arm/op_add_int_2addr.S */
5381/* File: arm/binop2addr.S */
5382 /*
5383 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5384 * that specifies an instruction that performs "result = r0 op r1".
5385 * This could be an ARM instruction or a function call. (If the result
5386 * comes back in a register other than r0, you can override "result".)
5387 *
5388 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5389 * vCC (r1). Useful for integer division and modulus.
5390 *
5391 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5392 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5393 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5394 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5395 */
5396 /* binop/2addr vA, vB */
5397 mov r3, rINST, lsr #12 @ r3<- B
5398 ubfx r9, rINST, #8, #4 @ r9<- A
5399 GET_VREG r1, r3 @ r1<- vB
5400 GET_VREG r0, r9 @ r0<- vA
5401 .if 0
5402 cmp r1, #0 @ is second operand zero?
5403 beq common_errDivideByZero
5404 .endif
5405 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5406
5407 @ optional op; may set condition codes
5408 add r0, r0, r1 @ r0<- op, r0-r3 changed
5409 GET_INST_OPCODE ip @ extract opcode from rINST
5410 SET_VREG r0, r9 @ vAA<- r0
5411 GOTO_OPCODE ip @ jump to next instruction
5412 /* 10-13 instructions */
5413
5414
5415/* ------------------------------ */
5416 .balign 128
5417.L_op_sub_int_2addr: /* 0xb1 */
5418/* File: arm/op_sub_int_2addr.S */
5419/* File: arm/binop2addr.S */
5420 /*
5421 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5422 * that specifies an instruction that performs "result = r0 op r1".
5423 * This could be an ARM instruction or a function call. (If the result
5424 * comes back in a register other than r0, you can override "result".)
5425 *
5426 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5427 * vCC (r1). Useful for integer division and modulus.
5428 *
5429 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5430 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5431 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5432 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5433 */
5434 /* binop/2addr vA, vB */
5435 mov r3, rINST, lsr #12 @ r3<- B
5436 ubfx r9, rINST, #8, #4 @ r9<- A
5437 GET_VREG r1, r3 @ r1<- vB
5438 GET_VREG r0, r9 @ r0<- vA
5439 .if 0
5440 cmp r1, #0 @ is second operand zero?
5441 beq common_errDivideByZero
5442 .endif
5443 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5444
5445 @ optional op; may set condition codes
5446 sub r0, r0, r1 @ r0<- op, r0-r3 changed
5447 GET_INST_OPCODE ip @ extract opcode from rINST
5448 SET_VREG r0, r9 @ vAA<- r0
5449 GOTO_OPCODE ip @ jump to next instruction
5450 /* 10-13 instructions */
5451
5452
5453/* ------------------------------ */
5454 .balign 128
5455.L_op_mul_int_2addr: /* 0xb2 */
5456/* File: arm/op_mul_int_2addr.S */
5457/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5458/* File: arm/binop2addr.S */
5459 /*
5460 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5461 * that specifies an instruction that performs "result = r0 op r1".
5462 * This could be an ARM instruction or a function call. (If the result
5463 * comes back in a register other than r0, you can override "result".)
5464 *
5465 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5466 * vCC (r1). Useful for integer division and modulus.
5467 *
5468 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5469 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5470 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5471 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5472 */
5473 /* binop/2addr vA, vB */
5474 mov r3, rINST, lsr #12 @ r3<- B
5475 ubfx r9, rINST, #8, #4 @ r9<- A
5476 GET_VREG r1, r3 @ r1<- vB
5477 GET_VREG r0, r9 @ r0<- vA
5478 .if 0
5479 cmp r1, #0 @ is second operand zero?
5480 beq common_errDivideByZero
5481 .endif
5482 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5483
5484 @ optional op; may set condition codes
5485 mul r0, r1, r0 @ r0<- op, r0-r3 changed
5486 GET_INST_OPCODE ip @ extract opcode from rINST
5487 SET_VREG r0, r9 @ vAA<- r0
5488 GOTO_OPCODE ip @ jump to next instruction
5489 /* 10-13 instructions */
5490
5491
5492/* ------------------------------ */
5493 .balign 128
5494.L_op_div_int_2addr: /* 0xb3 */
5495/* File: arm/op_div_int_2addr.S */
5496 /*
5497 * Specialized 32-bit binary operation
5498 *
5499 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5500 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5501 * ARMv7 CPUs that have hardware division support).
5502 *
5503 * div-int/2addr
5504 *
5505 */
5506 mov r3, rINST, lsr #12 @ r3<- B
5507 ubfx r9, rINST, #8, #4 @ r9<- A
5508 GET_VREG r1, r3 @ r1<- vB
5509 GET_VREG r0, r9 @ r0<- vA
5510 cmp r1, #0 @ is second operand zero?
5511 beq common_errDivideByZero
5512 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5513
5514#ifdef __ARM_ARCH_EXT_IDIV__
5515 sdiv r0, r0, r1 @ r0<- op
5516#else
5517 bl __aeabi_idiv @ r0<- op, r0-r3 changed
5518#endif
5519 GET_INST_OPCODE ip @ extract opcode from rINST
5520 SET_VREG r0, r9 @ vAA<- r0
5521 GOTO_OPCODE ip @ jump to next instruction
5522 /* 10-13 instructions */
5523
5524
5525/* ------------------------------ */
5526 .balign 128
5527.L_op_rem_int_2addr: /* 0xb4 */
5528/* File: arm/op_rem_int_2addr.S */
5529 /*
5530 * Specialized 32-bit binary operation
5531 *
5532 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5533 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5534 * ARMv7 CPUs that have hardware division support).
5535 *
5536 * NOTE: idivmod returns quotient in r0 and remainder in r1
5537 *
5538 * rem-int/2addr
5539 *
5540 */
5541 mov r3, rINST, lsr #12 @ r3<- B
5542 ubfx r9, rINST, #8, #4 @ r9<- A
5543 GET_VREG r1, r3 @ r1<- vB
5544 GET_VREG r0, r9 @ r0<- vA
5545 cmp r1, #0 @ is second operand zero?
5546 beq common_errDivideByZero
5547 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5548
5549#ifdef __ARM_ARCH_EXT_IDIV__
5550 sdiv r2, r0, r1
5551 mls r1, r1, r2, r0 @ r1<- op
5552#else
5553 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
5554#endif
5555 GET_INST_OPCODE ip @ extract opcode from rINST
5556 SET_VREG r1, r9 @ vAA<- r1
5557 GOTO_OPCODE ip @ jump to next instruction
5558 /* 10-13 instructions */
5559
5560
5561/* ------------------------------ */
5562 .balign 128
5563.L_op_and_int_2addr: /* 0xb5 */
5564/* File: arm/op_and_int_2addr.S */
5565/* File: arm/binop2addr.S */
5566 /*
5567 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5568 * that specifies an instruction that performs "result = r0 op r1".
5569 * This could be an ARM instruction or a function call. (If the result
5570 * comes back in a register other than r0, you can override "result".)
5571 *
5572 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5573 * vCC (r1). Useful for integer division and modulus.
5574 *
5575 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5576 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5577 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5578 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5579 */
5580 /* binop/2addr vA, vB */
5581 mov r3, rINST, lsr #12 @ r3<- B
5582 ubfx r9, rINST, #8, #4 @ r9<- A
5583 GET_VREG r1, r3 @ r1<- vB
5584 GET_VREG r0, r9 @ r0<- vA
5585 .if 0
5586 cmp r1, #0 @ is second operand zero?
5587 beq common_errDivideByZero
5588 .endif
5589 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5590
5591 @ optional op; may set condition codes
5592 and r0, r0, r1 @ r0<- op, r0-r3 changed
5593 GET_INST_OPCODE ip @ extract opcode from rINST
5594 SET_VREG r0, r9 @ vAA<- r0
5595 GOTO_OPCODE ip @ jump to next instruction
5596 /* 10-13 instructions */
5597
5598
5599/* ------------------------------ */
5600 .balign 128
5601.L_op_or_int_2addr: /* 0xb6 */
5602/* File: arm/op_or_int_2addr.S */
5603/* File: arm/binop2addr.S */
5604 /*
5605 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5606 * that specifies an instruction that performs "result = r0 op r1".
5607 * This could be an ARM instruction or a function call. (If the result
5608 * comes back in a register other than r0, you can override "result".)
5609 *
5610 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5611 * vCC (r1). Useful for integer division and modulus.
5612 *
5613 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5614 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5615 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5616 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5617 */
5618 /* binop/2addr vA, vB */
5619 mov r3, rINST, lsr #12 @ r3<- B
5620 ubfx r9, rINST, #8, #4 @ r9<- A
5621 GET_VREG r1, r3 @ r1<- vB
5622 GET_VREG r0, r9 @ r0<- vA
5623 .if 0
5624 cmp r1, #0 @ is second operand zero?
5625 beq common_errDivideByZero
5626 .endif
5627 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5628
5629 @ optional op; may set condition codes
5630 orr r0, r0, r1 @ r0<- op, r0-r3 changed
5631 GET_INST_OPCODE ip @ extract opcode from rINST
5632 SET_VREG r0, r9 @ vAA<- r0
5633 GOTO_OPCODE ip @ jump to next instruction
5634 /* 10-13 instructions */
5635
5636
5637/* ------------------------------ */
5638 .balign 128
5639.L_op_xor_int_2addr: /* 0xb7 */
5640/* File: arm/op_xor_int_2addr.S */
5641/* File: arm/binop2addr.S */
5642 /*
5643 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5644 * that specifies an instruction that performs "result = r0 op r1".
5645 * This could be an ARM instruction or a function call. (If the result
5646 * comes back in a register other than r0, you can override "result".)
5647 *
5648 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5649 * vCC (r1). Useful for integer division and modulus.
5650 *
5651 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5652 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5653 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5654 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5655 */
5656 /* binop/2addr vA, vB */
5657 mov r3, rINST, lsr #12 @ r3<- B
5658 ubfx r9, rINST, #8, #4 @ r9<- A
5659 GET_VREG r1, r3 @ r1<- vB
5660 GET_VREG r0, r9 @ r0<- vA
5661 .if 0
5662 cmp r1, #0 @ is second operand zero?
5663 beq common_errDivideByZero
5664 .endif
5665 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5666
5667 @ optional op; may set condition codes
5668 eor r0, r0, r1 @ r0<- op, r0-r3 changed
5669 GET_INST_OPCODE ip @ extract opcode from rINST
5670 SET_VREG r0, r9 @ vAA<- r0
5671 GOTO_OPCODE ip @ jump to next instruction
5672 /* 10-13 instructions */
5673
5674
5675/* ------------------------------ */
5676 .balign 128
5677.L_op_shl_int_2addr: /* 0xb8 */
5678/* File: arm/op_shl_int_2addr.S */
5679/* File: arm/binop2addr.S */
5680 /*
5681 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5682 * that specifies an instruction that performs "result = r0 op r1".
5683 * This could be an ARM instruction or a function call. (If the result
5684 * comes back in a register other than r0, you can override "result".)
5685 *
5686 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5687 * vCC (r1). Useful for integer division and modulus.
5688 *
5689 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5690 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5691 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5692 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5693 */
5694 /* binop/2addr vA, vB */
5695 mov r3, rINST, lsr #12 @ r3<- B
5696 ubfx r9, rINST, #8, #4 @ r9<- A
5697 GET_VREG r1, r3 @ r1<- vB
5698 GET_VREG r0, r9 @ r0<- vA
5699 .if 0
5700 cmp r1, #0 @ is second operand zero?
5701 beq common_errDivideByZero
5702 .endif
5703 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5704
5705 and r1, r1, #31 @ optional op; may set condition codes
5706 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
5707 GET_INST_OPCODE ip @ extract opcode from rINST
5708 SET_VREG r0, r9 @ vAA<- r0
5709 GOTO_OPCODE ip @ jump to next instruction
5710 /* 10-13 instructions */
5711
5712
5713/* ------------------------------ */
5714 .balign 128
5715.L_op_shr_int_2addr: /* 0xb9 */
5716/* File: arm/op_shr_int_2addr.S */
5717/* File: arm/binop2addr.S */
5718 /*
5719 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5720 * that specifies an instruction that performs "result = r0 op r1".
5721 * This could be an ARM instruction or a function call. (If the result
5722 * comes back in a register other than r0, you can override "result".)
5723 *
5724 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5725 * vCC (r1). Useful for integer division and modulus.
5726 *
5727 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5728 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5729 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5730 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5731 */
5732 /* binop/2addr vA, vB */
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 .if 0
5738 cmp r1, #0 @ is second operand zero?
5739 beq common_errDivideByZero
5740 .endif
5741 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5742
5743 and r1, r1, #31 @ optional op; may set condition codes
5744 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
5745 GET_INST_OPCODE ip @ extract opcode from rINST
5746 SET_VREG r0, r9 @ vAA<- r0
5747 GOTO_OPCODE ip @ jump to next instruction
5748 /* 10-13 instructions */
5749
5750
5751/* ------------------------------ */
5752 .balign 128
5753.L_op_ushr_int_2addr: /* 0xba */
5754/* File: arm/op_ushr_int_2addr.S */
5755/* File: arm/binop2addr.S */
5756 /*
5757 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5758 * that specifies an instruction that performs "result = r0 op r1".
5759 * This could be an ARM instruction or a function call. (If the result
5760 * comes back in a register other than r0, you can override "result".)
5761 *
5762 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5763 * vCC (r1). Useful for integer division and modulus.
5764 *
5765 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5766 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5767 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5768 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5769 */
5770 /* binop/2addr vA, vB */
5771 mov r3, rINST, lsr #12 @ r3<- B
5772 ubfx r9, rINST, #8, #4 @ r9<- A
5773 GET_VREG r1, r3 @ r1<- vB
5774 GET_VREG r0, r9 @ r0<- vA
5775 .if 0
5776 cmp r1, #0 @ is second operand zero?
5777 beq common_errDivideByZero
5778 .endif
5779 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5780
5781 and r1, r1, #31 @ optional op; may set condition codes
5782 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
5783 GET_INST_OPCODE ip @ extract opcode from rINST
5784 SET_VREG r0, r9 @ vAA<- r0
5785 GOTO_OPCODE ip @ jump to next instruction
5786 /* 10-13 instructions */
5787
5788
5789/* ------------------------------ */
5790 .balign 128
5791.L_op_add_long_2addr: /* 0xbb */
5792/* File: arm/op_add_long_2addr.S */
5793/* File: arm/binopWide2addr.S */
5794 /*
5795 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5796 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5797 * This could be an ARM instruction or a function call. (If the result
5798 * comes back in a register other than r0, you can override "result".)
5799 *
5800 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5801 * vCC (r1). Useful for integer division and modulus.
5802 *
5803 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5804 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5805 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5806 * rem-double/2addr
5807 */
5808 /* binop/2addr vA, vB */
5809 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005810 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005811 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005812 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005813 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5814 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5815 .if 0
5816 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5817 beq common_errDivideByZero
5818 .endif
buzbee50cf6002016-02-10 08:59:12 -08005819 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005820 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005821 adds r0, r0, r2 @ optional op; may set condition codes
5822 adc r1, r1, r3 @ result<- op, r0-r3 changed
5823 GET_INST_OPCODE ip @ extract opcode from rINST
5824 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5825 GOTO_OPCODE ip @ jump to next instruction
5826 /* 12-15 instructions */
5827
5828
5829/* ------------------------------ */
5830 .balign 128
5831.L_op_sub_long_2addr: /* 0xbc */
5832/* File: arm/op_sub_long_2addr.S */
5833/* File: arm/binopWide2addr.S */
5834 /*
5835 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5836 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
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-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5844 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5845 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5846 * rem-double/2addr
5847 */
5848 /* binop/2addr vA, vB */
5849 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005850 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005851 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005852 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005853 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5854 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5855 .if 0
5856 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5857 beq common_errDivideByZero
5858 .endif
buzbee50cf6002016-02-10 08:59:12 -08005859 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005860 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005861 subs r0, r0, r2 @ optional op; may set condition codes
5862 sbc r1, r1, r3 @ result<- op, r0-r3 changed
5863 GET_INST_OPCODE ip @ extract opcode from rINST
5864 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5865 GOTO_OPCODE ip @ jump to next instruction
5866 /* 12-15 instructions */
5867
5868
5869/* ------------------------------ */
5870 .balign 128
5871.L_op_mul_long_2addr: /* 0xbd */
5872/* File: arm/op_mul_long_2addr.S */
5873 /*
5874 * Signed 64-bit integer multiply, "/2addr" version.
5875 *
5876 * See op_mul_long for an explanation.
5877 *
5878 * We get a little tight on registers, so to avoid looking up &fp[A]
5879 * again we stuff it into rINST.
5880 */
5881 /* mul-long/2addr vA, vB */
5882 mov r1, rINST, lsr #12 @ r1<- B
5883 ubfx r9, rINST, #8, #4 @ r9<- A
5884 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5885 add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A]
5886 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5887 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1
5888 mul ip, r2, r1 @ ip<- ZxW
5889 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
5890 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
5891 mov r0, rINST @ r0<- &fp[A] (free up rINST)
5892 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5893 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
5894 GET_INST_OPCODE ip @ extract opcode from rINST
5895 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
5896 GOTO_OPCODE ip @ jump to next instruction
5897
5898/* ------------------------------ */
5899 .balign 128
5900.L_op_div_long_2addr: /* 0xbe */
5901/* File: arm/op_div_long_2addr.S */
5902/* File: arm/binopWide2addr.S */
5903 /*
5904 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5905 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5906 * This could be an ARM instruction or a function call. (If the result
5907 * comes back in a register other than r0, you can override "result".)
5908 *
5909 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5910 * vCC (r1). Useful for integer division and modulus.
5911 *
5912 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5913 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5914 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5915 * rem-double/2addr
5916 */
5917 /* binop/2addr vA, vB */
5918 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005919 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005920 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005921 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005922 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5923 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5924 .if 1
5925 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5926 beq common_errDivideByZero
5927 .endif
buzbee50cf6002016-02-10 08:59:12 -08005928 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005929 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005930 @ optional op; may set condition codes
5931 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5932 GET_INST_OPCODE ip @ extract opcode from rINST
5933 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5934 GOTO_OPCODE ip @ jump to next instruction
5935 /* 12-15 instructions */
5936
5937
5938/* ------------------------------ */
5939 .balign 128
5940.L_op_rem_long_2addr: /* 0xbf */
5941/* File: arm/op_rem_long_2addr.S */
5942/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5943/* File: arm/binopWide2addr.S */
5944 /*
5945 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5946 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5947 * This could be an ARM instruction or a function call. (If the result
5948 * comes back in a register other than r0, you can override "result".)
5949 *
5950 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5951 * vCC (r1). Useful for integer division and modulus.
5952 *
5953 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5954 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5955 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5956 * rem-double/2addr
5957 */
5958 /* binop/2addr vA, vB */
5959 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005960 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005961 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005962 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005963 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5964 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5965 .if 1
5966 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5967 beq common_errDivideByZero
5968 .endif
buzbee50cf6002016-02-10 08:59:12 -08005969 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005970 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005971 @ optional op; may set condition codes
5972 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5973 GET_INST_OPCODE ip @ extract opcode from rINST
5974 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
5975 GOTO_OPCODE ip @ jump to next instruction
5976 /* 12-15 instructions */
5977
5978
5979/* ------------------------------ */
5980 .balign 128
5981.L_op_and_long_2addr: /* 0xc0 */
5982/* File: arm/op_and_long_2addr.S */
5983/* File: arm/binopWide2addr.S */
5984 /*
5985 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5986 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5987 * This could be an ARM instruction or a function call. (If the result
5988 * comes back in a register other than r0, you can override "result".)
5989 *
5990 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5991 * vCC (r1). Useful for integer division and modulus.
5992 *
5993 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5994 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5995 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5996 * rem-double/2addr
5997 */
5998 /* binop/2addr vA, vB */
5999 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006000 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006001 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006002 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006003 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6004 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6005 .if 0
6006 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6007 beq common_errDivideByZero
6008 .endif
buzbee50cf6002016-02-10 08:59:12 -08006009 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006010 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006011 and r0, r0, r2 @ optional op; may set condition codes
6012 and r1, r1, r3 @ result<- op, r0-r3 changed
6013 GET_INST_OPCODE ip @ extract opcode from rINST
6014 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6015 GOTO_OPCODE ip @ jump to next instruction
6016 /* 12-15 instructions */
6017
6018
6019/* ------------------------------ */
6020 .balign 128
6021.L_op_or_long_2addr: /* 0xc1 */
6022/* File: arm/op_or_long_2addr.S */
6023/* File: arm/binopWide2addr.S */
6024 /*
6025 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6026 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6027 * This could be an ARM instruction or a function call. (If the result
6028 * comes back in a register other than r0, you can override "result".)
6029 *
6030 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6031 * vCC (r1). Useful for integer division and modulus.
6032 *
6033 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6034 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6035 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6036 * rem-double/2addr
6037 */
6038 /* binop/2addr vA, vB */
6039 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006040 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006041 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006042 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006043 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6044 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6045 .if 0
6046 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6047 beq common_errDivideByZero
6048 .endif
buzbee50cf6002016-02-10 08:59:12 -08006049 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006050 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006051 orr r0, r0, r2 @ optional op; may set condition codes
6052 orr r1, r1, r3 @ result<- op, r0-r3 changed
6053 GET_INST_OPCODE ip @ extract opcode from rINST
6054 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6055 GOTO_OPCODE ip @ jump to next instruction
6056 /* 12-15 instructions */
6057
6058
6059/* ------------------------------ */
6060 .balign 128
6061.L_op_xor_long_2addr: /* 0xc2 */
6062/* File: arm/op_xor_long_2addr.S */
6063/* File: arm/binopWide2addr.S */
6064 /*
6065 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6066 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6067 * This could be an ARM instruction or a function call. (If the result
6068 * comes back in a register other than r0, you can override "result".)
6069 *
6070 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6071 * vCC (r1). Useful for integer division and modulus.
6072 *
6073 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6074 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6075 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6076 * rem-double/2addr
6077 */
6078 /* binop/2addr vA, vB */
6079 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006080 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006081 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006082 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006083 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6084 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6085 .if 0
6086 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6087 beq common_errDivideByZero
6088 .endif
buzbee50cf6002016-02-10 08:59:12 -08006089 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006090 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006091 eor r0, r0, r2 @ optional op; may set condition codes
6092 eor r1, r1, r3 @ result<- op, r0-r3 changed
6093 GET_INST_OPCODE ip @ extract opcode from rINST
6094 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6095 GOTO_OPCODE ip @ jump to next instruction
6096 /* 12-15 instructions */
6097
6098
6099/* ------------------------------ */
6100 .balign 128
6101.L_op_shl_long_2addr: /* 0xc3 */
6102/* File: arm/op_shl_long_2addr.S */
6103 /*
6104 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6105 * 32-bit shift distance.
6106 */
6107 /* shl-long/2addr vA, vB */
6108 mov r3, rINST, lsr #12 @ r3<- B
6109 ubfx r9, rINST, #8, #4 @ r9<- A
6110 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006111 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006112 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6113 and r2, r2, #63 @ r2<- r2 & 0x3f
6114 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006115 mov r1, r1, asl r2 @ r1<- r1 << r2
6116 rsb r3, r2, #32 @ r3<- 32 - r2
6117 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
6118 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006119 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006120 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
6121 mov r0, r0, asl r2 @ r0<- r0 << r2
buzbee1452bee2015-03-06 14:43:04 -08006122 GET_INST_OPCODE ip @ extract opcode from rINST
6123 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6124 GOTO_OPCODE ip @ jump to next instruction
6125
6126/* ------------------------------ */
6127 .balign 128
6128.L_op_shr_long_2addr: /* 0xc4 */
6129/* File: arm/op_shr_long_2addr.S */
6130 /*
6131 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6132 * 32-bit shift distance.
6133 */
6134 /* shr-long/2addr vA, vB */
6135 mov r3, rINST, lsr #12 @ r3<- B
6136 ubfx r9, rINST, #8, #4 @ r9<- A
6137 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006138 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006139 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6140 and r2, r2, #63 @ r2<- r2 & 0x3f
6141 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006142 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6143 rsb r3, r2, #32 @ r3<- 32 - r2
6144 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6145 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006146 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006147 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
6148 mov r1, r1, asr r2 @ r1<- r1 >> r2
buzbee1452bee2015-03-06 14:43:04 -08006149 GET_INST_OPCODE ip @ extract opcode from rINST
6150 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6151 GOTO_OPCODE ip @ jump to next instruction
6152
6153/* ------------------------------ */
6154 .balign 128
6155.L_op_ushr_long_2addr: /* 0xc5 */
6156/* File: arm/op_ushr_long_2addr.S */
6157 /*
6158 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6159 * 32-bit shift distance.
6160 */
6161 /* ushr-long/2addr vA, vB */
6162 mov r3, rINST, lsr #12 @ r3<- B
6163 ubfx r9, rINST, #8, #4 @ r9<- A
6164 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006165 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006166 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6167 and r2, r2, #63 @ r2<- r2 & 0x3f
6168 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006169 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6170 rsb r3, r2, #32 @ r3<- 32 - r2
6171 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6172 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006173 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006174 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
6175 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
buzbee1452bee2015-03-06 14:43:04 -08006176 GET_INST_OPCODE ip @ extract opcode from rINST
6177 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6178 GOTO_OPCODE ip @ jump to next instruction
6179
6180/* ------------------------------ */
6181 .balign 128
6182.L_op_add_float_2addr: /* 0xc6 */
6183/* File: arm/op_add_float_2addr.S */
6184/* File: arm/fbinop2addr.S */
6185 /*
6186 * Generic 32-bit floating point "/2addr" binary operation. Provide
6187 * an "instr" line that specifies an instruction that performs
6188 * "s2 = s0 op s1".
6189 *
6190 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6191 */
6192 /* binop/2addr vA, vB */
6193 mov r3, rINST, lsr #12 @ r3<- B
6194 mov r9, rINST, lsr #8 @ r9<- A+
6195 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6196 and r9, r9, #15 @ r9<- A
6197 flds s1, [r3] @ s1<- vB
6198 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6199 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6200 flds s0, [r9] @ s0<- vA
6201
6202 fadds s2, s0, s1 @ s2<- op
6203 GET_INST_OPCODE ip @ extract opcode from rINST
6204 fsts s2, [r9] @ vAA<- s2
6205 GOTO_OPCODE ip @ jump to next instruction
6206
6207
6208/* ------------------------------ */
6209 .balign 128
6210.L_op_sub_float_2addr: /* 0xc7 */
6211/* File: arm/op_sub_float_2addr.S */
6212/* File: arm/fbinop2addr.S */
6213 /*
6214 * Generic 32-bit floating point "/2addr" binary operation. Provide
6215 * an "instr" line that specifies an instruction that performs
6216 * "s2 = s0 op s1".
6217 *
6218 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6219 */
6220 /* binop/2addr vA, vB */
6221 mov r3, rINST, lsr #12 @ r3<- B
6222 mov r9, rINST, lsr #8 @ r9<- A+
6223 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6224 and r9, r9, #15 @ r9<- A
6225 flds s1, [r3] @ s1<- vB
6226 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6227 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6228 flds s0, [r9] @ s0<- vA
6229
6230 fsubs s2, s0, s1 @ s2<- op
6231 GET_INST_OPCODE ip @ extract opcode from rINST
6232 fsts s2, [r9] @ vAA<- s2
6233 GOTO_OPCODE ip @ jump to next instruction
6234
6235
6236/* ------------------------------ */
6237 .balign 128
6238.L_op_mul_float_2addr: /* 0xc8 */
6239/* File: arm/op_mul_float_2addr.S */
6240/* File: arm/fbinop2addr.S */
6241 /*
6242 * Generic 32-bit floating point "/2addr" binary operation. Provide
6243 * an "instr" line that specifies an instruction that performs
6244 * "s2 = s0 op s1".
6245 *
6246 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6247 */
6248 /* binop/2addr vA, vB */
6249 mov r3, rINST, lsr #12 @ r3<- B
6250 mov r9, rINST, lsr #8 @ r9<- A+
6251 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6252 and r9, r9, #15 @ r9<- A
6253 flds s1, [r3] @ s1<- vB
6254 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6255 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6256 flds s0, [r9] @ s0<- vA
6257
6258 fmuls s2, s0, s1 @ s2<- op
6259 GET_INST_OPCODE ip @ extract opcode from rINST
6260 fsts s2, [r9] @ vAA<- s2
6261 GOTO_OPCODE ip @ jump to next instruction
6262
6263
6264/* ------------------------------ */
6265 .balign 128
6266.L_op_div_float_2addr: /* 0xc9 */
6267/* File: arm/op_div_float_2addr.S */
6268/* File: arm/fbinop2addr.S */
6269 /*
6270 * Generic 32-bit floating point "/2addr" binary operation. Provide
6271 * an "instr" line that specifies an instruction that performs
6272 * "s2 = s0 op s1".
6273 *
6274 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6275 */
6276 /* binop/2addr vA, vB */
6277 mov r3, rINST, lsr #12 @ r3<- B
6278 mov r9, rINST, lsr #8 @ r9<- A+
6279 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6280 and r9, r9, #15 @ r9<- A
6281 flds s1, [r3] @ s1<- vB
6282 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6283 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6284 flds s0, [r9] @ s0<- vA
6285
6286 fdivs s2, s0, s1 @ s2<- op
6287 GET_INST_OPCODE ip @ extract opcode from rINST
6288 fsts s2, [r9] @ vAA<- s2
6289 GOTO_OPCODE ip @ jump to next instruction
6290
6291
6292/* ------------------------------ */
6293 .balign 128
6294.L_op_rem_float_2addr: /* 0xca */
6295/* File: arm/op_rem_float_2addr.S */
6296/* EABI doesn't define a float remainder function, but libm does */
6297/* File: arm/binop2addr.S */
6298 /*
6299 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
6300 * that specifies an instruction that performs "result = r0 op r1".
6301 * This could be an ARM instruction or a function call. (If the result
6302 * comes back in a register other than r0, you can override "result".)
6303 *
6304 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6305 * vCC (r1). Useful for integer division and modulus.
6306 *
6307 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6308 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6309 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6310 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6311 */
6312 /* binop/2addr vA, vB */
6313 mov r3, rINST, lsr #12 @ r3<- B
6314 ubfx r9, rINST, #8, #4 @ r9<- A
6315 GET_VREG r1, r3 @ r1<- vB
6316 GET_VREG r0, r9 @ r0<- vA
6317 .if 0
6318 cmp r1, #0 @ is second operand zero?
6319 beq common_errDivideByZero
6320 .endif
6321 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6322
6323 @ optional op; may set condition codes
6324 bl fmodf @ r0<- op, r0-r3 changed
6325 GET_INST_OPCODE ip @ extract opcode from rINST
6326 SET_VREG r0, r9 @ vAA<- r0
6327 GOTO_OPCODE ip @ jump to next instruction
6328 /* 10-13 instructions */
6329
6330
6331/* ------------------------------ */
6332 .balign 128
6333.L_op_add_double_2addr: /* 0xcb */
6334/* File: arm/op_add_double_2addr.S */
6335/* File: arm/fbinopWide2addr.S */
6336 /*
6337 * Generic 64-bit floating point "/2addr" binary operation. Provide
6338 * an "instr" line that specifies an instruction that performs
6339 * "d2 = d0 op d1".
6340 *
6341 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6342 * div-double/2addr
6343 */
6344 /* binop/2addr vA, vB */
6345 mov r3, rINST, lsr #12 @ r3<- B
6346 mov r9, rINST, lsr #8 @ r9<- A+
6347 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6348 and r9, r9, #15 @ r9<- A
6349 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006350 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006351 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6352 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6353 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006354 faddd d2, d0, d1 @ d2<- op
6355 GET_INST_OPCODE ip @ extract opcode from rINST
6356 fstd d2, [r9] @ vAA<- d2
6357 GOTO_OPCODE ip @ jump to next instruction
6358
6359
6360/* ------------------------------ */
6361 .balign 128
6362.L_op_sub_double_2addr: /* 0xcc */
6363/* File: arm/op_sub_double_2addr.S */
6364/* File: arm/fbinopWide2addr.S */
6365 /*
6366 * Generic 64-bit floating point "/2addr" binary operation. Provide
6367 * an "instr" line that specifies an instruction that performs
6368 * "d2 = d0 op d1".
6369 *
6370 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6371 * div-double/2addr
6372 */
6373 /* binop/2addr vA, vB */
6374 mov r3, rINST, lsr #12 @ r3<- B
6375 mov r9, rINST, lsr #8 @ r9<- A+
6376 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6377 and r9, r9, #15 @ r9<- A
6378 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006379 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006380 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6381 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6382 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006383 fsubd d2, d0, d1 @ d2<- op
6384 GET_INST_OPCODE ip @ extract opcode from rINST
6385 fstd d2, [r9] @ vAA<- d2
6386 GOTO_OPCODE ip @ jump to next instruction
6387
6388
6389/* ------------------------------ */
6390 .balign 128
6391.L_op_mul_double_2addr: /* 0xcd */
6392/* File: arm/op_mul_double_2addr.S */
6393/* File: arm/fbinopWide2addr.S */
6394 /*
6395 * Generic 64-bit floating point "/2addr" binary operation. Provide
6396 * an "instr" line that specifies an instruction that performs
6397 * "d2 = d0 op d1".
6398 *
6399 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6400 * div-double/2addr
6401 */
6402 /* binop/2addr vA, vB */
6403 mov r3, rINST, lsr #12 @ r3<- B
6404 mov r9, rINST, lsr #8 @ r9<- A+
6405 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6406 and r9, r9, #15 @ r9<- A
6407 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006408 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006409 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6410 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6411 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006412 fmuld d2, d0, d1 @ d2<- op
6413 GET_INST_OPCODE ip @ extract opcode from rINST
6414 fstd d2, [r9] @ vAA<- d2
6415 GOTO_OPCODE ip @ jump to next instruction
6416
6417
6418/* ------------------------------ */
6419 .balign 128
6420.L_op_div_double_2addr: /* 0xce */
6421/* File: arm/op_div_double_2addr.S */
6422/* File: arm/fbinopWide2addr.S */
6423 /*
6424 * Generic 64-bit floating point "/2addr" binary operation. Provide
6425 * an "instr" line that specifies an instruction that performs
6426 * "d2 = d0 op d1".
6427 *
6428 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6429 * div-double/2addr
6430 */
6431 /* binop/2addr vA, vB */
6432 mov r3, rINST, lsr #12 @ r3<- B
6433 mov r9, rINST, lsr #8 @ r9<- A+
6434 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6435 and r9, r9, #15 @ r9<- A
6436 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006437 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006438 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6439 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6440 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006441 fdivd d2, d0, d1 @ d2<- op
6442 GET_INST_OPCODE ip @ extract opcode from rINST
6443 fstd d2, [r9] @ vAA<- d2
6444 GOTO_OPCODE ip @ jump to next instruction
6445
6446
6447/* ------------------------------ */
6448 .balign 128
6449.L_op_rem_double_2addr: /* 0xcf */
6450/* File: arm/op_rem_double_2addr.S */
6451/* EABI doesn't define a double remainder function, but libm does */
6452/* File: arm/binopWide2addr.S */
6453 /*
6454 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6455 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6456 * This could be an ARM instruction or a function call. (If the result
6457 * comes back in a register other than r0, you can override "result".)
6458 *
6459 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6460 * vCC (r1). Useful for integer division and modulus.
6461 *
6462 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6463 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6464 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6465 * rem-double/2addr
6466 */
6467 /* binop/2addr vA, vB */
6468 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006469 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006470 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006471 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006472 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6473 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6474 .if 0
6475 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6476 beq common_errDivideByZero
6477 .endif
buzbee50cf6002016-02-10 08:59:12 -08006478 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006479 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006480 @ optional op; may set condition codes
6481 bl fmod @ result<- op, r0-r3 changed
6482 GET_INST_OPCODE ip @ extract opcode from rINST
6483 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6484 GOTO_OPCODE ip @ jump to next instruction
6485 /* 12-15 instructions */
6486
6487
6488/* ------------------------------ */
6489 .balign 128
6490.L_op_add_int_lit16: /* 0xd0 */
6491/* File: arm/op_add_int_lit16.S */
6492/* File: arm/binopLit16.S */
6493 /*
6494 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6495 * that specifies an instruction that performs "result = r0 op r1".
6496 * This could be an ARM instruction or a function call. (If the result
6497 * comes back in a register other than r0, you can override "result".)
6498 *
6499 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6500 * vCC (r1). Useful for integer division and modulus.
6501 *
6502 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6503 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6504 */
6505 /* binop/lit16 vA, vB, #+CCCC */
6506 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6507 mov r2, rINST, lsr #12 @ r2<- B
6508 ubfx r9, rINST, #8, #4 @ r9<- A
6509 GET_VREG r0, r2 @ r0<- vB
6510 .if 0
6511 cmp r1, #0 @ is second operand zero?
6512 beq common_errDivideByZero
6513 .endif
6514 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6515
6516 add r0, r0, r1 @ 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_rsub_int: /* 0xd1 */
6526/* File: arm/op_rsub_int.S */
6527/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6528/* File: arm/binopLit16.S */
6529 /*
6530 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6531 * that specifies an instruction that performs "result = r0 op r1".
6532 * This could be an ARM instruction or a function call. (If the result
6533 * comes back in a register other than r0, you can override "result".)
6534 *
6535 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6536 * vCC (r1). Useful for integer division and modulus.
6537 *
6538 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6539 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6540 */
6541 /* binop/lit16 vA, vB, #+CCCC */
6542 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6543 mov r2, rINST, lsr #12 @ r2<- B
6544 ubfx r9, rINST, #8, #4 @ r9<- A
6545 GET_VREG r0, r2 @ r0<- vB
6546 .if 0
6547 cmp r1, #0 @ is second operand zero?
6548 beq common_errDivideByZero
6549 .endif
6550 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6551
6552 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6553 GET_INST_OPCODE ip @ extract opcode from rINST
6554 SET_VREG r0, r9 @ vAA<- r0
6555 GOTO_OPCODE ip @ jump to next instruction
6556 /* 10-13 instructions */
6557
6558
6559/* ------------------------------ */
6560 .balign 128
6561.L_op_mul_int_lit16: /* 0xd2 */
6562/* File: arm/op_mul_int_lit16.S */
6563/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6564/* File: arm/binopLit16.S */
6565 /*
6566 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6567 * that specifies an instruction that performs "result = r0 op r1".
6568 * This could be an ARM instruction or a function call. (If the result
6569 * comes back in a register other than r0, you can override "result".)
6570 *
6571 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6572 * vCC (r1). Useful for integer division and modulus.
6573 *
6574 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6575 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6576 */
6577 /* binop/lit16 vA, vB, #+CCCC */
6578 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6579 mov r2, rINST, lsr #12 @ r2<- B
6580 ubfx r9, rINST, #8, #4 @ r9<- A
6581 GET_VREG r0, r2 @ r0<- vB
6582 .if 0
6583 cmp r1, #0 @ is second operand zero?
6584 beq common_errDivideByZero
6585 .endif
6586 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6587
6588 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6589 GET_INST_OPCODE ip @ extract opcode from rINST
6590 SET_VREG r0, r9 @ vAA<- r0
6591 GOTO_OPCODE ip @ jump to next instruction
6592 /* 10-13 instructions */
6593
6594
6595/* ------------------------------ */
6596 .balign 128
6597.L_op_div_int_lit16: /* 0xd3 */
6598/* File: arm/op_div_int_lit16.S */
6599 /*
6600 * Specialized 32-bit binary operation
6601 *
6602 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6603 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6604 * ARMv7 CPUs that have hardware division support).
6605 *
6606 * div-int/lit16
6607 *
6608 */
6609 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6610 mov r2, rINST, lsr #12 @ r2<- B
6611 ubfx r9, rINST, #8, #4 @ r9<- A
6612 GET_VREG r0, r2 @ r0<- vB
6613 cmp r1, #0 @ is second operand zero?
6614 beq common_errDivideByZero
6615 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6616
6617#ifdef __ARM_ARCH_EXT_IDIV__
6618 sdiv r0, r0, r1 @ r0<- op
6619#else
6620 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6621#endif
6622 GET_INST_OPCODE ip @ extract opcode from rINST
6623 SET_VREG r0, r9 @ vAA<- r0
6624 GOTO_OPCODE ip @ jump to next instruction
6625 /* 10-13 instructions */
6626
6627/* ------------------------------ */
6628 .balign 128
6629.L_op_rem_int_lit16: /* 0xd4 */
6630/* File: arm/op_rem_int_lit16.S */
6631 /*
6632 * Specialized 32-bit binary operation
6633 *
6634 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6635 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6636 * ARMv7 CPUs that have hardware division support).
6637 *
6638 * NOTE: idivmod returns quotient in r0 and remainder in r1
6639 *
6640 * rem-int/lit16
6641 *
6642 */
6643 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6644 mov r2, rINST, lsr #12 @ r2<- B
6645 ubfx r9, rINST, #8, #4 @ r9<- A
6646 GET_VREG r0, r2 @ r0<- vB
6647 cmp r1, #0 @ is second operand zero?
6648 beq common_errDivideByZero
6649 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6650
6651#ifdef __ARM_ARCH_EXT_IDIV__
6652 sdiv r2, r0, r1
6653 mls r1, r1, r2, r0 @ r1<- op
6654#else
6655 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6656#endif
6657 GET_INST_OPCODE ip @ extract opcode from rINST
6658 SET_VREG r1, r9 @ vAA<- r1
6659 GOTO_OPCODE ip @ jump to next instruction
6660 /* 10-13 instructions */
6661
6662/* ------------------------------ */
6663 .balign 128
6664.L_op_and_int_lit16: /* 0xd5 */
6665/* File: arm/op_and_int_lit16.S */
6666/* File: arm/binopLit16.S */
6667 /*
6668 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6669 * that specifies an instruction that performs "result = r0 op r1".
6670 * This could be an ARM instruction or a function call. (If the result
6671 * comes back in a register other than r0, you can override "result".)
6672 *
6673 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6674 * vCC (r1). Useful for integer division and modulus.
6675 *
6676 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6677 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6678 */
6679 /* binop/lit16 vA, vB, #+CCCC */
6680 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6681 mov r2, rINST, lsr #12 @ r2<- B
6682 ubfx r9, rINST, #8, #4 @ r9<- A
6683 GET_VREG r0, r2 @ r0<- vB
6684 .if 0
6685 cmp r1, #0 @ is second operand zero?
6686 beq common_errDivideByZero
6687 .endif
6688 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6689
6690 and r0, r0, r1 @ r0<- op, r0-r3 changed
6691 GET_INST_OPCODE ip @ extract opcode from rINST
6692 SET_VREG r0, r9 @ vAA<- r0
6693 GOTO_OPCODE ip @ jump to next instruction
6694 /* 10-13 instructions */
6695
6696
6697/* ------------------------------ */
6698 .balign 128
6699.L_op_or_int_lit16: /* 0xd6 */
6700/* File: arm/op_or_int_lit16.S */
6701/* File: arm/binopLit16.S */
6702 /*
6703 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6704 * that specifies an instruction that performs "result = r0 op r1".
6705 * This could be an ARM instruction or a function call. (If the result
6706 * comes back in a register other than r0, you can override "result".)
6707 *
6708 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6709 * vCC (r1). Useful for integer division and modulus.
6710 *
6711 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6712 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6713 */
6714 /* binop/lit16 vA, vB, #+CCCC */
6715 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6716 mov r2, rINST, lsr #12 @ r2<- B
6717 ubfx r9, rINST, #8, #4 @ r9<- A
6718 GET_VREG r0, r2 @ r0<- vB
6719 .if 0
6720 cmp r1, #0 @ is second operand zero?
6721 beq common_errDivideByZero
6722 .endif
6723 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6724
6725 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6726 GET_INST_OPCODE ip @ extract opcode from rINST
6727 SET_VREG r0, r9 @ vAA<- r0
6728 GOTO_OPCODE ip @ jump to next instruction
6729 /* 10-13 instructions */
6730
6731
6732/* ------------------------------ */
6733 .balign 128
6734.L_op_xor_int_lit16: /* 0xd7 */
6735/* File: arm/op_xor_int_lit16.S */
6736/* File: arm/binopLit16.S */
6737 /*
6738 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6739 * that specifies an instruction that performs "result = r0 op r1".
6740 * This could be an ARM instruction or a function call. (If the result
6741 * comes back in a register other than r0, you can override "result".)
6742 *
6743 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6744 * vCC (r1). Useful for integer division and modulus.
6745 *
6746 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6747 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6748 */
6749 /* binop/lit16 vA, vB, #+CCCC */
6750 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6751 mov r2, rINST, lsr #12 @ r2<- B
6752 ubfx r9, rINST, #8, #4 @ r9<- A
6753 GET_VREG r0, r2 @ r0<- vB
6754 .if 0
6755 cmp r1, #0 @ is second operand zero?
6756 beq common_errDivideByZero
6757 .endif
6758 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6759
6760 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6761 GET_INST_OPCODE ip @ extract opcode from rINST
6762 SET_VREG r0, r9 @ vAA<- r0
6763 GOTO_OPCODE ip @ jump to next instruction
6764 /* 10-13 instructions */
6765
6766
6767/* ------------------------------ */
6768 .balign 128
6769.L_op_add_int_lit8: /* 0xd8 */
6770/* File: arm/op_add_int_lit8.S */
6771/* File: arm/binopLit8.S */
6772 /*
6773 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6774 * that specifies an instruction that performs "result = r0 op r1".
6775 * This could be an ARM instruction or a function call. (If the result
6776 * comes back in a register other than r0, you can override "result".)
6777 *
6778 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6779 * vCC (r1). Useful for integer division and modulus.
6780 *
6781 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6782 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6783 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6784 */
6785 /* binop/lit8 vAA, vBB, #+CC */
6786 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6787 mov r9, rINST, lsr #8 @ r9<- AA
6788 and r2, r3, #255 @ r2<- BB
6789 GET_VREG r0, r2 @ r0<- vBB
6790 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6791 .if 0
6792 @cmp r1, #0 @ is second operand zero?
6793 beq common_errDivideByZero
6794 .endif
6795 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6796
6797 @ optional op; may set condition codes
6798 add r0, r0, r1 @ r0<- op, r0-r3 changed
6799 GET_INST_OPCODE ip @ extract opcode from rINST
6800 SET_VREG r0, r9 @ vAA<- r0
6801 GOTO_OPCODE ip @ jump to next instruction
6802 /* 10-12 instructions */
6803
6804
6805/* ------------------------------ */
6806 .balign 128
6807.L_op_rsub_int_lit8: /* 0xd9 */
6808/* File: arm/op_rsub_int_lit8.S */
6809/* File: arm/binopLit8.S */
6810 /*
6811 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6812 * that specifies an instruction that performs "result = r0 op r1".
6813 * This could be an ARM instruction or a function call. (If the result
6814 * comes back in a register other than r0, you can override "result".)
6815 *
6816 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6817 * vCC (r1). Useful for integer division and modulus.
6818 *
6819 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6820 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6821 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6822 */
6823 /* binop/lit8 vAA, vBB, #+CC */
6824 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6825 mov r9, rINST, lsr #8 @ r9<- AA
6826 and r2, r3, #255 @ r2<- BB
6827 GET_VREG r0, r2 @ r0<- vBB
6828 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6829 .if 0
6830 @cmp r1, #0 @ is second operand zero?
6831 beq common_errDivideByZero
6832 .endif
6833 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6834
6835 @ optional op; may set condition codes
6836 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6837 GET_INST_OPCODE ip @ extract opcode from rINST
6838 SET_VREG r0, r9 @ vAA<- r0
6839 GOTO_OPCODE ip @ jump to next instruction
6840 /* 10-12 instructions */
6841
6842
6843/* ------------------------------ */
6844 .balign 128
6845.L_op_mul_int_lit8: /* 0xda */
6846/* File: arm/op_mul_int_lit8.S */
6847/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6848/* File: arm/binopLit8.S */
6849 /*
6850 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6851 * that specifies an instruction that performs "result = r0 op r1".
6852 * This could be an ARM instruction or a function call. (If the result
6853 * comes back in a register other than r0, you can override "result".)
6854 *
6855 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6856 * vCC (r1). Useful for integer division and modulus.
6857 *
6858 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6859 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6860 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6861 */
6862 /* binop/lit8 vAA, vBB, #+CC */
6863 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6864 mov r9, rINST, lsr #8 @ r9<- AA
6865 and r2, r3, #255 @ r2<- BB
6866 GET_VREG r0, r2 @ r0<- vBB
6867 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6868 .if 0
6869 @cmp r1, #0 @ is second operand zero?
6870 beq common_errDivideByZero
6871 .endif
6872 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6873
6874 @ optional op; may set condition codes
6875 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6876 GET_INST_OPCODE ip @ extract opcode from rINST
6877 SET_VREG r0, r9 @ vAA<- r0
6878 GOTO_OPCODE ip @ jump to next instruction
6879 /* 10-12 instructions */
6880
6881
6882/* ------------------------------ */
6883 .balign 128
6884.L_op_div_int_lit8: /* 0xdb */
6885/* File: arm/op_div_int_lit8.S */
6886 /*
6887 * Specialized 32-bit binary operation
6888 *
6889 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6890 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6891 * ARMv7 CPUs that have hardware division support).
6892 *
6893 * div-int/lit8
6894 *
6895 */
6896 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6897 mov r9, rINST, lsr #8 @ r9<- AA
6898 and r2, r3, #255 @ r2<- BB
6899 GET_VREG r0, r2 @ r0<- vBB
6900 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6901 @cmp r1, #0 @ is second operand zero?
6902 beq common_errDivideByZero
6903 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6904
6905#ifdef __ARM_ARCH_EXT_IDIV__
6906 sdiv r0, r0, r1 @ r0<- op
6907#else
6908 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6909#endif
6910 GET_INST_OPCODE ip @ extract opcode from rINST
6911 SET_VREG r0, r9 @ vAA<- r0
6912 GOTO_OPCODE ip @ jump to next instruction
6913 /* 10-12 instructions */
6914
6915/* ------------------------------ */
6916 .balign 128
6917.L_op_rem_int_lit8: /* 0xdc */
6918/* File: arm/op_rem_int_lit8.S */
6919 /*
6920 * Specialized 32-bit binary operation
6921 *
6922 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6923 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6924 * ARMv7 CPUs that have hardware division support).
6925 *
6926 * NOTE: idivmod returns quotient in r0 and remainder in r1
6927 *
6928 * rem-int/lit8
6929 *
6930 */
6931 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
6932 mov r9, rINST, lsr #8 @ r9<- AA
6933 and r2, r3, #255 @ r2<- BB
6934 GET_VREG r0, r2 @ r0<- vBB
6935 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6936 @cmp r1, #0 @ is second operand zero?
6937 beq common_errDivideByZero
6938 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6939
6940#ifdef __ARM_ARCH_EXT_IDIV__
6941 sdiv r2, r0, r1
6942 mls r1, r1, r2, r0 @ r1<- op
6943#else
6944 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6945#endif
6946 GET_INST_OPCODE ip @ extract opcode from rINST
6947 SET_VREG r1, r9 @ vAA<- r1
6948 GOTO_OPCODE ip @ jump to next instruction
6949 /* 10-12 instructions */
6950
6951/* ------------------------------ */
6952 .balign 128
6953.L_op_and_int_lit8: /* 0xdd */
6954/* File: arm/op_and_int_lit8.S */
6955/* File: arm/binopLit8.S */
6956 /*
6957 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6958 * that specifies an instruction that performs "result = r0 op r1".
6959 * This could be an ARM instruction or a function call. (If the result
6960 * comes back in a register other than r0, you can override "result".)
6961 *
6962 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6963 * vCC (r1). Useful for integer division and modulus.
6964 *
6965 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6966 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6967 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6968 */
6969 /* binop/lit8 vAA, vBB, #+CC */
6970 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6971 mov r9, rINST, lsr #8 @ r9<- AA
6972 and r2, r3, #255 @ r2<- BB
6973 GET_VREG r0, r2 @ r0<- vBB
6974 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6975 .if 0
6976 @cmp r1, #0 @ is second operand zero?
6977 beq common_errDivideByZero
6978 .endif
6979 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6980
6981 @ optional op; may set condition codes
6982 and r0, r0, r1 @ r0<- op, r0-r3 changed
6983 GET_INST_OPCODE ip @ extract opcode from rINST
6984 SET_VREG r0, r9 @ vAA<- r0
6985 GOTO_OPCODE ip @ jump to next instruction
6986 /* 10-12 instructions */
6987
6988
6989/* ------------------------------ */
6990 .balign 128
6991.L_op_or_int_lit8: /* 0xde */
6992/* File: arm/op_or_int_lit8.S */
6993/* File: arm/binopLit8.S */
6994 /*
6995 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6996 * that specifies an instruction that performs "result = r0 op r1".
6997 * This could be an ARM instruction or a function call. (If the result
6998 * comes back in a register other than r0, you can override "result".)
6999 *
7000 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7001 * vCC (r1). Useful for integer division and modulus.
7002 *
7003 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7004 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7005 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7006 */
7007 /* binop/lit8 vAA, vBB, #+CC */
7008 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7009 mov r9, rINST, lsr #8 @ r9<- AA
7010 and r2, r3, #255 @ r2<- BB
7011 GET_VREG r0, r2 @ r0<- vBB
7012 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7013 .if 0
7014 @cmp r1, #0 @ is second operand zero?
7015 beq common_errDivideByZero
7016 .endif
7017 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7018
7019 @ optional op; may set condition codes
7020 orr r0, r0, r1 @ r0<- op, r0-r3 changed
7021 GET_INST_OPCODE ip @ extract opcode from rINST
7022 SET_VREG r0, r9 @ vAA<- r0
7023 GOTO_OPCODE ip @ jump to next instruction
7024 /* 10-12 instructions */
7025
7026
7027/* ------------------------------ */
7028 .balign 128
7029.L_op_xor_int_lit8: /* 0xdf */
7030/* File: arm/op_xor_int_lit8.S */
7031/* File: arm/binopLit8.S */
7032 /*
7033 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7034 * that specifies an instruction that performs "result = r0 op r1".
7035 * This could be an ARM instruction or a function call. (If the result
7036 * comes back in a register other than r0, you can override "result".)
7037 *
7038 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7039 * vCC (r1). Useful for integer division and modulus.
7040 *
7041 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7042 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7043 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7044 */
7045 /* binop/lit8 vAA, vBB, #+CC */
7046 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7047 mov r9, rINST, lsr #8 @ r9<- AA
7048 and r2, r3, #255 @ r2<- BB
7049 GET_VREG r0, r2 @ r0<- vBB
7050 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7051 .if 0
7052 @cmp r1, #0 @ is second operand zero?
7053 beq common_errDivideByZero
7054 .endif
7055 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7056
7057 @ optional op; may set condition codes
7058 eor r0, r0, r1 @ r0<- op, r0-r3 changed
7059 GET_INST_OPCODE ip @ extract opcode from rINST
7060 SET_VREG r0, r9 @ vAA<- r0
7061 GOTO_OPCODE ip @ jump to next instruction
7062 /* 10-12 instructions */
7063
7064
7065/* ------------------------------ */
7066 .balign 128
7067.L_op_shl_int_lit8: /* 0xe0 */
7068/* File: arm/op_shl_int_lit8.S */
7069/* File: arm/binopLit8.S */
7070 /*
7071 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7072 * that specifies an instruction that performs "result = r0 op r1".
7073 * This could be an ARM instruction or a function call. (If the result
7074 * comes back in a register other than r0, you can override "result".)
7075 *
7076 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7077 * vCC (r1). Useful for integer division and modulus.
7078 *
7079 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7080 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7081 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7082 */
7083 /* binop/lit8 vAA, vBB, #+CC */
7084 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7085 mov r9, rINST, lsr #8 @ r9<- AA
7086 and r2, r3, #255 @ r2<- BB
7087 GET_VREG r0, r2 @ r0<- vBB
7088 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7089 .if 0
7090 @cmp r1, #0 @ is second operand zero?
7091 beq common_errDivideByZero
7092 .endif
7093 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7094
7095 and r1, r1, #31 @ optional op; may set condition codes
7096 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
7097 GET_INST_OPCODE ip @ extract opcode from rINST
7098 SET_VREG r0, r9 @ vAA<- r0
7099 GOTO_OPCODE ip @ jump to next instruction
7100 /* 10-12 instructions */
7101
7102
7103/* ------------------------------ */
7104 .balign 128
7105.L_op_shr_int_lit8: /* 0xe1 */
7106/* File: arm/op_shr_int_lit8.S */
7107/* File: arm/binopLit8.S */
7108 /*
7109 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7110 * that specifies an instruction that performs "result = r0 op r1".
7111 * This could be an ARM instruction or a function call. (If the result
7112 * comes back in a register other than r0, you can override "result".)
7113 *
7114 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7115 * vCC (r1). Useful for integer division and modulus.
7116 *
7117 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7118 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7119 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7120 */
7121 /* binop/lit8 vAA, vBB, #+CC */
7122 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7123 mov r9, rINST, lsr #8 @ r9<- AA
7124 and r2, r3, #255 @ r2<- BB
7125 GET_VREG r0, r2 @ r0<- vBB
7126 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7127 .if 0
7128 @cmp r1, #0 @ is second operand zero?
7129 beq common_errDivideByZero
7130 .endif
7131 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7132
7133 and r1, r1, #31 @ optional op; may set condition codes
7134 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
7135 GET_INST_OPCODE ip @ extract opcode from rINST
7136 SET_VREG r0, r9 @ vAA<- r0
7137 GOTO_OPCODE ip @ jump to next instruction
7138 /* 10-12 instructions */
7139
7140
7141/* ------------------------------ */
7142 .balign 128
7143.L_op_ushr_int_lit8: /* 0xe2 */
7144/* File: arm/op_ushr_int_lit8.S */
7145/* File: arm/binopLit8.S */
7146 /*
7147 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7148 * that specifies an instruction that performs "result = r0 op r1".
7149 * This could be an ARM instruction or a function call. (If the result
7150 * comes back in a register other than r0, you can override "result".)
7151 *
7152 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7153 * vCC (r1). Useful for integer division and modulus.
7154 *
7155 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7156 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7157 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7158 */
7159 /* binop/lit8 vAA, vBB, #+CC */
7160 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7161 mov r9, rINST, lsr #8 @ r9<- AA
7162 and r2, r3, #255 @ r2<- BB
7163 GET_VREG r0, r2 @ r0<- vBB
7164 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7165 .if 0
7166 @cmp r1, #0 @ is second operand zero?
7167 beq common_errDivideByZero
7168 .endif
7169 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7170
7171 and r1, r1, #31 @ optional op; may set condition codes
7172 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
7173 GET_INST_OPCODE ip @ extract opcode from rINST
7174 SET_VREG r0, r9 @ vAA<- r0
7175 GOTO_OPCODE ip @ jump to next instruction
7176 /* 10-12 instructions */
7177
7178
7179/* ------------------------------ */
7180 .balign 128
7181.L_op_iget_quick: /* 0xe3 */
7182/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007183 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007184 /* op vA, vB, offset@CCCC */
7185 mov r2, rINST, lsr #12 @ r2<- B
7186 FETCH r1, 1 @ r1<- field byte offset
7187 GET_VREG r3, r2 @ r3<- object we're operating on
7188 ubfx r2, rINST, #8, #4 @ r2<- A
7189 cmp r3, #0 @ check object for null
7190 beq common_errNullObject @ object was null
7191 ldr r0, [r3, r1] @ r0<- obj.field
7192 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007193 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007194 GET_INST_OPCODE ip @ extract opcode from rINST
7195 GOTO_OPCODE ip @ jump to next instruction
7196
7197/* ------------------------------ */
7198 .balign 128
7199.L_op_iget_wide_quick: /* 0xe4 */
7200/* File: arm/op_iget_wide_quick.S */
7201 /* iget-wide-quick vA, vB, offset@CCCC */
7202 mov r2, rINST, lsr #12 @ r2<- B
7203 FETCH ip, 1 @ ip<- field byte offset
7204 GET_VREG r3, r2 @ r3<- object we're operating on
7205 ubfx r2, rINST, #8, #4 @ r2<- A
7206 cmp r3, #0 @ check object for null
7207 beq common_errNullObject @ object was null
7208 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
7209 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7210 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
buzbee50cf6002016-02-10 08:59:12 -08007211 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08007212 GET_INST_OPCODE ip @ extract opcode from rINST
7213 stmia r3, {r0-r1} @ fp[A]<- r0/r1
7214 GOTO_OPCODE ip @ jump to next instruction
7215
7216/* ------------------------------ */
7217 .balign 128
7218.L_op_iget_object_quick: /* 0xe5 */
7219/* File: arm/op_iget_object_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007220 /* For: iget-object-quick */
buzbee1452bee2015-03-06 14:43:04 -08007221 /* op vA, vB, offset@CCCC */
7222 mov r2, rINST, lsr #12 @ r2<- B
7223 FETCH r1, 1 @ r1<- field byte offset
buzbeebb6e7262016-01-14 05:34:34 -08007224 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -08007225 GET_VREG r0, r2 @ r0<- object we're operating on
buzbee76833da2016-01-13 13:06:22 -08007226 bl artIGetObjectFromMterp @ (obj, offset)
7227 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
7228 ubfx r2, rINST, #8, #4 @ r2<- A
7229 PREFETCH_INST 2
7230 cmp r3, #0
7231 bne MterpPossibleException @ bail out
buzbee1452bee2015-03-06 14:43:04 -08007232 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
buzbee76833da2016-01-13 13:06:22 -08007233 ADVANCE 2 @ advance rPC
buzbee1452bee2015-03-06 14:43:04 -08007234 GET_INST_OPCODE ip @ extract opcode from rINST
7235 GOTO_OPCODE ip @ jump to next instruction
7236
buzbee1452bee2015-03-06 14:43:04 -08007237/* ------------------------------ */
7238 .balign 128
7239.L_op_iput_quick: /* 0xe6 */
7240/* File: arm/op_iput_quick.S */
7241 /* For: iput-quick, iput-object-quick */
7242 /* op vA, vB, offset@CCCC */
7243 mov r2, rINST, lsr #12 @ r2<- B
7244 FETCH r1, 1 @ r1<- field byte offset
7245 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7246 ubfx r2, rINST, #8, #4 @ r2<- A
7247 cmp r3, #0 @ check object for null
7248 beq common_errNullObject @ object was null
7249 GET_VREG r0, r2 @ r0<- fp[A]
7250 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7251 str r0, [r3, r1] @ obj.field<- r0
7252 GET_INST_OPCODE ip @ extract opcode from rINST
7253 GOTO_OPCODE ip @ jump to next instruction
7254
7255/* ------------------------------ */
7256 .balign 128
7257.L_op_iput_wide_quick: /* 0xe7 */
7258/* File: arm/op_iput_wide_quick.S */
7259 /* iput-wide-quick vA, vB, offset@CCCC */
7260 mov r2, rINST, lsr #12 @ r2<- B
7261 FETCH r3, 1 @ r3<- field byte offset
7262 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7263 ubfx r0, rINST, #8, #4 @ r0<- A
7264 cmp r2, #0 @ check object for null
7265 beq common_errNullObject @ object was null
7266 add r0, rFP, r0, lsl #2 @ r0<- &fp[A]
7267 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7268 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7269 strd r0, [r2, r3] @ obj.field<- r0/r1
7270 GET_INST_OPCODE ip @ extract opcode from rINST
7271 GOTO_OPCODE ip @ jump to next instruction
7272
7273/* ------------------------------ */
7274 .balign 128
7275.L_op_iput_object_quick: /* 0xe8 */
7276/* File: arm/op_iput_object_quick.S */
7277 EXPORT_PC
7278 add r0, rFP, #OFF_FP_SHADOWFRAME
7279 mov r1, rPC
7280 mov r2, rINST
7281 bl MterpIputObjectQuick
7282 cmp r0, #0
7283 beq MterpException
7284 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7285 GET_INST_OPCODE ip @ extract opcode from rINST
7286 GOTO_OPCODE ip @ jump to next instruction
7287
7288/* ------------------------------ */
7289 .balign 128
7290.L_op_invoke_virtual_quick: /* 0xe9 */
7291/* File: arm/op_invoke_virtual_quick.S */
7292/* File: arm/invoke.S */
7293 /*
7294 * Generic invoke handler wrapper.
7295 */
7296 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7297 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7298 .extern MterpInvokeVirtualQuick
7299 EXPORT_PC
7300 mov r0, rSELF
7301 add r1, rFP, #OFF_FP_SHADOWFRAME
7302 mov r2, rPC
7303 mov r3, rINST
7304 bl MterpInvokeVirtualQuick
7305 cmp r0, #0
7306 beq MterpException
7307 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00007308 bl MterpShouldSwitchInterpreters
7309 cmp r0, #0
7310 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08007311 GET_INST_OPCODE ip
7312 GOTO_OPCODE ip
7313
7314
7315
7316/* ------------------------------ */
7317 .balign 128
7318.L_op_invoke_virtual_range_quick: /* 0xea */
7319/* File: arm/op_invoke_virtual_range_quick.S */
7320/* File: arm/invoke.S */
7321 /*
7322 * Generic invoke handler wrapper.
7323 */
7324 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7325 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7326 .extern MterpInvokeVirtualQuickRange
7327 EXPORT_PC
7328 mov r0, rSELF
7329 add r1, rFP, #OFF_FP_SHADOWFRAME
7330 mov r2, rPC
7331 mov r3, rINST
7332 bl MterpInvokeVirtualQuickRange
7333 cmp r0, #0
7334 beq MterpException
7335 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00007336 bl MterpShouldSwitchInterpreters
7337 cmp r0, #0
7338 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08007339 GET_INST_OPCODE ip
7340 GOTO_OPCODE ip
7341
7342
7343
7344/* ------------------------------ */
7345 .balign 128
7346.L_op_iput_boolean_quick: /* 0xeb */
7347/* File: arm/op_iput_boolean_quick.S */
7348/* File: arm/op_iput_quick.S */
7349 /* For: iput-quick, iput-object-quick */
7350 /* op vA, vB, offset@CCCC */
7351 mov r2, rINST, lsr #12 @ r2<- B
7352 FETCH r1, 1 @ r1<- field byte offset
7353 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7354 ubfx r2, rINST, #8, #4 @ r2<- A
7355 cmp r3, #0 @ check object for null
7356 beq common_errNullObject @ object was null
7357 GET_VREG r0, r2 @ r0<- fp[A]
7358 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7359 strb r0, [r3, r1] @ obj.field<- r0
7360 GET_INST_OPCODE ip @ extract opcode from rINST
7361 GOTO_OPCODE ip @ jump to next instruction
7362
7363
7364/* ------------------------------ */
7365 .balign 128
7366.L_op_iput_byte_quick: /* 0xec */
7367/* File: arm/op_iput_byte_quick.S */
7368/* File: arm/op_iput_quick.S */
7369 /* For: iput-quick, iput-object-quick */
7370 /* op vA, vB, offset@CCCC */
7371 mov r2, rINST, lsr #12 @ r2<- B
7372 FETCH r1, 1 @ r1<- field byte offset
7373 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7374 ubfx r2, rINST, #8, #4 @ r2<- A
7375 cmp r3, #0 @ check object for null
7376 beq common_errNullObject @ object was null
7377 GET_VREG r0, r2 @ r0<- fp[A]
7378 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7379 strb r0, [r3, r1] @ obj.field<- r0
7380 GET_INST_OPCODE ip @ extract opcode from rINST
7381 GOTO_OPCODE ip @ jump to next instruction
7382
7383
7384/* ------------------------------ */
7385 .balign 128
7386.L_op_iput_char_quick: /* 0xed */
7387/* File: arm/op_iput_char_quick.S */
7388/* File: arm/op_iput_quick.S */
7389 /* For: iput-quick, iput-object-quick */
7390 /* op vA, vB, offset@CCCC */
7391 mov r2, rINST, lsr #12 @ r2<- B
7392 FETCH r1, 1 @ r1<- field byte offset
7393 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7394 ubfx r2, rINST, #8, #4 @ r2<- A
7395 cmp r3, #0 @ check object for null
7396 beq common_errNullObject @ object was null
7397 GET_VREG r0, r2 @ r0<- fp[A]
7398 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7399 strh r0, [r3, r1] @ obj.field<- r0
7400 GET_INST_OPCODE ip @ extract opcode from rINST
7401 GOTO_OPCODE ip @ jump to next instruction
7402
7403
7404/* ------------------------------ */
7405 .balign 128
7406.L_op_iput_short_quick: /* 0xee */
7407/* File: arm/op_iput_short_quick.S */
7408/* File: arm/op_iput_quick.S */
7409 /* For: iput-quick, iput-object-quick */
7410 /* op vA, vB, offset@CCCC */
7411 mov r2, rINST, lsr #12 @ r2<- B
7412 FETCH r1, 1 @ r1<- field byte offset
7413 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7414 ubfx r2, rINST, #8, #4 @ r2<- A
7415 cmp r3, #0 @ check object for null
7416 beq common_errNullObject @ object was null
7417 GET_VREG r0, r2 @ r0<- fp[A]
7418 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7419 strh r0, [r3, r1] @ obj.field<- r0
7420 GET_INST_OPCODE ip @ extract opcode from rINST
7421 GOTO_OPCODE ip @ jump to next instruction
7422
7423
7424/* ------------------------------ */
7425 .balign 128
7426.L_op_iget_boolean_quick: /* 0xef */
7427/* File: arm/op_iget_boolean_quick.S */
7428/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007429 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007430 /* op vA, vB, offset@CCCC */
7431 mov r2, rINST, lsr #12 @ r2<- B
7432 FETCH r1, 1 @ r1<- field byte offset
7433 GET_VREG r3, r2 @ r3<- object we're operating on
7434 ubfx r2, rINST, #8, #4 @ r2<- A
7435 cmp r3, #0 @ check object for null
7436 beq common_errNullObject @ object was null
7437 ldrb r0, [r3, r1] @ r0<- obj.field
7438 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007439 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007440 GET_INST_OPCODE ip @ extract opcode from rINST
7441 GOTO_OPCODE ip @ jump to next instruction
7442
7443
7444/* ------------------------------ */
7445 .balign 128
7446.L_op_iget_byte_quick: /* 0xf0 */
7447/* File: arm/op_iget_byte_quick.S */
7448/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007449 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007450 /* op vA, vB, offset@CCCC */
7451 mov r2, rINST, lsr #12 @ r2<- B
7452 FETCH r1, 1 @ r1<- field byte offset
7453 GET_VREG r3, r2 @ r3<- object we're operating on
7454 ubfx r2, rINST, #8, #4 @ r2<- A
7455 cmp r3, #0 @ check object for null
7456 beq common_errNullObject @ object was null
7457 ldrsb r0, [r3, r1] @ r0<- obj.field
7458 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007459 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007460 GET_INST_OPCODE ip @ extract opcode from rINST
7461 GOTO_OPCODE ip @ jump to next instruction
7462
7463
7464/* ------------------------------ */
7465 .balign 128
7466.L_op_iget_char_quick: /* 0xf1 */
7467/* File: arm/op_iget_char_quick.S */
7468/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007469 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007470 /* op vA, vB, offset@CCCC */
7471 mov r2, rINST, lsr #12 @ r2<- B
7472 FETCH r1, 1 @ r1<- field byte offset
7473 GET_VREG r3, r2 @ r3<- object we're operating on
7474 ubfx r2, rINST, #8, #4 @ r2<- A
7475 cmp r3, #0 @ check object for null
7476 beq common_errNullObject @ object was null
7477 ldrh r0, [r3, r1] @ r0<- obj.field
7478 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007479 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007480 GET_INST_OPCODE ip @ extract opcode from rINST
7481 GOTO_OPCODE ip @ jump to next instruction
7482
7483
7484/* ------------------------------ */
7485 .balign 128
7486.L_op_iget_short_quick: /* 0xf2 */
7487/* File: arm/op_iget_short_quick.S */
7488/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007489 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007490 /* op vA, vB, offset@CCCC */
7491 mov r2, rINST, lsr #12 @ r2<- B
7492 FETCH r1, 1 @ r1<- field byte offset
7493 GET_VREG r3, r2 @ r3<- object we're operating on
7494 ubfx r2, rINST, #8, #4 @ r2<- A
7495 cmp r3, #0 @ check object for null
7496 beq common_errNullObject @ object was null
7497 ldrsh r0, [r3, r1] @ r0<- obj.field
7498 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007499 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007500 GET_INST_OPCODE ip @ extract opcode from rINST
7501 GOTO_OPCODE ip @ jump to next instruction
7502
7503
7504/* ------------------------------ */
7505 .balign 128
7506.L_op_invoke_lambda: /* 0xf3 */
7507/* Transfer stub to alternate interpreter */
7508 b MterpFallback
7509
7510
7511/* ------------------------------ */
7512 .balign 128
7513.L_op_unused_f4: /* 0xf4 */
7514/* File: arm/op_unused_f4.S */
7515/* File: arm/unused.S */
7516/*
7517 * Bail to reference interpreter to throw.
7518 */
7519 b MterpFallback
7520
7521
7522/* ------------------------------ */
7523 .balign 128
7524.L_op_capture_variable: /* 0xf5 */
7525/* Transfer stub to alternate interpreter */
7526 b MterpFallback
7527
7528
7529/* ------------------------------ */
7530 .balign 128
7531.L_op_create_lambda: /* 0xf6 */
7532/* Transfer stub to alternate interpreter */
7533 b MterpFallback
7534
7535
7536/* ------------------------------ */
7537 .balign 128
7538.L_op_liberate_variable: /* 0xf7 */
7539/* Transfer stub to alternate interpreter */
7540 b MterpFallback
7541
7542
7543/* ------------------------------ */
7544 .balign 128
7545.L_op_box_lambda: /* 0xf8 */
7546/* Transfer stub to alternate interpreter */
7547 b MterpFallback
7548
7549
7550/* ------------------------------ */
7551 .balign 128
7552.L_op_unbox_lambda: /* 0xf9 */
7553/* Transfer stub to alternate interpreter */
7554 b MterpFallback
7555
7556
7557/* ------------------------------ */
7558 .balign 128
7559.L_op_unused_fa: /* 0xfa */
7560/* File: arm/op_unused_fa.S */
7561/* File: arm/unused.S */
7562/*
7563 * Bail to reference interpreter to throw.
7564 */
7565 b MterpFallback
7566
7567
7568/* ------------------------------ */
7569 .balign 128
7570.L_op_unused_fb: /* 0xfb */
7571/* File: arm/op_unused_fb.S */
7572/* File: arm/unused.S */
7573/*
7574 * Bail to reference interpreter to throw.
7575 */
7576 b MterpFallback
7577
7578
7579/* ------------------------------ */
7580 .balign 128
7581.L_op_unused_fc: /* 0xfc */
7582/* File: arm/op_unused_fc.S */
7583/* File: arm/unused.S */
7584/*
7585 * Bail to reference interpreter to throw.
7586 */
7587 b MterpFallback
7588
7589
7590/* ------------------------------ */
7591 .balign 128
7592.L_op_unused_fd: /* 0xfd */
7593/* File: arm/op_unused_fd.S */
7594/* File: arm/unused.S */
7595/*
7596 * Bail to reference interpreter to throw.
7597 */
7598 b MterpFallback
7599
7600
7601/* ------------------------------ */
7602 .balign 128
7603.L_op_unused_fe: /* 0xfe */
7604/* File: arm/op_unused_fe.S */
7605/* File: arm/unused.S */
7606/*
7607 * Bail to reference interpreter to throw.
7608 */
7609 b MterpFallback
7610
7611
7612/* ------------------------------ */
7613 .balign 128
7614.L_op_unused_ff: /* 0xff */
7615/* File: arm/op_unused_ff.S */
7616/* File: arm/unused.S */
7617/*
7618 * Bail to reference interpreter to throw.
7619 */
7620 b MterpFallback
7621
7622
7623 .balign 128
7624 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7625 .global artMterpAsmInstructionEnd
7626artMterpAsmInstructionEnd:
7627
7628/*
7629 * ===========================================================================
7630 * Sister implementations
7631 * ===========================================================================
7632 */
7633 .global artMterpAsmSisterStart
7634 .type artMterpAsmSisterStart, %function
7635 .text
7636 .balign 4
7637artMterpAsmSisterStart:
7638
7639/* continuation for op_cmp_long */
7640
7641.Lop_cmp_long_less:
7642 mvn r1, #0 @ r1<- -1
7643 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7644 @ instead, we just replicate the tail end.
7645 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7646 SET_VREG r1, r9 @ vAA<- r1
7647 GET_INST_OPCODE ip @ extract opcode from rINST
7648 GOTO_OPCODE ip @ jump to next instruction
7649
7650.Lop_cmp_long_greater:
7651 mov r1, #1 @ r1<- 1
7652 @ fall through to _finish
7653
7654.Lop_cmp_long_finish:
7655 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7656 SET_VREG r1, r9 @ vAA<- r1
7657 GET_INST_OPCODE ip @ extract opcode from rINST
7658 GOTO_OPCODE ip @ jump to next instruction
7659
7660/* continuation for op_float_to_long */
7661/*
7662 * Convert the float in r0 to a long in r0/r1.
7663 *
7664 * We have to clip values to long min/max per the specification. The
7665 * expected common case is a "reasonable" value that converts directly
7666 * to modest integer. The EABI convert function isn't doing this for us.
7667 */
7668f2l_doconv:
7669 stmfd sp!, {r4, lr}
7670 mov r1, #0x5f000000 @ (float)maxlong
7671 mov r4, r0
7672 bl __aeabi_fcmpge @ is arg >= maxlong?
7673 cmp r0, #0 @ nonzero == yes
7674 mvnne r0, #0 @ return maxlong (7fffffff)
7675 mvnne r1, #0x80000000
buzbee96530d32016-03-04 08:03:51 -08007676 popne {r4, pc}
buzbee1452bee2015-03-06 14:43:04 -08007677
7678 mov r0, r4 @ recover arg
7679 mov r1, #0xdf000000 @ (float)minlong
7680 bl __aeabi_fcmple @ is arg <= minlong?
7681 cmp r0, #0 @ nonzero == yes
7682 movne r0, #0 @ return minlong (80000000)
7683 movne r1, #0x80000000
buzbee96530d32016-03-04 08:03:51 -08007684 popne {r4, pc}
buzbee1452bee2015-03-06 14:43:04 -08007685
7686 mov r0, r4 @ recover arg
7687 mov r1, r4
7688 bl __aeabi_fcmpeq @ is arg == self?
7689 cmp r0, #0 @ zero == no
7690 moveq r1, #0 @ return zero for NaN
buzbee96530d32016-03-04 08:03:51 -08007691 popeq {r4, pc}
buzbee1452bee2015-03-06 14:43:04 -08007692
7693 mov r0, r4 @ recover arg
7694 bl __aeabi_f2lz @ convert float to long
7695 ldmfd sp!, {r4, pc}
7696
7697/* continuation for op_double_to_long */
7698/*
7699 * Convert the double in r0/r1 to a long in r0/r1.
7700 *
7701 * We have to clip values to long min/max per the specification. The
7702 * expected common case is a "reasonable" value that converts directly
7703 * to modest integer. The EABI convert function isn't doing this for us.
7704 */
7705d2l_doconv:
7706 stmfd sp!, {r4, r5, lr} @ save regs
7707 mov r3, #0x43000000 @ maxlong, as a double (high word)
7708 add r3, #0x00e00000 @ 0x43e00000
7709 mov r2, #0 @ maxlong, as a double (low word)
7710 sub sp, sp, #4 @ align for EABI
7711 mov r4, r0 @ save a copy of r0
7712 mov r5, r1 @ and r1
7713 bl __aeabi_dcmpge @ is arg >= maxlong?
7714 cmp r0, #0 @ nonzero == yes
7715 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7716 mvnne r1, #0x80000000
7717 bne 1f
7718
7719 mov r0, r4 @ recover arg
7720 mov r1, r5
7721 mov r3, #0xc3000000 @ minlong, as a double (high word)
7722 add r3, #0x00e00000 @ 0xc3e00000
7723 mov r2, #0 @ minlong, as a double (low word)
7724 bl __aeabi_dcmple @ is arg <= minlong?
7725 cmp r0, #0 @ nonzero == yes
7726 movne r0, #0 @ return minlong (8000000000000000)
7727 movne r1, #0x80000000
7728 bne 1f
7729
7730 mov r0, r4 @ recover arg
7731 mov r1, r5
7732 mov r2, r4 @ compare against self
7733 mov r3, r5
7734 bl __aeabi_dcmpeq @ is arg == self?
7735 cmp r0, #0 @ zero == no
7736 moveq r1, #0 @ return zero for NaN
7737 beq 1f
7738
7739 mov r0, r4 @ recover arg
7740 mov r1, r5
7741 bl __aeabi_d2lz @ convert double to long
7742
77431:
7744 add sp, sp, #4
7745 ldmfd sp!, {r4, r5, pc}
7746
7747 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7748 .global artMterpAsmSisterEnd
7749artMterpAsmSisterEnd:
7750
7751
7752 .global artMterpAsmAltInstructionStart
7753 .type artMterpAsmAltInstructionStart, %function
7754 .text
7755
7756artMterpAsmAltInstructionStart = .L_ALT_op_nop
7757/* ------------------------------ */
7758 .balign 128
7759.L_ALT_op_nop: /* 0x00 */
7760/* File: arm/alt_stub.S */
7761/*
7762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7763 * any interesting requests and then jump to the real instruction
7764 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7765 */
7766 .extern MterpCheckBefore
7767 EXPORT_PC
7768 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7769 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7770 mov r0, rSELF
7771 add r1, rFP, #OFF_FP_SHADOWFRAME
7772 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7773
7774/* ------------------------------ */
7775 .balign 128
7776.L_ALT_op_move: /* 0x01 */
7777/* File: arm/alt_stub.S */
7778/*
7779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7780 * any interesting requests and then jump to the real instruction
7781 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7782 */
7783 .extern MterpCheckBefore
7784 EXPORT_PC
7785 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7786 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7787 mov r0, rSELF
7788 add r1, rFP, #OFF_FP_SHADOWFRAME
7789 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7790
7791/* ------------------------------ */
7792 .balign 128
7793.L_ALT_op_move_from16: /* 0x02 */
7794/* File: arm/alt_stub.S */
7795/*
7796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7797 * any interesting requests and then jump to the real instruction
7798 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7799 */
7800 .extern MterpCheckBefore
7801 EXPORT_PC
7802 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7803 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7804 mov r0, rSELF
7805 add r1, rFP, #OFF_FP_SHADOWFRAME
7806 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7807
7808/* ------------------------------ */
7809 .balign 128
7810.L_ALT_op_move_16: /* 0x03 */
7811/* File: arm/alt_stub.S */
7812/*
7813 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7814 * any interesting requests and then jump to the real instruction
7815 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7816 */
7817 .extern MterpCheckBefore
7818 EXPORT_PC
7819 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7820 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
7821 mov r0, rSELF
7822 add r1, rFP, #OFF_FP_SHADOWFRAME
7823 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7824
7825/* ------------------------------ */
7826 .balign 128
7827.L_ALT_op_move_wide: /* 0x04 */
7828/* File: arm/alt_stub.S */
7829/*
7830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7831 * any interesting requests and then jump to the real instruction
7832 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7833 */
7834 .extern MterpCheckBefore
7835 EXPORT_PC
7836 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7837 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
7838 mov r0, rSELF
7839 add r1, rFP, #OFF_FP_SHADOWFRAME
7840 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7841
7842/* ------------------------------ */
7843 .balign 128
7844.L_ALT_op_move_wide_from16: /* 0x05 */
7845/* File: arm/alt_stub.S */
7846/*
7847 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7848 * any interesting requests and then jump to the real instruction
7849 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7850 */
7851 .extern MterpCheckBefore
7852 EXPORT_PC
7853 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7854 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
7855 mov r0, rSELF
7856 add r1, rFP, #OFF_FP_SHADOWFRAME
7857 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7858
7859/* ------------------------------ */
7860 .balign 128
7861.L_ALT_op_move_wide_16: /* 0x06 */
7862/* File: arm/alt_stub.S */
7863/*
7864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7865 * any interesting requests and then jump to the real instruction
7866 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7867 */
7868 .extern MterpCheckBefore
7869 EXPORT_PC
7870 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7871 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
7872 mov r0, rSELF
7873 add r1, rFP, #OFF_FP_SHADOWFRAME
7874 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7875
7876/* ------------------------------ */
7877 .balign 128
7878.L_ALT_op_move_object: /* 0x07 */
7879/* File: arm/alt_stub.S */
7880/*
7881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7882 * any interesting requests and then jump to the real instruction
7883 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7884 */
7885 .extern MterpCheckBefore
7886 EXPORT_PC
7887 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7888 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
7889 mov r0, rSELF
7890 add r1, rFP, #OFF_FP_SHADOWFRAME
7891 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7892
7893/* ------------------------------ */
7894 .balign 128
7895.L_ALT_op_move_object_from16: /* 0x08 */
7896/* File: arm/alt_stub.S */
7897/*
7898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7899 * any interesting requests and then jump to the real instruction
7900 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7901 */
7902 .extern MterpCheckBefore
7903 EXPORT_PC
7904 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7905 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
7906 mov r0, rSELF
7907 add r1, rFP, #OFF_FP_SHADOWFRAME
7908 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7909
7910/* ------------------------------ */
7911 .balign 128
7912.L_ALT_op_move_object_16: /* 0x09 */
7913/* File: arm/alt_stub.S */
7914/*
7915 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7916 * any interesting requests and then jump to the real instruction
7917 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7918 */
7919 .extern MterpCheckBefore
7920 EXPORT_PC
7921 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7922 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
7923 mov r0, rSELF
7924 add r1, rFP, #OFF_FP_SHADOWFRAME
7925 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7926
7927/* ------------------------------ */
7928 .balign 128
7929.L_ALT_op_move_result: /* 0x0a */
7930/* File: arm/alt_stub.S */
7931/*
7932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7933 * any interesting requests and then jump to the real instruction
7934 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7935 */
7936 .extern MterpCheckBefore
7937 EXPORT_PC
7938 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7939 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
7940 mov r0, rSELF
7941 add r1, rFP, #OFF_FP_SHADOWFRAME
7942 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7943
7944/* ------------------------------ */
7945 .balign 128
7946.L_ALT_op_move_result_wide: /* 0x0b */
7947/* File: arm/alt_stub.S */
7948/*
7949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7950 * any interesting requests and then jump to the real instruction
7951 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7952 */
7953 .extern MterpCheckBefore
7954 EXPORT_PC
7955 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7956 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
7957 mov r0, rSELF
7958 add r1, rFP, #OFF_FP_SHADOWFRAME
7959 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7960
7961/* ------------------------------ */
7962 .balign 128
7963.L_ALT_op_move_result_object: /* 0x0c */
7964/* File: arm/alt_stub.S */
7965/*
7966 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7967 * any interesting requests and then jump to the real instruction
7968 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7969 */
7970 .extern MterpCheckBefore
7971 EXPORT_PC
7972 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7973 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
7974 mov r0, rSELF
7975 add r1, rFP, #OFF_FP_SHADOWFRAME
7976 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7977
7978/* ------------------------------ */
7979 .balign 128
7980.L_ALT_op_move_exception: /* 0x0d */
7981/* File: arm/alt_stub.S */
7982/*
7983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7984 * any interesting requests and then jump to the real instruction
7985 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7986 */
7987 .extern MterpCheckBefore
7988 EXPORT_PC
7989 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7990 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
7991 mov r0, rSELF
7992 add r1, rFP, #OFF_FP_SHADOWFRAME
7993 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7994
7995/* ------------------------------ */
7996 .balign 128
7997.L_ALT_op_return_void: /* 0x0e */
7998/* File: arm/alt_stub.S */
7999/*
8000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8001 * any interesting requests and then jump to the real instruction
8002 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8003 */
8004 .extern MterpCheckBefore
8005 EXPORT_PC
8006 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8007 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
8008 mov r0, rSELF
8009 add r1, rFP, #OFF_FP_SHADOWFRAME
8010 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8011
8012/* ------------------------------ */
8013 .balign 128
8014.L_ALT_op_return: /* 0x0f */
8015/* File: arm/alt_stub.S */
8016/*
8017 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8018 * any interesting requests and then jump to the real instruction
8019 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8020 */
8021 .extern MterpCheckBefore
8022 EXPORT_PC
8023 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8024 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
8025 mov r0, rSELF
8026 add r1, rFP, #OFF_FP_SHADOWFRAME
8027 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8028
8029/* ------------------------------ */
8030 .balign 128
8031.L_ALT_op_return_wide: /* 0x10 */
8032/* File: arm/alt_stub.S */
8033/*
8034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8035 * any interesting requests and then jump to the real instruction
8036 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8037 */
8038 .extern MterpCheckBefore
8039 EXPORT_PC
8040 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8041 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
8042 mov r0, rSELF
8043 add r1, rFP, #OFF_FP_SHADOWFRAME
8044 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8045
8046/* ------------------------------ */
8047 .balign 128
8048.L_ALT_op_return_object: /* 0x11 */
8049/* File: arm/alt_stub.S */
8050/*
8051 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8052 * any interesting requests and then jump to the real instruction
8053 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8054 */
8055 .extern MterpCheckBefore
8056 EXPORT_PC
8057 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8058 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
8059 mov r0, rSELF
8060 add r1, rFP, #OFF_FP_SHADOWFRAME
8061 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8062
8063/* ------------------------------ */
8064 .balign 128
8065.L_ALT_op_const_4: /* 0x12 */
8066/* File: arm/alt_stub.S */
8067/*
8068 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8069 * any interesting requests and then jump to the real instruction
8070 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8071 */
8072 .extern MterpCheckBefore
8073 EXPORT_PC
8074 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8075 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
8076 mov r0, rSELF
8077 add r1, rFP, #OFF_FP_SHADOWFRAME
8078 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8079
8080/* ------------------------------ */
8081 .balign 128
8082.L_ALT_op_const_16: /* 0x13 */
8083/* File: arm/alt_stub.S */
8084/*
8085 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8086 * any interesting requests and then jump to the real instruction
8087 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8088 */
8089 .extern MterpCheckBefore
8090 EXPORT_PC
8091 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8092 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8093 mov r0, rSELF
8094 add r1, rFP, #OFF_FP_SHADOWFRAME
8095 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8096
8097/* ------------------------------ */
8098 .balign 128
8099.L_ALT_op_const: /* 0x14 */
8100/* File: arm/alt_stub.S */
8101/*
8102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8103 * any interesting requests and then jump to the real instruction
8104 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8105 */
8106 .extern MterpCheckBefore
8107 EXPORT_PC
8108 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8109 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8110 mov r0, rSELF
8111 add r1, rFP, #OFF_FP_SHADOWFRAME
8112 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8113
8114/* ------------------------------ */
8115 .balign 128
8116.L_ALT_op_const_high16: /* 0x15 */
8117/* File: arm/alt_stub.S */
8118/*
8119 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8120 * any interesting requests and then jump to the real instruction
8121 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8122 */
8123 .extern MterpCheckBefore
8124 EXPORT_PC
8125 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8126 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8127 mov r0, rSELF
8128 add r1, rFP, #OFF_FP_SHADOWFRAME
8129 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8130
8131/* ------------------------------ */
8132 .balign 128
8133.L_ALT_op_const_wide_16: /* 0x16 */
8134/* File: arm/alt_stub.S */
8135/*
8136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8137 * any interesting requests and then jump to the real instruction
8138 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8139 */
8140 .extern MterpCheckBefore
8141 EXPORT_PC
8142 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8143 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8144 mov r0, rSELF
8145 add r1, rFP, #OFF_FP_SHADOWFRAME
8146 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8147
8148/* ------------------------------ */
8149 .balign 128
8150.L_ALT_op_const_wide_32: /* 0x17 */
8151/* File: arm/alt_stub.S */
8152/*
8153 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8154 * any interesting requests and then jump to the real instruction
8155 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8156 */
8157 .extern MterpCheckBefore
8158 EXPORT_PC
8159 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8160 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8161 mov r0, rSELF
8162 add r1, rFP, #OFF_FP_SHADOWFRAME
8163 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8164
8165/* ------------------------------ */
8166 .balign 128
8167.L_ALT_op_const_wide: /* 0x18 */
8168/* File: arm/alt_stub.S */
8169/*
8170 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8171 * any interesting requests and then jump to the real instruction
8172 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8173 */
8174 .extern MterpCheckBefore
8175 EXPORT_PC
8176 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8177 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8178 mov r0, rSELF
8179 add r1, rFP, #OFF_FP_SHADOWFRAME
8180 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8181
8182/* ------------------------------ */
8183 .balign 128
8184.L_ALT_op_const_wide_high16: /* 0x19 */
8185/* File: arm/alt_stub.S */
8186/*
8187 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8188 * any interesting requests and then jump to the real instruction
8189 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8190 */
8191 .extern MterpCheckBefore
8192 EXPORT_PC
8193 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8194 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8195 mov r0, rSELF
8196 add r1, rFP, #OFF_FP_SHADOWFRAME
8197 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8198
8199/* ------------------------------ */
8200 .balign 128
8201.L_ALT_op_const_string: /* 0x1a */
8202/* File: arm/alt_stub.S */
8203/*
8204 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8205 * any interesting requests and then jump to the real instruction
8206 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8207 */
8208 .extern MterpCheckBefore
8209 EXPORT_PC
8210 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8211 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8212 mov r0, rSELF
8213 add r1, rFP, #OFF_FP_SHADOWFRAME
8214 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8215
8216/* ------------------------------ */
8217 .balign 128
8218.L_ALT_op_const_string_jumbo: /* 0x1b */
8219/* File: arm/alt_stub.S */
8220/*
8221 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8222 * any interesting requests and then jump to the real instruction
8223 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8224 */
8225 .extern MterpCheckBefore
8226 EXPORT_PC
8227 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8228 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8229 mov r0, rSELF
8230 add r1, rFP, #OFF_FP_SHADOWFRAME
8231 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8232
8233/* ------------------------------ */
8234 .balign 128
8235.L_ALT_op_const_class: /* 0x1c */
8236/* File: arm/alt_stub.S */
8237/*
8238 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8239 * any interesting requests and then jump to the real instruction
8240 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8241 */
8242 .extern MterpCheckBefore
8243 EXPORT_PC
8244 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8245 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8246 mov r0, rSELF
8247 add r1, rFP, #OFF_FP_SHADOWFRAME
8248 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8249
8250/* ------------------------------ */
8251 .balign 128
8252.L_ALT_op_monitor_enter: /* 0x1d */
8253/* File: arm/alt_stub.S */
8254/*
8255 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8256 * any interesting requests and then jump to the real instruction
8257 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8258 */
8259 .extern MterpCheckBefore
8260 EXPORT_PC
8261 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8262 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8263 mov r0, rSELF
8264 add r1, rFP, #OFF_FP_SHADOWFRAME
8265 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8266
8267/* ------------------------------ */
8268 .balign 128
8269.L_ALT_op_monitor_exit: /* 0x1e */
8270/* File: arm/alt_stub.S */
8271/*
8272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8273 * any interesting requests and then jump to the real instruction
8274 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8275 */
8276 .extern MterpCheckBefore
8277 EXPORT_PC
8278 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8279 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8280 mov r0, rSELF
8281 add r1, rFP, #OFF_FP_SHADOWFRAME
8282 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8283
8284/* ------------------------------ */
8285 .balign 128
8286.L_ALT_op_check_cast: /* 0x1f */
8287/* File: arm/alt_stub.S */
8288/*
8289 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8290 * any interesting requests and then jump to the real instruction
8291 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8292 */
8293 .extern MterpCheckBefore
8294 EXPORT_PC
8295 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8296 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8297 mov r0, rSELF
8298 add r1, rFP, #OFF_FP_SHADOWFRAME
8299 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8300
8301/* ------------------------------ */
8302 .balign 128
8303.L_ALT_op_instance_of: /* 0x20 */
8304/* File: arm/alt_stub.S */
8305/*
8306 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8307 * any interesting requests and then jump to the real instruction
8308 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8309 */
8310 .extern MterpCheckBefore
8311 EXPORT_PC
8312 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8313 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8314 mov r0, rSELF
8315 add r1, rFP, #OFF_FP_SHADOWFRAME
8316 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8317
8318/* ------------------------------ */
8319 .balign 128
8320.L_ALT_op_array_length: /* 0x21 */
8321/* File: arm/alt_stub.S */
8322/*
8323 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8324 * any interesting requests and then jump to the real instruction
8325 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8326 */
8327 .extern MterpCheckBefore
8328 EXPORT_PC
8329 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8330 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8331 mov r0, rSELF
8332 add r1, rFP, #OFF_FP_SHADOWFRAME
8333 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8334
8335/* ------------------------------ */
8336 .balign 128
8337.L_ALT_op_new_instance: /* 0x22 */
8338/* File: arm/alt_stub.S */
8339/*
8340 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8341 * any interesting requests and then jump to the real instruction
8342 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8343 */
8344 .extern MterpCheckBefore
8345 EXPORT_PC
8346 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8347 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8348 mov r0, rSELF
8349 add r1, rFP, #OFF_FP_SHADOWFRAME
8350 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8351
8352/* ------------------------------ */
8353 .balign 128
8354.L_ALT_op_new_array: /* 0x23 */
8355/* File: arm/alt_stub.S */
8356/*
8357 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8358 * any interesting requests and then jump to the real instruction
8359 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8360 */
8361 .extern MterpCheckBefore
8362 EXPORT_PC
8363 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8364 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8365 mov r0, rSELF
8366 add r1, rFP, #OFF_FP_SHADOWFRAME
8367 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8368
8369/* ------------------------------ */
8370 .balign 128
8371.L_ALT_op_filled_new_array: /* 0x24 */
8372/* File: arm/alt_stub.S */
8373/*
8374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8375 * any interesting requests and then jump to the real instruction
8376 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8377 */
8378 .extern MterpCheckBefore
8379 EXPORT_PC
8380 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8381 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8382 mov r0, rSELF
8383 add r1, rFP, #OFF_FP_SHADOWFRAME
8384 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8385
8386/* ------------------------------ */
8387 .balign 128
8388.L_ALT_op_filled_new_array_range: /* 0x25 */
8389/* File: arm/alt_stub.S */
8390/*
8391 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8392 * any interesting requests and then jump to the real instruction
8393 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8394 */
8395 .extern MterpCheckBefore
8396 EXPORT_PC
8397 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8398 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8399 mov r0, rSELF
8400 add r1, rFP, #OFF_FP_SHADOWFRAME
8401 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8402
8403/* ------------------------------ */
8404 .balign 128
8405.L_ALT_op_fill_array_data: /* 0x26 */
8406/* File: arm/alt_stub.S */
8407/*
8408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8409 * any interesting requests and then jump to the real instruction
8410 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8411 */
8412 .extern MterpCheckBefore
8413 EXPORT_PC
8414 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8415 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8416 mov r0, rSELF
8417 add r1, rFP, #OFF_FP_SHADOWFRAME
8418 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8419
8420/* ------------------------------ */
8421 .balign 128
8422.L_ALT_op_throw: /* 0x27 */
8423/* File: arm/alt_stub.S */
8424/*
8425 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8426 * any interesting requests and then jump to the real instruction
8427 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8428 */
8429 .extern MterpCheckBefore
8430 EXPORT_PC
8431 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8432 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8433 mov r0, rSELF
8434 add r1, rFP, #OFF_FP_SHADOWFRAME
8435 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8436
8437/* ------------------------------ */
8438 .balign 128
8439.L_ALT_op_goto: /* 0x28 */
8440/* File: arm/alt_stub.S */
8441/*
8442 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8443 * any interesting requests and then jump to the real instruction
8444 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8445 */
8446 .extern MterpCheckBefore
8447 EXPORT_PC
8448 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8449 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8450 mov r0, rSELF
8451 add r1, rFP, #OFF_FP_SHADOWFRAME
8452 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8453
8454/* ------------------------------ */
8455 .balign 128
8456.L_ALT_op_goto_16: /* 0x29 */
8457/* File: arm/alt_stub.S */
8458/*
8459 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8460 * any interesting requests and then jump to the real instruction
8461 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8462 */
8463 .extern MterpCheckBefore
8464 EXPORT_PC
8465 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8466 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8467 mov r0, rSELF
8468 add r1, rFP, #OFF_FP_SHADOWFRAME
8469 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8470
8471/* ------------------------------ */
8472 .balign 128
8473.L_ALT_op_goto_32: /* 0x2a */
8474/* File: arm/alt_stub.S */
8475/*
8476 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8477 * any interesting requests and then jump to the real instruction
8478 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8479 */
8480 .extern MterpCheckBefore
8481 EXPORT_PC
8482 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8483 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8484 mov r0, rSELF
8485 add r1, rFP, #OFF_FP_SHADOWFRAME
8486 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8487
8488/* ------------------------------ */
8489 .balign 128
8490.L_ALT_op_packed_switch: /* 0x2b */
8491/* File: arm/alt_stub.S */
8492/*
8493 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8494 * any interesting requests and then jump to the real instruction
8495 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8496 */
8497 .extern MterpCheckBefore
8498 EXPORT_PC
8499 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8500 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8501 mov r0, rSELF
8502 add r1, rFP, #OFF_FP_SHADOWFRAME
8503 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8504
8505/* ------------------------------ */
8506 .balign 128
8507.L_ALT_op_sparse_switch: /* 0x2c */
8508/* File: arm/alt_stub.S */
8509/*
8510 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8511 * any interesting requests and then jump to the real instruction
8512 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8513 */
8514 .extern MterpCheckBefore
8515 EXPORT_PC
8516 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8517 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8518 mov r0, rSELF
8519 add r1, rFP, #OFF_FP_SHADOWFRAME
8520 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8521
8522/* ------------------------------ */
8523 .balign 128
8524.L_ALT_op_cmpl_float: /* 0x2d */
8525/* File: arm/alt_stub.S */
8526/*
8527 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8528 * any interesting requests and then jump to the real instruction
8529 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8530 */
8531 .extern MterpCheckBefore
8532 EXPORT_PC
8533 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8534 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8535 mov r0, rSELF
8536 add r1, rFP, #OFF_FP_SHADOWFRAME
8537 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8538
8539/* ------------------------------ */
8540 .balign 128
8541.L_ALT_op_cmpg_float: /* 0x2e */
8542/* File: arm/alt_stub.S */
8543/*
8544 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8545 * any interesting requests and then jump to the real instruction
8546 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8547 */
8548 .extern MterpCheckBefore
8549 EXPORT_PC
8550 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8551 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8552 mov r0, rSELF
8553 add r1, rFP, #OFF_FP_SHADOWFRAME
8554 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8555
8556/* ------------------------------ */
8557 .balign 128
8558.L_ALT_op_cmpl_double: /* 0x2f */
8559/* File: arm/alt_stub.S */
8560/*
8561 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8562 * any interesting requests and then jump to the real instruction
8563 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8564 */
8565 .extern MterpCheckBefore
8566 EXPORT_PC
8567 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8568 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8569 mov r0, rSELF
8570 add r1, rFP, #OFF_FP_SHADOWFRAME
8571 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8572
8573/* ------------------------------ */
8574 .balign 128
8575.L_ALT_op_cmpg_double: /* 0x30 */
8576/* File: arm/alt_stub.S */
8577/*
8578 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8579 * any interesting requests and then jump to the real instruction
8580 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8581 */
8582 .extern MterpCheckBefore
8583 EXPORT_PC
8584 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8585 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8586 mov r0, rSELF
8587 add r1, rFP, #OFF_FP_SHADOWFRAME
8588 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8589
8590/* ------------------------------ */
8591 .balign 128
8592.L_ALT_op_cmp_long: /* 0x31 */
8593/* File: arm/alt_stub.S */
8594/*
8595 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8596 * any interesting requests and then jump to the real instruction
8597 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8598 */
8599 .extern MterpCheckBefore
8600 EXPORT_PC
8601 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8602 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8603 mov r0, rSELF
8604 add r1, rFP, #OFF_FP_SHADOWFRAME
8605 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8606
8607/* ------------------------------ */
8608 .balign 128
8609.L_ALT_op_if_eq: /* 0x32 */
8610/* File: arm/alt_stub.S */
8611/*
8612 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8613 * any interesting requests and then jump to the real instruction
8614 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8615 */
8616 .extern MterpCheckBefore
8617 EXPORT_PC
8618 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8619 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8620 mov r0, rSELF
8621 add r1, rFP, #OFF_FP_SHADOWFRAME
8622 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8623
8624/* ------------------------------ */
8625 .balign 128
8626.L_ALT_op_if_ne: /* 0x33 */
8627/* File: arm/alt_stub.S */
8628/*
8629 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8630 * any interesting requests and then jump to the real instruction
8631 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8632 */
8633 .extern MterpCheckBefore
8634 EXPORT_PC
8635 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8636 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8637 mov r0, rSELF
8638 add r1, rFP, #OFF_FP_SHADOWFRAME
8639 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8640
8641/* ------------------------------ */
8642 .balign 128
8643.L_ALT_op_if_lt: /* 0x34 */
8644/* File: arm/alt_stub.S */
8645/*
8646 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8647 * any interesting requests and then jump to the real instruction
8648 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8649 */
8650 .extern MterpCheckBefore
8651 EXPORT_PC
8652 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8653 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8654 mov r0, rSELF
8655 add r1, rFP, #OFF_FP_SHADOWFRAME
8656 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8657
8658/* ------------------------------ */
8659 .balign 128
8660.L_ALT_op_if_ge: /* 0x35 */
8661/* File: arm/alt_stub.S */
8662/*
8663 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8664 * any interesting requests and then jump to the real instruction
8665 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8666 */
8667 .extern MterpCheckBefore
8668 EXPORT_PC
8669 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8670 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8671 mov r0, rSELF
8672 add r1, rFP, #OFF_FP_SHADOWFRAME
8673 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8674
8675/* ------------------------------ */
8676 .balign 128
8677.L_ALT_op_if_gt: /* 0x36 */
8678/* File: arm/alt_stub.S */
8679/*
8680 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8681 * any interesting requests and then jump to the real instruction
8682 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8683 */
8684 .extern MterpCheckBefore
8685 EXPORT_PC
8686 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8687 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8688 mov r0, rSELF
8689 add r1, rFP, #OFF_FP_SHADOWFRAME
8690 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8691
8692/* ------------------------------ */
8693 .balign 128
8694.L_ALT_op_if_le: /* 0x37 */
8695/* File: arm/alt_stub.S */
8696/*
8697 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8698 * any interesting requests and then jump to the real instruction
8699 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8700 */
8701 .extern MterpCheckBefore
8702 EXPORT_PC
8703 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8704 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8705 mov r0, rSELF
8706 add r1, rFP, #OFF_FP_SHADOWFRAME
8707 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8708
8709/* ------------------------------ */
8710 .balign 128
8711.L_ALT_op_if_eqz: /* 0x38 */
8712/* File: arm/alt_stub.S */
8713/*
8714 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8715 * any interesting requests and then jump to the real instruction
8716 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8717 */
8718 .extern MterpCheckBefore
8719 EXPORT_PC
8720 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8721 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8722 mov r0, rSELF
8723 add r1, rFP, #OFF_FP_SHADOWFRAME
8724 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8725
8726/* ------------------------------ */
8727 .balign 128
8728.L_ALT_op_if_nez: /* 0x39 */
8729/* File: arm/alt_stub.S */
8730/*
8731 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8732 * any interesting requests and then jump to the real instruction
8733 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8734 */
8735 .extern MterpCheckBefore
8736 EXPORT_PC
8737 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8738 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8739 mov r0, rSELF
8740 add r1, rFP, #OFF_FP_SHADOWFRAME
8741 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8742
8743/* ------------------------------ */
8744 .balign 128
8745.L_ALT_op_if_ltz: /* 0x3a */
8746/* File: arm/alt_stub.S */
8747/*
8748 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8749 * any interesting requests and then jump to the real instruction
8750 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8751 */
8752 .extern MterpCheckBefore
8753 EXPORT_PC
8754 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8755 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8756 mov r0, rSELF
8757 add r1, rFP, #OFF_FP_SHADOWFRAME
8758 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8759
8760/* ------------------------------ */
8761 .balign 128
8762.L_ALT_op_if_gez: /* 0x3b */
8763/* File: arm/alt_stub.S */
8764/*
8765 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8766 * any interesting requests and then jump to the real instruction
8767 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8768 */
8769 .extern MterpCheckBefore
8770 EXPORT_PC
8771 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8772 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8773 mov r0, rSELF
8774 add r1, rFP, #OFF_FP_SHADOWFRAME
8775 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8776
8777/* ------------------------------ */
8778 .balign 128
8779.L_ALT_op_if_gtz: /* 0x3c */
8780/* File: arm/alt_stub.S */
8781/*
8782 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8783 * any interesting requests and then jump to the real instruction
8784 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8785 */
8786 .extern MterpCheckBefore
8787 EXPORT_PC
8788 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8789 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8790 mov r0, rSELF
8791 add r1, rFP, #OFF_FP_SHADOWFRAME
8792 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8793
8794/* ------------------------------ */
8795 .balign 128
8796.L_ALT_op_if_lez: /* 0x3d */
8797/* File: arm/alt_stub.S */
8798/*
8799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8800 * any interesting requests and then jump to the real instruction
8801 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8802 */
8803 .extern MterpCheckBefore
8804 EXPORT_PC
8805 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8806 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8807 mov r0, rSELF
8808 add r1, rFP, #OFF_FP_SHADOWFRAME
8809 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8810
8811/* ------------------------------ */
8812 .balign 128
8813.L_ALT_op_unused_3e: /* 0x3e */
8814/* File: arm/alt_stub.S */
8815/*
8816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8817 * any interesting requests and then jump to the real instruction
8818 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8819 */
8820 .extern MterpCheckBefore
8821 EXPORT_PC
8822 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8823 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
8824 mov r0, rSELF
8825 add r1, rFP, #OFF_FP_SHADOWFRAME
8826 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8827
8828/* ------------------------------ */
8829 .balign 128
8830.L_ALT_op_unused_3f: /* 0x3f */
8831/* File: arm/alt_stub.S */
8832/*
8833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8834 * any interesting requests and then jump to the real instruction
8835 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8836 */
8837 .extern MterpCheckBefore
8838 EXPORT_PC
8839 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8840 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
8841 mov r0, rSELF
8842 add r1, rFP, #OFF_FP_SHADOWFRAME
8843 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8844
8845/* ------------------------------ */
8846 .balign 128
8847.L_ALT_op_unused_40: /* 0x40 */
8848/* File: arm/alt_stub.S */
8849/*
8850 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8851 * any interesting requests and then jump to the real instruction
8852 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8853 */
8854 .extern MterpCheckBefore
8855 EXPORT_PC
8856 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8857 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
8858 mov r0, rSELF
8859 add r1, rFP, #OFF_FP_SHADOWFRAME
8860 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8861
8862/* ------------------------------ */
8863 .balign 128
8864.L_ALT_op_unused_41: /* 0x41 */
8865/* File: arm/alt_stub.S */
8866/*
8867 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8868 * any interesting requests and then jump to the real instruction
8869 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8870 */
8871 .extern MterpCheckBefore
8872 EXPORT_PC
8873 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8874 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
8875 mov r0, rSELF
8876 add r1, rFP, #OFF_FP_SHADOWFRAME
8877 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8878
8879/* ------------------------------ */
8880 .balign 128
8881.L_ALT_op_unused_42: /* 0x42 */
8882/* File: arm/alt_stub.S */
8883/*
8884 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8885 * any interesting requests and then jump to the real instruction
8886 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8887 */
8888 .extern MterpCheckBefore
8889 EXPORT_PC
8890 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8891 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
8892 mov r0, rSELF
8893 add r1, rFP, #OFF_FP_SHADOWFRAME
8894 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8895
8896/* ------------------------------ */
8897 .balign 128
8898.L_ALT_op_unused_43: /* 0x43 */
8899/* File: arm/alt_stub.S */
8900/*
8901 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8902 * any interesting requests and then jump to the real instruction
8903 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8904 */
8905 .extern MterpCheckBefore
8906 EXPORT_PC
8907 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8908 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
8909 mov r0, rSELF
8910 add r1, rFP, #OFF_FP_SHADOWFRAME
8911 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8912
8913/* ------------------------------ */
8914 .balign 128
8915.L_ALT_op_aget: /* 0x44 */
8916/* File: arm/alt_stub.S */
8917/*
8918 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8919 * any interesting requests and then jump to the real instruction
8920 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8921 */
8922 .extern MterpCheckBefore
8923 EXPORT_PC
8924 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8925 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
8926 mov r0, rSELF
8927 add r1, rFP, #OFF_FP_SHADOWFRAME
8928 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8929
8930/* ------------------------------ */
8931 .balign 128
8932.L_ALT_op_aget_wide: /* 0x45 */
8933/* File: arm/alt_stub.S */
8934/*
8935 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8936 * any interesting requests and then jump to the real instruction
8937 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8938 */
8939 .extern MterpCheckBefore
8940 EXPORT_PC
8941 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8942 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
8943 mov r0, rSELF
8944 add r1, rFP, #OFF_FP_SHADOWFRAME
8945 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8946
8947/* ------------------------------ */
8948 .balign 128
8949.L_ALT_op_aget_object: /* 0x46 */
8950/* File: arm/alt_stub.S */
8951/*
8952 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8953 * any interesting requests and then jump to the real instruction
8954 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8955 */
8956 .extern MterpCheckBefore
8957 EXPORT_PC
8958 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8959 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
8960 mov r0, rSELF
8961 add r1, rFP, #OFF_FP_SHADOWFRAME
8962 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8963
8964/* ------------------------------ */
8965 .balign 128
8966.L_ALT_op_aget_boolean: /* 0x47 */
8967/* File: arm/alt_stub.S */
8968/*
8969 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8970 * any interesting requests and then jump to the real instruction
8971 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8972 */
8973 .extern MterpCheckBefore
8974 EXPORT_PC
8975 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8976 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
8977 mov r0, rSELF
8978 add r1, rFP, #OFF_FP_SHADOWFRAME
8979 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8980
8981/* ------------------------------ */
8982 .balign 128
8983.L_ALT_op_aget_byte: /* 0x48 */
8984/* File: arm/alt_stub.S */
8985/*
8986 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8987 * any interesting requests and then jump to the real instruction
8988 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8989 */
8990 .extern MterpCheckBefore
8991 EXPORT_PC
8992 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8993 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
8994 mov r0, rSELF
8995 add r1, rFP, #OFF_FP_SHADOWFRAME
8996 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8997
8998/* ------------------------------ */
8999 .balign 128
9000.L_ALT_op_aget_char: /* 0x49 */
9001/* File: arm/alt_stub.S */
9002/*
9003 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9004 * any interesting requests and then jump to the real instruction
9005 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9006 */
9007 .extern MterpCheckBefore
9008 EXPORT_PC
9009 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9010 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
9011 mov r0, rSELF
9012 add r1, rFP, #OFF_FP_SHADOWFRAME
9013 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9014
9015/* ------------------------------ */
9016 .balign 128
9017.L_ALT_op_aget_short: /* 0x4a */
9018/* File: arm/alt_stub.S */
9019/*
9020 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9021 * any interesting requests and then jump to the real instruction
9022 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9023 */
9024 .extern MterpCheckBefore
9025 EXPORT_PC
9026 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9027 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
9028 mov r0, rSELF
9029 add r1, rFP, #OFF_FP_SHADOWFRAME
9030 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9031
9032/* ------------------------------ */
9033 .balign 128
9034.L_ALT_op_aput: /* 0x4b */
9035/* File: arm/alt_stub.S */
9036/*
9037 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9038 * any interesting requests and then jump to the real instruction
9039 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9040 */
9041 .extern MterpCheckBefore
9042 EXPORT_PC
9043 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9044 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
9045 mov r0, rSELF
9046 add r1, rFP, #OFF_FP_SHADOWFRAME
9047 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9048
9049/* ------------------------------ */
9050 .balign 128
9051.L_ALT_op_aput_wide: /* 0x4c */
9052/* File: arm/alt_stub.S */
9053/*
9054 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9055 * any interesting requests and then jump to the real instruction
9056 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9057 */
9058 .extern MterpCheckBefore
9059 EXPORT_PC
9060 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9061 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
9062 mov r0, rSELF
9063 add r1, rFP, #OFF_FP_SHADOWFRAME
9064 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9065
9066/* ------------------------------ */
9067 .balign 128
9068.L_ALT_op_aput_object: /* 0x4d */
9069/* File: arm/alt_stub.S */
9070/*
9071 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9072 * any interesting requests and then jump to the real instruction
9073 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9074 */
9075 .extern MterpCheckBefore
9076 EXPORT_PC
9077 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9078 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
9079 mov r0, rSELF
9080 add r1, rFP, #OFF_FP_SHADOWFRAME
9081 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9082
9083/* ------------------------------ */
9084 .balign 128
9085.L_ALT_op_aput_boolean: /* 0x4e */
9086/* File: arm/alt_stub.S */
9087/*
9088 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9089 * any interesting requests and then jump to the real instruction
9090 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9091 */
9092 .extern MterpCheckBefore
9093 EXPORT_PC
9094 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9095 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9096 mov r0, rSELF
9097 add r1, rFP, #OFF_FP_SHADOWFRAME
9098 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9099
9100/* ------------------------------ */
9101 .balign 128
9102.L_ALT_op_aput_byte: /* 0x4f */
9103/* File: arm/alt_stub.S */
9104/*
9105 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9106 * any interesting requests and then jump to the real instruction
9107 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9108 */
9109 .extern MterpCheckBefore
9110 EXPORT_PC
9111 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9112 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9113 mov r0, rSELF
9114 add r1, rFP, #OFF_FP_SHADOWFRAME
9115 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9116
9117/* ------------------------------ */
9118 .balign 128
9119.L_ALT_op_aput_char: /* 0x50 */
9120/* File: arm/alt_stub.S */
9121/*
9122 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9123 * any interesting requests and then jump to the real instruction
9124 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9125 */
9126 .extern MterpCheckBefore
9127 EXPORT_PC
9128 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9129 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9130 mov r0, rSELF
9131 add r1, rFP, #OFF_FP_SHADOWFRAME
9132 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9133
9134/* ------------------------------ */
9135 .balign 128
9136.L_ALT_op_aput_short: /* 0x51 */
9137/* File: arm/alt_stub.S */
9138/*
9139 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9140 * any interesting requests and then jump to the real instruction
9141 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9142 */
9143 .extern MterpCheckBefore
9144 EXPORT_PC
9145 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9146 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9147 mov r0, rSELF
9148 add r1, rFP, #OFF_FP_SHADOWFRAME
9149 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9150
9151/* ------------------------------ */
9152 .balign 128
9153.L_ALT_op_iget: /* 0x52 */
9154/* File: arm/alt_stub.S */
9155/*
9156 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9157 * any interesting requests and then jump to the real instruction
9158 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9159 */
9160 .extern MterpCheckBefore
9161 EXPORT_PC
9162 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9163 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9164 mov r0, rSELF
9165 add r1, rFP, #OFF_FP_SHADOWFRAME
9166 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9167
9168/* ------------------------------ */
9169 .balign 128
9170.L_ALT_op_iget_wide: /* 0x53 */
9171/* File: arm/alt_stub.S */
9172/*
9173 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9174 * any interesting requests and then jump to the real instruction
9175 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9176 */
9177 .extern MterpCheckBefore
9178 EXPORT_PC
9179 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9180 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9181 mov r0, rSELF
9182 add r1, rFP, #OFF_FP_SHADOWFRAME
9183 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9184
9185/* ------------------------------ */
9186 .balign 128
9187.L_ALT_op_iget_object: /* 0x54 */
9188/* File: arm/alt_stub.S */
9189/*
9190 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9191 * any interesting requests and then jump to the real instruction
9192 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9193 */
9194 .extern MterpCheckBefore
9195 EXPORT_PC
9196 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9197 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9198 mov r0, rSELF
9199 add r1, rFP, #OFF_FP_SHADOWFRAME
9200 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9201
9202/* ------------------------------ */
9203 .balign 128
9204.L_ALT_op_iget_boolean: /* 0x55 */
9205/* File: arm/alt_stub.S */
9206/*
9207 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9208 * any interesting requests and then jump to the real instruction
9209 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9210 */
9211 .extern MterpCheckBefore
9212 EXPORT_PC
9213 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9214 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9215 mov r0, rSELF
9216 add r1, rFP, #OFF_FP_SHADOWFRAME
9217 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9218
9219/* ------------------------------ */
9220 .balign 128
9221.L_ALT_op_iget_byte: /* 0x56 */
9222/* File: arm/alt_stub.S */
9223/*
9224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9225 * any interesting requests and then jump to the real instruction
9226 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9227 */
9228 .extern MterpCheckBefore
9229 EXPORT_PC
9230 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9231 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9232 mov r0, rSELF
9233 add r1, rFP, #OFF_FP_SHADOWFRAME
9234 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9235
9236/* ------------------------------ */
9237 .balign 128
9238.L_ALT_op_iget_char: /* 0x57 */
9239/* File: arm/alt_stub.S */
9240/*
9241 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9242 * any interesting requests and then jump to the real instruction
9243 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9244 */
9245 .extern MterpCheckBefore
9246 EXPORT_PC
9247 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9248 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9249 mov r0, rSELF
9250 add r1, rFP, #OFF_FP_SHADOWFRAME
9251 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9252
9253/* ------------------------------ */
9254 .balign 128
9255.L_ALT_op_iget_short: /* 0x58 */
9256/* File: arm/alt_stub.S */
9257/*
9258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9259 * any interesting requests and then jump to the real instruction
9260 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9261 */
9262 .extern MterpCheckBefore
9263 EXPORT_PC
9264 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9265 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9266 mov r0, rSELF
9267 add r1, rFP, #OFF_FP_SHADOWFRAME
9268 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9269
9270/* ------------------------------ */
9271 .balign 128
9272.L_ALT_op_iput: /* 0x59 */
9273/* File: arm/alt_stub.S */
9274/*
9275 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9276 * any interesting requests and then jump to the real instruction
9277 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9278 */
9279 .extern MterpCheckBefore
9280 EXPORT_PC
9281 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9282 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9283 mov r0, rSELF
9284 add r1, rFP, #OFF_FP_SHADOWFRAME
9285 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9286
9287/* ------------------------------ */
9288 .balign 128
9289.L_ALT_op_iput_wide: /* 0x5a */
9290/* File: arm/alt_stub.S */
9291/*
9292 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9293 * any interesting requests and then jump to the real instruction
9294 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9295 */
9296 .extern MterpCheckBefore
9297 EXPORT_PC
9298 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9299 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9300 mov r0, rSELF
9301 add r1, rFP, #OFF_FP_SHADOWFRAME
9302 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9303
9304/* ------------------------------ */
9305 .balign 128
9306.L_ALT_op_iput_object: /* 0x5b */
9307/* File: arm/alt_stub.S */
9308/*
9309 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9310 * any interesting requests and then jump to the real instruction
9311 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9312 */
9313 .extern MterpCheckBefore
9314 EXPORT_PC
9315 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9316 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9317 mov r0, rSELF
9318 add r1, rFP, #OFF_FP_SHADOWFRAME
9319 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9320
9321/* ------------------------------ */
9322 .balign 128
9323.L_ALT_op_iput_boolean: /* 0x5c */
9324/* File: arm/alt_stub.S */
9325/*
9326 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9327 * any interesting requests and then jump to the real instruction
9328 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9329 */
9330 .extern MterpCheckBefore
9331 EXPORT_PC
9332 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9333 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9334 mov r0, rSELF
9335 add r1, rFP, #OFF_FP_SHADOWFRAME
9336 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9337
9338/* ------------------------------ */
9339 .balign 128
9340.L_ALT_op_iput_byte: /* 0x5d */
9341/* File: arm/alt_stub.S */
9342/*
9343 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9344 * any interesting requests and then jump to the real instruction
9345 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9346 */
9347 .extern MterpCheckBefore
9348 EXPORT_PC
9349 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9350 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9351 mov r0, rSELF
9352 add r1, rFP, #OFF_FP_SHADOWFRAME
9353 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9354
9355/* ------------------------------ */
9356 .balign 128
9357.L_ALT_op_iput_char: /* 0x5e */
9358/* File: arm/alt_stub.S */
9359/*
9360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9361 * any interesting requests and then jump to the real instruction
9362 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9363 */
9364 .extern MterpCheckBefore
9365 EXPORT_PC
9366 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9367 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9368 mov r0, rSELF
9369 add r1, rFP, #OFF_FP_SHADOWFRAME
9370 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9371
9372/* ------------------------------ */
9373 .balign 128
9374.L_ALT_op_iput_short: /* 0x5f */
9375/* File: arm/alt_stub.S */
9376/*
9377 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9378 * any interesting requests and then jump to the real instruction
9379 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9380 */
9381 .extern MterpCheckBefore
9382 EXPORT_PC
9383 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9384 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9385 mov r0, rSELF
9386 add r1, rFP, #OFF_FP_SHADOWFRAME
9387 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9388
9389/* ------------------------------ */
9390 .balign 128
9391.L_ALT_op_sget: /* 0x60 */
9392/* File: arm/alt_stub.S */
9393/*
9394 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9395 * any interesting requests and then jump to the real instruction
9396 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9397 */
9398 .extern MterpCheckBefore
9399 EXPORT_PC
9400 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9401 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9402 mov r0, rSELF
9403 add r1, rFP, #OFF_FP_SHADOWFRAME
9404 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9405
9406/* ------------------------------ */
9407 .balign 128
9408.L_ALT_op_sget_wide: /* 0x61 */
9409/* File: arm/alt_stub.S */
9410/*
9411 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9412 * any interesting requests and then jump to the real instruction
9413 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9414 */
9415 .extern MterpCheckBefore
9416 EXPORT_PC
9417 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9418 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9419 mov r0, rSELF
9420 add r1, rFP, #OFF_FP_SHADOWFRAME
9421 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9422
9423/* ------------------------------ */
9424 .balign 128
9425.L_ALT_op_sget_object: /* 0x62 */
9426/* File: arm/alt_stub.S */
9427/*
9428 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9429 * any interesting requests and then jump to the real instruction
9430 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9431 */
9432 .extern MterpCheckBefore
9433 EXPORT_PC
9434 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9435 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9436 mov r0, rSELF
9437 add r1, rFP, #OFF_FP_SHADOWFRAME
9438 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9439
9440/* ------------------------------ */
9441 .balign 128
9442.L_ALT_op_sget_boolean: /* 0x63 */
9443/* File: arm/alt_stub.S */
9444/*
9445 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9446 * any interesting requests and then jump to the real instruction
9447 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9448 */
9449 .extern MterpCheckBefore
9450 EXPORT_PC
9451 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9452 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9453 mov r0, rSELF
9454 add r1, rFP, #OFF_FP_SHADOWFRAME
9455 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9456
9457/* ------------------------------ */
9458 .balign 128
9459.L_ALT_op_sget_byte: /* 0x64 */
9460/* File: arm/alt_stub.S */
9461/*
9462 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9463 * any interesting requests and then jump to the real instruction
9464 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9465 */
9466 .extern MterpCheckBefore
9467 EXPORT_PC
9468 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9469 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9470 mov r0, rSELF
9471 add r1, rFP, #OFF_FP_SHADOWFRAME
9472 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9473
9474/* ------------------------------ */
9475 .balign 128
9476.L_ALT_op_sget_char: /* 0x65 */
9477/* File: arm/alt_stub.S */
9478/*
9479 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9480 * any interesting requests and then jump to the real instruction
9481 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9482 */
9483 .extern MterpCheckBefore
9484 EXPORT_PC
9485 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9486 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9487 mov r0, rSELF
9488 add r1, rFP, #OFF_FP_SHADOWFRAME
9489 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9490
9491/* ------------------------------ */
9492 .balign 128
9493.L_ALT_op_sget_short: /* 0x66 */
9494/* File: arm/alt_stub.S */
9495/*
9496 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9497 * any interesting requests and then jump to the real instruction
9498 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9499 */
9500 .extern MterpCheckBefore
9501 EXPORT_PC
9502 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9503 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9504 mov r0, rSELF
9505 add r1, rFP, #OFF_FP_SHADOWFRAME
9506 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9507
9508/* ------------------------------ */
9509 .balign 128
9510.L_ALT_op_sput: /* 0x67 */
9511/* File: arm/alt_stub.S */
9512/*
9513 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9514 * any interesting requests and then jump to the real instruction
9515 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9516 */
9517 .extern MterpCheckBefore
9518 EXPORT_PC
9519 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9520 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9521 mov r0, rSELF
9522 add r1, rFP, #OFF_FP_SHADOWFRAME
9523 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9524
9525/* ------------------------------ */
9526 .balign 128
9527.L_ALT_op_sput_wide: /* 0x68 */
9528/* File: arm/alt_stub.S */
9529/*
9530 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9531 * any interesting requests and then jump to the real instruction
9532 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9533 */
9534 .extern MterpCheckBefore
9535 EXPORT_PC
9536 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9537 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9538 mov r0, rSELF
9539 add r1, rFP, #OFF_FP_SHADOWFRAME
9540 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9541
9542/* ------------------------------ */
9543 .balign 128
9544.L_ALT_op_sput_object: /* 0x69 */
9545/* File: arm/alt_stub.S */
9546/*
9547 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9548 * any interesting requests and then jump to the real instruction
9549 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9550 */
9551 .extern MterpCheckBefore
9552 EXPORT_PC
9553 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9554 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9555 mov r0, rSELF
9556 add r1, rFP, #OFF_FP_SHADOWFRAME
9557 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9558
9559/* ------------------------------ */
9560 .balign 128
9561.L_ALT_op_sput_boolean: /* 0x6a */
9562/* File: arm/alt_stub.S */
9563/*
9564 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9565 * any interesting requests and then jump to the real instruction
9566 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9567 */
9568 .extern MterpCheckBefore
9569 EXPORT_PC
9570 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9571 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9572 mov r0, rSELF
9573 add r1, rFP, #OFF_FP_SHADOWFRAME
9574 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9575
9576/* ------------------------------ */
9577 .balign 128
9578.L_ALT_op_sput_byte: /* 0x6b */
9579/* File: arm/alt_stub.S */
9580/*
9581 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9582 * any interesting requests and then jump to the real instruction
9583 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9584 */
9585 .extern MterpCheckBefore
9586 EXPORT_PC
9587 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9588 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9589 mov r0, rSELF
9590 add r1, rFP, #OFF_FP_SHADOWFRAME
9591 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9592
9593/* ------------------------------ */
9594 .balign 128
9595.L_ALT_op_sput_char: /* 0x6c */
9596/* File: arm/alt_stub.S */
9597/*
9598 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9599 * any interesting requests and then jump to the real instruction
9600 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9601 */
9602 .extern MterpCheckBefore
9603 EXPORT_PC
9604 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9605 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9606 mov r0, rSELF
9607 add r1, rFP, #OFF_FP_SHADOWFRAME
9608 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9609
9610/* ------------------------------ */
9611 .balign 128
9612.L_ALT_op_sput_short: /* 0x6d */
9613/* File: arm/alt_stub.S */
9614/*
9615 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9616 * any interesting requests and then jump to the real instruction
9617 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9618 */
9619 .extern MterpCheckBefore
9620 EXPORT_PC
9621 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9622 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9623 mov r0, rSELF
9624 add r1, rFP, #OFF_FP_SHADOWFRAME
9625 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9626
9627/* ------------------------------ */
9628 .balign 128
9629.L_ALT_op_invoke_virtual: /* 0x6e */
9630/* File: arm/alt_stub.S */
9631/*
9632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9633 * any interesting requests and then jump to the real instruction
9634 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9635 */
9636 .extern MterpCheckBefore
9637 EXPORT_PC
9638 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9639 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9640 mov r0, rSELF
9641 add r1, rFP, #OFF_FP_SHADOWFRAME
9642 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9643
9644/* ------------------------------ */
9645 .balign 128
9646.L_ALT_op_invoke_super: /* 0x6f */
9647/* File: arm/alt_stub.S */
9648/*
9649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9650 * any interesting requests and then jump to the real instruction
9651 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9652 */
9653 .extern MterpCheckBefore
9654 EXPORT_PC
9655 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9656 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9657 mov r0, rSELF
9658 add r1, rFP, #OFF_FP_SHADOWFRAME
9659 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9660
9661/* ------------------------------ */
9662 .balign 128
9663.L_ALT_op_invoke_direct: /* 0x70 */
9664/* File: arm/alt_stub.S */
9665/*
9666 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9667 * any interesting requests and then jump to the real instruction
9668 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9669 */
9670 .extern MterpCheckBefore
9671 EXPORT_PC
9672 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9673 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9674 mov r0, rSELF
9675 add r1, rFP, #OFF_FP_SHADOWFRAME
9676 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9677
9678/* ------------------------------ */
9679 .balign 128
9680.L_ALT_op_invoke_static: /* 0x71 */
9681/* File: arm/alt_stub.S */
9682/*
9683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9684 * any interesting requests and then jump to the real instruction
9685 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9686 */
9687 .extern MterpCheckBefore
9688 EXPORT_PC
9689 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9690 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9691 mov r0, rSELF
9692 add r1, rFP, #OFF_FP_SHADOWFRAME
9693 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9694
9695/* ------------------------------ */
9696 .balign 128
9697.L_ALT_op_invoke_interface: /* 0x72 */
9698/* File: arm/alt_stub.S */
9699/*
9700 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9701 * any interesting requests and then jump to the real instruction
9702 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9703 */
9704 .extern MterpCheckBefore
9705 EXPORT_PC
9706 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9707 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9708 mov r0, rSELF
9709 add r1, rFP, #OFF_FP_SHADOWFRAME
9710 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9711
9712/* ------------------------------ */
9713 .balign 128
9714.L_ALT_op_return_void_no_barrier: /* 0x73 */
9715/* File: arm/alt_stub.S */
9716/*
9717 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9718 * any interesting requests and then jump to the real instruction
9719 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9720 */
9721 .extern MterpCheckBefore
9722 EXPORT_PC
9723 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9724 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9725 mov r0, rSELF
9726 add r1, rFP, #OFF_FP_SHADOWFRAME
9727 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9728
9729/* ------------------------------ */
9730 .balign 128
9731.L_ALT_op_invoke_virtual_range: /* 0x74 */
9732/* File: arm/alt_stub.S */
9733/*
9734 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9735 * any interesting requests and then jump to the real instruction
9736 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9737 */
9738 .extern MterpCheckBefore
9739 EXPORT_PC
9740 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9741 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9742 mov r0, rSELF
9743 add r1, rFP, #OFF_FP_SHADOWFRAME
9744 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9745
9746/* ------------------------------ */
9747 .balign 128
9748.L_ALT_op_invoke_super_range: /* 0x75 */
9749/* File: arm/alt_stub.S */
9750/*
9751 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9752 * any interesting requests and then jump to the real instruction
9753 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9754 */
9755 .extern MterpCheckBefore
9756 EXPORT_PC
9757 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9758 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9759 mov r0, rSELF
9760 add r1, rFP, #OFF_FP_SHADOWFRAME
9761 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9762
9763/* ------------------------------ */
9764 .balign 128
9765.L_ALT_op_invoke_direct_range: /* 0x76 */
9766/* File: arm/alt_stub.S */
9767/*
9768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9769 * any interesting requests and then jump to the real instruction
9770 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9771 */
9772 .extern MterpCheckBefore
9773 EXPORT_PC
9774 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9775 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9776 mov r0, rSELF
9777 add r1, rFP, #OFF_FP_SHADOWFRAME
9778 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9779
9780/* ------------------------------ */
9781 .balign 128
9782.L_ALT_op_invoke_static_range: /* 0x77 */
9783/* File: arm/alt_stub.S */
9784/*
9785 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9786 * any interesting requests and then jump to the real instruction
9787 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9788 */
9789 .extern MterpCheckBefore
9790 EXPORT_PC
9791 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9792 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9793 mov r0, rSELF
9794 add r1, rFP, #OFF_FP_SHADOWFRAME
9795 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9796
9797/* ------------------------------ */
9798 .balign 128
9799.L_ALT_op_invoke_interface_range: /* 0x78 */
9800/* File: arm/alt_stub.S */
9801/*
9802 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9803 * any interesting requests and then jump to the real instruction
9804 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9805 */
9806 .extern MterpCheckBefore
9807 EXPORT_PC
9808 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9809 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
9810 mov r0, rSELF
9811 add r1, rFP, #OFF_FP_SHADOWFRAME
9812 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9813
9814/* ------------------------------ */
9815 .balign 128
9816.L_ALT_op_unused_79: /* 0x79 */
9817/* File: arm/alt_stub.S */
9818/*
9819 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9820 * any interesting requests and then jump to the real instruction
9821 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9822 */
9823 .extern MterpCheckBefore
9824 EXPORT_PC
9825 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9826 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
9827 mov r0, rSELF
9828 add r1, rFP, #OFF_FP_SHADOWFRAME
9829 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9830
9831/* ------------------------------ */
9832 .balign 128
9833.L_ALT_op_unused_7a: /* 0x7a */
9834/* File: arm/alt_stub.S */
9835/*
9836 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9837 * any interesting requests and then jump to the real instruction
9838 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9839 */
9840 .extern MterpCheckBefore
9841 EXPORT_PC
9842 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9843 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
9844 mov r0, rSELF
9845 add r1, rFP, #OFF_FP_SHADOWFRAME
9846 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9847
9848/* ------------------------------ */
9849 .balign 128
9850.L_ALT_op_neg_int: /* 0x7b */
9851/* File: arm/alt_stub.S */
9852/*
9853 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9854 * any interesting requests and then jump to the real instruction
9855 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9856 */
9857 .extern MterpCheckBefore
9858 EXPORT_PC
9859 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9860 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
9861 mov r0, rSELF
9862 add r1, rFP, #OFF_FP_SHADOWFRAME
9863 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9864
9865/* ------------------------------ */
9866 .balign 128
9867.L_ALT_op_not_int: /* 0x7c */
9868/* File: arm/alt_stub.S */
9869/*
9870 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9871 * any interesting requests and then jump to the real instruction
9872 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9873 */
9874 .extern MterpCheckBefore
9875 EXPORT_PC
9876 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9877 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
9878 mov r0, rSELF
9879 add r1, rFP, #OFF_FP_SHADOWFRAME
9880 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9881
9882/* ------------------------------ */
9883 .balign 128
9884.L_ALT_op_neg_long: /* 0x7d */
9885/* File: arm/alt_stub.S */
9886/*
9887 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9888 * any interesting requests and then jump to the real instruction
9889 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9890 */
9891 .extern MterpCheckBefore
9892 EXPORT_PC
9893 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9894 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
9895 mov r0, rSELF
9896 add r1, rFP, #OFF_FP_SHADOWFRAME
9897 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9898
9899/* ------------------------------ */
9900 .balign 128
9901.L_ALT_op_not_long: /* 0x7e */
9902/* File: arm/alt_stub.S */
9903/*
9904 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9905 * any interesting requests and then jump to the real instruction
9906 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9907 */
9908 .extern MterpCheckBefore
9909 EXPORT_PC
9910 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9911 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
9912 mov r0, rSELF
9913 add r1, rFP, #OFF_FP_SHADOWFRAME
9914 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9915
9916/* ------------------------------ */
9917 .balign 128
9918.L_ALT_op_neg_float: /* 0x7f */
9919/* File: arm/alt_stub.S */
9920/*
9921 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9922 * any interesting requests and then jump to the real instruction
9923 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9924 */
9925 .extern MterpCheckBefore
9926 EXPORT_PC
9927 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9928 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
9929 mov r0, rSELF
9930 add r1, rFP, #OFF_FP_SHADOWFRAME
9931 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9932
9933/* ------------------------------ */
9934 .balign 128
9935.L_ALT_op_neg_double: /* 0x80 */
9936/* File: arm/alt_stub.S */
9937/*
9938 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9939 * any interesting requests and then jump to the real instruction
9940 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9941 */
9942 .extern MterpCheckBefore
9943 EXPORT_PC
9944 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9945 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
9946 mov r0, rSELF
9947 add r1, rFP, #OFF_FP_SHADOWFRAME
9948 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9949
9950/* ------------------------------ */
9951 .balign 128
9952.L_ALT_op_int_to_long: /* 0x81 */
9953/* File: arm/alt_stub.S */
9954/*
9955 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9956 * any interesting requests and then jump to the real instruction
9957 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9958 */
9959 .extern MterpCheckBefore
9960 EXPORT_PC
9961 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9962 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
9963 mov r0, rSELF
9964 add r1, rFP, #OFF_FP_SHADOWFRAME
9965 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9966
9967/* ------------------------------ */
9968 .balign 128
9969.L_ALT_op_int_to_float: /* 0x82 */
9970/* File: arm/alt_stub.S */
9971/*
9972 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9973 * any interesting requests and then jump to the real instruction
9974 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9975 */
9976 .extern MterpCheckBefore
9977 EXPORT_PC
9978 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9979 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
9980 mov r0, rSELF
9981 add r1, rFP, #OFF_FP_SHADOWFRAME
9982 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9983
9984/* ------------------------------ */
9985 .balign 128
9986.L_ALT_op_int_to_double: /* 0x83 */
9987/* File: arm/alt_stub.S */
9988/*
9989 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9990 * any interesting requests and then jump to the real instruction
9991 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9992 */
9993 .extern MterpCheckBefore
9994 EXPORT_PC
9995 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9996 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
9997 mov r0, rSELF
9998 add r1, rFP, #OFF_FP_SHADOWFRAME
9999 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10000
10001/* ------------------------------ */
10002 .balign 128
10003.L_ALT_op_long_to_int: /* 0x84 */
10004/* File: arm/alt_stub.S */
10005/*
10006 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10007 * any interesting requests and then jump to the real instruction
10008 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10009 */
10010 .extern MterpCheckBefore
10011 EXPORT_PC
10012 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10013 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
10014 mov r0, rSELF
10015 add r1, rFP, #OFF_FP_SHADOWFRAME
10016 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10017
10018/* ------------------------------ */
10019 .balign 128
10020.L_ALT_op_long_to_float: /* 0x85 */
10021/* File: arm/alt_stub.S */
10022/*
10023 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10024 * any interesting requests and then jump to the real instruction
10025 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10026 */
10027 .extern MterpCheckBefore
10028 EXPORT_PC
10029 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10030 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
10031 mov r0, rSELF
10032 add r1, rFP, #OFF_FP_SHADOWFRAME
10033 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10034
10035/* ------------------------------ */
10036 .balign 128
10037.L_ALT_op_long_to_double: /* 0x86 */
10038/* File: arm/alt_stub.S */
10039/*
10040 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10041 * any interesting requests and then jump to the real instruction
10042 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10043 */
10044 .extern MterpCheckBefore
10045 EXPORT_PC
10046 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10047 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
10048 mov r0, rSELF
10049 add r1, rFP, #OFF_FP_SHADOWFRAME
10050 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10051
10052/* ------------------------------ */
10053 .balign 128
10054.L_ALT_op_float_to_int: /* 0x87 */
10055/* File: arm/alt_stub.S */
10056/*
10057 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10058 * any interesting requests and then jump to the real instruction
10059 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10060 */
10061 .extern MterpCheckBefore
10062 EXPORT_PC
10063 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10064 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
10065 mov r0, rSELF
10066 add r1, rFP, #OFF_FP_SHADOWFRAME
10067 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10068
10069/* ------------------------------ */
10070 .balign 128
10071.L_ALT_op_float_to_long: /* 0x88 */
10072/* File: arm/alt_stub.S */
10073/*
10074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10075 * any interesting requests and then jump to the real instruction
10076 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10077 */
10078 .extern MterpCheckBefore
10079 EXPORT_PC
10080 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10081 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10082 mov r0, rSELF
10083 add r1, rFP, #OFF_FP_SHADOWFRAME
10084 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10085
10086/* ------------------------------ */
10087 .balign 128
10088.L_ALT_op_float_to_double: /* 0x89 */
10089/* File: arm/alt_stub.S */
10090/*
10091 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10092 * any interesting requests and then jump to the real instruction
10093 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10094 */
10095 .extern MterpCheckBefore
10096 EXPORT_PC
10097 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10098 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10099 mov r0, rSELF
10100 add r1, rFP, #OFF_FP_SHADOWFRAME
10101 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10102
10103/* ------------------------------ */
10104 .balign 128
10105.L_ALT_op_double_to_int: /* 0x8a */
10106/* File: arm/alt_stub.S */
10107/*
10108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10109 * any interesting requests and then jump to the real instruction
10110 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10111 */
10112 .extern MterpCheckBefore
10113 EXPORT_PC
10114 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10115 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10116 mov r0, rSELF
10117 add r1, rFP, #OFF_FP_SHADOWFRAME
10118 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10119
10120/* ------------------------------ */
10121 .balign 128
10122.L_ALT_op_double_to_long: /* 0x8b */
10123/* File: arm/alt_stub.S */
10124/*
10125 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10126 * any interesting requests and then jump to the real instruction
10127 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10128 */
10129 .extern MterpCheckBefore
10130 EXPORT_PC
10131 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10132 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10133 mov r0, rSELF
10134 add r1, rFP, #OFF_FP_SHADOWFRAME
10135 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10136
10137/* ------------------------------ */
10138 .balign 128
10139.L_ALT_op_double_to_float: /* 0x8c */
10140/* File: arm/alt_stub.S */
10141/*
10142 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10143 * any interesting requests and then jump to the real instruction
10144 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10145 */
10146 .extern MterpCheckBefore
10147 EXPORT_PC
10148 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10149 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10150 mov r0, rSELF
10151 add r1, rFP, #OFF_FP_SHADOWFRAME
10152 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10153
10154/* ------------------------------ */
10155 .balign 128
10156.L_ALT_op_int_to_byte: /* 0x8d */
10157/* File: arm/alt_stub.S */
10158/*
10159 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10160 * any interesting requests and then jump to the real instruction
10161 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10162 */
10163 .extern MterpCheckBefore
10164 EXPORT_PC
10165 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10166 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10167 mov r0, rSELF
10168 add r1, rFP, #OFF_FP_SHADOWFRAME
10169 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10170
10171/* ------------------------------ */
10172 .balign 128
10173.L_ALT_op_int_to_char: /* 0x8e */
10174/* File: arm/alt_stub.S */
10175/*
10176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10177 * any interesting requests and then jump to the real instruction
10178 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10179 */
10180 .extern MterpCheckBefore
10181 EXPORT_PC
10182 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10183 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10184 mov r0, rSELF
10185 add r1, rFP, #OFF_FP_SHADOWFRAME
10186 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10187
10188/* ------------------------------ */
10189 .balign 128
10190.L_ALT_op_int_to_short: /* 0x8f */
10191/* File: arm/alt_stub.S */
10192/*
10193 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10194 * any interesting requests and then jump to the real instruction
10195 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10196 */
10197 .extern MterpCheckBefore
10198 EXPORT_PC
10199 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10200 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10201 mov r0, rSELF
10202 add r1, rFP, #OFF_FP_SHADOWFRAME
10203 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10204
10205/* ------------------------------ */
10206 .balign 128
10207.L_ALT_op_add_int: /* 0x90 */
10208/* File: arm/alt_stub.S */
10209/*
10210 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10211 * any interesting requests and then jump to the real instruction
10212 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10213 */
10214 .extern MterpCheckBefore
10215 EXPORT_PC
10216 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10217 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10218 mov r0, rSELF
10219 add r1, rFP, #OFF_FP_SHADOWFRAME
10220 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10221
10222/* ------------------------------ */
10223 .balign 128
10224.L_ALT_op_sub_int: /* 0x91 */
10225/* File: arm/alt_stub.S */
10226/*
10227 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10228 * any interesting requests and then jump to the real instruction
10229 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10230 */
10231 .extern MterpCheckBefore
10232 EXPORT_PC
10233 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10234 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10235 mov r0, rSELF
10236 add r1, rFP, #OFF_FP_SHADOWFRAME
10237 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10238
10239/* ------------------------------ */
10240 .balign 128
10241.L_ALT_op_mul_int: /* 0x92 */
10242/* File: arm/alt_stub.S */
10243/*
10244 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10245 * any interesting requests and then jump to the real instruction
10246 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10247 */
10248 .extern MterpCheckBefore
10249 EXPORT_PC
10250 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10251 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10252 mov r0, rSELF
10253 add r1, rFP, #OFF_FP_SHADOWFRAME
10254 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10255
10256/* ------------------------------ */
10257 .balign 128
10258.L_ALT_op_div_int: /* 0x93 */
10259/* File: arm/alt_stub.S */
10260/*
10261 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10262 * any interesting requests and then jump to the real instruction
10263 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10264 */
10265 .extern MterpCheckBefore
10266 EXPORT_PC
10267 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10268 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10269 mov r0, rSELF
10270 add r1, rFP, #OFF_FP_SHADOWFRAME
10271 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10272
10273/* ------------------------------ */
10274 .balign 128
10275.L_ALT_op_rem_int: /* 0x94 */
10276/* File: arm/alt_stub.S */
10277/*
10278 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10279 * any interesting requests and then jump to the real instruction
10280 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10281 */
10282 .extern MterpCheckBefore
10283 EXPORT_PC
10284 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10285 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10286 mov r0, rSELF
10287 add r1, rFP, #OFF_FP_SHADOWFRAME
10288 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10289
10290/* ------------------------------ */
10291 .balign 128
10292.L_ALT_op_and_int: /* 0x95 */
10293/* File: arm/alt_stub.S */
10294/*
10295 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10296 * any interesting requests and then jump to the real instruction
10297 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10298 */
10299 .extern MterpCheckBefore
10300 EXPORT_PC
10301 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10302 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10303 mov r0, rSELF
10304 add r1, rFP, #OFF_FP_SHADOWFRAME
10305 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10306
10307/* ------------------------------ */
10308 .balign 128
10309.L_ALT_op_or_int: /* 0x96 */
10310/* File: arm/alt_stub.S */
10311/*
10312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10313 * any interesting requests and then jump to the real instruction
10314 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10315 */
10316 .extern MterpCheckBefore
10317 EXPORT_PC
10318 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10319 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10320 mov r0, rSELF
10321 add r1, rFP, #OFF_FP_SHADOWFRAME
10322 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10323
10324/* ------------------------------ */
10325 .balign 128
10326.L_ALT_op_xor_int: /* 0x97 */
10327/* File: arm/alt_stub.S */
10328/*
10329 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10330 * any interesting requests and then jump to the real instruction
10331 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10332 */
10333 .extern MterpCheckBefore
10334 EXPORT_PC
10335 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10336 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10337 mov r0, rSELF
10338 add r1, rFP, #OFF_FP_SHADOWFRAME
10339 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10340
10341/* ------------------------------ */
10342 .balign 128
10343.L_ALT_op_shl_int: /* 0x98 */
10344/* File: arm/alt_stub.S */
10345/*
10346 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10347 * any interesting requests and then jump to the real instruction
10348 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10349 */
10350 .extern MterpCheckBefore
10351 EXPORT_PC
10352 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10353 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10354 mov r0, rSELF
10355 add r1, rFP, #OFF_FP_SHADOWFRAME
10356 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10357
10358/* ------------------------------ */
10359 .balign 128
10360.L_ALT_op_shr_int: /* 0x99 */
10361/* File: arm/alt_stub.S */
10362/*
10363 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10364 * any interesting requests and then jump to the real instruction
10365 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10366 */
10367 .extern MterpCheckBefore
10368 EXPORT_PC
10369 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10370 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10371 mov r0, rSELF
10372 add r1, rFP, #OFF_FP_SHADOWFRAME
10373 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10374
10375/* ------------------------------ */
10376 .balign 128
10377.L_ALT_op_ushr_int: /* 0x9a */
10378/* File: arm/alt_stub.S */
10379/*
10380 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10381 * any interesting requests and then jump to the real instruction
10382 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10383 */
10384 .extern MterpCheckBefore
10385 EXPORT_PC
10386 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10387 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10388 mov r0, rSELF
10389 add r1, rFP, #OFF_FP_SHADOWFRAME
10390 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10391
10392/* ------------------------------ */
10393 .balign 128
10394.L_ALT_op_add_long: /* 0x9b */
10395/* File: arm/alt_stub.S */
10396/*
10397 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10398 * any interesting requests and then jump to the real instruction
10399 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10400 */
10401 .extern MterpCheckBefore
10402 EXPORT_PC
10403 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10404 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10405 mov r0, rSELF
10406 add r1, rFP, #OFF_FP_SHADOWFRAME
10407 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10408
10409/* ------------------------------ */
10410 .balign 128
10411.L_ALT_op_sub_long: /* 0x9c */
10412/* File: arm/alt_stub.S */
10413/*
10414 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10415 * any interesting requests and then jump to the real instruction
10416 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10417 */
10418 .extern MterpCheckBefore
10419 EXPORT_PC
10420 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10421 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10422 mov r0, rSELF
10423 add r1, rFP, #OFF_FP_SHADOWFRAME
10424 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10425
10426/* ------------------------------ */
10427 .balign 128
10428.L_ALT_op_mul_long: /* 0x9d */
10429/* File: arm/alt_stub.S */
10430/*
10431 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10432 * any interesting requests and then jump to the real instruction
10433 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10434 */
10435 .extern MterpCheckBefore
10436 EXPORT_PC
10437 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10438 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10439 mov r0, rSELF
10440 add r1, rFP, #OFF_FP_SHADOWFRAME
10441 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10442
10443/* ------------------------------ */
10444 .balign 128
10445.L_ALT_op_div_long: /* 0x9e */
10446/* File: arm/alt_stub.S */
10447/*
10448 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10449 * any interesting requests and then jump to the real instruction
10450 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10451 */
10452 .extern MterpCheckBefore
10453 EXPORT_PC
10454 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10455 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10456 mov r0, rSELF
10457 add r1, rFP, #OFF_FP_SHADOWFRAME
10458 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10459
10460/* ------------------------------ */
10461 .balign 128
10462.L_ALT_op_rem_long: /* 0x9f */
10463/* File: arm/alt_stub.S */
10464/*
10465 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10466 * any interesting requests and then jump to the real instruction
10467 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10468 */
10469 .extern MterpCheckBefore
10470 EXPORT_PC
10471 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10472 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10473 mov r0, rSELF
10474 add r1, rFP, #OFF_FP_SHADOWFRAME
10475 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10476
10477/* ------------------------------ */
10478 .balign 128
10479.L_ALT_op_and_long: /* 0xa0 */
10480/* File: arm/alt_stub.S */
10481/*
10482 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10483 * any interesting requests and then jump to the real instruction
10484 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10485 */
10486 .extern MterpCheckBefore
10487 EXPORT_PC
10488 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10489 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10490 mov r0, rSELF
10491 add r1, rFP, #OFF_FP_SHADOWFRAME
10492 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10493
10494/* ------------------------------ */
10495 .balign 128
10496.L_ALT_op_or_long: /* 0xa1 */
10497/* File: arm/alt_stub.S */
10498/*
10499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10500 * any interesting requests and then jump to the real instruction
10501 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10502 */
10503 .extern MterpCheckBefore
10504 EXPORT_PC
10505 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10506 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10507 mov r0, rSELF
10508 add r1, rFP, #OFF_FP_SHADOWFRAME
10509 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10510
10511/* ------------------------------ */
10512 .balign 128
10513.L_ALT_op_xor_long: /* 0xa2 */
10514/* File: arm/alt_stub.S */
10515/*
10516 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10517 * any interesting requests and then jump to the real instruction
10518 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10519 */
10520 .extern MterpCheckBefore
10521 EXPORT_PC
10522 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10523 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10524 mov r0, rSELF
10525 add r1, rFP, #OFF_FP_SHADOWFRAME
10526 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10527
10528/* ------------------------------ */
10529 .balign 128
10530.L_ALT_op_shl_long: /* 0xa3 */
10531/* File: arm/alt_stub.S */
10532/*
10533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10534 * any interesting requests and then jump to the real instruction
10535 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10536 */
10537 .extern MterpCheckBefore
10538 EXPORT_PC
10539 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10540 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10541 mov r0, rSELF
10542 add r1, rFP, #OFF_FP_SHADOWFRAME
10543 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10544
10545/* ------------------------------ */
10546 .balign 128
10547.L_ALT_op_shr_long: /* 0xa4 */
10548/* File: arm/alt_stub.S */
10549/*
10550 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10551 * any interesting requests and then jump to the real instruction
10552 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10553 */
10554 .extern MterpCheckBefore
10555 EXPORT_PC
10556 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10557 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10558 mov r0, rSELF
10559 add r1, rFP, #OFF_FP_SHADOWFRAME
10560 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10561
10562/* ------------------------------ */
10563 .balign 128
10564.L_ALT_op_ushr_long: /* 0xa5 */
10565/* File: arm/alt_stub.S */
10566/*
10567 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10568 * any interesting requests and then jump to the real instruction
10569 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10570 */
10571 .extern MterpCheckBefore
10572 EXPORT_PC
10573 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10574 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10575 mov r0, rSELF
10576 add r1, rFP, #OFF_FP_SHADOWFRAME
10577 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10578
10579/* ------------------------------ */
10580 .balign 128
10581.L_ALT_op_add_float: /* 0xa6 */
10582/* File: arm/alt_stub.S */
10583/*
10584 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10585 * any interesting requests and then jump to the real instruction
10586 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10587 */
10588 .extern MterpCheckBefore
10589 EXPORT_PC
10590 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10591 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10592 mov r0, rSELF
10593 add r1, rFP, #OFF_FP_SHADOWFRAME
10594 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10595
10596/* ------------------------------ */
10597 .balign 128
10598.L_ALT_op_sub_float: /* 0xa7 */
10599/* File: arm/alt_stub.S */
10600/*
10601 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10602 * any interesting requests and then jump to the real instruction
10603 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10604 */
10605 .extern MterpCheckBefore
10606 EXPORT_PC
10607 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10608 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10609 mov r0, rSELF
10610 add r1, rFP, #OFF_FP_SHADOWFRAME
10611 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10612
10613/* ------------------------------ */
10614 .balign 128
10615.L_ALT_op_mul_float: /* 0xa8 */
10616/* File: arm/alt_stub.S */
10617/*
10618 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10619 * any interesting requests and then jump to the real instruction
10620 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10621 */
10622 .extern MterpCheckBefore
10623 EXPORT_PC
10624 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10625 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10626 mov r0, rSELF
10627 add r1, rFP, #OFF_FP_SHADOWFRAME
10628 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10629
10630/* ------------------------------ */
10631 .balign 128
10632.L_ALT_op_div_float: /* 0xa9 */
10633/* File: arm/alt_stub.S */
10634/*
10635 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10636 * any interesting requests and then jump to the real instruction
10637 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10638 */
10639 .extern MterpCheckBefore
10640 EXPORT_PC
10641 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10642 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10643 mov r0, rSELF
10644 add r1, rFP, #OFF_FP_SHADOWFRAME
10645 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10646
10647/* ------------------------------ */
10648 .balign 128
10649.L_ALT_op_rem_float: /* 0xaa */
10650/* File: arm/alt_stub.S */
10651/*
10652 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10653 * any interesting requests and then jump to the real instruction
10654 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10655 */
10656 .extern MterpCheckBefore
10657 EXPORT_PC
10658 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10659 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10660 mov r0, rSELF
10661 add r1, rFP, #OFF_FP_SHADOWFRAME
10662 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10663
10664/* ------------------------------ */
10665 .balign 128
10666.L_ALT_op_add_double: /* 0xab */
10667/* File: arm/alt_stub.S */
10668/*
10669 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10670 * any interesting requests and then jump to the real instruction
10671 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10672 */
10673 .extern MterpCheckBefore
10674 EXPORT_PC
10675 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10676 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10677 mov r0, rSELF
10678 add r1, rFP, #OFF_FP_SHADOWFRAME
10679 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10680
10681/* ------------------------------ */
10682 .balign 128
10683.L_ALT_op_sub_double: /* 0xac */
10684/* File: arm/alt_stub.S */
10685/*
10686 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10687 * any interesting requests and then jump to the real instruction
10688 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10689 */
10690 .extern MterpCheckBefore
10691 EXPORT_PC
10692 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10693 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10694 mov r0, rSELF
10695 add r1, rFP, #OFF_FP_SHADOWFRAME
10696 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10697
10698/* ------------------------------ */
10699 .balign 128
10700.L_ALT_op_mul_double: /* 0xad */
10701/* File: arm/alt_stub.S */
10702/*
10703 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10704 * any interesting requests and then jump to the real instruction
10705 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10706 */
10707 .extern MterpCheckBefore
10708 EXPORT_PC
10709 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10710 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10711 mov r0, rSELF
10712 add r1, rFP, #OFF_FP_SHADOWFRAME
10713 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10714
10715/* ------------------------------ */
10716 .balign 128
10717.L_ALT_op_div_double: /* 0xae */
10718/* File: arm/alt_stub.S */
10719/*
10720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10721 * any interesting requests and then jump to the real instruction
10722 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10723 */
10724 .extern MterpCheckBefore
10725 EXPORT_PC
10726 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10727 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10728 mov r0, rSELF
10729 add r1, rFP, #OFF_FP_SHADOWFRAME
10730 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10731
10732/* ------------------------------ */
10733 .balign 128
10734.L_ALT_op_rem_double: /* 0xaf */
10735/* File: arm/alt_stub.S */
10736/*
10737 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10738 * any interesting requests and then jump to the real instruction
10739 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10740 */
10741 .extern MterpCheckBefore
10742 EXPORT_PC
10743 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10744 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10745 mov r0, rSELF
10746 add r1, rFP, #OFF_FP_SHADOWFRAME
10747 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10748
10749/* ------------------------------ */
10750 .balign 128
10751.L_ALT_op_add_int_2addr: /* 0xb0 */
10752/* File: arm/alt_stub.S */
10753/*
10754 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10755 * any interesting requests and then jump to the real instruction
10756 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10757 */
10758 .extern MterpCheckBefore
10759 EXPORT_PC
10760 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10761 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10762 mov r0, rSELF
10763 add r1, rFP, #OFF_FP_SHADOWFRAME
10764 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10765
10766/* ------------------------------ */
10767 .balign 128
10768.L_ALT_op_sub_int_2addr: /* 0xb1 */
10769/* File: arm/alt_stub.S */
10770/*
10771 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10772 * any interesting requests and then jump to the real instruction
10773 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10774 */
10775 .extern MterpCheckBefore
10776 EXPORT_PC
10777 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10778 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10779 mov r0, rSELF
10780 add r1, rFP, #OFF_FP_SHADOWFRAME
10781 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10782
10783/* ------------------------------ */
10784 .balign 128
10785.L_ALT_op_mul_int_2addr: /* 0xb2 */
10786/* File: arm/alt_stub.S */
10787/*
10788 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10789 * any interesting requests and then jump to the real instruction
10790 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10791 */
10792 .extern MterpCheckBefore
10793 EXPORT_PC
10794 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10795 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10796 mov r0, rSELF
10797 add r1, rFP, #OFF_FP_SHADOWFRAME
10798 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10799
10800/* ------------------------------ */
10801 .balign 128
10802.L_ALT_op_div_int_2addr: /* 0xb3 */
10803/* File: arm/alt_stub.S */
10804/*
10805 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10806 * any interesting requests and then jump to the real instruction
10807 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10808 */
10809 .extern MterpCheckBefore
10810 EXPORT_PC
10811 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10812 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
10813 mov r0, rSELF
10814 add r1, rFP, #OFF_FP_SHADOWFRAME
10815 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10816
10817/* ------------------------------ */
10818 .balign 128
10819.L_ALT_op_rem_int_2addr: /* 0xb4 */
10820/* File: arm/alt_stub.S */
10821/*
10822 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10823 * any interesting requests and then jump to the real instruction
10824 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10825 */
10826 .extern MterpCheckBefore
10827 EXPORT_PC
10828 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10829 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
10830 mov r0, rSELF
10831 add r1, rFP, #OFF_FP_SHADOWFRAME
10832 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10833
10834/* ------------------------------ */
10835 .balign 128
10836.L_ALT_op_and_int_2addr: /* 0xb5 */
10837/* File: arm/alt_stub.S */
10838/*
10839 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10840 * any interesting requests and then jump to the real instruction
10841 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10842 */
10843 .extern MterpCheckBefore
10844 EXPORT_PC
10845 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10846 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
10847 mov r0, rSELF
10848 add r1, rFP, #OFF_FP_SHADOWFRAME
10849 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10850
10851/* ------------------------------ */
10852 .balign 128
10853.L_ALT_op_or_int_2addr: /* 0xb6 */
10854/* File: arm/alt_stub.S */
10855/*
10856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10857 * any interesting requests and then jump to the real instruction
10858 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10859 */
10860 .extern MterpCheckBefore
10861 EXPORT_PC
10862 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10863 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
10864 mov r0, rSELF
10865 add r1, rFP, #OFF_FP_SHADOWFRAME
10866 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10867
10868/* ------------------------------ */
10869 .balign 128
10870.L_ALT_op_xor_int_2addr: /* 0xb7 */
10871/* File: arm/alt_stub.S */
10872/*
10873 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10874 * any interesting requests and then jump to the real instruction
10875 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10876 */
10877 .extern MterpCheckBefore
10878 EXPORT_PC
10879 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10880 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
10881 mov r0, rSELF
10882 add r1, rFP, #OFF_FP_SHADOWFRAME
10883 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10884
10885/* ------------------------------ */
10886 .balign 128
10887.L_ALT_op_shl_int_2addr: /* 0xb8 */
10888/* File: arm/alt_stub.S */
10889/*
10890 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10891 * any interesting requests and then jump to the real instruction
10892 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10893 */
10894 .extern MterpCheckBefore
10895 EXPORT_PC
10896 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10897 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
10898 mov r0, rSELF
10899 add r1, rFP, #OFF_FP_SHADOWFRAME
10900 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10901
10902/* ------------------------------ */
10903 .balign 128
10904.L_ALT_op_shr_int_2addr: /* 0xb9 */
10905/* File: arm/alt_stub.S */
10906/*
10907 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10908 * any interesting requests and then jump to the real instruction
10909 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10910 */
10911 .extern MterpCheckBefore
10912 EXPORT_PC
10913 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10914 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
10915 mov r0, rSELF
10916 add r1, rFP, #OFF_FP_SHADOWFRAME
10917 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10918
10919/* ------------------------------ */
10920 .balign 128
10921.L_ALT_op_ushr_int_2addr: /* 0xba */
10922/* File: arm/alt_stub.S */
10923/*
10924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10925 * any interesting requests and then jump to the real instruction
10926 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10927 */
10928 .extern MterpCheckBefore
10929 EXPORT_PC
10930 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10931 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
10932 mov r0, rSELF
10933 add r1, rFP, #OFF_FP_SHADOWFRAME
10934 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10935
10936/* ------------------------------ */
10937 .balign 128
10938.L_ALT_op_add_long_2addr: /* 0xbb */
10939/* File: arm/alt_stub.S */
10940/*
10941 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10942 * any interesting requests and then jump to the real instruction
10943 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10944 */
10945 .extern MterpCheckBefore
10946 EXPORT_PC
10947 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10948 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
10949 mov r0, rSELF
10950 add r1, rFP, #OFF_FP_SHADOWFRAME
10951 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10952
10953/* ------------------------------ */
10954 .balign 128
10955.L_ALT_op_sub_long_2addr: /* 0xbc */
10956/* File: arm/alt_stub.S */
10957/*
10958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10959 * any interesting requests and then jump to the real instruction
10960 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10961 */
10962 .extern MterpCheckBefore
10963 EXPORT_PC
10964 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10965 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
10966 mov r0, rSELF
10967 add r1, rFP, #OFF_FP_SHADOWFRAME
10968 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10969
10970/* ------------------------------ */
10971 .balign 128
10972.L_ALT_op_mul_long_2addr: /* 0xbd */
10973/* File: arm/alt_stub.S */
10974/*
10975 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10976 * any interesting requests and then jump to the real instruction
10977 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10978 */
10979 .extern MterpCheckBefore
10980 EXPORT_PC
10981 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10982 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
10983 mov r0, rSELF
10984 add r1, rFP, #OFF_FP_SHADOWFRAME
10985 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10986
10987/* ------------------------------ */
10988 .balign 128
10989.L_ALT_op_div_long_2addr: /* 0xbe */
10990/* File: arm/alt_stub.S */
10991/*
10992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10993 * any interesting requests and then jump to the real instruction
10994 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10995 */
10996 .extern MterpCheckBefore
10997 EXPORT_PC
10998 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10999 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
11000 mov r0, rSELF
11001 add r1, rFP, #OFF_FP_SHADOWFRAME
11002 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11003
11004/* ------------------------------ */
11005 .balign 128
11006.L_ALT_op_rem_long_2addr: /* 0xbf */
11007/* File: arm/alt_stub.S */
11008/*
11009 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11010 * any interesting requests and then jump to the real instruction
11011 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11012 */
11013 .extern MterpCheckBefore
11014 EXPORT_PC
11015 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11016 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
11017 mov r0, rSELF
11018 add r1, rFP, #OFF_FP_SHADOWFRAME
11019 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11020
11021/* ------------------------------ */
11022 .balign 128
11023.L_ALT_op_and_long_2addr: /* 0xc0 */
11024/* File: arm/alt_stub.S */
11025/*
11026 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11027 * any interesting requests and then jump to the real instruction
11028 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11029 */
11030 .extern MterpCheckBefore
11031 EXPORT_PC
11032 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11033 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
11034 mov r0, rSELF
11035 add r1, rFP, #OFF_FP_SHADOWFRAME
11036 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11037
11038/* ------------------------------ */
11039 .balign 128
11040.L_ALT_op_or_long_2addr: /* 0xc1 */
11041/* File: arm/alt_stub.S */
11042/*
11043 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11044 * any interesting requests and then jump to the real instruction
11045 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11046 */
11047 .extern MterpCheckBefore
11048 EXPORT_PC
11049 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11050 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
11051 mov r0, rSELF
11052 add r1, rFP, #OFF_FP_SHADOWFRAME
11053 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11054
11055/* ------------------------------ */
11056 .balign 128
11057.L_ALT_op_xor_long_2addr: /* 0xc2 */
11058/* File: arm/alt_stub.S */
11059/*
11060 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11061 * any interesting requests and then jump to the real instruction
11062 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11063 */
11064 .extern MterpCheckBefore
11065 EXPORT_PC
11066 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11067 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
11068 mov r0, rSELF
11069 add r1, rFP, #OFF_FP_SHADOWFRAME
11070 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11071
11072/* ------------------------------ */
11073 .balign 128
11074.L_ALT_op_shl_long_2addr: /* 0xc3 */
11075/* File: arm/alt_stub.S */
11076/*
11077 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11078 * any interesting requests and then jump to the real instruction
11079 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11080 */
11081 .extern MterpCheckBefore
11082 EXPORT_PC
11083 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11084 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11085 mov r0, rSELF
11086 add r1, rFP, #OFF_FP_SHADOWFRAME
11087 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11088
11089/* ------------------------------ */
11090 .balign 128
11091.L_ALT_op_shr_long_2addr: /* 0xc4 */
11092/* File: arm/alt_stub.S */
11093/*
11094 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11095 * any interesting requests and then jump to the real instruction
11096 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11097 */
11098 .extern MterpCheckBefore
11099 EXPORT_PC
11100 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11101 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11102 mov r0, rSELF
11103 add r1, rFP, #OFF_FP_SHADOWFRAME
11104 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11105
11106/* ------------------------------ */
11107 .balign 128
11108.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11109/* File: arm/alt_stub.S */
11110/*
11111 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11112 * any interesting requests and then jump to the real instruction
11113 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11114 */
11115 .extern MterpCheckBefore
11116 EXPORT_PC
11117 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11118 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11119 mov r0, rSELF
11120 add r1, rFP, #OFF_FP_SHADOWFRAME
11121 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11122
11123/* ------------------------------ */
11124 .balign 128
11125.L_ALT_op_add_float_2addr: /* 0xc6 */
11126/* File: arm/alt_stub.S */
11127/*
11128 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11129 * any interesting requests and then jump to the real instruction
11130 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11131 */
11132 .extern MterpCheckBefore
11133 EXPORT_PC
11134 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11135 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11136 mov r0, rSELF
11137 add r1, rFP, #OFF_FP_SHADOWFRAME
11138 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11139
11140/* ------------------------------ */
11141 .balign 128
11142.L_ALT_op_sub_float_2addr: /* 0xc7 */
11143/* File: arm/alt_stub.S */
11144/*
11145 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11146 * any interesting requests and then jump to the real instruction
11147 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11148 */
11149 .extern MterpCheckBefore
11150 EXPORT_PC
11151 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11152 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11153 mov r0, rSELF
11154 add r1, rFP, #OFF_FP_SHADOWFRAME
11155 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11156
11157/* ------------------------------ */
11158 .balign 128
11159.L_ALT_op_mul_float_2addr: /* 0xc8 */
11160/* File: arm/alt_stub.S */
11161/*
11162 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11163 * any interesting requests and then jump to the real instruction
11164 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11165 */
11166 .extern MterpCheckBefore
11167 EXPORT_PC
11168 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11169 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11170 mov r0, rSELF
11171 add r1, rFP, #OFF_FP_SHADOWFRAME
11172 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11173
11174/* ------------------------------ */
11175 .balign 128
11176.L_ALT_op_div_float_2addr: /* 0xc9 */
11177/* File: arm/alt_stub.S */
11178/*
11179 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11180 * any interesting requests and then jump to the real instruction
11181 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11182 */
11183 .extern MterpCheckBefore
11184 EXPORT_PC
11185 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11186 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11187 mov r0, rSELF
11188 add r1, rFP, #OFF_FP_SHADOWFRAME
11189 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11190
11191/* ------------------------------ */
11192 .balign 128
11193.L_ALT_op_rem_float_2addr: /* 0xca */
11194/* File: arm/alt_stub.S */
11195/*
11196 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11197 * any interesting requests and then jump to the real instruction
11198 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11199 */
11200 .extern MterpCheckBefore
11201 EXPORT_PC
11202 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11203 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11204 mov r0, rSELF
11205 add r1, rFP, #OFF_FP_SHADOWFRAME
11206 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11207
11208/* ------------------------------ */
11209 .balign 128
11210.L_ALT_op_add_double_2addr: /* 0xcb */
11211/* File: arm/alt_stub.S */
11212/*
11213 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11214 * any interesting requests and then jump to the real instruction
11215 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11216 */
11217 .extern MterpCheckBefore
11218 EXPORT_PC
11219 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11220 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11221 mov r0, rSELF
11222 add r1, rFP, #OFF_FP_SHADOWFRAME
11223 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11224
11225/* ------------------------------ */
11226 .balign 128
11227.L_ALT_op_sub_double_2addr: /* 0xcc */
11228/* File: arm/alt_stub.S */
11229/*
11230 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11231 * any interesting requests and then jump to the real instruction
11232 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11233 */
11234 .extern MterpCheckBefore
11235 EXPORT_PC
11236 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11237 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11238 mov r0, rSELF
11239 add r1, rFP, #OFF_FP_SHADOWFRAME
11240 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11241
11242/* ------------------------------ */
11243 .balign 128
11244.L_ALT_op_mul_double_2addr: /* 0xcd */
11245/* File: arm/alt_stub.S */
11246/*
11247 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11248 * any interesting requests and then jump to the real instruction
11249 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11250 */
11251 .extern MterpCheckBefore
11252 EXPORT_PC
11253 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11254 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11255 mov r0, rSELF
11256 add r1, rFP, #OFF_FP_SHADOWFRAME
11257 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11258
11259/* ------------------------------ */
11260 .balign 128
11261.L_ALT_op_div_double_2addr: /* 0xce */
11262/* File: arm/alt_stub.S */
11263/*
11264 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11265 * any interesting requests and then jump to the real instruction
11266 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11267 */
11268 .extern MterpCheckBefore
11269 EXPORT_PC
11270 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11271 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11272 mov r0, rSELF
11273 add r1, rFP, #OFF_FP_SHADOWFRAME
11274 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11275
11276/* ------------------------------ */
11277 .balign 128
11278.L_ALT_op_rem_double_2addr: /* 0xcf */
11279/* File: arm/alt_stub.S */
11280/*
11281 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11282 * any interesting requests and then jump to the real instruction
11283 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11284 */
11285 .extern MterpCheckBefore
11286 EXPORT_PC
11287 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11288 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11289 mov r0, rSELF
11290 add r1, rFP, #OFF_FP_SHADOWFRAME
11291 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11292
11293/* ------------------------------ */
11294 .balign 128
11295.L_ALT_op_add_int_lit16: /* 0xd0 */
11296/* File: arm/alt_stub.S */
11297/*
11298 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11299 * any interesting requests and then jump to the real instruction
11300 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11301 */
11302 .extern MterpCheckBefore
11303 EXPORT_PC
11304 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11305 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11306 mov r0, rSELF
11307 add r1, rFP, #OFF_FP_SHADOWFRAME
11308 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11309
11310/* ------------------------------ */
11311 .balign 128
11312.L_ALT_op_rsub_int: /* 0xd1 */
11313/* File: arm/alt_stub.S */
11314/*
11315 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11316 * any interesting requests and then jump to the real instruction
11317 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11318 */
11319 .extern MterpCheckBefore
11320 EXPORT_PC
11321 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11322 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11323 mov r0, rSELF
11324 add r1, rFP, #OFF_FP_SHADOWFRAME
11325 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11326
11327/* ------------------------------ */
11328 .balign 128
11329.L_ALT_op_mul_int_lit16: /* 0xd2 */
11330/* File: arm/alt_stub.S */
11331/*
11332 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11333 * any interesting requests and then jump to the real instruction
11334 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11335 */
11336 .extern MterpCheckBefore
11337 EXPORT_PC
11338 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11339 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11340 mov r0, rSELF
11341 add r1, rFP, #OFF_FP_SHADOWFRAME
11342 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11343
11344/* ------------------------------ */
11345 .balign 128
11346.L_ALT_op_div_int_lit16: /* 0xd3 */
11347/* File: arm/alt_stub.S */
11348/*
11349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11350 * any interesting requests and then jump to the real instruction
11351 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11352 */
11353 .extern MterpCheckBefore
11354 EXPORT_PC
11355 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11356 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11357 mov r0, rSELF
11358 add r1, rFP, #OFF_FP_SHADOWFRAME
11359 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11360
11361/* ------------------------------ */
11362 .balign 128
11363.L_ALT_op_rem_int_lit16: /* 0xd4 */
11364/* File: arm/alt_stub.S */
11365/*
11366 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11367 * any interesting requests and then jump to the real instruction
11368 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11369 */
11370 .extern MterpCheckBefore
11371 EXPORT_PC
11372 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11373 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11374 mov r0, rSELF
11375 add r1, rFP, #OFF_FP_SHADOWFRAME
11376 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11377
11378/* ------------------------------ */
11379 .balign 128
11380.L_ALT_op_and_int_lit16: /* 0xd5 */
11381/* File: arm/alt_stub.S */
11382/*
11383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11384 * any interesting requests and then jump to the real instruction
11385 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11386 */
11387 .extern MterpCheckBefore
11388 EXPORT_PC
11389 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11390 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11391 mov r0, rSELF
11392 add r1, rFP, #OFF_FP_SHADOWFRAME
11393 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11394
11395/* ------------------------------ */
11396 .balign 128
11397.L_ALT_op_or_int_lit16: /* 0xd6 */
11398/* File: arm/alt_stub.S */
11399/*
11400 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11401 * any interesting requests and then jump to the real instruction
11402 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11403 */
11404 .extern MterpCheckBefore
11405 EXPORT_PC
11406 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11407 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11408 mov r0, rSELF
11409 add r1, rFP, #OFF_FP_SHADOWFRAME
11410 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11411
11412/* ------------------------------ */
11413 .balign 128
11414.L_ALT_op_xor_int_lit16: /* 0xd7 */
11415/* File: arm/alt_stub.S */
11416/*
11417 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11418 * any interesting requests and then jump to the real instruction
11419 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11420 */
11421 .extern MterpCheckBefore
11422 EXPORT_PC
11423 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11424 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11425 mov r0, rSELF
11426 add r1, rFP, #OFF_FP_SHADOWFRAME
11427 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11428
11429/* ------------------------------ */
11430 .balign 128
11431.L_ALT_op_add_int_lit8: /* 0xd8 */
11432/* File: arm/alt_stub.S */
11433/*
11434 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11435 * any interesting requests and then jump to the real instruction
11436 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11437 */
11438 .extern MterpCheckBefore
11439 EXPORT_PC
11440 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11441 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11442 mov r0, rSELF
11443 add r1, rFP, #OFF_FP_SHADOWFRAME
11444 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11445
11446/* ------------------------------ */
11447 .balign 128
11448.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11449/* File: arm/alt_stub.S */
11450/*
11451 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11452 * any interesting requests and then jump to the real instruction
11453 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11454 */
11455 .extern MterpCheckBefore
11456 EXPORT_PC
11457 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11458 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11459 mov r0, rSELF
11460 add r1, rFP, #OFF_FP_SHADOWFRAME
11461 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11462
11463/* ------------------------------ */
11464 .balign 128
11465.L_ALT_op_mul_int_lit8: /* 0xda */
11466/* File: arm/alt_stub.S */
11467/*
11468 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11469 * any interesting requests and then jump to the real instruction
11470 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11471 */
11472 .extern MterpCheckBefore
11473 EXPORT_PC
11474 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11475 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11476 mov r0, rSELF
11477 add r1, rFP, #OFF_FP_SHADOWFRAME
11478 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11479
11480/* ------------------------------ */
11481 .balign 128
11482.L_ALT_op_div_int_lit8: /* 0xdb */
11483/* File: arm/alt_stub.S */
11484/*
11485 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11486 * any interesting requests and then jump to the real instruction
11487 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11488 */
11489 .extern MterpCheckBefore
11490 EXPORT_PC
11491 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11492 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11493 mov r0, rSELF
11494 add r1, rFP, #OFF_FP_SHADOWFRAME
11495 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11496
11497/* ------------------------------ */
11498 .balign 128
11499.L_ALT_op_rem_int_lit8: /* 0xdc */
11500/* File: arm/alt_stub.S */
11501/*
11502 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11503 * any interesting requests and then jump to the real instruction
11504 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11505 */
11506 .extern MterpCheckBefore
11507 EXPORT_PC
11508 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11509 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11510 mov r0, rSELF
11511 add r1, rFP, #OFF_FP_SHADOWFRAME
11512 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11513
11514/* ------------------------------ */
11515 .balign 128
11516.L_ALT_op_and_int_lit8: /* 0xdd */
11517/* File: arm/alt_stub.S */
11518/*
11519 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11520 * any interesting requests and then jump to the real instruction
11521 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11522 */
11523 .extern MterpCheckBefore
11524 EXPORT_PC
11525 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11526 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11527 mov r0, rSELF
11528 add r1, rFP, #OFF_FP_SHADOWFRAME
11529 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11530
11531/* ------------------------------ */
11532 .balign 128
11533.L_ALT_op_or_int_lit8: /* 0xde */
11534/* File: arm/alt_stub.S */
11535/*
11536 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11537 * any interesting requests and then jump to the real instruction
11538 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11539 */
11540 .extern MterpCheckBefore
11541 EXPORT_PC
11542 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11543 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11544 mov r0, rSELF
11545 add r1, rFP, #OFF_FP_SHADOWFRAME
11546 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11547
11548/* ------------------------------ */
11549 .balign 128
11550.L_ALT_op_xor_int_lit8: /* 0xdf */
11551/* File: arm/alt_stub.S */
11552/*
11553 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11554 * any interesting requests and then jump to the real instruction
11555 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11556 */
11557 .extern MterpCheckBefore
11558 EXPORT_PC
11559 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11560 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11561 mov r0, rSELF
11562 add r1, rFP, #OFF_FP_SHADOWFRAME
11563 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11564
11565/* ------------------------------ */
11566 .balign 128
11567.L_ALT_op_shl_int_lit8: /* 0xe0 */
11568/* File: arm/alt_stub.S */
11569/*
11570 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11571 * any interesting requests and then jump to the real instruction
11572 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11573 */
11574 .extern MterpCheckBefore
11575 EXPORT_PC
11576 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11577 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11578 mov r0, rSELF
11579 add r1, rFP, #OFF_FP_SHADOWFRAME
11580 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11581
11582/* ------------------------------ */
11583 .balign 128
11584.L_ALT_op_shr_int_lit8: /* 0xe1 */
11585/* File: arm/alt_stub.S */
11586/*
11587 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11588 * any interesting requests and then jump to the real instruction
11589 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11590 */
11591 .extern MterpCheckBefore
11592 EXPORT_PC
11593 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11594 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11595 mov r0, rSELF
11596 add r1, rFP, #OFF_FP_SHADOWFRAME
11597 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11598
11599/* ------------------------------ */
11600 .balign 128
11601.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11602/* File: arm/alt_stub.S */
11603/*
11604 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11605 * any interesting requests and then jump to the real instruction
11606 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11607 */
11608 .extern MterpCheckBefore
11609 EXPORT_PC
11610 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11611 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11612 mov r0, rSELF
11613 add r1, rFP, #OFF_FP_SHADOWFRAME
11614 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11615
11616/* ------------------------------ */
11617 .balign 128
11618.L_ALT_op_iget_quick: /* 0xe3 */
11619/* File: arm/alt_stub.S */
11620/*
11621 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11622 * any interesting requests and then jump to the real instruction
11623 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11624 */
11625 .extern MterpCheckBefore
11626 EXPORT_PC
11627 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11628 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11629 mov r0, rSELF
11630 add r1, rFP, #OFF_FP_SHADOWFRAME
11631 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11632
11633/* ------------------------------ */
11634 .balign 128
11635.L_ALT_op_iget_wide_quick: /* 0xe4 */
11636/* File: arm/alt_stub.S */
11637/*
11638 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11639 * any interesting requests and then jump to the real instruction
11640 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11641 */
11642 .extern MterpCheckBefore
11643 EXPORT_PC
11644 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11645 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11646 mov r0, rSELF
11647 add r1, rFP, #OFF_FP_SHADOWFRAME
11648 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11649
11650/* ------------------------------ */
11651 .balign 128
11652.L_ALT_op_iget_object_quick: /* 0xe5 */
11653/* File: arm/alt_stub.S */
11654/*
11655 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11656 * any interesting requests and then jump to the real instruction
11657 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11658 */
11659 .extern MterpCheckBefore
11660 EXPORT_PC
11661 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11662 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11663 mov r0, rSELF
11664 add r1, rFP, #OFF_FP_SHADOWFRAME
11665 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11666
11667/* ------------------------------ */
11668 .balign 128
11669.L_ALT_op_iput_quick: /* 0xe6 */
11670/* File: arm/alt_stub.S */
11671/*
11672 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11673 * any interesting requests and then jump to the real instruction
11674 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11675 */
11676 .extern MterpCheckBefore
11677 EXPORT_PC
11678 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11679 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11680 mov r0, rSELF
11681 add r1, rFP, #OFF_FP_SHADOWFRAME
11682 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11683
11684/* ------------------------------ */
11685 .balign 128
11686.L_ALT_op_iput_wide_quick: /* 0xe7 */
11687/* File: arm/alt_stub.S */
11688/*
11689 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11690 * any interesting requests and then jump to the real instruction
11691 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11692 */
11693 .extern MterpCheckBefore
11694 EXPORT_PC
11695 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11696 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11697 mov r0, rSELF
11698 add r1, rFP, #OFF_FP_SHADOWFRAME
11699 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11700
11701/* ------------------------------ */
11702 .balign 128
11703.L_ALT_op_iput_object_quick: /* 0xe8 */
11704/* File: arm/alt_stub.S */
11705/*
11706 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11707 * any interesting requests and then jump to the real instruction
11708 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11709 */
11710 .extern MterpCheckBefore
11711 EXPORT_PC
11712 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11713 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11714 mov r0, rSELF
11715 add r1, rFP, #OFF_FP_SHADOWFRAME
11716 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11717
11718/* ------------------------------ */
11719 .balign 128
11720.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11721/* File: arm/alt_stub.S */
11722/*
11723 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11724 * any interesting requests and then jump to the real instruction
11725 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11726 */
11727 .extern MterpCheckBefore
11728 EXPORT_PC
11729 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11730 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11731 mov r0, rSELF
11732 add r1, rFP, #OFF_FP_SHADOWFRAME
11733 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11734
11735/* ------------------------------ */
11736 .balign 128
11737.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11738/* File: arm/alt_stub.S */
11739/*
11740 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11741 * any interesting requests and then jump to the real instruction
11742 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11743 */
11744 .extern MterpCheckBefore
11745 EXPORT_PC
11746 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11747 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11748 mov r0, rSELF
11749 add r1, rFP, #OFF_FP_SHADOWFRAME
11750 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11751
11752/* ------------------------------ */
11753 .balign 128
11754.L_ALT_op_iput_boolean_quick: /* 0xeb */
11755/* File: arm/alt_stub.S */
11756/*
11757 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11758 * any interesting requests and then jump to the real instruction
11759 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11760 */
11761 .extern MterpCheckBefore
11762 EXPORT_PC
11763 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11764 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11765 mov r0, rSELF
11766 add r1, rFP, #OFF_FP_SHADOWFRAME
11767 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11768
11769/* ------------------------------ */
11770 .balign 128
11771.L_ALT_op_iput_byte_quick: /* 0xec */
11772/* File: arm/alt_stub.S */
11773/*
11774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11775 * any interesting requests and then jump to the real instruction
11776 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11777 */
11778 .extern MterpCheckBefore
11779 EXPORT_PC
11780 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11781 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11782 mov r0, rSELF
11783 add r1, rFP, #OFF_FP_SHADOWFRAME
11784 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11785
11786/* ------------------------------ */
11787 .balign 128
11788.L_ALT_op_iput_char_quick: /* 0xed */
11789/* File: arm/alt_stub.S */
11790/*
11791 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11792 * any interesting requests and then jump to the real instruction
11793 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11794 */
11795 .extern MterpCheckBefore
11796 EXPORT_PC
11797 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11798 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11799 mov r0, rSELF
11800 add r1, rFP, #OFF_FP_SHADOWFRAME
11801 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11802
11803/* ------------------------------ */
11804 .balign 128
11805.L_ALT_op_iput_short_quick: /* 0xee */
11806/* File: arm/alt_stub.S */
11807/*
11808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11809 * any interesting requests and then jump to the real instruction
11810 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11811 */
11812 .extern MterpCheckBefore
11813 EXPORT_PC
11814 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11815 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
11816 mov r0, rSELF
11817 add r1, rFP, #OFF_FP_SHADOWFRAME
11818 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11819
11820/* ------------------------------ */
11821 .balign 128
11822.L_ALT_op_iget_boolean_quick: /* 0xef */
11823/* File: arm/alt_stub.S */
11824/*
11825 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11826 * any interesting requests and then jump to the real instruction
11827 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11828 */
11829 .extern MterpCheckBefore
11830 EXPORT_PC
11831 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11832 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
11833 mov r0, rSELF
11834 add r1, rFP, #OFF_FP_SHADOWFRAME
11835 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11836
11837/* ------------------------------ */
11838 .balign 128
11839.L_ALT_op_iget_byte_quick: /* 0xf0 */
11840/* File: arm/alt_stub.S */
11841/*
11842 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11843 * any interesting requests and then jump to the real instruction
11844 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11845 */
11846 .extern MterpCheckBefore
11847 EXPORT_PC
11848 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11849 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
11850 mov r0, rSELF
11851 add r1, rFP, #OFF_FP_SHADOWFRAME
11852 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11853
11854/* ------------------------------ */
11855 .balign 128
11856.L_ALT_op_iget_char_quick: /* 0xf1 */
11857/* File: arm/alt_stub.S */
11858/*
11859 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11860 * any interesting requests and then jump to the real instruction
11861 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11862 */
11863 .extern MterpCheckBefore
11864 EXPORT_PC
11865 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11866 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
11867 mov r0, rSELF
11868 add r1, rFP, #OFF_FP_SHADOWFRAME
11869 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11870
11871/* ------------------------------ */
11872 .balign 128
11873.L_ALT_op_iget_short_quick: /* 0xf2 */
11874/* File: arm/alt_stub.S */
11875/*
11876 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11877 * any interesting requests and then jump to the real instruction
11878 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11879 */
11880 .extern MterpCheckBefore
11881 EXPORT_PC
11882 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11883 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
11884 mov r0, rSELF
11885 add r1, rFP, #OFF_FP_SHADOWFRAME
11886 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11887
11888/* ------------------------------ */
11889 .balign 128
11890.L_ALT_op_invoke_lambda: /* 0xf3 */
11891/* File: arm/alt_stub.S */
11892/*
11893 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11894 * any interesting requests and then jump to the real instruction
11895 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11896 */
11897 .extern MterpCheckBefore
11898 EXPORT_PC
11899 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11900 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
11901 mov r0, rSELF
11902 add r1, rFP, #OFF_FP_SHADOWFRAME
11903 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11904
11905/* ------------------------------ */
11906 .balign 128
11907.L_ALT_op_unused_f4: /* 0xf4 */
11908/* File: arm/alt_stub.S */
11909/*
11910 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11911 * any interesting requests and then jump to the real instruction
11912 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11913 */
11914 .extern MterpCheckBefore
11915 EXPORT_PC
11916 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11917 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
11918 mov r0, rSELF
11919 add r1, rFP, #OFF_FP_SHADOWFRAME
11920 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11921
11922/* ------------------------------ */
11923 .balign 128
11924.L_ALT_op_capture_variable: /* 0xf5 */
11925/* File: arm/alt_stub.S */
11926/*
11927 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11928 * any interesting requests and then jump to the real instruction
11929 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11930 */
11931 .extern MterpCheckBefore
11932 EXPORT_PC
11933 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11934 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
11935 mov r0, rSELF
11936 add r1, rFP, #OFF_FP_SHADOWFRAME
11937 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11938
11939/* ------------------------------ */
11940 .balign 128
11941.L_ALT_op_create_lambda: /* 0xf6 */
11942/* File: arm/alt_stub.S */
11943/*
11944 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11945 * any interesting requests and then jump to the real instruction
11946 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11947 */
11948 .extern MterpCheckBefore
11949 EXPORT_PC
11950 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11951 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
11952 mov r0, rSELF
11953 add r1, rFP, #OFF_FP_SHADOWFRAME
11954 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11955
11956/* ------------------------------ */
11957 .balign 128
11958.L_ALT_op_liberate_variable: /* 0xf7 */
11959/* File: arm/alt_stub.S */
11960/*
11961 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11962 * any interesting requests and then jump to the real instruction
11963 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11964 */
11965 .extern MterpCheckBefore
11966 EXPORT_PC
11967 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11968 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
11969 mov r0, rSELF
11970 add r1, rFP, #OFF_FP_SHADOWFRAME
11971 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11972
11973/* ------------------------------ */
11974 .balign 128
11975.L_ALT_op_box_lambda: /* 0xf8 */
11976/* File: arm/alt_stub.S */
11977/*
11978 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11979 * any interesting requests and then jump to the real instruction
11980 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11981 */
11982 .extern MterpCheckBefore
11983 EXPORT_PC
11984 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11985 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
11986 mov r0, rSELF
11987 add r1, rFP, #OFF_FP_SHADOWFRAME
11988 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11989
11990/* ------------------------------ */
11991 .balign 128
11992.L_ALT_op_unbox_lambda: /* 0xf9 */
11993/* File: arm/alt_stub.S */
11994/*
11995 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11996 * any interesting requests and then jump to the real instruction
11997 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11998 */
11999 .extern MterpCheckBefore
12000 EXPORT_PC
12001 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12002 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
12003 mov r0, rSELF
12004 add r1, rFP, #OFF_FP_SHADOWFRAME
12005 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12006
12007/* ------------------------------ */
12008 .balign 128
12009.L_ALT_op_unused_fa: /* 0xfa */
12010/* File: arm/alt_stub.S */
12011/*
12012 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12013 * any interesting requests and then jump to the real instruction
12014 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12015 */
12016 .extern MterpCheckBefore
12017 EXPORT_PC
12018 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12019 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
12020 mov r0, rSELF
12021 add r1, rFP, #OFF_FP_SHADOWFRAME
12022 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12023
12024/* ------------------------------ */
12025 .balign 128
12026.L_ALT_op_unused_fb: /* 0xfb */
12027/* File: arm/alt_stub.S */
12028/*
12029 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12030 * any interesting requests and then jump to the real instruction
12031 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12032 */
12033 .extern MterpCheckBefore
12034 EXPORT_PC
12035 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12036 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
12037 mov r0, rSELF
12038 add r1, rFP, #OFF_FP_SHADOWFRAME
12039 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12040
12041/* ------------------------------ */
12042 .balign 128
12043.L_ALT_op_unused_fc: /* 0xfc */
12044/* File: arm/alt_stub.S */
12045/*
12046 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12047 * any interesting requests and then jump to the real instruction
12048 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12049 */
12050 .extern MterpCheckBefore
12051 EXPORT_PC
12052 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12053 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
12054 mov r0, rSELF
12055 add r1, rFP, #OFF_FP_SHADOWFRAME
12056 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12057
12058/* ------------------------------ */
12059 .balign 128
12060.L_ALT_op_unused_fd: /* 0xfd */
12061/* File: arm/alt_stub.S */
12062/*
12063 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12064 * any interesting requests and then jump to the real instruction
12065 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12066 */
12067 .extern MterpCheckBefore
12068 EXPORT_PC
12069 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12070 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
12071 mov r0, rSELF
12072 add r1, rFP, #OFF_FP_SHADOWFRAME
12073 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12074
12075/* ------------------------------ */
12076 .balign 128
12077.L_ALT_op_unused_fe: /* 0xfe */
12078/* File: arm/alt_stub.S */
12079/*
12080 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12081 * any interesting requests and then jump to the real instruction
12082 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12083 */
12084 .extern MterpCheckBefore
12085 EXPORT_PC
12086 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12087 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12088 mov r0, rSELF
12089 add r1, rFP, #OFF_FP_SHADOWFRAME
12090 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12091
12092/* ------------------------------ */
12093 .balign 128
12094.L_ALT_op_unused_ff: /* 0xff */
12095/* File: arm/alt_stub.S */
12096/*
12097 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12098 * any interesting requests and then jump to the real instruction
12099 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12100 */
12101 .extern MterpCheckBefore
12102 EXPORT_PC
12103 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12104 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12105 mov r0, rSELF
12106 add r1, rFP, #OFF_FP_SHADOWFRAME
12107 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12108
12109 .balign 128
12110 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12111 .global artMterpAsmAltInstructionEnd
12112artMterpAsmAltInstructionEnd:
12113/* File: arm/footer.S */
12114/*
12115 * ===========================================================================
12116 * Common subroutines and data
12117 * ===========================================================================
12118 */
12119
12120 .text
12121 .align 2
12122
12123/*
12124 * We've detected a condition that will result in an exception, but the exception
12125 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12126 * TUNING: for consistency, we may want to just go ahead and handle these here.
12127 */
buzbee1452bee2015-03-06 14:43:04 -080012128common_errDivideByZero:
12129 EXPORT_PC
12130#if MTERP_LOGGING
12131 mov r0, rSELF
12132 add r1, rFP, #OFF_FP_SHADOWFRAME
12133 bl MterpLogDivideByZeroException
12134#endif
12135 b MterpCommonFallback
12136
12137common_errArrayIndex:
12138 EXPORT_PC
12139#if MTERP_LOGGING
12140 mov r0, rSELF
12141 add r1, rFP, #OFF_FP_SHADOWFRAME
12142 bl MterpLogArrayIndexException
12143#endif
12144 b MterpCommonFallback
12145
12146common_errNegativeArraySize:
12147 EXPORT_PC
12148#if MTERP_LOGGING
12149 mov r0, rSELF
12150 add r1, rFP, #OFF_FP_SHADOWFRAME
12151 bl MterpLogNegativeArraySizeException
12152#endif
12153 b MterpCommonFallback
12154
12155common_errNoSuchMethod:
12156 EXPORT_PC
12157#if MTERP_LOGGING
12158 mov r0, rSELF
12159 add r1, rFP, #OFF_FP_SHADOWFRAME
12160 bl MterpLogNoSuchMethodException
12161#endif
12162 b MterpCommonFallback
12163
12164common_errNullObject:
12165 EXPORT_PC
12166#if MTERP_LOGGING
12167 mov r0, rSELF
12168 add r1, rFP, #OFF_FP_SHADOWFRAME
12169 bl MterpLogNullObjectException
12170#endif
12171 b MterpCommonFallback
12172
12173common_exceptionThrown:
12174 EXPORT_PC
12175#if MTERP_LOGGING
12176 mov r0, rSELF
12177 add r1, rFP, #OFF_FP_SHADOWFRAME
12178 bl MterpLogExceptionThrownException
12179#endif
12180 b MterpCommonFallback
12181
12182MterpSuspendFallback:
12183 EXPORT_PC
12184#if MTERP_LOGGING
12185 mov r0, rSELF
12186 add r1, rFP, #OFF_FP_SHADOWFRAME
12187 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12188 bl MterpLogSuspendFallback
12189#endif
12190 b MterpCommonFallback
12191
12192/*
12193 * If we're here, something is out of the ordinary. If there is a pending
12194 * exception, handle it. Otherwise, roll back and retry with the reference
12195 * interpreter.
12196 */
12197MterpPossibleException:
12198 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12199 cmp r0, #0 @ Exception pending?
12200 beq MterpFallback @ If not, fall back to reference interpreter.
12201 /* intentional fallthrough - handle pending exception. */
12202/*
12203 * On return from a runtime helper routine, we've found a pending exception.
12204 * Can we handle it here - or need to bail out to caller?
12205 *
12206 */
12207MterpException:
12208 mov r0, rSELF
12209 add r1, rFP, #OFF_FP_SHADOWFRAME
12210 bl MterpHandleException @ (self, shadow_frame)
12211 cmp r0, #0
12212 beq MterpExceptionReturn @ no local catch, back to caller.
12213 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12214 ldr r1, [rFP, #OFF_FP_DEX_PC]
12215 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12216 add rPC, r0, #CODEITEM_INSNS_OFFSET
12217 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
Bill Buzbeefd522f92016-02-11 22:37:42 +000012218 /* Do we need to switch interpreters? */
12219 bl MterpShouldSwitchInterpreters
12220 cmp r0, #0
12221 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -080012222 /* resume execution at catch block */
Bill Buzbeefd522f92016-02-11 22:37:42 +000012223 EXPORT_PC
buzbee1452bee2015-03-06 14:43:04 -080012224 FETCH_INST
12225 GET_INST_OPCODE ip
12226 GOTO_OPCODE ip
12227 /* NOTE: no fallthrough */
12228
12229/*
12230 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12231 * still needs to get the opcode and branch to it, and flags are in lr.
12232 */
12233MterpCheckSuspendAndContinue:
12234 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -080012235 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
Bill Buzbeefd522f92016-02-11 22:37:42 +000012236 bne 1f
buzbee1452bee2015-03-06 14:43:04 -080012237 GET_INST_OPCODE ip @ extract opcode from rINST
12238 GOTO_OPCODE ip @ jump to next instruction
Bill Buzbeefd522f92016-02-11 22:37:42 +0000122391:
12240 EXPORT_PC
12241 mov r0, rSELF
12242 bl MterpSuspendCheck @ (self)
12243 cmp r0, #0
12244 bne MterpFallback
12245 GET_INST_OPCODE ip @ extract opcode from rINST
12246 GOTO_OPCODE ip @ jump to next instruction
12247
12248/*
12249 * On-stack replacement has happened, and now we've returned from the compiled method.
12250 */
12251MterpOnStackReplacement:
12252#if MTERP_LOGGING
12253 mov r0, rSELF
12254 add r1, rFP, #OFF_FP_SHADOWFRAME
12255 mov r2, rINST
12256 bl MterpLogOSR
12257#endif
12258 mov r0, #1 @ Signal normal return
12259 b MterpDone
buzbee1452bee2015-03-06 14:43:04 -080012260
12261/*
12262 * Bail out to reference interpreter.
12263 */
12264MterpFallback:
12265 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -080012266#if MTERP_LOGGING
buzbee1452bee2015-03-06 14:43:04 -080012267 mov r0, rSELF
12268 add r1, rFP, #OFF_FP_SHADOWFRAME
12269 bl MterpLogFallback
buzbee76833da2016-01-13 13:06:22 -080012270#endif
buzbee1452bee2015-03-06 14:43:04 -080012271MterpCommonFallback:
12272 mov r0, #0 @ signal retry with reference interpreter.
12273 b MterpDone
12274
12275/*
12276 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12277 * SP and LR. Here we restore SP, restore the registers, and then restore
12278 * LR to PC.
12279 *
12280 * On entry:
12281 * uint32_t* rFP (should still be live, pointer to base of vregs)
12282 */
12283MterpExceptionReturn:
buzbee1452bee2015-03-06 14:43:04 -080012284 mov r0, #1 @ signal return to caller.
12285 b MterpDone
12286MterpReturn:
12287 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
buzbee1452bee2015-03-06 14:43:04 -080012288 str r0, [r2]
12289 str r1, [r2, #4]
buzbee1452bee2015-03-06 14:43:04 -080012290 mov r0, #1 @ signal return to caller.
12291MterpDone:
12292 add sp, sp, #4 @ un-align 64
12293 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12294
12295
12296 .fnend
12297 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12298
12299