blob: 092474d5442d886c32106014e40a57dd0770b215 [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]
buzbeeace690f2016-03-11 09:51:11 -0800346 add rFP, r2, #SHADOWFRAME_VREGS_OFFSET @ point to vregs.
347 VREG_INDEX_TO_ADDR rREFS, r0 @ point to reference array in shadow frame
buzbee1452bee2015-03-06 14:43:04 -0800348 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
buzbeeace690f2016-03-11 09:51:11 -0800438 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B]
439 VREG_INDEX_TO_ADDR r2, rINST @ 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
buzbeeace690f2016-03-11 09:51:11 -0800455 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BBBB]
456 VREG_INDEX_TO_ADDR r2, rINST @ 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
buzbeeace690f2016-03-11 09:51:11 -0800472 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BBBB]
473 VREG_INDEX_TO_ADDR lr, r2 @ 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]
buzbeeace690f2016-03-11 09:51:11 -0800566 VREG_INDEX_TO_ADDR r2, rINST @ 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
buzbeeace690f2016-03-11 09:51:11 -0800658 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800659 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 */
buzbeeace690f2016-03-11 09:51:11 -0800690 sbfx r1, rINST, #12, #4 @ r1<- sssssssB (sign-extended)
buzbee1452bee2015-03-06 14:43:04 -0800691 ubfx r0, rINST, #8, #4 @ r0<- A
692 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -0800693 GET_INST_OPCODE ip @ ip<- opcode from rINST
694 SET_VREG r1, r0 @ fp[A]<- r1
695 GOTO_OPCODE ip @ execute next instruction
696
697/* ------------------------------ */
698 .balign 128
699.L_op_const_16: /* 0x13 */
700/* File: arm/op_const_16.S */
701 /* const/16 vAA, #+BBBB */
buzbeeace690f2016-03-11 09:51:11 -0800702 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended)
buzbee1452bee2015-03-06 14:43:04 -0800703 mov r3, rINST, lsr #8 @ r3<- AA
704 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
705 SET_VREG r0, r3 @ vAA<- r0
706 GET_INST_OPCODE ip @ extract opcode from rINST
707 GOTO_OPCODE ip @ jump to next instruction
708
709/* ------------------------------ */
710 .balign 128
711.L_op_const: /* 0x14 */
712/* File: arm/op_const.S */
713 /* const vAA, #+BBBBbbbb */
714 mov r3, rINST, lsr #8 @ r3<- AA
buzbeeace690f2016-03-11 09:51:11 -0800715 FETCH r0, 1 @ r0<- bbbb (low)
716 FETCH r1, 2 @ r1<- BBBB (high)
buzbee1452bee2015-03-06 14:43:04 -0800717 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
718 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
719 GET_INST_OPCODE ip @ extract opcode from rINST
720 SET_VREG r0, r3 @ vAA<- r0
721 GOTO_OPCODE ip @ jump to next instruction
722
723/* ------------------------------ */
724 .balign 128
725.L_op_const_high16: /* 0x15 */
726/* File: arm/op_const_high16.S */
727 /* const/high16 vAA, #+BBBB0000 */
buzbeeace690f2016-03-11 09:51:11 -0800728 FETCH r0, 1 @ r0<- 0000BBBB (zero-extended)
buzbee1452bee2015-03-06 14:43:04 -0800729 mov r3, rINST, lsr #8 @ r3<- AA
730 mov r0, r0, lsl #16 @ r0<- BBBB0000
731 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
732 SET_VREG r0, r3 @ vAA<- r0
733 GET_INST_OPCODE ip @ extract opcode from rINST
734 GOTO_OPCODE ip @ jump to next instruction
735
736/* ------------------------------ */
737 .balign 128
738.L_op_const_wide_16: /* 0x16 */
739/* File: arm/op_const_wide_16.S */
740 /* const-wide/16 vAA, #+BBBB */
buzbeeace690f2016-03-11 09:51:11 -0800741 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended)
buzbee1452bee2015-03-06 14:43:04 -0800742 mov r3, rINST, lsr #8 @ r3<- AA
743 mov r1, r0, asr #31 @ r1<- ssssssss
744 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -0800745 CLEAR_SHADOW_PAIR r3, r2, lr @ Zero out the shadow regs
buzbeeace690f2016-03-11 09:51:11 -0800746 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800747 GET_INST_OPCODE ip @ extract opcode from rINST
748 stmia r3, {r0-r1} @ vAA<- r0/r1
749 GOTO_OPCODE ip @ jump to next instruction
750
751/* ------------------------------ */
752 .balign 128
753.L_op_const_wide_32: /* 0x17 */
754/* File: arm/op_const_wide_32.S */
755 /* const-wide/32 vAA, #+BBBBbbbb */
756 FETCH r0, 1 @ r0<- 0000bbbb (low)
757 mov r3, rINST, lsr #8 @ r3<- AA
758 FETCH_S r2, 2 @ r2<- ssssBBBB (high)
759 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
760 orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb
buzbee50cf6002016-02-10 08:59:12 -0800761 CLEAR_SHADOW_PAIR r3, r2, lr @ Zero out the shadow regs
buzbeeace690f2016-03-11 09:51:11 -0800762 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800763 mov r1, r0, asr #31 @ r1<- ssssssss
764 GET_INST_OPCODE ip @ extract opcode from rINST
765 stmia r3, {r0-r1} @ vAA<- r0/r1
766 GOTO_OPCODE ip @ jump to next instruction
767
768/* ------------------------------ */
769 .balign 128
770.L_op_const_wide: /* 0x18 */
771/* File: arm/op_const_wide.S */
772 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
773 FETCH r0, 1 @ r0<- bbbb (low)
774 FETCH r1, 2 @ r1<- BBBB (low middle)
775 FETCH r2, 3 @ r2<- hhhh (high middle)
776 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word)
777 FETCH r3, 4 @ r3<- HHHH (high)
778 mov r9, rINST, lsr #8 @ r9<- AA
779 orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word)
buzbee50cf6002016-02-10 08:59:12 -0800780 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800781 FETCH_ADVANCE_INST 5 @ advance rPC, load rINST
buzbeeace690f2016-03-11 09:51:11 -0800782 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800783 GET_INST_OPCODE ip @ extract opcode from rINST
784 stmia r9, {r0-r1} @ vAA<- r0/r1
785 GOTO_OPCODE ip @ jump to next instruction
786
787/* ------------------------------ */
788 .balign 128
789.L_op_const_wide_high16: /* 0x19 */
790/* File: arm/op_const_wide_high16.S */
791 /* const-wide/high16 vAA, #+BBBB000000000000 */
792 FETCH r1, 1 @ r1<- 0000BBBB (zero-extended)
793 mov r3, rINST, lsr #8 @ r3<- AA
794 mov r0, #0 @ r0<- 00000000
795 mov r1, r1, lsl #16 @ r1<- BBBB0000
796 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -0800797 CLEAR_SHADOW_PAIR r3, r0, r2 @ Zero shadow regs
buzbeeace690f2016-03-11 09:51:11 -0800798 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800799 GET_INST_OPCODE ip @ extract opcode from rINST
800 stmia r3, {r0-r1} @ vAA<- r0/r1
801 GOTO_OPCODE ip @ jump to next instruction
802
803/* ------------------------------ */
804 .balign 128
805.L_op_const_string: /* 0x1a */
806/* File: arm/op_const_string.S */
807 /* const/string vAA, String@BBBB */
808 EXPORT_PC
809 FETCH r0, 1 @ r0<- BBBB
810 mov r1, rINST, lsr #8 @ r1<- AA
811 add r2, rFP, #OFF_FP_SHADOWFRAME
812 mov r3, rSELF
813 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
814 PREFETCH_INST 2 @ load rINST
815 cmp r0, #0 @ fail?
816 bne MterpPossibleException @ let reference interpreter deal with it.
817 ADVANCE 2 @ advance rPC
818 GET_INST_OPCODE ip @ extract opcode from rINST
819 GOTO_OPCODE ip @ jump to next instruction
820
821/* ------------------------------ */
822 .balign 128
823.L_op_const_string_jumbo: /* 0x1b */
824/* File: arm/op_const_string_jumbo.S */
825 /* const/string vAA, String@BBBBBBBB */
826 EXPORT_PC
buzbeeace690f2016-03-11 09:51:11 -0800827 FETCH r0, 1 @ r0<- bbbb (low)
828 FETCH r2, 2 @ r2<- BBBB (high)
buzbee1452bee2015-03-06 14:43:04 -0800829 mov r1, rINST, lsr #8 @ r1<- AA
830 orr r0, r0, r2, lsl #16 @ r1<- BBBBbbbb
831 add r2, rFP, #OFF_FP_SHADOWFRAME
832 mov r3, rSELF
833 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
834 PREFETCH_INST 3 @ advance rPC
835 cmp r0, #0 @ fail?
836 bne MterpPossibleException @ let reference interpreter deal with it.
837 ADVANCE 3 @ advance rPC
838 GET_INST_OPCODE ip @ extract opcode from rINST
839 GOTO_OPCODE ip @ jump to next instruction
840
841/* ------------------------------ */
842 .balign 128
843.L_op_const_class: /* 0x1c */
844/* File: arm/op_const_class.S */
845 /* const/class vAA, Class@BBBB */
846 EXPORT_PC
847 FETCH r0, 1 @ r0<- BBBB
848 mov r1, rINST, lsr #8 @ r1<- AA
849 add r2, rFP, #OFF_FP_SHADOWFRAME
850 mov r3, rSELF
851 bl MterpConstClass @ (index, tgt_reg, shadow_frame, self)
852 PREFETCH_INST 2
853 cmp r0, #0
854 bne MterpPossibleException
855 ADVANCE 2
856 GET_INST_OPCODE ip @ extract opcode from rINST
857 GOTO_OPCODE ip @ jump to next instruction
858
859/* ------------------------------ */
860 .balign 128
861.L_op_monitor_enter: /* 0x1d */
862/* File: arm/op_monitor_enter.S */
863 /*
864 * Synchronize on an object.
865 */
866 /* monitor-enter vAA */
867 EXPORT_PC
868 mov r2, rINST, lsr #8 @ r2<- AA
869 GET_VREG r0, r2 @ r0<- vAA (object)
870 mov r1, rSELF @ r1<- self
871 bl artLockObjectFromCode
872 cmp r0, #0
873 bne MterpException
874 FETCH_ADVANCE_INST 1
875 GET_INST_OPCODE ip @ extract opcode from rINST
876 GOTO_OPCODE ip @ jump to next instruction
877
878/* ------------------------------ */
879 .balign 128
880.L_op_monitor_exit: /* 0x1e */
881/* File: arm/op_monitor_exit.S */
882 /*
883 * Unlock an object.
884 *
885 * Exceptions that occur when unlocking a monitor need to appear as
886 * if they happened at the following instruction. See the Dalvik
887 * instruction spec.
888 */
889 /* monitor-exit vAA */
890 EXPORT_PC
891 mov r2, rINST, lsr #8 @ r2<- AA
892 GET_VREG r0, r2 @ r0<- vAA (object)
893 mov r1, rSELF @ r0<- self
894 bl artUnlockObjectFromCode @ r0<- success for unlock(self, obj)
895 cmp r0, #0 @ failed?
896 bne MterpException
897 FETCH_ADVANCE_INST 1 @ before throw: advance rPC, load rINST
898 GET_INST_OPCODE ip @ extract opcode from rINST
899 GOTO_OPCODE ip @ jump to next instruction
900
901/* ------------------------------ */
902 .balign 128
903.L_op_check_cast: /* 0x1f */
904/* File: arm/op_check_cast.S */
905 /*
906 * Check to see if a cast from one class to another is allowed.
907 */
908 /* check-cast vAA, class@BBBB */
909 EXPORT_PC
910 FETCH r0, 1 @ r0<- BBBB
911 mov r1, rINST, lsr #8 @ r1<- AA
buzbeea2c97a92016-01-25 15:41:24 -0800912 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800913 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
914 mov r3, rSELF @ r3<- self
buzbeea2c97a92016-01-25 15:41:24 -0800915 bl MterpCheckCast @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800916 PREFETCH_INST 2
917 cmp r0, #0
918 bne MterpPossibleException
919 ADVANCE 2
920 GET_INST_OPCODE ip @ extract opcode from rINST
921 GOTO_OPCODE ip @ jump to next instruction
922
923/* ------------------------------ */
924 .balign 128
925.L_op_instance_of: /* 0x20 */
926/* File: arm/op_instance_of.S */
927 /*
928 * Check to see if an object reference is an instance of a class.
929 *
930 * Most common situation is a non-null object, being compared against
931 * an already-resolved class.
932 */
933 /* instance-of vA, vB, class@CCCC */
934 EXPORT_PC
935 FETCH r0, 1 @ r0<- CCCC
936 mov r1, rINST, lsr #12 @ r1<- B
buzbeea2c97a92016-01-25 15:41:24 -0800937 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800938 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
939 mov r3, rSELF @ r3<- self
buzbeea2c97a92016-01-25 15:41:24 -0800940 bl MterpInstanceOf @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800941 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
buzbeeace690f2016-03-11 09:51:11 -0800942 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -0800943 PREFETCH_INST 2
944 cmp r1, #0 @ exception pending?
945 bne MterpException
946 ADVANCE 2 @ advance rPC
947 SET_VREG r0, r9 @ vA<- r0
948 GET_INST_OPCODE ip @ extract opcode from rINST
949 GOTO_OPCODE ip @ jump to next instruction
950
951/* ------------------------------ */
952 .balign 128
953.L_op_array_length: /* 0x21 */
954/* File: arm/op_array_length.S */
955 /*
956 * Return the length of an array.
957 */
958 mov r1, rINST, lsr #12 @ r1<- B
959 ubfx r2, rINST, #8, #4 @ r2<- A
960 GET_VREG r0, r1 @ r0<- vB (object ref)
961 cmp r0, #0 @ is object null?
962 beq common_errNullObject @ yup, fail
963 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
964 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- array length
965 GET_INST_OPCODE ip @ extract opcode from rINST
966 SET_VREG r3, r2 @ vB<- length
967 GOTO_OPCODE ip @ jump to next instruction
968
969/* ------------------------------ */
970 .balign 128
971.L_op_new_instance: /* 0x22 */
972/* File: arm/op_new_instance.S */
973 /*
974 * Create a new instance of a class.
975 */
976 /* new-instance vAA, class@BBBB */
977 EXPORT_PC
978 add r0, rFP, #OFF_FP_SHADOWFRAME
979 mov r1, rSELF
980 mov r2, rINST
981 bl MterpNewInstance @ (shadow_frame, self, inst_data)
982 cmp r0, #0
983 beq MterpPossibleException
984 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
985 GET_INST_OPCODE ip @ extract opcode from rINST
986 GOTO_OPCODE ip @ jump to next instruction
987
988/* ------------------------------ */
989 .balign 128
990.L_op_new_array: /* 0x23 */
991/* File: arm/op_new_array.S */
992 /*
993 * Allocate an array of objects, specified with the array class
994 * and a count.
995 *
996 * The verifier guarantees that this is an array class, so we don't
997 * check for it here.
998 */
999 /* new-array vA, vB, class@CCCC */
1000 EXPORT_PC
1001 add r0, rFP, #OFF_FP_SHADOWFRAME
1002 mov r1, rPC
1003 mov r2, rINST
1004 mov r3, rSELF
1005 bl MterpNewArray
1006 cmp r0, #0
1007 beq MterpPossibleException
1008 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1009 GET_INST_OPCODE ip @ extract opcode from rINST
1010 GOTO_OPCODE ip @ jump to next instruction
1011
1012/* ------------------------------ */
1013 .balign 128
1014.L_op_filled_new_array: /* 0x24 */
1015/* File: arm/op_filled_new_array.S */
1016 /*
1017 * Create a new array with elements filled from registers.
1018 *
1019 * for: filled-new-array, filled-new-array/range
1020 */
1021 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1022 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1023 .extern MterpFilledNewArray
1024 EXPORT_PC
1025 add r0, rFP, #OFF_FP_SHADOWFRAME
1026 mov r1, rPC
1027 mov r2, rSELF
1028 bl MterpFilledNewArray
1029 cmp r0, #0
1030 beq MterpPossibleException
1031 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1032 GET_INST_OPCODE ip @ extract opcode from rINST
1033 GOTO_OPCODE ip @ jump to next instruction
1034
1035/* ------------------------------ */
1036 .balign 128
1037.L_op_filled_new_array_range: /* 0x25 */
1038/* File: arm/op_filled_new_array_range.S */
1039/* File: arm/op_filled_new_array.S */
1040 /*
1041 * Create a new array with elements filled from registers.
1042 *
1043 * for: filled-new-array, filled-new-array/range
1044 */
1045 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1046 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1047 .extern MterpFilledNewArrayRange
1048 EXPORT_PC
1049 add r0, rFP, #OFF_FP_SHADOWFRAME
1050 mov r1, rPC
1051 mov r2, rSELF
1052 bl MterpFilledNewArrayRange
1053 cmp r0, #0
1054 beq MterpPossibleException
1055 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1056 GET_INST_OPCODE ip @ extract opcode from rINST
1057 GOTO_OPCODE ip @ jump to next instruction
1058
1059
1060/* ------------------------------ */
1061 .balign 128
1062.L_op_fill_array_data: /* 0x26 */
1063/* File: arm/op_fill_array_data.S */
1064 /* fill-array-data vAA, +BBBBBBBB */
1065 EXPORT_PC
1066 FETCH r0, 1 @ r0<- bbbb (lo)
1067 FETCH r1, 2 @ r1<- BBBB (hi)
1068 mov r3, rINST, lsr #8 @ r3<- AA
1069 orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb
1070 GET_VREG r0, r3 @ r0<- vAA (array object)
1071 add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.)
1072 bl MterpFillArrayData @ (obj, payload)
1073 cmp r0, #0 @ 0 means an exception is thrown
1074 beq MterpPossibleException @ exception?
1075 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1076 GET_INST_OPCODE ip @ extract opcode from rINST
1077 GOTO_OPCODE ip @ jump to next instruction
1078
1079/* ------------------------------ */
1080 .balign 128
1081.L_op_throw: /* 0x27 */
1082/* File: arm/op_throw.S */
1083 /*
1084 * Throw an exception object in the current thread.
1085 */
1086 /* throw vAA */
1087 EXPORT_PC
1088 mov r2, rINST, lsr #8 @ r2<- AA
1089 GET_VREG r1, r2 @ r1<- vAA (exception object)
1090 cmp r1, #0 @ null object?
1091 beq common_errNullObject @ yes, throw an NPE instead
1092 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ thread->exception<- obj
1093 b MterpException
1094
1095/* ------------------------------ */
1096 .balign 128
1097.L_op_goto: /* 0x28 */
1098/* File: arm/op_goto.S */
1099 /*
1100 * Unconditional branch, 8-bit offset.
1101 *
1102 * The branch distance is a signed code-unit offset, which we need to
1103 * double to get a byte offset.
1104 */
1105 /* goto +AA */
1106 /* tuning: use sbfx for 6t2+ targets */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001107#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001108 mov r0, rINST, lsl #16 @ r0<- AAxx0000
Bill Buzbeefd522f92016-02-11 22:37:42 +00001109 movs rINST, r0, asr #24 @ rINST<- ssssssAA (sign-extended)
1110 EXPORT_PC
1111 mov r0, rSELF
1112 add r1, rFP, #OFF_FP_SHADOWFRAME
1113 mov r2, rINST
1114 bl MterpProfileBranch @ (self, shadow_frame, offset)
1115 cmp r0, #0
1116 bne MterpOnStackReplacement @ Note: offset must be in rINST
1117 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray69564bb2016-02-21 17:19:18 +00001118 adds r2, rINST, rINST @ r2<- byte offset, set flags
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001119 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001120 @ If backwards branch refresh rIBASE
1121 bmi MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001122 GET_INST_OPCODE ip @ extract opcode from rINST
1123 GOTO_OPCODE ip @ jump to next instruction
1124#else
Nicolas Geoffray5d033172016-02-11 11:39:37 +00001125 mov r0, rINST, lsl #16 @ r0<- AAxx0000
Bill Buzbeefd522f92016-02-11 22:37:42 +00001126 movs rINST, r0, asr #24 @ rINST<- ssssssAA (sign-extended)
1127 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray69564bb2016-02-21 17:19:18 +00001128 adds r2, rINST, rINST @ r2<- byte offset, set flags
buzbee1452bee2015-03-06 14:43:04 -08001129 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1130 @ If backwards branch refresh rIBASE
1131 bmi MterpCheckSuspendAndContinue
1132 GET_INST_OPCODE ip @ extract opcode from rINST
1133 GOTO_OPCODE ip @ jump to next instruction
1134#endif
1135
1136/* ------------------------------ */
1137 .balign 128
1138.L_op_goto_16: /* 0x29 */
1139/* File: arm/op_goto_16.S */
1140 /*
1141 * Unconditional branch, 16-bit offset.
1142 *
1143 * The branch distance is a signed code-unit offset, which we need to
1144 * double to get a byte offset.
1145 */
1146 /* goto/16 +AAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001147#if MTERP_PROFILE_BRANCHES
1148 FETCH_S rINST, 1 @ rINST<- ssssAAAA (sign-extended)
1149 EXPORT_PC
1150 mov r0, rSELF
1151 add r1, rFP, #OFF_FP_SHADOWFRAME
1152 mov r2, rINST
1153 bl MterpProfileBranch @ (self, shadow_frame, offset)
1154 cmp r0, #0
1155 bne MterpOnStackReplacement @ Note: offset must be in rINST
1156 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1157 adds r1, rINST, rINST @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001158 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001159 bmi MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001160 GET_INST_OPCODE ip @ extract opcode from rINST
1161 GOTO_OPCODE ip @ jump to next instruction
1162#else
Bill Buzbeefd522f92016-02-11 22:37:42 +00001163 FETCH_S rINST, 1 @ rINST<- ssssAAAA (sign-extended)
buzbee1452bee2015-03-06 14:43:04 -08001164 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001165 adds r1, rINST, rINST @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001166 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1167 bmi MterpCheckSuspendAndContinue
1168 GET_INST_OPCODE ip @ extract opcode from rINST
1169 GOTO_OPCODE ip @ jump to next instruction
1170#endif
1171
1172/* ------------------------------ */
1173 .balign 128
1174.L_op_goto_32: /* 0x2a */
1175/* File: arm/op_goto_32.S */
1176 /*
1177 * Unconditional branch, 32-bit offset.
1178 *
1179 * The branch distance is a signed code-unit offset, which we need to
1180 * double to get a byte offset.
1181 *
1182 * Unlike most opcodes, this one is allowed to branch to itself, so
1183 * our "backward branch" test must be "<=0" instead of "<0". Because
1184 * we need the V bit set, we'll use an adds to convert from Dalvik
1185 * offset to byte offset.
1186 */
1187 /* goto/32 +AAAAAAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001188#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001189 FETCH r0, 1 @ r0<- aaaa (lo)
1190 FETCH r1, 2 @ r1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001191 orr rINST, r0, r1, lsl #16 @ rINST<- AAAAaaaa
1192 EXPORT_PC
1193 mov r0, rSELF
1194 add r1, rFP, #OFF_FP_SHADOWFRAME
1195 mov r2, rINST
1196 bl MterpProfileBranch @ (self, shadow_frame, offset)
1197 cmp r0, #0
1198 bne MterpOnStackReplacement @ Note: offset must be in rINST
1199 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1200 adds r1, rINST, rINST @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001201 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001202 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001203 GET_INST_OPCODE ip @ extract opcode from rINST
1204 GOTO_OPCODE ip @ jump to next instruction
1205#else
1206 FETCH r0, 1 @ r0<- aaaa (lo)
1207 FETCH r1, 2 @ r1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001208 orr rINST, r0, r1, lsl #16 @ rINST<- AAAAaaaa
buzbee1452bee2015-03-06 14:43:04 -08001209 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001210 adds r1, rINST, rINST @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001211 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1212 ble MterpCheckSuspendAndContinue
1213 GET_INST_OPCODE ip @ extract opcode from rINST
1214 GOTO_OPCODE ip @ jump to next instruction
1215#endif
1216
1217/* ------------------------------ */
1218 .balign 128
1219.L_op_packed_switch: /* 0x2b */
1220/* File: arm/op_packed_switch.S */
1221 /*
1222 * Handle a packed-switch or sparse-switch instruction. In both cases
1223 * we decode it and hand it off to a helper function.
1224 *
1225 * We don't really expect backward branches in a switch statement, but
1226 * they're perfectly legal, so we check for them here.
1227 *
1228 * for: packed-switch, sparse-switch
1229 */
1230 /* op vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001231#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001232 FETCH r0, 1 @ r0<- bbbb (lo)
1233 FETCH r1, 2 @ r1<- BBBB (hi)
1234 mov r3, rINST, lsr #8 @ r3<- AA
1235 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1236 GET_VREG r1, r3 @ r1<- vAA
1237 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1238 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001239 mov rINST, r0
1240 EXPORT_PC
1241 mov r0, rSELF
1242 add r1, rFP, #OFF_FP_SHADOWFRAME
1243 mov r2, rINST
1244 bl MterpProfileBranch @ (self, shadow_frame, offset)
1245 cmp r0, #0
1246 bne MterpOnStackReplacement @ Note: offset must be in rINST
1247 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1248 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001249 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001250 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001251 GET_INST_OPCODE ip @ extract opcode from rINST
1252 GOTO_OPCODE ip @ jump to next instruction
1253#else
1254 FETCH r0, 1 @ r0<- bbbb (lo)
1255 FETCH r1, 2 @ r1<- BBBB (hi)
1256 mov r3, rINST, lsr #8 @ r3<- AA
1257 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1258 GET_VREG r1, r3 @ r1<- vAA
1259 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1260 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001261 mov rINST, r0
buzbee1452bee2015-03-06 14:43:04 -08001262 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001263 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001264 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1265 ble MterpCheckSuspendAndContinue
1266 GET_INST_OPCODE ip @ extract opcode from rINST
1267 GOTO_OPCODE ip @ jump to next instruction
1268#endif
1269
1270/* ------------------------------ */
1271 .balign 128
1272.L_op_sparse_switch: /* 0x2c */
1273/* File: arm/op_sparse_switch.S */
1274/* File: arm/op_packed_switch.S */
1275 /*
1276 * Handle a packed-switch or sparse-switch instruction. In both cases
1277 * we decode it and hand it off to a helper function.
1278 *
1279 * We don't really expect backward branches in a switch statement, but
1280 * they're perfectly legal, so we check for them here.
1281 *
1282 * for: packed-switch, sparse-switch
1283 */
1284 /* op vAA, +BBBB */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001285#if MTERP_PROFILE_BRANCHES
buzbee1452bee2015-03-06 14:43:04 -08001286 FETCH r0, 1 @ r0<- bbbb (lo)
1287 FETCH r1, 2 @ r1<- BBBB (hi)
1288 mov r3, rINST, lsr #8 @ r3<- AA
1289 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1290 GET_VREG r1, r3 @ r1<- vAA
1291 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1292 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001293 mov rINST, r0
1294 EXPORT_PC
1295 mov r0, rSELF
1296 add r1, rFP, #OFF_FP_SHADOWFRAME
1297 mov r2, rINST
1298 bl MterpProfileBranch @ (self, shadow_frame, offset)
1299 cmp r0, #0
1300 bne MterpOnStackReplacement @ Note: offset must be in rINST
1301 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1302 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001303 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
Bill Buzbeefd522f92016-02-11 22:37:42 +00001304 ble MterpCheckSuspendAndContinue
buzbee1452bee2015-03-06 14:43:04 -08001305 GET_INST_OPCODE ip @ extract opcode from rINST
1306 GOTO_OPCODE ip @ jump to next instruction
1307#else
1308 FETCH r0, 1 @ r0<- bbbb (lo)
1309 FETCH r1, 2 @ r1<- BBBB (hi)
1310 mov r3, rINST, lsr #8 @ r3<- AA
1311 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1312 GET_VREG r1, r3 @ r1<- vAA
1313 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1314 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001315 mov rINST, r0
buzbee1452bee2015-03-06 14:43:04 -08001316 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00001317 adds r1, rINST, rINST @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001318 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1319 ble MterpCheckSuspendAndContinue
1320 GET_INST_OPCODE ip @ extract opcode from rINST
1321 GOTO_OPCODE ip @ jump to next instruction
1322#endif
1323
1324
1325/* ------------------------------ */
1326 .balign 128
1327.L_op_cmpl_float: /* 0x2d */
1328/* File: arm/op_cmpl_float.S */
1329 /*
1330 * Compare two floating-point values. Puts 0, 1, or -1 into the
1331 * destination register based on the results of the comparison.
1332 *
1333 * int compare(x, y) {
1334 * if (x == y) {
1335 * return 0;
1336 * } else if (x > y) {
1337 * return 1;
1338 * } else if (x < y) {
1339 * return -1;
1340 * } else {
1341 * return -1;
1342 * }
1343 * }
1344 */
1345 /* op vAA, vBB, vCC */
1346 FETCH r0, 1 @ r0<- CCBB
1347 mov r9, rINST, lsr #8 @ r9<- AA
1348 and r2, r0, #255 @ r2<- BB
1349 mov r3, r0, lsr #8 @ r3<- CC
1350 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1351 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1352 flds s0, [r2] @ s0<- vBB
1353 flds s1, [r3] @ s1<- vCC
buzbee96530d32016-03-04 08:03:51 -08001354 vcmpe.f32 s0, s1 @ compare (vBB, vCC)
buzbee1452bee2015-03-06 14:43:04 -08001355 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1356 mvn r0, #0 @ r0<- -1 (default)
1357 GET_INST_OPCODE ip @ extract opcode from rINST
1358 fmstat @ export status flags
1359 movgt r0, #1 @ (greater than) r1<- 1
1360 moveq r0, #0 @ (equal) r1<- 0
1361 SET_VREG r0, r9 @ vAA<- r0
1362 GOTO_OPCODE ip @ jump to next instruction
1363
1364/* ------------------------------ */
1365 .balign 128
1366.L_op_cmpg_float: /* 0x2e */
1367/* File: arm/op_cmpg_float.S */
1368 /*
1369 * Compare two floating-point values. Puts 0, 1, or -1 into the
1370 * destination register based on the results of the comparison.
1371 *
1372 * int compare(x, y) {
1373 * if (x == y) {
1374 * return 0;
1375 * } else if (x < y) {
1376 * return -1;
1377 * } else if (x > y) {
1378 * return 1;
1379 * } else {
1380 * return 1;
1381 * }
1382 * }
1383 */
1384 /* op vAA, vBB, vCC */
1385 FETCH r0, 1 @ r0<- CCBB
1386 mov r9, rINST, lsr #8 @ r9<- AA
1387 and r2, r0, #255 @ r2<- BB
1388 mov r3, r0, lsr #8 @ r3<- CC
1389 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1390 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1391 flds s0, [r2] @ s0<- vBB
1392 flds s1, [r3] @ s1<- vCC
buzbee96530d32016-03-04 08:03:51 -08001393 vcmpe.f32 s0, s1 @ compare (vBB, vCC)
buzbee1452bee2015-03-06 14:43:04 -08001394 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1395 mov r0, #1 @ r0<- 1 (default)
1396 GET_INST_OPCODE ip @ extract opcode from rINST
1397 fmstat @ export status flags
1398 mvnmi r0, #0 @ (less than) r1<- -1
1399 moveq r0, #0 @ (equal) r1<- 0
1400 SET_VREG r0, r9 @ vAA<- r0
1401 GOTO_OPCODE ip @ jump to next instruction
1402
1403/* ------------------------------ */
1404 .balign 128
1405.L_op_cmpl_double: /* 0x2f */
1406/* File: arm/op_cmpl_double.S */
1407 /*
1408 * Compare two floating-point values. Puts 0, 1, or -1 into the
1409 * destination register based on the results of the comparison.
1410 *
1411 * int compare(x, y) {
1412 * if (x == y) {
1413 * return 0;
1414 * } else if (x > y) {
1415 * return 1;
1416 * } else if (x < y) {
1417 * return -1;
1418 * } else {
1419 * return -1;
1420 * }
1421 * }
1422 */
1423 /* op vAA, vBB, vCC */
1424 FETCH r0, 1 @ r0<- CCBB
1425 mov r9, rINST, lsr #8 @ r9<- AA
1426 and r2, r0, #255 @ r2<- BB
1427 mov r3, r0, lsr #8 @ r3<- CC
1428 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1429 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1430 fldd d0, [r2] @ d0<- vBB
1431 fldd d1, [r3] @ d1<- vCC
buzbee96530d32016-03-04 08:03:51 -08001432 vcmpe.f64 d0, d1 @ compare (vBB, vCC)
buzbee1452bee2015-03-06 14:43:04 -08001433 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1434 mvn r0, #0 @ r0<- -1 (default)
1435 GET_INST_OPCODE ip @ extract opcode from rINST
1436 fmstat @ export status flags
1437 movgt r0, #1 @ (greater than) r1<- 1
1438 moveq r0, #0 @ (equal) r1<- 0
1439 SET_VREG r0, r9 @ vAA<- r0
1440 GOTO_OPCODE ip @ jump to next instruction
1441
1442/* ------------------------------ */
1443 .balign 128
1444.L_op_cmpg_double: /* 0x30 */
1445/* File: arm/op_cmpg_double.S */
1446 /*
1447 * Compare two floating-point values. Puts 0, 1, or -1 into the
1448 * destination register based on the results of the comparison.
1449 *
1450 * int compare(x, y) {
1451 * if (x == y) {
1452 * return 0;
1453 * } else if (x < y) {
1454 * return -1;
1455 * } else if (x > y) {
1456 * return 1;
1457 * } else {
1458 * return 1;
1459 * }
1460 * }
1461 */
1462 /* op vAA, vBB, vCC */
1463 FETCH r0, 1 @ r0<- CCBB
1464 mov r9, rINST, lsr #8 @ r9<- AA
1465 and r2, r0, #255 @ r2<- BB
1466 mov r3, r0, lsr #8 @ r3<- CC
1467 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1468 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1469 fldd d0, [r2] @ d0<- vBB
1470 fldd d1, [r3] @ d1<- vCC
buzbee96530d32016-03-04 08:03:51 -08001471 vcmpe.f64 d0, d1 @ compare (vBB, vCC)
buzbee1452bee2015-03-06 14:43:04 -08001472 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1473 mov r0, #1 @ r0<- 1 (default)
1474 GET_INST_OPCODE ip @ extract opcode from rINST
1475 fmstat @ export status flags
1476 mvnmi r0, #0 @ (less than) r1<- -1
1477 moveq r0, #0 @ (equal) r1<- 0
1478 SET_VREG r0, r9 @ vAA<- r0
1479 GOTO_OPCODE ip @ jump to next instruction
1480
1481/* ------------------------------ */
1482 .balign 128
1483.L_op_cmp_long: /* 0x31 */
1484/* File: arm/op_cmp_long.S */
1485 /*
1486 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination
1487 * register based on the results of the comparison.
1488 *
1489 * We load the full values with LDM, but in practice many values could
1490 * be resolved by only looking at the high word. This could be made
1491 * faster or slower by splitting the LDM into a pair of LDRs.
1492 *
1493 * If we just wanted to set condition flags, we could do this:
1494 * subs ip, r0, r2
1495 * sbcs ip, r1, r3
1496 * subeqs ip, r0, r2
1497 * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific
1498 * integer value, which we can do with 2 conditional mov/mvn instructions
1499 * (set 1, set -1; if they're equal we already have 0 in ip), giving
1500 * us a constant 5-cycle path plus a branch at the end to the
1501 * instruction epilogue code. The multi-compare approach below needs
1502 * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1503 * in the worst case (the 64-bit values are equal).
1504 */
1505 /* cmp-long vAA, vBB, vCC */
1506 FETCH r0, 1 @ r0<- CCBB
1507 mov r9, rINST, lsr #8 @ r9<- AA
1508 and r2, r0, #255 @ r2<- BB
1509 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08001510 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
1511 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08001512 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
1513 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
1514 cmp r1, r3 @ compare (vBB+1, vCC+1)
1515 blt .Lop_cmp_long_less @ signed compare on high part
1516 bgt .Lop_cmp_long_greater
1517 subs r1, r0, r2 @ r1<- r0 - r2
1518 bhi .Lop_cmp_long_greater @ unsigned compare on low part
1519 bne .Lop_cmp_long_less
1520 b .Lop_cmp_long_finish @ equal; r1 already holds 0
1521
1522/* ------------------------------ */
1523 .balign 128
1524.L_op_if_eq: /* 0x32 */
1525/* File: arm/op_if_eq.S */
1526/* File: arm/bincmp.S */
1527 /*
1528 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1529 * fragment that specifies the *reverse* comparison to perform, e.g.
1530 * for "if-le" you would use "gt".
1531 *
1532 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1533 */
1534 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001535 mov r1, rINST, lsr #12 @ r1<- B
1536 ubfx r0, rINST, #8, #4 @ r0<- A
1537 GET_VREG r3, r1 @ r3<- vB
1538 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001539 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001540 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001541 movne rINST, #2
1542#if MTERP_PROFILE_BRANCHES
1543 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001544 EXPORT_PC
1545 mov r0, rSELF
1546 add r1, rFP, #OFF_FP_SHADOWFRAME
1547 mov r2, rINST
1548 bl MterpProfileBranch @ (self, shadow_frame, offset)
1549 cmp r0, #0
1550 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001551#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001552 adds r2, rINST, rINST @ convert to bytes, check sign
1553 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1554 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1555 bmi MterpCheckSuspendAndContinue
1556 GET_INST_OPCODE ip @ extract opcode from rINST
1557 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001558
1559
1560/* ------------------------------ */
1561 .balign 128
1562.L_op_if_ne: /* 0x33 */
1563/* File: arm/op_if_ne.S */
1564/* File: arm/bincmp.S */
1565 /*
1566 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1567 * fragment that specifies the *reverse* comparison to perform, e.g.
1568 * for "if-le" you would use "gt".
1569 *
1570 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1571 */
1572 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001573 mov r1, rINST, lsr #12 @ r1<- B
1574 ubfx r0, rINST, #8, #4 @ r0<- A
1575 GET_VREG r3, r1 @ r3<- vB
1576 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001577 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001578 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001579 moveq rINST, #2
1580#if MTERP_PROFILE_BRANCHES
1581 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001582 EXPORT_PC
1583 mov r0, rSELF
1584 add r1, rFP, #OFF_FP_SHADOWFRAME
1585 mov r2, rINST
1586 bl MterpProfileBranch @ (self, shadow_frame, offset)
1587 cmp r0, #0
1588 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001589#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001590 adds r2, rINST, rINST @ convert to bytes, check sign
1591 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1592 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1593 bmi MterpCheckSuspendAndContinue
1594 GET_INST_OPCODE ip @ extract opcode from rINST
1595 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001596
1597
1598/* ------------------------------ */
1599 .balign 128
1600.L_op_if_lt: /* 0x34 */
1601/* File: arm/op_if_lt.S */
1602/* File: arm/bincmp.S */
1603 /*
1604 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1605 * fragment that specifies the *reverse* comparison to perform, e.g.
1606 * for "if-le" you would use "gt".
1607 *
1608 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1609 */
1610 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001611 mov r1, rINST, lsr #12 @ r1<- B
1612 ubfx r0, rINST, #8, #4 @ r0<- A
1613 GET_VREG r3, r1 @ r3<- vB
1614 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001615 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001616 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001617 movge rINST, #2
1618#if MTERP_PROFILE_BRANCHES
1619 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001620 EXPORT_PC
1621 mov r0, rSELF
1622 add r1, rFP, #OFF_FP_SHADOWFRAME
1623 mov r2, rINST
1624 bl MterpProfileBranch @ (self, shadow_frame, offset)
1625 cmp r0, #0
1626 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001627#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001628 adds r2, rINST, rINST @ convert to bytes, check sign
1629 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1630 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1631 bmi MterpCheckSuspendAndContinue
1632 GET_INST_OPCODE ip @ extract opcode from rINST
1633 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001634
1635
1636/* ------------------------------ */
1637 .balign 128
1638.L_op_if_ge: /* 0x35 */
1639/* File: arm/op_if_ge.S */
1640/* File: arm/bincmp.S */
1641 /*
1642 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1643 * fragment that specifies the *reverse* comparison to perform, e.g.
1644 * for "if-le" you would use "gt".
1645 *
1646 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1647 */
1648 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001649 mov r1, rINST, lsr #12 @ r1<- B
1650 ubfx r0, rINST, #8, #4 @ r0<- A
1651 GET_VREG r3, r1 @ r3<- vB
1652 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001653 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001654 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001655 movlt rINST, #2
1656#if MTERP_PROFILE_BRANCHES
1657 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001658 EXPORT_PC
1659 mov r0, rSELF
1660 add r1, rFP, #OFF_FP_SHADOWFRAME
1661 mov r2, rINST
1662 bl MterpProfileBranch @ (self, shadow_frame, offset)
1663 cmp r0, #0
1664 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001665#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001666 adds r2, rINST, rINST @ convert to bytes, check sign
1667 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1668 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1669 bmi MterpCheckSuspendAndContinue
1670 GET_INST_OPCODE ip @ extract opcode from rINST
1671 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001672
1673
1674/* ------------------------------ */
1675 .balign 128
1676.L_op_if_gt: /* 0x36 */
1677/* File: arm/op_if_gt.S */
1678/* File: arm/bincmp.S */
1679 /*
1680 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1681 * fragment that specifies the *reverse* comparison to perform, e.g.
1682 * for "if-le" you would use "gt".
1683 *
1684 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1685 */
1686 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001687 mov r1, rINST, lsr #12 @ r1<- B
1688 ubfx r0, rINST, #8, #4 @ r0<- A
1689 GET_VREG r3, r1 @ r3<- vB
1690 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001691 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001692 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001693 movle rINST, #2
1694#if MTERP_PROFILE_BRANCHES
1695 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001696 EXPORT_PC
1697 mov r0, rSELF
1698 add r1, rFP, #OFF_FP_SHADOWFRAME
1699 mov r2, rINST
1700 bl MterpProfileBranch @ (self, shadow_frame, offset)
1701 cmp r0, #0
1702 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001703#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001704 adds r2, rINST, rINST @ convert to bytes, check sign
1705 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1706 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1707 bmi MterpCheckSuspendAndContinue
1708 GET_INST_OPCODE ip @ extract opcode from rINST
1709 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001710
1711
1712/* ------------------------------ */
1713 .balign 128
1714.L_op_if_le: /* 0x37 */
1715/* File: arm/op_if_le.S */
1716/* File: arm/bincmp.S */
1717 /*
1718 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1719 * fragment that specifies the *reverse* comparison to perform, e.g.
1720 * for "if-le" you would use "gt".
1721 *
1722 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1723 */
1724 /* if-cmp vA, vB, +CCCC */
buzbee1452bee2015-03-06 14:43:04 -08001725 mov r1, rINST, lsr #12 @ r1<- B
1726 ubfx r0, rINST, #8, #4 @ r0<- A
1727 GET_VREG r3, r1 @ r3<- vB
1728 GET_VREG r2, r0 @ r2<- vA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001729 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001730 cmp r2, r3 @ compare (vA, vB)
buzbeef1dcacc2016-02-24 14:24:24 -08001731 movgt rINST, #2
1732#if MTERP_PROFILE_BRANCHES
1733 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001734 EXPORT_PC
1735 mov r0, rSELF
1736 add r1, rFP, #OFF_FP_SHADOWFRAME
1737 mov r2, rINST
1738 bl MterpProfileBranch @ (self, shadow_frame, offset)
1739 cmp r0, #0
1740 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001741#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001742 adds r2, rINST, rINST @ convert to bytes, check sign
1743 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1744 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1745 bmi MterpCheckSuspendAndContinue
1746 GET_INST_OPCODE ip @ extract opcode from rINST
1747 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001748
1749
1750/* ------------------------------ */
1751 .balign 128
1752.L_op_if_eqz: /* 0x38 */
1753/* File: arm/op_if_eqz.S */
1754/* File: arm/zcmp.S */
1755 /*
1756 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1757 * fragment that specifies the *reverse* comparison to perform, e.g.
1758 * for "if-le" you would use "gt".
1759 *
1760 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1761 */
1762 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001763 mov r0, rINST, lsr #8 @ r0<- AA
1764 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001765 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1766 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001767 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001768 movne rINST, #2
1769#if MTERP_PROFILE_BRANCHES
1770 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001771 EXPORT_PC
1772 mov r0, rSELF
1773 add r1, rFP, #OFF_FP_SHADOWFRAME
1774 mov r2, rINST
1775 bl MterpProfileBranch @ (self, shadow_frame, offset)
1776 cmp r0, #0
1777 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001778#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001779 adds r1, rINST, rINST @ convert to bytes & set flags
1780 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1781 bmi MterpCheckSuspendAndContinue
1782 GET_INST_OPCODE ip @ extract opcode from rINST
1783 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001784
1785
1786/* ------------------------------ */
1787 .balign 128
1788.L_op_if_nez: /* 0x39 */
1789/* File: arm/op_if_nez.S */
1790/* File: arm/zcmp.S */
1791 /*
1792 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1793 * fragment that specifies the *reverse* comparison to perform, e.g.
1794 * for "if-le" you would use "gt".
1795 *
1796 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1797 */
1798 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001799 mov r0, rINST, lsr #8 @ r0<- AA
1800 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001801 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1802 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001803 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001804 moveq rINST, #2
1805#if MTERP_PROFILE_BRANCHES
1806 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001807 EXPORT_PC
1808 mov r0, rSELF
1809 add r1, rFP, #OFF_FP_SHADOWFRAME
1810 mov r2, rINST
1811 bl MterpProfileBranch @ (self, shadow_frame, offset)
1812 cmp r0, #0
1813 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001814#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001815 adds r1, rINST, rINST @ convert to bytes & set flags
1816 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1817 bmi MterpCheckSuspendAndContinue
1818 GET_INST_OPCODE ip @ extract opcode from rINST
1819 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001820
1821
1822/* ------------------------------ */
1823 .balign 128
1824.L_op_if_ltz: /* 0x3a */
1825/* File: arm/op_if_ltz.S */
1826/* File: arm/zcmp.S */
1827 /*
1828 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1829 * fragment that specifies the *reverse* comparison to perform, e.g.
1830 * for "if-le" you would use "gt".
1831 *
1832 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1833 */
1834 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001835 mov r0, rINST, lsr #8 @ r0<- AA
1836 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001837 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1838 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001839 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001840 movge rINST, #2
1841#if MTERP_PROFILE_BRANCHES
1842 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001843 EXPORT_PC
1844 mov r0, rSELF
1845 add r1, rFP, #OFF_FP_SHADOWFRAME
1846 mov r2, rINST
1847 bl MterpProfileBranch @ (self, shadow_frame, offset)
1848 cmp r0, #0
1849 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001850#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001851 adds r1, rINST, rINST @ convert to bytes & set flags
1852 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1853 bmi MterpCheckSuspendAndContinue
1854 GET_INST_OPCODE ip @ extract opcode from rINST
1855 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001856
1857
1858/* ------------------------------ */
1859 .balign 128
1860.L_op_if_gez: /* 0x3b */
1861/* File: arm/op_if_gez.S */
1862/* File: arm/zcmp.S */
1863 /*
1864 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1865 * fragment that specifies the *reverse* comparison to perform, e.g.
1866 * for "if-le" you would use "gt".
1867 *
1868 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1869 */
1870 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001871 mov r0, rINST, lsr #8 @ r0<- AA
1872 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001873 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1874 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001875 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001876 movlt rINST, #2
1877#if MTERP_PROFILE_BRANCHES
1878 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001879 EXPORT_PC
1880 mov r0, rSELF
1881 add r1, rFP, #OFF_FP_SHADOWFRAME
1882 mov r2, rINST
1883 bl MterpProfileBranch @ (self, shadow_frame, offset)
1884 cmp r0, #0
1885 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001886#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001887 adds r1, rINST, rINST @ convert to bytes & set flags
1888 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1889 bmi MterpCheckSuspendAndContinue
1890 GET_INST_OPCODE ip @ extract opcode from rINST
1891 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001892
1893
1894/* ------------------------------ */
1895 .balign 128
1896.L_op_if_gtz: /* 0x3c */
1897/* File: arm/op_if_gtz.S */
1898/* File: arm/zcmp.S */
1899 /*
1900 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1901 * fragment that specifies the *reverse* comparison to perform, e.g.
1902 * for "if-le" you would use "gt".
1903 *
1904 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1905 */
1906 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001907 mov r0, rINST, lsr #8 @ r0<- AA
1908 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001909 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1910 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001911 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001912 movle rINST, #2
1913#if MTERP_PROFILE_BRANCHES
1914 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001915 EXPORT_PC
1916 mov r0, rSELF
1917 add r1, rFP, #OFF_FP_SHADOWFRAME
1918 mov r2, rINST
1919 bl MterpProfileBranch @ (self, shadow_frame, offset)
1920 cmp r0, #0
1921 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001922#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001923 adds r1, rINST, rINST @ convert to bytes & set flags
1924 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1925 bmi MterpCheckSuspendAndContinue
1926 GET_INST_OPCODE ip @ extract opcode from rINST
1927 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001928
1929
1930/* ------------------------------ */
1931 .balign 128
1932.L_op_if_lez: /* 0x3d */
1933/* File: arm/op_if_lez.S */
1934/* File: arm/zcmp.S */
1935 /*
1936 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1937 * fragment that specifies the *reverse* comparison to perform, e.g.
1938 * for "if-le" you would use "gt".
1939 *
1940 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1941 */
1942 /* if-cmp vAA, +BBBB */
buzbee1452bee2015-03-06 14:43:04 -08001943 mov r0, rINST, lsr #8 @ r0<- AA
1944 GET_VREG r2, r0 @ r2<- vAA
Bill Buzbeefd522f92016-02-11 22:37:42 +00001945 FETCH_S rINST, 1 @ rINST<- branch offset, in code units
1946 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
buzbee1452bee2015-03-06 14:43:04 -08001947 cmp r2, #0 @ compare (vA, 0)
buzbeef1dcacc2016-02-24 14:24:24 -08001948 movgt rINST, #2
1949#if MTERP_PROFILE_BRANCHES
1950 @ TUNING: once measurements are complete, remove #if and hand-schedule.
Bill Buzbeefd522f92016-02-11 22:37:42 +00001951 EXPORT_PC
1952 mov r0, rSELF
1953 add r1, rFP, #OFF_FP_SHADOWFRAME
1954 mov r2, rINST
1955 bl MterpProfileBranch @ (self, shadow_frame, offset)
1956 cmp r0, #0
1957 bne MterpOnStackReplacement @ Note: offset must be in rINST
buzbee1452bee2015-03-06 14:43:04 -08001958#endif
buzbeef1dcacc2016-02-24 14:24:24 -08001959 adds r1, rINST, rINST @ convert to bytes & set flags
1960 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1961 bmi MterpCheckSuspendAndContinue
1962 GET_INST_OPCODE ip @ extract opcode from rINST
1963 GOTO_OPCODE ip @ jump to next instruction
buzbee1452bee2015-03-06 14:43:04 -08001964
1965
1966/* ------------------------------ */
1967 .balign 128
1968.L_op_unused_3e: /* 0x3e */
1969/* File: arm/op_unused_3e.S */
1970/* File: arm/unused.S */
1971/*
1972 * Bail to reference interpreter to throw.
1973 */
1974 b MterpFallback
1975
1976
1977/* ------------------------------ */
1978 .balign 128
1979.L_op_unused_3f: /* 0x3f */
1980/* File: arm/op_unused_3f.S */
1981/* File: arm/unused.S */
1982/*
1983 * Bail to reference interpreter to throw.
1984 */
1985 b MterpFallback
1986
1987
1988/* ------------------------------ */
1989 .balign 128
1990.L_op_unused_40: /* 0x40 */
1991/* File: arm/op_unused_40.S */
1992/* File: arm/unused.S */
1993/*
1994 * Bail to reference interpreter to throw.
1995 */
1996 b MterpFallback
1997
1998
1999/* ------------------------------ */
2000 .balign 128
2001.L_op_unused_41: /* 0x41 */
2002/* File: arm/op_unused_41.S */
2003/* File: arm/unused.S */
2004/*
2005 * Bail to reference interpreter to throw.
2006 */
2007 b MterpFallback
2008
2009
2010/* ------------------------------ */
2011 .balign 128
2012.L_op_unused_42: /* 0x42 */
2013/* File: arm/op_unused_42.S */
2014/* File: arm/unused.S */
2015/*
2016 * Bail to reference interpreter to throw.
2017 */
2018 b MterpFallback
2019
2020
2021/* ------------------------------ */
2022 .balign 128
2023.L_op_unused_43: /* 0x43 */
2024/* File: arm/op_unused_43.S */
2025/* File: arm/unused.S */
2026/*
2027 * Bail to reference interpreter to throw.
2028 */
2029 b MterpFallback
2030
2031
2032/* ------------------------------ */
2033 .balign 128
2034.L_op_aget: /* 0x44 */
2035/* File: arm/op_aget.S */
2036 /*
2037 * Array get, 32 bits or less. vAA <- vBB[vCC].
2038 *
2039 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2040 * instructions. We use a pair of FETCH_Bs instead.
2041 *
buzbee76833da2016-01-13 13:06:22 -08002042 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002043 *
2044 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2045 * If this changes, specialize.
2046 */
2047 /* op vAA, vBB, vCC */
2048 FETCH_B r2, 1, 0 @ r2<- BB
2049 mov r9, rINST, lsr #8 @ r9<- AA
2050 FETCH_B r3, 1, 1 @ r3<- CC
2051 GET_VREG r0, r2 @ r0<- vBB (array object)
2052 GET_VREG r1, r3 @ r1<- vCC (requested index)
2053 cmp r0, #0 @ null array object?
2054 beq common_errNullObject @ yes, bail
2055 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2056 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2057 cmp r1, r3 @ compare unsigned index, length
2058 bcs common_errArrayIndex @ index >= length, bail
2059 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2060 ldr r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2061 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002062 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002063 GOTO_OPCODE ip @ jump to next instruction
2064
2065/* ------------------------------ */
2066 .balign 128
2067.L_op_aget_wide: /* 0x45 */
2068/* File: arm/op_aget_wide.S */
2069 /*
2070 * Array get, 64 bits. vAA <- vBB[vCC].
2071 *
2072 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2073 */
2074 /* aget-wide vAA, vBB, vCC */
2075 FETCH r0, 1 @ r0<- CCBB
2076 mov r9, rINST, lsr #8 @ r9<- AA
2077 and r2, r0, #255 @ r2<- BB
2078 mov r3, r0, lsr #8 @ r3<- CC
2079 GET_VREG r0, r2 @ r0<- vBB (array object)
2080 GET_VREG r1, r3 @ r1<- vCC (requested index)
buzbee50cf6002016-02-10 08:59:12 -08002081 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08002082 cmp r0, #0 @ null array object?
2083 beq common_errNullObject @ yes, bail
2084 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2085 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2086 cmp r1, r3 @ compare unsigned index, length
2087 bcs common_errArrayIndex @ index >= length, bail
2088 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2089 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
buzbeeace690f2016-03-11 09:51:11 -08002090 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08002091 GET_INST_OPCODE ip @ extract opcode from rINST
2092 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3
2093 GOTO_OPCODE ip @ jump to next instruction
2094
2095/* ------------------------------ */
2096 .balign 128
2097.L_op_aget_object: /* 0x46 */
2098/* File: arm/op_aget_object.S */
2099 /*
2100 * Array object get. vAA <- vBB[vCC].
2101 *
2102 * for: aget-object
2103 */
2104 /* op vAA, vBB, vCC */
2105 FETCH_B r2, 1, 0 @ r2<- BB
2106 mov r9, rINST, lsr #8 @ r9<- AA
2107 FETCH_B r3, 1, 1 @ r3<- CC
2108 EXPORT_PC
2109 GET_VREG r0, r2 @ r0<- vBB (array object)
2110 GET_VREG r1, r3 @ r1<- vCC (requested index)
2111 bl artAGetObjectFromMterp @ (array, index)
2112 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
2113 PREFETCH_INST 2
2114 cmp r1, #0
2115 bne MterpException
2116 SET_VREG_OBJECT r0, r9
2117 ADVANCE 2
2118 GET_INST_OPCODE ip
2119 GOTO_OPCODE ip @ jump to next instruction
2120
2121/* ------------------------------ */
2122 .balign 128
2123.L_op_aget_boolean: /* 0x47 */
2124/* File: arm/op_aget_boolean.S */
2125/* File: arm/op_aget.S */
2126 /*
2127 * Array get, 32 bits or less. vAA <- vBB[vCC].
2128 *
2129 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2130 * instructions. We use a pair of FETCH_Bs instead.
2131 *
buzbee76833da2016-01-13 13:06:22 -08002132 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002133 *
2134 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2135 * If this changes, specialize.
2136 */
2137 /* op vAA, vBB, vCC */
2138 FETCH_B r2, 1, 0 @ r2<- BB
2139 mov r9, rINST, lsr #8 @ r9<- AA
2140 FETCH_B r3, 1, 1 @ r3<- CC
2141 GET_VREG r0, r2 @ r0<- vBB (array object)
2142 GET_VREG r1, r3 @ r1<- vCC (requested index)
2143 cmp r0, #0 @ null array object?
2144 beq common_errNullObject @ yes, bail
2145 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2146 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2147 cmp r1, r3 @ compare unsigned index, length
2148 bcs common_errArrayIndex @ index >= length, bail
2149 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2150 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2151 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002152 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002153 GOTO_OPCODE ip @ jump to next instruction
2154
2155
2156/* ------------------------------ */
2157 .balign 128
2158.L_op_aget_byte: /* 0x48 */
2159/* File: arm/op_aget_byte.S */
2160/* File: arm/op_aget.S */
2161 /*
2162 * Array get, 32 bits or less. vAA <- vBB[vCC].
2163 *
2164 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2165 * instructions. We use a pair of FETCH_Bs instead.
2166 *
buzbee76833da2016-01-13 13:06:22 -08002167 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002168 *
2169 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2170 * If this changes, specialize.
2171 */
2172 /* op vAA, vBB, vCC */
2173 FETCH_B r2, 1, 0 @ r2<- BB
2174 mov r9, rINST, lsr #8 @ r9<- AA
2175 FETCH_B r3, 1, 1 @ r3<- CC
2176 GET_VREG r0, r2 @ r0<- vBB (array object)
2177 GET_VREG r1, r3 @ r1<- vCC (requested index)
2178 cmp r0, #0 @ null array object?
2179 beq common_errNullObject @ yes, bail
2180 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2181 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2182 cmp r1, r3 @ compare unsigned index, length
2183 bcs common_errArrayIndex @ index >= length, bail
2184 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2185 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2186 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002187 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002188 GOTO_OPCODE ip @ jump to next instruction
2189
2190
2191/* ------------------------------ */
2192 .balign 128
2193.L_op_aget_char: /* 0x49 */
2194/* File: arm/op_aget_char.S */
2195/* File: arm/op_aget.S */
2196 /*
2197 * Array get, 32 bits or less. vAA <- vBB[vCC].
2198 *
2199 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2200 * instructions. We use a pair of FETCH_Bs instead.
2201 *
buzbee76833da2016-01-13 13:06:22 -08002202 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002203 *
2204 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2205 * If this changes, specialize.
2206 */
2207 /* op vAA, vBB, vCC */
2208 FETCH_B r2, 1, 0 @ r2<- BB
2209 mov r9, rINST, lsr #8 @ r9<- AA
2210 FETCH_B r3, 1, 1 @ r3<- CC
2211 GET_VREG r0, r2 @ r0<- vBB (array object)
2212 GET_VREG r1, r3 @ r1<- vCC (requested index)
2213 cmp r0, #0 @ null array object?
2214 beq common_errNullObject @ yes, bail
2215 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2216 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2217 cmp r1, r3 @ compare unsigned index, length
2218 bcs common_errArrayIndex @ index >= length, bail
2219 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2220 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2221 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002222 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002223 GOTO_OPCODE ip @ jump to next instruction
2224
2225
2226/* ------------------------------ */
2227 .balign 128
2228.L_op_aget_short: /* 0x4a */
2229/* File: arm/op_aget_short.S */
2230/* File: arm/op_aget.S */
2231 /*
2232 * Array get, 32 bits or less. vAA <- vBB[vCC].
2233 *
2234 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2235 * instructions. We use a pair of FETCH_Bs instead.
2236 *
buzbee76833da2016-01-13 13:06:22 -08002237 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002238 *
2239 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2240 * If this changes, specialize.
2241 */
2242 /* op vAA, vBB, vCC */
2243 FETCH_B r2, 1, 0 @ r2<- BB
2244 mov r9, rINST, lsr #8 @ r9<- AA
2245 FETCH_B r3, 1, 1 @ r3<- CC
2246 GET_VREG r0, r2 @ r0<- vBB (array object)
2247 GET_VREG r1, r3 @ r1<- vCC (requested index)
2248 cmp r0, #0 @ null array object?
2249 beq common_errNullObject @ yes, bail
2250 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2251 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2252 cmp r1, r3 @ compare unsigned index, length
2253 bcs common_errArrayIndex @ index >= length, bail
2254 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2255 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2256 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002257 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002258 GOTO_OPCODE ip @ jump to next instruction
2259
2260
2261/* ------------------------------ */
2262 .balign 128
2263.L_op_aput: /* 0x4b */
2264/* File: arm/op_aput.S */
2265 /*
2266 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2267 *
2268 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2269 * instructions. We use a pair of FETCH_Bs instead.
2270 *
2271 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2272 *
2273 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2274 * If this changes, specialize.
2275 */
2276 /* op vAA, vBB, vCC */
2277 FETCH_B r2, 1, 0 @ r2<- BB
2278 mov r9, rINST, lsr #8 @ r9<- AA
2279 FETCH_B r3, 1, 1 @ r3<- CC
2280 GET_VREG r0, r2 @ r0<- vBB (array object)
2281 GET_VREG r1, r3 @ r1<- vCC (requested index)
2282 cmp r0, #0 @ null array object?
2283 beq common_errNullObject @ yes, bail
2284 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2285 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2286 cmp r1, r3 @ compare unsigned index, length
2287 bcs common_errArrayIndex @ index >= length, bail
2288 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2289 GET_VREG r2, r9 @ r2<- vAA
2290 GET_INST_OPCODE ip @ extract opcode from rINST
2291 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2292 GOTO_OPCODE ip @ jump to next instruction
2293
2294/* ------------------------------ */
2295 .balign 128
2296.L_op_aput_wide: /* 0x4c */
2297/* File: arm/op_aput_wide.S */
2298 /*
2299 * Array put, 64 bits. vBB[vCC] <- vAA.
2300 *
2301 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2302 */
2303 /* aput-wide vAA, vBB, vCC */
2304 FETCH r0, 1 @ r0<- CCBB
2305 mov r9, rINST, lsr #8 @ r9<- AA
2306 and r2, r0, #255 @ r2<- BB
2307 mov r3, r0, lsr #8 @ r3<- CC
2308 GET_VREG r0, r2 @ r0<- vBB (array object)
2309 GET_VREG r1, r3 @ r1<- vCC (requested index)
2310 cmp r0, #0 @ null array object?
2311 beq common_errNullObject @ yes, bail
2312 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2313 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2314 cmp r1, r3 @ compare unsigned index, length
buzbeeace690f2016-03-11 09:51:11 -08002315 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08002316 bcs common_errArrayIndex @ index >= length, bail
2317 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2318 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1
2319 GET_INST_OPCODE ip @ extract opcode from rINST
2320 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2321 GOTO_OPCODE ip @ jump to next instruction
2322
2323/* ------------------------------ */
2324 .balign 128
2325.L_op_aput_object: /* 0x4d */
2326/* File: arm/op_aput_object.S */
2327 /*
2328 * Store an object into an array. vBB[vCC] <- vAA.
2329 */
2330 /* op vAA, vBB, vCC */
2331 EXPORT_PC
2332 add r0, rFP, #OFF_FP_SHADOWFRAME
2333 mov r1, rPC
2334 mov r2, rINST
2335 bl MterpAputObject
2336 cmp r0, #0
2337 beq MterpPossibleException
2338 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2339 GET_INST_OPCODE ip @ extract opcode from rINST
2340 GOTO_OPCODE ip @ jump to next instruction
2341
2342/* ------------------------------ */
2343 .balign 128
2344.L_op_aput_boolean: /* 0x4e */
2345/* File: arm/op_aput_boolean.S */
2346/* File: arm/op_aput.S */
2347 /*
2348 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2349 *
2350 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2351 * instructions. We use a pair of FETCH_Bs instead.
2352 *
2353 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2354 *
2355 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2356 * If this changes, specialize.
2357 */
2358 /* op vAA, vBB, vCC */
2359 FETCH_B r2, 1, 0 @ r2<- BB
2360 mov r9, rINST, lsr #8 @ r9<- AA
2361 FETCH_B r3, 1, 1 @ r3<- CC
2362 GET_VREG r0, r2 @ r0<- vBB (array object)
2363 GET_VREG r1, r3 @ r1<- vCC (requested index)
2364 cmp r0, #0 @ null array object?
2365 beq common_errNullObject @ yes, bail
2366 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2367 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2368 cmp r1, r3 @ compare unsigned index, length
2369 bcs common_errArrayIndex @ index >= length, bail
2370 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2371 GET_VREG r2, r9 @ r2<- vAA
2372 GET_INST_OPCODE ip @ extract opcode from rINST
2373 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2374 GOTO_OPCODE ip @ jump to next instruction
2375
2376
2377/* ------------------------------ */
2378 .balign 128
2379.L_op_aput_byte: /* 0x4f */
2380/* File: arm/op_aput_byte.S */
2381/* File: arm/op_aput.S */
2382 /*
2383 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2384 *
2385 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2386 * instructions. We use a pair of FETCH_Bs instead.
2387 *
2388 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2389 *
2390 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2391 * If this changes, specialize.
2392 */
2393 /* op vAA, vBB, vCC */
2394 FETCH_B r2, 1, 0 @ r2<- BB
2395 mov r9, rINST, lsr #8 @ r9<- AA
2396 FETCH_B r3, 1, 1 @ r3<- CC
2397 GET_VREG r0, r2 @ r0<- vBB (array object)
2398 GET_VREG r1, r3 @ r1<- vCC (requested index)
2399 cmp r0, #0 @ null array object?
2400 beq common_errNullObject @ yes, bail
2401 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2402 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2403 cmp r1, r3 @ compare unsigned index, length
2404 bcs common_errArrayIndex @ index >= length, bail
2405 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2406 GET_VREG r2, r9 @ r2<- vAA
2407 GET_INST_OPCODE ip @ extract opcode from rINST
2408 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2409 GOTO_OPCODE ip @ jump to next instruction
2410
2411
2412/* ------------------------------ */
2413 .balign 128
2414.L_op_aput_char: /* 0x50 */
2415/* File: arm/op_aput_char.S */
2416/* File: arm/op_aput.S */
2417 /*
2418 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2419 *
2420 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2421 * instructions. We use a pair of FETCH_Bs instead.
2422 *
2423 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2424 *
2425 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2426 * If this changes, specialize.
2427 */
2428 /* op vAA, vBB, vCC */
2429 FETCH_B r2, 1, 0 @ r2<- BB
2430 mov r9, rINST, lsr #8 @ r9<- AA
2431 FETCH_B r3, 1, 1 @ r3<- CC
2432 GET_VREG r0, r2 @ r0<- vBB (array object)
2433 GET_VREG r1, r3 @ r1<- vCC (requested index)
2434 cmp r0, #0 @ null array object?
2435 beq common_errNullObject @ yes, bail
2436 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2437 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2438 cmp r1, r3 @ compare unsigned index, length
2439 bcs common_errArrayIndex @ index >= length, bail
2440 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2441 GET_VREG r2, r9 @ r2<- vAA
2442 GET_INST_OPCODE ip @ extract opcode from rINST
2443 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2444 GOTO_OPCODE ip @ jump to next instruction
2445
2446
2447/* ------------------------------ */
2448 .balign 128
2449.L_op_aput_short: /* 0x51 */
2450/* File: arm/op_aput_short.S */
2451/* File: arm/op_aput.S */
2452 /*
2453 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2454 *
2455 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2456 * instructions. We use a pair of FETCH_Bs instead.
2457 *
2458 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2459 *
2460 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2461 * If this changes, specialize.
2462 */
2463 /* op vAA, vBB, vCC */
2464 FETCH_B r2, 1, 0 @ r2<- BB
2465 mov r9, rINST, lsr #8 @ r9<- AA
2466 FETCH_B r3, 1, 1 @ r3<- CC
2467 GET_VREG r0, r2 @ r0<- vBB (array object)
2468 GET_VREG r1, r3 @ r1<- vCC (requested index)
2469 cmp r0, #0 @ null array object?
2470 beq common_errNullObject @ yes, bail
2471 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2472 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2473 cmp r1, r3 @ compare unsigned index, length
2474 bcs common_errArrayIndex @ index >= length, bail
2475 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2476 GET_VREG r2, r9 @ r2<- vAA
2477 GET_INST_OPCODE ip @ extract opcode from rINST
2478 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2479 GOTO_OPCODE ip @ jump to next instruction
2480
2481
2482/* ------------------------------ */
2483 .balign 128
2484.L_op_iget: /* 0x52 */
2485/* File: arm/op_iget.S */
2486 /*
2487 * General instance field get.
2488 *
2489 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2490 */
2491 EXPORT_PC
2492 FETCH r0, 1 @ r0<- field ref CCCC
2493 mov r1, rINST, lsr #12 @ r1<- B
2494 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2495 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2496 mov r3, rSELF @ r3<- self
2497 bl artGet32InstanceFromCode
2498 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2499 ubfx r2, rINST, #8, #4 @ r2<- A
2500 PREFETCH_INST 2
2501 cmp r3, #0
2502 bne MterpPossibleException @ bail out
2503 .if 0
2504 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2505 .else
2506 SET_VREG r0, r2 @ fp[A]<- r0
2507 .endif
2508 ADVANCE 2
2509 GET_INST_OPCODE ip @ extract opcode from rINST
2510 GOTO_OPCODE ip @ jump to next instruction
2511
2512/* ------------------------------ */
2513 .balign 128
2514.L_op_iget_wide: /* 0x53 */
2515/* File: arm/op_iget_wide.S */
2516 /*
2517 * 64-bit instance field get.
2518 *
2519 * for: iget-wide
2520 */
2521 EXPORT_PC
2522 FETCH r0, 1 @ r0<- field ref CCCC
2523 mov r1, rINST, lsr #12 @ r1<- B
2524 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2525 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2526 mov r3, rSELF @ r3<- self
2527 bl artGet64InstanceFromCode
2528 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2529 ubfx r2, rINST, #8, #4 @ r2<- A
2530 PREFETCH_INST 2
2531 cmp r3, #0
2532 bne MterpException @ bail out
buzbee50cf6002016-02-10 08:59:12 -08002533 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
buzbeeace690f2016-03-11 09:51:11 -08002534 VREG_INDEX_TO_ADDR r3, r2 @ r3<- &fp[A]
buzbee50cf6002016-02-10 08:59:12 -08002535 stmia r3, {r0-r1} @ fp[A]<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -08002536 ADVANCE 2
2537 GET_INST_OPCODE ip @ extract opcode from rINST
2538 GOTO_OPCODE ip @ jump to next instruction
2539
2540/* ------------------------------ */
2541 .balign 128
2542.L_op_iget_object: /* 0x54 */
2543/* File: arm/op_iget_object.S */
2544/* File: arm/op_iget.S */
2545 /*
2546 * General instance field get.
2547 *
2548 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2549 */
2550 EXPORT_PC
2551 FETCH r0, 1 @ r0<- field ref CCCC
2552 mov r1, rINST, lsr #12 @ r1<- B
2553 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2554 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2555 mov r3, rSELF @ r3<- self
2556 bl artGetObjInstanceFromCode
2557 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2558 ubfx r2, rINST, #8, #4 @ r2<- A
2559 PREFETCH_INST 2
2560 cmp r3, #0
2561 bne MterpPossibleException @ bail out
2562 .if 1
2563 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2564 .else
2565 SET_VREG r0, r2 @ fp[A]<- r0
2566 .endif
2567 ADVANCE 2
2568 GET_INST_OPCODE ip @ extract opcode from rINST
2569 GOTO_OPCODE ip @ jump to next instruction
2570
2571
2572/* ------------------------------ */
2573 .balign 128
2574.L_op_iget_boolean: /* 0x55 */
2575/* File: arm/op_iget_boolean.S */
2576/* File: arm/op_iget.S */
2577 /*
2578 * General instance field get.
2579 *
2580 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2581 */
2582 EXPORT_PC
2583 FETCH r0, 1 @ r0<- field ref CCCC
2584 mov r1, rINST, lsr #12 @ r1<- B
2585 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2586 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2587 mov r3, rSELF @ r3<- self
2588 bl artGetBooleanInstanceFromCode
2589 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2590 ubfx r2, rINST, #8, #4 @ r2<- A
2591 PREFETCH_INST 2
2592 cmp r3, #0
2593 bne MterpPossibleException @ bail out
2594 .if 0
2595 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2596 .else
2597 SET_VREG r0, r2 @ fp[A]<- r0
2598 .endif
2599 ADVANCE 2
2600 GET_INST_OPCODE ip @ extract opcode from rINST
2601 GOTO_OPCODE ip @ jump to next instruction
2602
2603
2604/* ------------------------------ */
2605 .balign 128
2606.L_op_iget_byte: /* 0x56 */
2607/* File: arm/op_iget_byte.S */
2608/* File: arm/op_iget.S */
2609 /*
2610 * General instance field get.
2611 *
2612 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2613 */
2614 EXPORT_PC
2615 FETCH r0, 1 @ r0<- field ref CCCC
2616 mov r1, rINST, lsr #12 @ r1<- B
2617 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2618 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2619 mov r3, rSELF @ r3<- self
2620 bl artGetByteInstanceFromCode
2621 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2622 ubfx r2, rINST, #8, #4 @ r2<- A
2623 PREFETCH_INST 2
2624 cmp r3, #0
2625 bne MterpPossibleException @ bail out
2626 .if 0
2627 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2628 .else
2629 SET_VREG r0, r2 @ fp[A]<- r0
2630 .endif
2631 ADVANCE 2
2632 GET_INST_OPCODE ip @ extract opcode from rINST
2633 GOTO_OPCODE ip @ jump to next instruction
2634
2635
2636/* ------------------------------ */
2637 .balign 128
2638.L_op_iget_char: /* 0x57 */
2639/* File: arm/op_iget_char.S */
2640/* File: arm/op_iget.S */
2641 /*
2642 * General instance field get.
2643 *
2644 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2645 */
2646 EXPORT_PC
2647 FETCH r0, 1 @ r0<- field ref CCCC
2648 mov r1, rINST, lsr #12 @ r1<- B
2649 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2650 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2651 mov r3, rSELF @ r3<- self
2652 bl artGetCharInstanceFromCode
2653 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2654 ubfx r2, rINST, #8, #4 @ r2<- A
2655 PREFETCH_INST 2
2656 cmp r3, #0
2657 bne MterpPossibleException @ bail out
2658 .if 0
2659 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2660 .else
2661 SET_VREG r0, r2 @ fp[A]<- r0
2662 .endif
2663 ADVANCE 2
2664 GET_INST_OPCODE ip @ extract opcode from rINST
2665 GOTO_OPCODE ip @ jump to next instruction
2666
2667
2668/* ------------------------------ */
2669 .balign 128
2670.L_op_iget_short: /* 0x58 */
2671/* File: arm/op_iget_short.S */
2672/* File: arm/op_iget.S */
2673 /*
2674 * General instance field get.
2675 *
2676 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2677 */
2678 EXPORT_PC
2679 FETCH r0, 1 @ r0<- field ref CCCC
2680 mov r1, rINST, lsr #12 @ r1<- B
2681 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2682 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2683 mov r3, rSELF @ r3<- self
2684 bl artGetShortInstanceFromCode
2685 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2686 ubfx r2, rINST, #8, #4 @ r2<- A
2687 PREFETCH_INST 2
2688 cmp r3, #0
2689 bne MterpPossibleException @ bail out
2690 .if 0
2691 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2692 .else
2693 SET_VREG r0, r2 @ fp[A]<- r0
2694 .endif
2695 ADVANCE 2
2696 GET_INST_OPCODE ip @ extract opcode from rINST
2697 GOTO_OPCODE ip @ jump to next instruction
2698
2699
2700/* ------------------------------ */
2701 .balign 128
2702.L_op_iput: /* 0x59 */
2703/* File: arm/op_iput.S */
2704 /*
2705 * General 32-bit instance field put.
2706 *
2707 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2708 */
2709 /* op vA, vB, field@CCCC */
2710 .extern artSet32InstanceFromMterp
2711 EXPORT_PC
2712 FETCH r0, 1 @ r0<- field ref CCCC
2713 mov r1, rINST, lsr #12 @ r1<- B
2714 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2715 ubfx r2, rINST, #8, #4 @ r2<- A
2716 GET_VREG r2, r2 @ r2<- fp[A]
2717 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2718 PREFETCH_INST 2
2719 bl artSet32InstanceFromMterp
2720 cmp r0, #0
2721 bne MterpPossibleException
2722 ADVANCE 2 @ advance rPC
2723 GET_INST_OPCODE ip @ extract opcode from rINST
2724 GOTO_OPCODE ip @ jump to next instruction
2725
2726/* ------------------------------ */
2727 .balign 128
2728.L_op_iput_wide: /* 0x5a */
2729/* File: arm/op_iput_wide.S */
2730 /* iput-wide vA, vB, field@CCCC */
2731 .extern artSet64InstanceFromMterp
2732 EXPORT_PC
2733 FETCH r0, 1 @ r0<- field ref CCCC
2734 mov r1, rINST, lsr #12 @ r1<- B
2735 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2736 ubfx r2, rINST, #8, #4 @ r2<- A
buzbeeace690f2016-03-11 09:51:11 -08002737 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08002738 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2739 PREFETCH_INST 2
2740 bl artSet64InstanceFromMterp
2741 cmp r0, #0
2742 bne MterpPossibleException
2743 ADVANCE 2 @ advance rPC
2744 GET_INST_OPCODE ip @ extract opcode from rINST
2745 GOTO_OPCODE ip @ jump to next instruction
2746
2747/* ------------------------------ */
2748 .balign 128
2749.L_op_iput_object: /* 0x5b */
2750/* File: arm/op_iput_object.S */
2751 EXPORT_PC
2752 add r0, rFP, #OFF_FP_SHADOWFRAME
2753 mov r1, rPC
2754 mov r2, rINST
2755 mov r3, rSELF
2756 bl MterpIputObject
2757 cmp r0, #0
2758 beq MterpException
2759 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2760 GET_INST_OPCODE ip @ extract opcode from rINST
2761 GOTO_OPCODE ip @ jump to next instruction
2762
2763/* ------------------------------ */
2764 .balign 128
2765.L_op_iput_boolean: /* 0x5c */
2766/* File: arm/op_iput_boolean.S */
2767/* File: arm/op_iput.S */
2768 /*
2769 * General 32-bit instance field put.
2770 *
2771 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2772 */
2773 /* op vA, vB, field@CCCC */
2774 .extern artSet8InstanceFromMterp
2775 EXPORT_PC
2776 FETCH r0, 1 @ r0<- field ref CCCC
2777 mov r1, rINST, lsr #12 @ r1<- B
2778 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2779 ubfx r2, rINST, #8, #4 @ r2<- A
2780 GET_VREG r2, r2 @ r2<- fp[A]
2781 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2782 PREFETCH_INST 2
2783 bl artSet8InstanceFromMterp
2784 cmp r0, #0
2785 bne MterpPossibleException
2786 ADVANCE 2 @ advance rPC
2787 GET_INST_OPCODE ip @ extract opcode from rINST
2788 GOTO_OPCODE ip @ jump to next instruction
2789
2790
2791/* ------------------------------ */
2792 .balign 128
2793.L_op_iput_byte: /* 0x5d */
2794/* File: arm/op_iput_byte.S */
2795/* File: arm/op_iput.S */
2796 /*
2797 * General 32-bit instance field put.
2798 *
2799 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2800 */
2801 /* op vA, vB, field@CCCC */
2802 .extern artSet8InstanceFromMterp
2803 EXPORT_PC
2804 FETCH r0, 1 @ r0<- field ref CCCC
2805 mov r1, rINST, lsr #12 @ r1<- B
2806 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2807 ubfx r2, rINST, #8, #4 @ r2<- A
2808 GET_VREG r2, r2 @ r2<- fp[A]
2809 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2810 PREFETCH_INST 2
2811 bl artSet8InstanceFromMterp
2812 cmp r0, #0
2813 bne MterpPossibleException
2814 ADVANCE 2 @ advance rPC
2815 GET_INST_OPCODE ip @ extract opcode from rINST
2816 GOTO_OPCODE ip @ jump to next instruction
2817
2818
2819/* ------------------------------ */
2820 .balign 128
2821.L_op_iput_char: /* 0x5e */
2822/* File: arm/op_iput_char.S */
2823/* File: arm/op_iput.S */
2824 /*
2825 * General 32-bit instance field put.
2826 *
2827 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2828 */
2829 /* op vA, vB, field@CCCC */
2830 .extern artSet16InstanceFromMterp
2831 EXPORT_PC
2832 FETCH r0, 1 @ r0<- field ref CCCC
2833 mov r1, rINST, lsr #12 @ r1<- B
2834 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2835 ubfx r2, rINST, #8, #4 @ r2<- A
2836 GET_VREG r2, r2 @ r2<- fp[A]
2837 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2838 PREFETCH_INST 2
2839 bl artSet16InstanceFromMterp
2840 cmp r0, #0
2841 bne MterpPossibleException
2842 ADVANCE 2 @ advance rPC
2843 GET_INST_OPCODE ip @ extract opcode from rINST
2844 GOTO_OPCODE ip @ jump to next instruction
2845
2846
2847/* ------------------------------ */
2848 .balign 128
2849.L_op_iput_short: /* 0x5f */
2850/* File: arm/op_iput_short.S */
2851/* File: arm/op_iput.S */
2852 /*
2853 * General 32-bit instance field put.
2854 *
2855 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2856 */
2857 /* op vA, vB, field@CCCC */
2858 .extern artSet16InstanceFromMterp
2859 EXPORT_PC
2860 FETCH r0, 1 @ r0<- field ref CCCC
2861 mov r1, rINST, lsr #12 @ r1<- B
2862 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2863 ubfx r2, rINST, #8, #4 @ r2<- A
2864 GET_VREG r2, r2 @ r2<- fp[A]
2865 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2866 PREFETCH_INST 2
2867 bl artSet16InstanceFromMterp
2868 cmp r0, #0
2869 bne MterpPossibleException
2870 ADVANCE 2 @ advance rPC
2871 GET_INST_OPCODE ip @ extract opcode from rINST
2872 GOTO_OPCODE ip @ jump to next instruction
2873
2874
2875/* ------------------------------ */
2876 .balign 128
2877.L_op_sget: /* 0x60 */
2878/* File: arm/op_sget.S */
2879 /*
2880 * General SGET handler wrapper.
2881 *
2882 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2883 */
2884 /* op vAA, field@BBBB */
2885
2886 .extern artGet32StaticFromCode
2887 EXPORT_PC
2888 FETCH r0, 1 @ r0<- field ref BBBB
2889 ldr r1, [rFP, #OFF_FP_METHOD]
2890 mov r2, rSELF
2891 bl artGet32StaticFromCode
2892 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2893 mov r2, rINST, lsr #8 @ r2<- AA
2894 PREFETCH_INST 2
2895 cmp r3, #0 @ Fail to resolve?
2896 bne MterpException @ bail out
2897.if 0
2898 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2899.else
2900 SET_VREG r0, r2 @ fp[AA]<- r0
2901.endif
2902 ADVANCE 2
2903 GET_INST_OPCODE ip @ extract opcode from rINST
2904 GOTO_OPCODE ip
2905
2906/* ------------------------------ */
2907 .balign 128
2908.L_op_sget_wide: /* 0x61 */
2909/* File: arm/op_sget_wide.S */
2910 /*
2911 * SGET_WIDE handler wrapper.
2912 *
2913 */
2914 /* sget-wide vAA, field@BBBB */
2915
2916 .extern artGet64StaticFromCode
2917 EXPORT_PC
2918 FETCH r0, 1 @ r0<- field ref BBBB
2919 ldr r1, [rFP, #OFF_FP_METHOD]
2920 mov r2, rSELF
2921 bl artGet64StaticFromCode
2922 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2923 mov r9, rINST, lsr #8 @ r9<- AA
buzbeeace690f2016-03-11 09:51:11 -08002924 VREG_INDEX_TO_ADDR lr, r9 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08002925 cmp r3, #0 @ Fail to resolve?
2926 bne MterpException @ bail out
2927 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -08002928 CLEAR_SHADOW_PAIR r9, r2, ip @ Zero out the shadow regs
2929 stmia lr, {r0-r1} @ vAA/vAA+1<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -08002930 GET_INST_OPCODE ip @ extract opcode from rINST
2931 GOTO_OPCODE ip @ jump to next instruction
2932
2933/* ------------------------------ */
2934 .balign 128
2935.L_op_sget_object: /* 0x62 */
2936/* File: arm/op_sget_object.S */
2937/* File: arm/op_sget.S */
2938 /*
2939 * General SGET handler wrapper.
2940 *
2941 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2942 */
2943 /* op vAA, field@BBBB */
2944
2945 .extern artGetObjStaticFromCode
2946 EXPORT_PC
2947 FETCH r0, 1 @ r0<- field ref BBBB
2948 ldr r1, [rFP, #OFF_FP_METHOD]
2949 mov r2, rSELF
2950 bl artGetObjStaticFromCode
2951 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2952 mov r2, rINST, lsr #8 @ r2<- AA
2953 PREFETCH_INST 2
2954 cmp r3, #0 @ Fail to resolve?
2955 bne MterpException @ bail out
2956.if 1
2957 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2958.else
2959 SET_VREG r0, r2 @ fp[AA]<- r0
2960.endif
2961 ADVANCE 2
2962 GET_INST_OPCODE ip @ extract opcode from rINST
2963 GOTO_OPCODE ip
2964
2965
2966/* ------------------------------ */
2967 .balign 128
2968.L_op_sget_boolean: /* 0x63 */
2969/* File: arm/op_sget_boolean.S */
2970/* File: arm/op_sget.S */
2971 /*
2972 * General SGET handler wrapper.
2973 *
2974 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2975 */
2976 /* op vAA, field@BBBB */
2977
2978 .extern artGetBooleanStaticFromCode
2979 EXPORT_PC
2980 FETCH r0, 1 @ r0<- field ref BBBB
2981 ldr r1, [rFP, #OFF_FP_METHOD]
2982 mov r2, rSELF
2983 bl artGetBooleanStaticFromCode
2984 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2985 mov r2, rINST, lsr #8 @ r2<- AA
2986 PREFETCH_INST 2
2987 cmp r3, #0 @ Fail to resolve?
2988 bne MterpException @ bail out
2989.if 0
2990 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2991.else
2992 SET_VREG r0, r2 @ fp[AA]<- r0
2993.endif
2994 ADVANCE 2
2995 GET_INST_OPCODE ip @ extract opcode from rINST
2996 GOTO_OPCODE ip
2997
2998
2999/* ------------------------------ */
3000 .balign 128
3001.L_op_sget_byte: /* 0x64 */
3002/* File: arm/op_sget_byte.S */
3003/* File: arm/op_sget.S */
3004 /*
3005 * General SGET handler wrapper.
3006 *
3007 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3008 */
3009 /* op vAA, field@BBBB */
3010
3011 .extern artGetByteStaticFromCode
3012 EXPORT_PC
3013 FETCH r0, 1 @ r0<- field ref BBBB
3014 ldr r1, [rFP, #OFF_FP_METHOD]
3015 mov r2, rSELF
3016 bl artGetByteStaticFromCode
3017 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3018 mov r2, rINST, lsr #8 @ r2<- AA
3019 PREFETCH_INST 2
3020 cmp r3, #0 @ Fail to resolve?
3021 bne MterpException @ bail out
3022.if 0
3023 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3024.else
3025 SET_VREG r0, r2 @ fp[AA]<- r0
3026.endif
3027 ADVANCE 2
3028 GET_INST_OPCODE ip @ extract opcode from rINST
3029 GOTO_OPCODE ip
3030
3031
3032/* ------------------------------ */
3033 .balign 128
3034.L_op_sget_char: /* 0x65 */
3035/* File: arm/op_sget_char.S */
3036/* File: arm/op_sget.S */
3037 /*
3038 * General SGET handler wrapper.
3039 *
3040 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3041 */
3042 /* op vAA, field@BBBB */
3043
3044 .extern artGetCharStaticFromCode
3045 EXPORT_PC
3046 FETCH r0, 1 @ r0<- field ref BBBB
3047 ldr r1, [rFP, #OFF_FP_METHOD]
3048 mov r2, rSELF
3049 bl artGetCharStaticFromCode
3050 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3051 mov r2, rINST, lsr #8 @ r2<- AA
3052 PREFETCH_INST 2
3053 cmp r3, #0 @ Fail to resolve?
3054 bne MterpException @ bail out
3055.if 0
3056 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3057.else
3058 SET_VREG r0, r2 @ fp[AA]<- r0
3059.endif
3060 ADVANCE 2
3061 GET_INST_OPCODE ip @ extract opcode from rINST
3062 GOTO_OPCODE ip
3063
3064
3065/* ------------------------------ */
3066 .balign 128
3067.L_op_sget_short: /* 0x66 */
3068/* File: arm/op_sget_short.S */
3069/* File: arm/op_sget.S */
3070 /*
3071 * General SGET handler wrapper.
3072 *
3073 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3074 */
3075 /* op vAA, field@BBBB */
3076
3077 .extern artGetShortStaticFromCode
3078 EXPORT_PC
3079 FETCH r0, 1 @ r0<- field ref BBBB
3080 ldr r1, [rFP, #OFF_FP_METHOD]
3081 mov r2, rSELF
3082 bl artGetShortStaticFromCode
3083 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3084 mov r2, rINST, lsr #8 @ r2<- AA
3085 PREFETCH_INST 2
3086 cmp r3, #0 @ Fail to resolve?
3087 bne MterpException @ bail out
3088.if 0
3089 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3090.else
3091 SET_VREG r0, r2 @ fp[AA]<- r0
3092.endif
3093 ADVANCE 2
3094 GET_INST_OPCODE ip @ extract opcode from rINST
3095 GOTO_OPCODE ip
3096
3097
3098/* ------------------------------ */
3099 .balign 128
3100.L_op_sput: /* 0x67 */
3101/* File: arm/op_sput.S */
3102 /*
3103 * General SPUT handler wrapper.
3104 *
3105 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3106 */
3107 /* op vAA, field@BBBB */
3108 EXPORT_PC
3109 FETCH r0, 1 @ r0<- field ref BBBB
3110 mov r3, rINST, lsr #8 @ r3<- AA
3111 GET_VREG r1, r3 @ r1<= fp[AA]
3112 ldr r2, [rFP, #OFF_FP_METHOD]
3113 mov r3, rSELF
3114 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3115 bl artSet32StaticFromCode
3116 cmp r0, #0 @ 0 on success, -1 on failure
3117 bne MterpException
3118 ADVANCE 2 @ Past exception point - now advance rPC
3119 GET_INST_OPCODE ip @ extract opcode from rINST
3120 GOTO_OPCODE ip @ jump to next instruction
3121
3122/* ------------------------------ */
3123 .balign 128
3124.L_op_sput_wide: /* 0x68 */
3125/* File: arm/op_sput_wide.S */
3126 /*
3127 * SPUT_WIDE handler wrapper.
3128 *
3129 */
3130 /* sput-wide vAA, field@BBBB */
3131 .extern artSet64IndirectStaticFromMterp
3132 EXPORT_PC
3133 FETCH r0, 1 @ r0<- field ref BBBB
3134 ldr r1, [rFP, #OFF_FP_METHOD]
3135 mov r2, rINST, lsr #8 @ r3<- AA
buzbeeace690f2016-03-11 09:51:11 -08003136 VREG_INDEX_TO_ADDR r2, r2
buzbee1452bee2015-03-06 14:43:04 -08003137 mov r3, rSELF
3138 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3139 bl artSet64IndirectStaticFromMterp
3140 cmp r0, #0 @ 0 on success, -1 on failure
3141 bne MterpException
3142 ADVANCE 2 @ Past exception point - now advance rPC
3143 GET_INST_OPCODE ip @ extract opcode from rINST
3144 GOTO_OPCODE ip @ jump to next instruction
3145
3146/* ------------------------------ */
3147 .balign 128
3148.L_op_sput_object: /* 0x69 */
3149/* File: arm/op_sput_object.S */
3150 EXPORT_PC
3151 add r0, rFP, #OFF_FP_SHADOWFRAME
3152 mov r1, rPC
3153 mov r2, rINST
3154 mov r3, rSELF
3155 bl MterpSputObject
3156 cmp r0, #0
3157 beq MterpException
3158 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3159 GET_INST_OPCODE ip @ extract opcode from rINST
3160 GOTO_OPCODE ip @ jump to next instruction
3161
3162/* ------------------------------ */
3163 .balign 128
3164.L_op_sput_boolean: /* 0x6a */
3165/* File: arm/op_sput_boolean.S */
3166/* File: arm/op_sput.S */
3167 /*
3168 * General SPUT handler wrapper.
3169 *
3170 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3171 */
3172 /* op vAA, field@BBBB */
3173 EXPORT_PC
3174 FETCH r0, 1 @ r0<- field ref BBBB
3175 mov r3, rINST, lsr #8 @ r3<- AA
3176 GET_VREG r1, r3 @ r1<= fp[AA]
3177 ldr r2, [rFP, #OFF_FP_METHOD]
3178 mov r3, rSELF
3179 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3180 bl artSet8StaticFromCode
3181 cmp r0, #0 @ 0 on success, -1 on failure
3182 bne MterpException
3183 ADVANCE 2 @ Past exception point - now advance rPC
3184 GET_INST_OPCODE ip @ extract opcode from rINST
3185 GOTO_OPCODE ip @ jump to next instruction
3186
3187
3188/* ------------------------------ */
3189 .balign 128
3190.L_op_sput_byte: /* 0x6b */
3191/* File: arm/op_sput_byte.S */
3192/* File: arm/op_sput.S */
3193 /*
3194 * General SPUT handler wrapper.
3195 *
3196 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3197 */
3198 /* op vAA, field@BBBB */
3199 EXPORT_PC
3200 FETCH r0, 1 @ r0<- field ref BBBB
3201 mov r3, rINST, lsr #8 @ r3<- AA
3202 GET_VREG r1, r3 @ r1<= fp[AA]
3203 ldr r2, [rFP, #OFF_FP_METHOD]
3204 mov r3, rSELF
3205 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3206 bl artSet8StaticFromCode
3207 cmp r0, #0 @ 0 on success, -1 on failure
3208 bne MterpException
3209 ADVANCE 2 @ Past exception point - now advance rPC
3210 GET_INST_OPCODE ip @ extract opcode from rINST
3211 GOTO_OPCODE ip @ jump to next instruction
3212
3213
3214/* ------------------------------ */
3215 .balign 128
3216.L_op_sput_char: /* 0x6c */
3217/* File: arm/op_sput_char.S */
3218/* File: arm/op_sput.S */
3219 /*
3220 * General SPUT handler wrapper.
3221 *
3222 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3223 */
3224 /* op vAA, field@BBBB */
3225 EXPORT_PC
3226 FETCH r0, 1 @ r0<- field ref BBBB
3227 mov r3, rINST, lsr #8 @ r3<- AA
3228 GET_VREG r1, r3 @ r1<= fp[AA]
3229 ldr r2, [rFP, #OFF_FP_METHOD]
3230 mov r3, rSELF
3231 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3232 bl artSet16StaticFromCode
3233 cmp r0, #0 @ 0 on success, -1 on failure
3234 bne MterpException
3235 ADVANCE 2 @ Past exception point - now advance rPC
3236 GET_INST_OPCODE ip @ extract opcode from rINST
3237 GOTO_OPCODE ip @ jump to next instruction
3238
3239
3240/* ------------------------------ */
3241 .balign 128
3242.L_op_sput_short: /* 0x6d */
3243/* File: arm/op_sput_short.S */
3244/* File: arm/op_sput.S */
3245 /*
3246 * General SPUT handler wrapper.
3247 *
3248 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3249 */
3250 /* op vAA, field@BBBB */
3251 EXPORT_PC
3252 FETCH r0, 1 @ r0<- field ref BBBB
3253 mov r3, rINST, lsr #8 @ r3<- AA
3254 GET_VREG r1, r3 @ r1<= fp[AA]
3255 ldr r2, [rFP, #OFF_FP_METHOD]
3256 mov r3, rSELF
3257 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3258 bl artSet16StaticFromCode
3259 cmp r0, #0 @ 0 on success, -1 on failure
3260 bne MterpException
3261 ADVANCE 2 @ Past exception point - now advance rPC
3262 GET_INST_OPCODE ip @ extract opcode from rINST
3263 GOTO_OPCODE ip @ jump to next instruction
3264
3265
3266/* ------------------------------ */
3267 .balign 128
3268.L_op_invoke_virtual: /* 0x6e */
3269/* File: arm/op_invoke_virtual.S */
3270/* File: arm/invoke.S */
3271 /*
3272 * Generic invoke handler wrapper.
3273 */
3274 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3275 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3276 .extern MterpInvokeVirtual
3277 EXPORT_PC
3278 mov r0, rSELF
3279 add r1, rFP, #OFF_FP_SHADOWFRAME
3280 mov r2, rPC
3281 mov r3, rINST
3282 bl MterpInvokeVirtual
3283 cmp r0, #0
3284 beq MterpException
3285 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003286 bl MterpShouldSwitchInterpreters
3287 cmp r0, #0
3288 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003289 GET_INST_OPCODE ip
3290 GOTO_OPCODE ip
3291
3292
3293 /*
3294 * Handle a virtual method call.
3295 *
3296 * for: invoke-virtual, invoke-virtual/range
3297 */
3298 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3299 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3300
3301/* ------------------------------ */
3302 .balign 128
3303.L_op_invoke_super: /* 0x6f */
3304/* File: arm/op_invoke_super.S */
3305/* File: arm/invoke.S */
3306 /*
3307 * Generic invoke handler wrapper.
3308 */
3309 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3310 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3311 .extern MterpInvokeSuper
3312 EXPORT_PC
3313 mov r0, rSELF
3314 add r1, rFP, #OFF_FP_SHADOWFRAME
3315 mov r2, rPC
3316 mov r3, rINST
3317 bl MterpInvokeSuper
3318 cmp r0, #0
3319 beq MterpException
3320 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003321 bl MterpShouldSwitchInterpreters
3322 cmp r0, #0
3323 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003324 GET_INST_OPCODE ip
3325 GOTO_OPCODE ip
3326
3327
3328 /*
3329 * Handle a "super" method call.
3330 *
3331 * for: invoke-super, invoke-super/range
3332 */
3333 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3334 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3335
3336/* ------------------------------ */
3337 .balign 128
3338.L_op_invoke_direct: /* 0x70 */
3339/* File: arm/op_invoke_direct.S */
3340/* File: arm/invoke.S */
3341 /*
3342 * Generic invoke handler wrapper.
3343 */
3344 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3345 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3346 .extern MterpInvokeDirect
3347 EXPORT_PC
3348 mov r0, rSELF
3349 add r1, rFP, #OFF_FP_SHADOWFRAME
3350 mov r2, rPC
3351 mov r3, rINST
3352 bl MterpInvokeDirect
3353 cmp r0, #0
3354 beq MterpException
3355 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003356 bl MterpShouldSwitchInterpreters
3357 cmp r0, #0
3358 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003359 GET_INST_OPCODE ip
3360 GOTO_OPCODE ip
3361
3362
3363
3364/* ------------------------------ */
3365 .balign 128
3366.L_op_invoke_static: /* 0x71 */
3367/* File: arm/op_invoke_static.S */
3368/* File: arm/invoke.S */
3369 /*
3370 * Generic invoke handler wrapper.
3371 */
3372 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3373 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3374 .extern MterpInvokeStatic
3375 EXPORT_PC
3376 mov r0, rSELF
3377 add r1, rFP, #OFF_FP_SHADOWFRAME
3378 mov r2, rPC
3379 mov r3, rINST
3380 bl MterpInvokeStatic
3381 cmp r0, #0
3382 beq MterpException
3383 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003384 bl MterpShouldSwitchInterpreters
3385 cmp r0, #0
3386 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003387 GET_INST_OPCODE ip
3388 GOTO_OPCODE ip
3389
3390
3391
3392
3393/* ------------------------------ */
3394 .balign 128
3395.L_op_invoke_interface: /* 0x72 */
3396/* File: arm/op_invoke_interface.S */
3397/* File: arm/invoke.S */
3398 /*
3399 * Generic invoke handler wrapper.
3400 */
3401 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3402 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3403 .extern MterpInvokeInterface
3404 EXPORT_PC
3405 mov r0, rSELF
3406 add r1, rFP, #OFF_FP_SHADOWFRAME
3407 mov r2, rPC
3408 mov r3, rINST
3409 bl MterpInvokeInterface
3410 cmp r0, #0
3411 beq MterpException
3412 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003413 bl MterpShouldSwitchInterpreters
3414 cmp r0, #0
3415 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003416 GET_INST_OPCODE ip
3417 GOTO_OPCODE ip
3418
3419
3420 /*
3421 * Handle an interface method call.
3422 *
3423 * for: invoke-interface, invoke-interface/range
3424 */
3425 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3426 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3427
3428/* ------------------------------ */
3429 .balign 128
3430.L_op_return_void_no_barrier: /* 0x73 */
3431/* File: arm/op_return_void_no_barrier.S */
buzbeea2c97a92016-01-25 15:41:24 -08003432 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
3433 mov r0, rSELF
3434 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3435 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -08003436 mov r0, #0
3437 mov r1, #0
3438 b MterpReturn
3439
3440/* ------------------------------ */
3441 .balign 128
3442.L_op_invoke_virtual_range: /* 0x74 */
3443/* File: arm/op_invoke_virtual_range.S */
3444/* File: arm/invoke.S */
3445 /*
3446 * Generic invoke handler wrapper.
3447 */
3448 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3449 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3450 .extern MterpInvokeVirtualRange
3451 EXPORT_PC
3452 mov r0, rSELF
3453 add r1, rFP, #OFF_FP_SHADOWFRAME
3454 mov r2, rPC
3455 mov r3, rINST
3456 bl MterpInvokeVirtualRange
3457 cmp r0, #0
3458 beq MterpException
3459 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003460 bl MterpShouldSwitchInterpreters
3461 cmp r0, #0
3462 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003463 GET_INST_OPCODE ip
3464 GOTO_OPCODE ip
3465
3466
3467
3468/* ------------------------------ */
3469 .balign 128
3470.L_op_invoke_super_range: /* 0x75 */
3471/* File: arm/op_invoke_super_range.S */
3472/* File: arm/invoke.S */
3473 /*
3474 * Generic invoke handler wrapper.
3475 */
3476 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3477 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3478 .extern MterpInvokeSuperRange
3479 EXPORT_PC
3480 mov r0, rSELF
3481 add r1, rFP, #OFF_FP_SHADOWFRAME
3482 mov r2, rPC
3483 mov r3, rINST
3484 bl MterpInvokeSuperRange
3485 cmp r0, #0
3486 beq MterpException
3487 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003488 bl MterpShouldSwitchInterpreters
3489 cmp r0, #0
3490 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003491 GET_INST_OPCODE ip
3492 GOTO_OPCODE ip
3493
3494
3495
3496/* ------------------------------ */
3497 .balign 128
3498.L_op_invoke_direct_range: /* 0x76 */
3499/* File: arm/op_invoke_direct_range.S */
3500/* File: arm/invoke.S */
3501 /*
3502 * Generic invoke handler wrapper.
3503 */
3504 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3505 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3506 .extern MterpInvokeDirectRange
3507 EXPORT_PC
3508 mov r0, rSELF
3509 add r1, rFP, #OFF_FP_SHADOWFRAME
3510 mov r2, rPC
3511 mov r3, rINST
3512 bl MterpInvokeDirectRange
3513 cmp r0, #0
3514 beq MterpException
3515 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003516 bl MterpShouldSwitchInterpreters
3517 cmp r0, #0
3518 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003519 GET_INST_OPCODE ip
3520 GOTO_OPCODE ip
3521
3522
3523
3524/* ------------------------------ */
3525 .balign 128
3526.L_op_invoke_static_range: /* 0x77 */
3527/* File: arm/op_invoke_static_range.S */
3528/* File: arm/invoke.S */
3529 /*
3530 * Generic invoke handler wrapper.
3531 */
3532 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3533 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3534 .extern MterpInvokeStaticRange
3535 EXPORT_PC
3536 mov r0, rSELF
3537 add r1, rFP, #OFF_FP_SHADOWFRAME
3538 mov r2, rPC
3539 mov r3, rINST
3540 bl MterpInvokeStaticRange
3541 cmp r0, #0
3542 beq MterpException
3543 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003544 bl MterpShouldSwitchInterpreters
3545 cmp r0, #0
3546 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003547 GET_INST_OPCODE ip
3548 GOTO_OPCODE ip
3549
3550
3551
3552/* ------------------------------ */
3553 .balign 128
3554.L_op_invoke_interface_range: /* 0x78 */
3555/* File: arm/op_invoke_interface_range.S */
3556/* File: arm/invoke.S */
3557 /*
3558 * Generic invoke handler wrapper.
3559 */
3560 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3561 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3562 .extern MterpInvokeInterfaceRange
3563 EXPORT_PC
3564 mov r0, rSELF
3565 add r1, rFP, #OFF_FP_SHADOWFRAME
3566 mov r2, rPC
3567 mov r3, rINST
3568 bl MterpInvokeInterfaceRange
3569 cmp r0, #0
3570 beq MterpException
3571 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003572 bl MterpShouldSwitchInterpreters
3573 cmp r0, #0
3574 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08003575 GET_INST_OPCODE ip
3576 GOTO_OPCODE ip
3577
3578
3579
3580/* ------------------------------ */
3581 .balign 128
3582.L_op_unused_79: /* 0x79 */
3583/* File: arm/op_unused_79.S */
3584/* File: arm/unused.S */
3585/*
3586 * Bail to reference interpreter to throw.
3587 */
3588 b MterpFallback
3589
3590
3591/* ------------------------------ */
3592 .balign 128
3593.L_op_unused_7a: /* 0x7a */
3594/* File: arm/op_unused_7a.S */
3595/* File: arm/unused.S */
3596/*
3597 * Bail to reference interpreter to throw.
3598 */
3599 b MterpFallback
3600
3601
3602/* ------------------------------ */
3603 .balign 128
3604.L_op_neg_int: /* 0x7b */
3605/* File: arm/op_neg_int.S */
3606/* File: arm/unop.S */
3607 /*
3608 * Generic 32-bit unary operation. Provide an "instr" line that
3609 * specifies an instruction that performs "result = op r0".
3610 * This could be an ARM instruction or a function call.
3611 *
3612 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3613 * int-to-byte, int-to-char, int-to-short
3614 */
3615 /* unop vA, vB */
3616 mov r3, rINST, lsr #12 @ r3<- B
3617 ubfx r9, rINST, #8, #4 @ r9<- A
3618 GET_VREG r0, r3 @ r0<- vB
3619 @ optional op; may set condition codes
3620 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3621 rsb r0, r0, #0 @ r0<- op, r0-r3 changed
3622 GET_INST_OPCODE ip @ extract opcode from rINST
3623 SET_VREG r0, r9 @ vAA<- r0
3624 GOTO_OPCODE ip @ jump to next instruction
3625 /* 8-9 instructions */
3626
3627
3628/* ------------------------------ */
3629 .balign 128
3630.L_op_not_int: /* 0x7c */
3631/* File: arm/op_not_int.S */
3632/* File: arm/unop.S */
3633 /*
3634 * Generic 32-bit unary operation. Provide an "instr" line that
3635 * specifies an instruction that performs "result = op r0".
3636 * This could be an ARM instruction or a function call.
3637 *
3638 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3639 * int-to-byte, int-to-char, int-to-short
3640 */
3641 /* unop vA, vB */
3642 mov r3, rINST, lsr #12 @ r3<- B
3643 ubfx r9, rINST, #8, #4 @ r9<- A
3644 GET_VREG r0, r3 @ r0<- vB
3645 @ optional op; may set condition codes
3646 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3647 mvn r0, r0 @ r0<- op, r0-r3 changed
3648 GET_INST_OPCODE ip @ extract opcode from rINST
3649 SET_VREG r0, r9 @ vAA<- r0
3650 GOTO_OPCODE ip @ jump to next instruction
3651 /* 8-9 instructions */
3652
3653
3654/* ------------------------------ */
3655 .balign 128
3656.L_op_neg_long: /* 0x7d */
3657/* File: arm/op_neg_long.S */
3658/* File: arm/unopWide.S */
3659 /*
3660 * Generic 64-bit unary operation. Provide an "instr" line that
3661 * specifies an instruction that performs "result = op r0/r1".
3662 * This could be an ARM instruction or a function call.
3663 *
3664 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3665 */
3666 /* unop vA, vB */
3667 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003668 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08003669 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B]
3670 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003671 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003672 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003673 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3674 rsbs r0, r0, #0 @ optional op; may set condition codes
3675 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed
3676 GET_INST_OPCODE ip @ extract opcode from rINST
3677 stmia r9, {r0-r1} @ vAA<- r0/r1
3678 GOTO_OPCODE ip @ jump to next instruction
3679 /* 10-11 instructions */
3680
3681
3682/* ------------------------------ */
3683 .balign 128
3684.L_op_not_long: /* 0x7e */
3685/* File: arm/op_not_long.S */
3686/* File: arm/unopWide.S */
3687 /*
3688 * Generic 64-bit unary operation. Provide an "instr" line that
3689 * specifies an instruction that performs "result = op r0/r1".
3690 * This could be an ARM instruction or a function call.
3691 *
3692 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3693 */
3694 /* unop vA, vB */
3695 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003696 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08003697 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B]
3698 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003699 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003700 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003701 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3702 mvn r0, r0 @ optional op; may set condition codes
3703 mvn r1, r1 @ r0/r1<- op, r2-r3 changed
3704 GET_INST_OPCODE ip @ extract opcode from rINST
3705 stmia r9, {r0-r1} @ vAA<- r0/r1
3706 GOTO_OPCODE ip @ jump to next instruction
3707 /* 10-11 instructions */
3708
3709
3710/* ------------------------------ */
3711 .balign 128
3712.L_op_neg_float: /* 0x7f */
3713/* File: arm/op_neg_float.S */
3714/* File: arm/unop.S */
3715 /*
3716 * Generic 32-bit unary operation. Provide an "instr" line that
3717 * specifies an instruction that performs "result = op r0".
3718 * This could be an ARM instruction or a function call.
3719 *
3720 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3721 * int-to-byte, int-to-char, int-to-short
3722 */
3723 /* unop vA, vB */
3724 mov r3, rINST, lsr #12 @ r3<- B
3725 ubfx r9, rINST, #8, #4 @ r9<- A
3726 GET_VREG r0, r3 @ r0<- vB
3727 @ optional op; may set condition codes
3728 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3729 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed
3730 GET_INST_OPCODE ip @ extract opcode from rINST
3731 SET_VREG r0, r9 @ vAA<- r0
3732 GOTO_OPCODE ip @ jump to next instruction
3733 /* 8-9 instructions */
3734
3735
3736/* ------------------------------ */
3737 .balign 128
3738.L_op_neg_double: /* 0x80 */
3739/* File: arm/op_neg_double.S */
3740/* File: arm/unopWide.S */
3741 /*
3742 * Generic 64-bit unary operation. Provide an "instr" line that
3743 * specifies an instruction that performs "result = op r0/r1".
3744 * This could be an ARM instruction or a function call.
3745 *
3746 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3747 */
3748 /* unop vA, vB */
3749 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003750 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08003751 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B]
3752 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003753 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003754 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003755 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3756 @ optional op; may set condition codes
3757 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed
3758 GET_INST_OPCODE ip @ extract opcode from rINST
3759 stmia r9, {r0-r1} @ vAA<- r0/r1
3760 GOTO_OPCODE ip @ jump to next instruction
3761 /* 10-11 instructions */
3762
3763
3764/* ------------------------------ */
3765 .balign 128
3766.L_op_int_to_long: /* 0x81 */
3767/* File: arm/op_int_to_long.S */
3768/* File: arm/unopWider.S */
3769 /*
3770 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3771 * that specifies an instruction that performs "result = op r0", where
3772 * "result" is a 64-bit quantity in r0/r1.
3773 *
3774 * For: int-to-long, int-to-double, float-to-long, float-to-double
3775 */
3776 /* unop vA, vB */
3777 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003778 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003779 GET_VREG r0, r3 @ r0<- vB
buzbeeace690f2016-03-11 09:51:11 -08003780 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003781 @ optional op; may set condition codes
buzbee50cf6002016-02-10 08:59:12 -08003782 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003783 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3784 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed
3785 GET_INST_OPCODE ip @ extract opcode from rINST
3786 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3787 GOTO_OPCODE ip @ jump to next instruction
3788 /* 9-10 instructions */
3789
3790
3791/* ------------------------------ */
3792 .balign 128
3793.L_op_int_to_float: /* 0x82 */
3794/* File: arm/op_int_to_float.S */
3795/* File: arm/funop.S */
3796 /*
3797 * Generic 32-bit unary floating-point operation. Provide an "instr"
3798 * line that specifies an instruction that performs "s1 = op s0".
3799 *
3800 * for: int-to-float, float-to-int
3801 */
3802 /* unop vA, vB */
3803 mov r3, rINST, lsr #12 @ r3<- B
buzbee1452bee2015-03-06 14:43:04 -08003804 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3805 flds s0, [r3] @ s0<- vB
buzbeeace690f2016-03-11 09:51:11 -08003806 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08003807 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08003808 fsitos s1, s0 @ s1<- op
3809 GET_INST_OPCODE ip @ extract opcode from rINST
3810 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3811 fsts s1, [r9] @ vA<- s1
3812 GOTO_OPCODE ip @ jump to next instruction
3813
3814
3815/* ------------------------------ */
3816 .balign 128
3817.L_op_int_to_double: /* 0x83 */
3818/* File: arm/op_int_to_double.S */
3819/* File: arm/funopWider.S */
3820 /*
3821 * Generic 32bit-to-64bit floating point unary operation. Provide an
3822 * "instr" line that specifies an instruction that performs "d0 = op s0".
3823 *
3824 * For: int-to-double, float-to-double
3825 */
3826 /* unop vA, vB */
3827 mov r3, rINST, lsr #12 @ r3<- B
buzbee1452bee2015-03-06 14:43:04 -08003828 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3829 flds s0, [r3] @ s0<- vB
buzbeeace690f2016-03-11 09:51:11 -08003830 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08003831 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08003832 fsitod d0, s0 @ d0<- op
buzbee50cf6002016-02-10 08:59:12 -08003833 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003834 GET_INST_OPCODE ip @ extract opcode from rINST
3835 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3836 fstd d0, [r9] @ vA<- d0
3837 GOTO_OPCODE ip @ jump to next instruction
3838
3839
3840/* ------------------------------ */
3841 .balign 128
3842.L_op_long_to_int: /* 0x84 */
3843/* File: arm/op_long_to_int.S */
3844/* we ignore the high word, making this equivalent to a 32-bit reg move */
3845/* File: arm/op_move.S */
3846 /* for move, move-object, long-to-int */
3847 /* op vA, vB */
3848 mov r1, rINST, lsr #12 @ r1<- B from 15:12
3849 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
3850 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3851 GET_VREG r2, r1 @ r2<- fp[B]
3852 GET_INST_OPCODE ip @ ip<- opcode from rINST
3853 .if 0
3854 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
3855 .else
3856 SET_VREG r2, r0 @ fp[A]<- r2
3857 .endif
3858 GOTO_OPCODE ip @ execute next instruction
3859
3860
3861/* ------------------------------ */
3862 .balign 128
3863.L_op_long_to_float: /* 0x85 */
3864/* File: arm/op_long_to_float.S */
3865/* File: arm/unopNarrower.S */
3866 /*
3867 * Generic 64bit-to-32bit unary operation. Provide an "instr" line
3868 * that specifies an instruction that performs "result = op r0/r1", where
3869 * "result" is a 32-bit quantity in r0.
3870 *
3871 * For: long-to-float, double-to-int, double-to-float
3872 *
3873 * (This would work for long-to-int, but that instruction is actually
3874 * an exact match for op_move.)
3875 */
3876 /* unop vA, vB */
3877 mov r3, rINST, lsr #12 @ r3<- B
3878 ubfx r9, rINST, #8, #4 @ r9<- A
buzbeeace690f2016-03-11 09:51:11 -08003879 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B]
buzbee1452bee2015-03-06 14:43:04 -08003880 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1
3881 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3882 @ optional op; may set condition codes
3883 bl __aeabi_l2f @ r0<- op, r0-r3 changed
3884 GET_INST_OPCODE ip @ extract opcode from rINST
3885 SET_VREG r0, r9 @ vA<- r0
3886 GOTO_OPCODE ip @ jump to next instruction
3887 /* 9-10 instructions */
3888
3889
3890/* ------------------------------ */
3891 .balign 128
3892.L_op_long_to_double: /* 0x86 */
3893/* File: arm/op_long_to_double.S */
3894 /*
3895 * Specialised 64-bit floating point operation.
3896 *
3897 * Note: The result will be returned in d2.
3898 *
3899 * For: long-to-double
3900 */
3901 mov r3, rINST, lsr #12 @ r3<- B
3902 ubfx r9, rINST, #8, #4 @ r9<- A
buzbeeace690f2016-03-11 09:51:11 -08003903 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B]
3904 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003905 vldr d0, [r3] @ d0<- vAA
3906 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3907
3908 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh)
3909 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl)
3910 vldr d3, constvalop_long_to_double
3911 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl
3912
3913 GET_INST_OPCODE ip @ extract opcode from rINST
3914 vstr.64 d2, [r9] @ vAA<- d2
3915 GOTO_OPCODE ip @ jump to next instruction
3916
3917 /* literal pool helper */
3918constvalop_long_to_double:
3919 .8byte 0x41f0000000000000
3920
3921/* ------------------------------ */
3922 .balign 128
3923.L_op_float_to_int: /* 0x87 */
3924/* File: arm/op_float_to_int.S */
3925/* File: arm/funop.S */
3926 /*
3927 * Generic 32-bit unary floating-point operation. Provide an "instr"
3928 * line that specifies an instruction that performs "s1 = op s0".
3929 *
3930 * for: int-to-float, float-to-int
3931 */
3932 /* unop vA, vB */
3933 mov r3, rINST, lsr #12 @ r3<- B
buzbee1452bee2015-03-06 14:43:04 -08003934 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3935 flds s0, [r3] @ s0<- vB
buzbeeace690f2016-03-11 09:51:11 -08003936 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08003937 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08003938 ftosizs s1, s0 @ s1<- op
3939 GET_INST_OPCODE ip @ extract opcode from rINST
3940 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3941 fsts s1, [r9] @ vA<- s1
3942 GOTO_OPCODE ip @ jump to next instruction
3943
3944
3945/* ------------------------------ */
3946 .balign 128
3947.L_op_float_to_long: /* 0x88 */
3948/* File: arm/op_float_to_long.S */
3949@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"}
3950/* File: arm/unopWider.S */
3951 /*
3952 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3953 * that specifies an instruction that performs "result = op r0", where
3954 * "result" is a 64-bit quantity in r0/r1.
3955 *
3956 * For: int-to-long, int-to-double, float-to-long, float-to-double
3957 */
3958 /* unop vA, vB */
3959 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003960 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003961 GET_VREG r0, r3 @ r0<- vB
buzbeeace690f2016-03-11 09:51:11 -08003962 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003963 @ optional op; may set condition codes
buzbee50cf6002016-02-10 08:59:12 -08003964 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003965 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3966 bl f2l_doconv @ r0<- op, r0-r3 changed
3967 GET_INST_OPCODE ip @ extract opcode from rINST
3968 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3969 GOTO_OPCODE ip @ jump to next instruction
3970 /* 9-10 instructions */
3971
3972
3973
3974/* ------------------------------ */
3975 .balign 128
3976.L_op_float_to_double: /* 0x89 */
3977/* File: arm/op_float_to_double.S */
3978/* File: arm/funopWider.S */
3979 /*
3980 * Generic 32bit-to-64bit floating point unary operation. Provide an
3981 * "instr" line that specifies an instruction that performs "d0 = op s0".
3982 *
3983 * For: int-to-double, float-to-double
3984 */
3985 /* unop vA, vB */
3986 mov r3, rINST, lsr #12 @ r3<- B
buzbee1452bee2015-03-06 14:43:04 -08003987 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3988 flds s0, [r3] @ s0<- vB
buzbeeace690f2016-03-11 09:51:11 -08003989 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08003990 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee96530d32016-03-04 08:03:51 -08003991 vcvt.f64.f32 d0, s0 @ d0<- op
buzbee50cf6002016-02-10 08:59:12 -08003992 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003993 GET_INST_OPCODE ip @ extract opcode from rINST
3994 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3995 fstd d0, [r9] @ vA<- d0
3996 GOTO_OPCODE ip @ jump to next instruction
3997
3998
3999/* ------------------------------ */
4000 .balign 128
4001.L_op_double_to_int: /* 0x8a */
4002/* File: arm/op_double_to_int.S */
4003/* File: arm/funopNarrower.S */
4004 /*
4005 * Generic 64bit-to-32bit unary floating point operation. Provide an
4006 * "instr" line that specifies an instruction that performs "s0 = op d0".
4007 *
4008 * For: double-to-int, double-to-float
4009 */
4010 /* unop vA, vB */
4011 mov r3, rINST, lsr #12 @ r3<- B
buzbee1452bee2015-03-06 14:43:04 -08004012 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4013 fldd d0, [r3] @ d0<- vB
buzbeeace690f2016-03-11 09:51:11 -08004014 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08004015 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004016 ftosizd s0, d0 @ s0<- op
4017 GET_INST_OPCODE ip @ extract opcode from rINST
4018 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4019 fsts s0, [r9] @ vA<- s0
4020 GOTO_OPCODE ip @ jump to next instruction
4021
4022
4023/* ------------------------------ */
4024 .balign 128
4025.L_op_double_to_long: /* 0x8b */
4026/* File: arm/op_double_to_long.S */
4027@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"}
4028/* File: arm/unopWide.S */
4029 /*
4030 * Generic 64-bit unary operation. Provide an "instr" line that
4031 * specifies an instruction that performs "result = op r0/r1".
4032 * This could be an ARM instruction or a function call.
4033 *
4034 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
4035 */
4036 /* unop vA, vB */
4037 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08004038 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08004039 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B]
4040 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08004041 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08004042 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004043 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4044 @ optional op; may set condition codes
4045 bl d2l_doconv @ r0/r1<- op, r2-r3 changed
4046 GET_INST_OPCODE ip @ extract opcode from rINST
4047 stmia r9, {r0-r1} @ vAA<- r0/r1
4048 GOTO_OPCODE ip @ jump to next instruction
4049 /* 10-11 instructions */
4050
4051
4052
4053/* ------------------------------ */
4054 .balign 128
4055.L_op_double_to_float: /* 0x8c */
4056/* File: arm/op_double_to_float.S */
4057/* File: arm/funopNarrower.S */
4058 /*
4059 * Generic 64bit-to-32bit unary floating point operation. Provide an
4060 * "instr" line that specifies an instruction that performs "s0 = op d0".
4061 *
4062 * For: double-to-int, double-to-float
4063 */
4064 /* unop vA, vB */
4065 mov r3, rINST, lsr #12 @ r3<- B
buzbee1452bee2015-03-06 14:43:04 -08004066 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4067 fldd d0, [r3] @ d0<- vB
buzbeeace690f2016-03-11 09:51:11 -08004068 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08004069 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee96530d32016-03-04 08:03:51 -08004070 vcvt.f32.f64 s0, d0 @ s0<- op
buzbee1452bee2015-03-06 14:43:04 -08004071 GET_INST_OPCODE ip @ extract opcode from rINST
4072 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4073 fsts s0, [r9] @ vA<- s0
4074 GOTO_OPCODE ip @ jump to next instruction
4075
4076
4077/* ------------------------------ */
4078 .balign 128
4079.L_op_int_to_byte: /* 0x8d */
4080/* File: arm/op_int_to_byte.S */
4081/* File: arm/unop.S */
4082 /*
4083 * Generic 32-bit unary operation. Provide an "instr" line that
4084 * specifies an instruction that performs "result = op r0".
4085 * This could be an ARM instruction or a function call.
4086 *
4087 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4088 * int-to-byte, int-to-char, int-to-short
4089 */
4090 /* unop vA, vB */
4091 mov r3, rINST, lsr #12 @ r3<- B
4092 ubfx r9, rINST, #8, #4 @ r9<- A
4093 GET_VREG r0, r3 @ r0<- vB
4094 @ optional op; may set condition codes
4095 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4096 sxtb r0, r0 @ r0<- op, r0-r3 changed
4097 GET_INST_OPCODE ip @ extract opcode from rINST
4098 SET_VREG r0, r9 @ vAA<- r0
4099 GOTO_OPCODE ip @ jump to next instruction
4100 /* 8-9 instructions */
4101
4102
4103/* ------------------------------ */
4104 .balign 128
4105.L_op_int_to_char: /* 0x8e */
4106/* File: arm/op_int_to_char.S */
4107/* File: arm/unop.S */
4108 /*
4109 * Generic 32-bit unary operation. Provide an "instr" line that
4110 * specifies an instruction that performs "result = op r0".
4111 * This could be an ARM instruction or a function call.
4112 *
4113 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4114 * int-to-byte, int-to-char, int-to-short
4115 */
4116 /* unop vA, vB */
4117 mov r3, rINST, lsr #12 @ r3<- B
4118 ubfx r9, rINST, #8, #4 @ r9<- A
4119 GET_VREG r0, r3 @ r0<- vB
4120 @ optional op; may set condition codes
4121 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4122 uxth r0, r0 @ r0<- op, r0-r3 changed
4123 GET_INST_OPCODE ip @ extract opcode from rINST
4124 SET_VREG r0, r9 @ vAA<- r0
4125 GOTO_OPCODE ip @ jump to next instruction
4126 /* 8-9 instructions */
4127
4128
4129/* ------------------------------ */
4130 .balign 128
4131.L_op_int_to_short: /* 0x8f */
4132/* File: arm/op_int_to_short.S */
4133/* File: arm/unop.S */
4134 /*
4135 * Generic 32-bit unary operation. Provide an "instr" line that
4136 * specifies an instruction that performs "result = op r0".
4137 * This could be an ARM instruction or a function call.
4138 *
4139 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4140 * int-to-byte, int-to-char, int-to-short
4141 */
4142 /* unop vA, vB */
4143 mov r3, rINST, lsr #12 @ r3<- B
4144 ubfx r9, rINST, #8, #4 @ r9<- A
4145 GET_VREG r0, r3 @ r0<- vB
4146 @ optional op; may set condition codes
4147 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4148 sxth r0, r0 @ r0<- op, r0-r3 changed
4149 GET_INST_OPCODE ip @ extract opcode from rINST
4150 SET_VREG r0, r9 @ vAA<- r0
4151 GOTO_OPCODE ip @ jump to next instruction
4152 /* 8-9 instructions */
4153
4154
4155/* ------------------------------ */
4156 .balign 128
4157.L_op_add_int: /* 0x90 */
4158/* File: arm/op_add_int.S */
4159/* File: arm/binop.S */
4160 /*
4161 * Generic 32-bit binary operation. Provide an "instr" line that
4162 * specifies an instruction that performs "result = r0 op r1".
4163 * This could be an ARM instruction or a function call. (If the result
4164 * comes back in a register other than r0, you can override "result".)
4165 *
4166 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4167 * vCC (r1). Useful for integer division and modulus. Note that we
4168 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4169 * handles it correctly.
4170 *
4171 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4172 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4173 * mul-float, div-float, rem-float
4174 */
4175 /* binop vAA, vBB, vCC */
4176 FETCH r0, 1 @ r0<- CCBB
4177 mov r9, rINST, lsr #8 @ r9<- AA
4178 mov r3, r0, lsr #8 @ r3<- CC
4179 and r2, r0, #255 @ r2<- BB
4180 GET_VREG r1, r3 @ r1<- vCC
4181 GET_VREG r0, r2 @ r0<- vBB
4182 .if 0
4183 cmp r1, #0 @ is second operand zero?
4184 beq common_errDivideByZero
4185 .endif
4186
4187 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4188 @ optional op; may set condition codes
4189 add r0, r0, r1 @ r0<- op, r0-r3 changed
4190 GET_INST_OPCODE ip @ extract opcode from rINST
4191 SET_VREG r0, r9 @ vAA<- r0
4192 GOTO_OPCODE ip @ jump to next instruction
4193 /* 11-14 instructions */
4194
4195
4196/* ------------------------------ */
4197 .balign 128
4198.L_op_sub_int: /* 0x91 */
4199/* File: arm/op_sub_int.S */
4200/* File: arm/binop.S */
4201 /*
4202 * Generic 32-bit binary operation. Provide an "instr" line that
4203 * specifies an instruction that performs "result = r0 op r1".
4204 * This could be an ARM instruction or a function call. (If the result
4205 * comes back in a register other than r0, you can override "result".)
4206 *
4207 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4208 * vCC (r1). Useful for integer division and modulus. Note that we
4209 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4210 * handles it correctly.
4211 *
4212 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4213 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4214 * mul-float, div-float, rem-float
4215 */
4216 /* binop vAA, vBB, vCC */
4217 FETCH r0, 1 @ r0<- CCBB
4218 mov r9, rINST, lsr #8 @ r9<- AA
4219 mov r3, r0, lsr #8 @ r3<- CC
4220 and r2, r0, #255 @ r2<- BB
4221 GET_VREG r1, r3 @ r1<- vCC
4222 GET_VREG r0, r2 @ r0<- vBB
4223 .if 0
4224 cmp r1, #0 @ is second operand zero?
4225 beq common_errDivideByZero
4226 .endif
4227
4228 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4229 @ optional op; may set condition codes
4230 sub r0, r0, r1 @ r0<- op, r0-r3 changed
4231 GET_INST_OPCODE ip @ extract opcode from rINST
4232 SET_VREG r0, r9 @ vAA<- r0
4233 GOTO_OPCODE ip @ jump to next instruction
4234 /* 11-14 instructions */
4235
4236
4237/* ------------------------------ */
4238 .balign 128
4239.L_op_mul_int: /* 0x92 */
4240/* File: arm/op_mul_int.S */
4241/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4242/* File: arm/binop.S */
4243 /*
4244 * Generic 32-bit binary operation. Provide an "instr" line that
4245 * specifies an instruction that performs "result = r0 op r1".
4246 * This could be an ARM instruction or a function call. (If the result
4247 * comes back in a register other than r0, you can override "result".)
4248 *
4249 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4250 * vCC (r1). Useful for integer division and modulus. Note that we
4251 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4252 * handles it correctly.
4253 *
4254 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4255 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4256 * mul-float, div-float, rem-float
4257 */
4258 /* binop vAA, vBB, vCC */
4259 FETCH r0, 1 @ r0<- CCBB
4260 mov r9, rINST, lsr #8 @ r9<- AA
4261 mov r3, r0, lsr #8 @ r3<- CC
4262 and r2, r0, #255 @ r2<- BB
4263 GET_VREG r1, r3 @ r1<- vCC
4264 GET_VREG r0, r2 @ r0<- vBB
4265 .if 0
4266 cmp r1, #0 @ is second operand zero?
4267 beq common_errDivideByZero
4268 .endif
4269
4270 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4271 @ optional op; may set condition codes
4272 mul r0, r1, r0 @ r0<- op, r0-r3 changed
4273 GET_INST_OPCODE ip @ extract opcode from rINST
4274 SET_VREG r0, r9 @ vAA<- r0
4275 GOTO_OPCODE ip @ jump to next instruction
4276 /* 11-14 instructions */
4277
4278
4279/* ------------------------------ */
4280 .balign 128
4281.L_op_div_int: /* 0x93 */
4282/* File: arm/op_div_int.S */
4283 /*
4284 * Specialized 32-bit binary operation
4285 *
4286 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4287 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4288 * ARMv7 CPUs that have hardware division support).
4289 *
4290 * div-int
4291 *
4292 */
4293 FETCH r0, 1 @ r0<- CCBB
4294 mov r9, rINST, lsr #8 @ r9<- AA
4295 mov r3, r0, lsr #8 @ r3<- CC
4296 and r2, r0, #255 @ r2<- BB
4297 GET_VREG r1, r3 @ r1<- vCC
4298 GET_VREG r0, r2 @ r0<- vBB
4299 cmp r1, #0 @ is second operand zero?
4300 beq common_errDivideByZero
4301
4302 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4303#ifdef __ARM_ARCH_EXT_IDIV__
4304 sdiv r0, r0, r1 @ r0<- op
4305#else
4306 bl __aeabi_idiv @ r0<- op, r0-r3 changed
4307#endif
4308 GET_INST_OPCODE ip @ extract opcode from rINST
4309 SET_VREG r0, r9 @ vAA<- r0
4310 GOTO_OPCODE ip @ jump to next instruction
4311 /* 11-14 instructions */
4312
4313/* ------------------------------ */
4314 .balign 128
4315.L_op_rem_int: /* 0x94 */
4316/* File: arm/op_rem_int.S */
4317 /*
4318 * Specialized 32-bit binary operation
4319 *
4320 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4321 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4322 * ARMv7 CPUs that have hardware division support).
4323 *
4324 * NOTE: idivmod returns quotient in r0 and remainder in r1
4325 *
4326 * rem-int
4327 *
4328 */
4329 FETCH r0, 1 @ r0<- CCBB
4330 mov r9, rINST, lsr #8 @ r9<- AA
4331 mov r3, r0, lsr #8 @ r3<- CC
4332 and r2, r0, #255 @ r2<- BB
4333 GET_VREG r1, r3 @ r1<- vCC
4334 GET_VREG r0, r2 @ r0<- vBB
4335 cmp r1, #0 @ is second operand zero?
4336 beq common_errDivideByZero
4337
4338 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4339#ifdef __ARM_ARCH_EXT_IDIV__
4340 sdiv r2, r0, r1
4341 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed
4342#else
4343 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
4344#endif
4345 GET_INST_OPCODE ip @ extract opcode from rINST
4346 SET_VREG r1, r9 @ vAA<- r1
4347 GOTO_OPCODE ip @ jump to next instruction
4348 /* 11-14 instructions */
4349
4350/* ------------------------------ */
4351 .balign 128
4352.L_op_and_int: /* 0x95 */
4353/* File: arm/op_and_int.S */
4354/* File: arm/binop.S */
4355 /*
4356 * Generic 32-bit binary operation. Provide an "instr" line that
4357 * specifies an instruction that performs "result = r0 op r1".
4358 * This could be an ARM instruction or a function call. (If the result
4359 * comes back in a register other than r0, you can override "result".)
4360 *
4361 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4362 * vCC (r1). Useful for integer division and modulus. Note that we
4363 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4364 * handles it correctly.
4365 *
4366 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4367 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4368 * mul-float, div-float, rem-float
4369 */
4370 /* binop vAA, vBB, vCC */
4371 FETCH r0, 1 @ r0<- CCBB
4372 mov r9, rINST, lsr #8 @ r9<- AA
4373 mov r3, r0, lsr #8 @ r3<- CC
4374 and r2, r0, #255 @ r2<- BB
4375 GET_VREG r1, r3 @ r1<- vCC
4376 GET_VREG r0, r2 @ r0<- vBB
4377 .if 0
4378 cmp r1, #0 @ is second operand zero?
4379 beq common_errDivideByZero
4380 .endif
4381
4382 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4383 @ optional op; may set condition codes
4384 and r0, r0, r1 @ r0<- op, r0-r3 changed
4385 GET_INST_OPCODE ip @ extract opcode from rINST
4386 SET_VREG r0, r9 @ vAA<- r0
4387 GOTO_OPCODE ip @ jump to next instruction
4388 /* 11-14 instructions */
4389
4390
4391/* ------------------------------ */
4392 .balign 128
4393.L_op_or_int: /* 0x96 */
4394/* File: arm/op_or_int.S */
4395/* File: arm/binop.S */
4396 /*
4397 * Generic 32-bit binary operation. Provide an "instr" line that
4398 * specifies an instruction that performs "result = r0 op r1".
4399 * This could be an ARM instruction or a function call. (If the result
4400 * comes back in a register other than r0, you can override "result".)
4401 *
4402 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4403 * vCC (r1). Useful for integer division and modulus. Note that we
4404 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4405 * handles it correctly.
4406 *
4407 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4408 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4409 * mul-float, div-float, rem-float
4410 */
4411 /* binop vAA, vBB, vCC */
4412 FETCH r0, 1 @ r0<- CCBB
4413 mov r9, rINST, lsr #8 @ r9<- AA
4414 mov r3, r0, lsr #8 @ r3<- CC
4415 and r2, r0, #255 @ r2<- BB
4416 GET_VREG r1, r3 @ r1<- vCC
4417 GET_VREG r0, r2 @ r0<- vBB
4418 .if 0
4419 cmp r1, #0 @ is second operand zero?
4420 beq common_errDivideByZero
4421 .endif
4422
4423 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4424 @ optional op; may set condition codes
4425 orr r0, r0, r1 @ r0<- op, r0-r3 changed
4426 GET_INST_OPCODE ip @ extract opcode from rINST
4427 SET_VREG r0, r9 @ vAA<- r0
4428 GOTO_OPCODE ip @ jump to next instruction
4429 /* 11-14 instructions */
4430
4431
4432/* ------------------------------ */
4433 .balign 128
4434.L_op_xor_int: /* 0x97 */
4435/* File: arm/op_xor_int.S */
4436/* File: arm/binop.S */
4437 /*
4438 * Generic 32-bit binary operation. Provide an "instr" line that
4439 * specifies an instruction that performs "result = r0 op r1".
4440 * This could be an ARM instruction or a function call. (If the result
4441 * comes back in a register other than r0, you can override "result".)
4442 *
4443 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4444 * vCC (r1). Useful for integer division and modulus. Note that we
4445 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4446 * handles it correctly.
4447 *
4448 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4449 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4450 * mul-float, div-float, rem-float
4451 */
4452 /* binop vAA, vBB, vCC */
4453 FETCH r0, 1 @ r0<- CCBB
4454 mov r9, rINST, lsr #8 @ r9<- AA
4455 mov r3, r0, lsr #8 @ r3<- CC
4456 and r2, r0, #255 @ r2<- BB
4457 GET_VREG r1, r3 @ r1<- vCC
4458 GET_VREG r0, r2 @ r0<- vBB
4459 .if 0
4460 cmp r1, #0 @ is second operand zero?
4461 beq common_errDivideByZero
4462 .endif
4463
4464 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4465 @ optional op; may set condition codes
4466 eor r0, r0, r1 @ r0<- op, r0-r3 changed
4467 GET_INST_OPCODE ip @ extract opcode from rINST
4468 SET_VREG r0, r9 @ vAA<- r0
4469 GOTO_OPCODE ip @ jump to next instruction
4470 /* 11-14 instructions */
4471
4472
4473/* ------------------------------ */
4474 .balign 128
4475.L_op_shl_int: /* 0x98 */
4476/* File: arm/op_shl_int.S */
4477/* File: arm/binop.S */
4478 /*
4479 * Generic 32-bit binary operation. Provide an "instr" line that
4480 * specifies an instruction that performs "result = r0 op r1".
4481 * This could be an ARM instruction or a function call. (If the result
4482 * comes back in a register other than r0, you can override "result".)
4483 *
4484 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4485 * vCC (r1). Useful for integer division and modulus. Note that we
4486 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4487 * handles it correctly.
4488 *
4489 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4490 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4491 * mul-float, div-float, rem-float
4492 */
4493 /* binop vAA, vBB, vCC */
4494 FETCH r0, 1 @ r0<- CCBB
4495 mov r9, rINST, lsr #8 @ r9<- AA
4496 mov r3, r0, lsr #8 @ r3<- CC
4497 and r2, r0, #255 @ r2<- BB
4498 GET_VREG r1, r3 @ r1<- vCC
4499 GET_VREG r0, r2 @ r0<- vBB
4500 .if 0
4501 cmp r1, #0 @ is second operand zero?
4502 beq common_errDivideByZero
4503 .endif
4504
4505 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4506 and r1, r1, #31 @ optional op; may set condition codes
4507 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
4508 GET_INST_OPCODE ip @ extract opcode from rINST
4509 SET_VREG r0, r9 @ vAA<- r0
4510 GOTO_OPCODE ip @ jump to next instruction
4511 /* 11-14 instructions */
4512
4513
4514/* ------------------------------ */
4515 .balign 128
4516.L_op_shr_int: /* 0x99 */
4517/* File: arm/op_shr_int.S */
4518/* File: arm/binop.S */
4519 /*
4520 * Generic 32-bit binary operation. Provide an "instr" line that
4521 * specifies an instruction that performs "result = r0 op r1".
4522 * This could be an ARM instruction or a function call. (If the result
4523 * comes back in a register other than r0, you can override "result".)
4524 *
4525 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4526 * vCC (r1). Useful for integer division and modulus. Note that we
4527 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4528 * handles it correctly.
4529 *
4530 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4531 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4532 * mul-float, div-float, rem-float
4533 */
4534 /* binop vAA, vBB, vCC */
4535 FETCH r0, 1 @ r0<- CCBB
4536 mov r9, rINST, lsr #8 @ r9<- AA
4537 mov r3, r0, lsr #8 @ r3<- CC
4538 and r2, r0, #255 @ r2<- BB
4539 GET_VREG r1, r3 @ r1<- vCC
4540 GET_VREG r0, r2 @ r0<- vBB
4541 .if 0
4542 cmp r1, #0 @ is second operand zero?
4543 beq common_errDivideByZero
4544 .endif
4545
4546 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4547 and r1, r1, #31 @ optional op; may set condition codes
4548 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
4549 GET_INST_OPCODE ip @ extract opcode from rINST
4550 SET_VREG r0, r9 @ vAA<- r0
4551 GOTO_OPCODE ip @ jump to next instruction
4552 /* 11-14 instructions */
4553
4554
4555/* ------------------------------ */
4556 .balign 128
4557.L_op_ushr_int: /* 0x9a */
4558/* File: arm/op_ushr_int.S */
4559/* File: arm/binop.S */
4560 /*
4561 * Generic 32-bit binary operation. Provide an "instr" line that
4562 * specifies an instruction that performs "result = r0 op r1".
4563 * This could be an ARM instruction or a function call. (If the result
4564 * comes back in a register other than r0, you can override "result".)
4565 *
4566 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4567 * vCC (r1). Useful for integer division and modulus. Note that we
4568 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4569 * handles it correctly.
4570 *
4571 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4572 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4573 * mul-float, div-float, rem-float
4574 */
4575 /* binop vAA, vBB, vCC */
4576 FETCH r0, 1 @ r0<- CCBB
4577 mov r9, rINST, lsr #8 @ r9<- AA
4578 mov r3, r0, lsr #8 @ r3<- CC
4579 and r2, r0, #255 @ r2<- BB
4580 GET_VREG r1, r3 @ r1<- vCC
4581 GET_VREG r0, r2 @ r0<- vBB
4582 .if 0
4583 cmp r1, #0 @ is second operand zero?
4584 beq common_errDivideByZero
4585 .endif
4586
4587 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4588 and r1, r1, #31 @ optional op; may set condition codes
4589 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
4590 GET_INST_OPCODE ip @ extract opcode from rINST
4591 SET_VREG r0, r9 @ vAA<- r0
4592 GOTO_OPCODE ip @ jump to next instruction
4593 /* 11-14 instructions */
4594
4595
4596/* ------------------------------ */
4597 .balign 128
4598.L_op_add_long: /* 0x9b */
4599/* File: arm/op_add_long.S */
4600/* File: arm/binopWide.S */
4601 /*
4602 * Generic 64-bit binary operation. Provide an "instr" line that
4603 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4604 * This could be an ARM instruction or a function call. (If the result
4605 * comes back in a register other than r0, you can override "result".)
4606 *
4607 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4608 * vCC (r1). Useful for integer division and modulus.
4609 *
4610 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4611 * xor-long, add-double, sub-double, mul-double, div-double,
4612 * rem-double
4613 *
4614 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4615 */
4616 /* binop vAA, vBB, vCC */
4617 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004618 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004619 and r2, r0, #255 @ r2<- BB
4620 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08004621 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA]
4622 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
4623 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08004624 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4625 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4626 .if 0
4627 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4628 beq common_errDivideByZero
4629 .endif
buzbee50cf6002016-02-10 08:59:12 -08004630 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004631 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004632 adds r0, r0, r2 @ optional op; may set condition codes
4633 adc r1, r1, r3 @ result<- op, r0-r3 changed
4634 GET_INST_OPCODE ip @ extract opcode from rINST
4635 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4636 GOTO_OPCODE ip @ jump to next instruction
4637 /* 14-17 instructions */
4638
4639
4640/* ------------------------------ */
4641 .balign 128
4642.L_op_sub_long: /* 0x9c */
4643/* File: arm/op_sub_long.S */
4644/* File: arm/binopWide.S */
4645 /*
4646 * Generic 64-bit binary operation. Provide an "instr" line that
4647 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4648 * This could be an ARM instruction or a function call. (If the result
4649 * comes back in a register other than r0, you can override "result".)
4650 *
4651 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4652 * vCC (r1). Useful for integer division and modulus.
4653 *
4654 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4655 * xor-long, add-double, sub-double, mul-double, div-double,
4656 * rem-double
4657 *
4658 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4659 */
4660 /* binop vAA, vBB, vCC */
4661 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004662 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004663 and r2, r0, #255 @ r2<- BB
4664 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08004665 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA]
4666 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
4667 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08004668 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4669 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4670 .if 0
4671 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4672 beq common_errDivideByZero
4673 .endif
buzbee50cf6002016-02-10 08:59:12 -08004674 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004675 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004676 subs r0, r0, r2 @ optional op; may set condition codes
4677 sbc r1, r1, r3 @ result<- op, r0-r3 changed
4678 GET_INST_OPCODE ip @ extract opcode from rINST
4679 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4680 GOTO_OPCODE ip @ jump to next instruction
4681 /* 14-17 instructions */
4682
4683
4684/* ------------------------------ */
4685 .balign 128
4686.L_op_mul_long: /* 0x9d */
4687/* File: arm/op_mul_long.S */
4688 /*
4689 * Signed 64-bit integer multiply.
4690 *
4691 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4692 * WX
4693 * x YZ
4694 * --------
4695 * ZW ZX
4696 * YW YX
4697 *
4698 * The low word of the result holds ZX, the high word holds
4699 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
4700 * it doesn't fit in the low 64 bits.
4701 *
4702 * Unlike most ARM math operations, multiply instructions have
4703 * restrictions on using the same register more than once (Rd and Rm
4704 * cannot be the same).
4705 */
4706 /* mul-long vAA, vBB, vCC */
4707 FETCH r0, 1 @ r0<- CCBB
4708 and r2, r0, #255 @ r2<- BB
4709 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08004710 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
4711 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08004712 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4713 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4714 mul ip, r2, r1 @ ip<- ZxW
4715 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
4716 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
4717 mov r0, rINST, lsr #8 @ r0<- AA
4718 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
buzbeeace690f2016-03-11 09:51:11 -08004719 VREG_INDEX_TO_ADDR r0, r0 @ r0<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004720 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4721 GET_INST_OPCODE ip @ extract opcode from rINST
4722 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
4723 GOTO_OPCODE ip @ jump to next instruction
4724
4725/* ------------------------------ */
4726 .balign 128
4727.L_op_div_long: /* 0x9e */
4728/* File: arm/op_div_long.S */
4729/* File: arm/binopWide.S */
4730 /*
4731 * Generic 64-bit binary operation. Provide an "instr" line that
4732 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4733 * This could be an ARM instruction or a function call. (If the result
4734 * comes back in a register other than r0, you can override "result".)
4735 *
4736 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4737 * vCC (r1). Useful for integer division and modulus.
4738 *
4739 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4740 * xor-long, add-double, sub-double, mul-double, div-double,
4741 * rem-double
4742 *
4743 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4744 */
4745 /* binop vAA, vBB, vCC */
4746 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004747 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004748 and r2, r0, #255 @ r2<- BB
4749 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08004750 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA]
4751 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
4752 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08004753 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4754 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4755 .if 1
4756 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4757 beq common_errDivideByZero
4758 .endif
buzbee50cf6002016-02-10 08:59:12 -08004759 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004760 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004761 @ optional op; may set condition codes
4762 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4763 GET_INST_OPCODE ip @ extract opcode from rINST
4764 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4765 GOTO_OPCODE ip @ jump to next instruction
4766 /* 14-17 instructions */
4767
4768
4769/* ------------------------------ */
4770 .balign 128
4771.L_op_rem_long: /* 0x9f */
4772/* File: arm/op_rem_long.S */
4773/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4774/* File: arm/binopWide.S */
4775 /*
4776 * Generic 64-bit binary operation. Provide an "instr" line that
4777 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4778 * This could be an ARM instruction or a function call. (If the result
4779 * comes back in a register other than r0, you can override "result".)
4780 *
4781 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4782 * vCC (r1). Useful for integer division and modulus.
4783 *
4784 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4785 * xor-long, add-double, sub-double, mul-double, div-double,
4786 * rem-double
4787 *
4788 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4789 */
4790 /* binop vAA, vBB, vCC */
4791 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004792 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004793 and r2, r0, #255 @ r2<- BB
4794 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08004795 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA]
4796 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
4797 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08004798 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4799 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4800 .if 1
4801 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4802 beq common_errDivideByZero
4803 .endif
buzbee50cf6002016-02-10 08:59:12 -08004804 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004805 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004806 @ optional op; may set condition codes
4807 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4808 GET_INST_OPCODE ip @ extract opcode from rINST
4809 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
4810 GOTO_OPCODE ip @ jump to next instruction
4811 /* 14-17 instructions */
4812
4813
4814/* ------------------------------ */
4815 .balign 128
4816.L_op_and_long: /* 0xa0 */
4817/* File: arm/op_and_long.S */
4818/* File: arm/binopWide.S */
4819 /*
4820 * Generic 64-bit binary operation. Provide an "instr" line that
4821 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4822 * This could be an ARM instruction or a function call. (If the result
4823 * comes back in a register other than r0, you can override "result".)
4824 *
4825 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4826 * vCC (r1). Useful for integer division and modulus.
4827 *
4828 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4829 * xor-long, add-double, sub-double, mul-double, div-double,
4830 * rem-double
4831 *
4832 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4833 */
4834 /* binop vAA, vBB, vCC */
4835 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004836 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004837 and r2, r0, #255 @ r2<- BB
4838 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08004839 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA]
4840 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
4841 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08004842 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4843 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4844 .if 0
4845 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4846 beq common_errDivideByZero
4847 .endif
buzbee50cf6002016-02-10 08:59:12 -08004848 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004849 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004850 and r0, r0, r2 @ optional op; may set condition codes
4851 and r1, r1, r3 @ result<- op, r0-r3 changed
4852 GET_INST_OPCODE ip @ extract opcode from rINST
4853 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4854 GOTO_OPCODE ip @ jump to next instruction
4855 /* 14-17 instructions */
4856
4857
4858/* ------------------------------ */
4859 .balign 128
4860.L_op_or_long: /* 0xa1 */
4861/* File: arm/op_or_long.S */
4862/* File: arm/binopWide.S */
4863 /*
4864 * Generic 64-bit binary operation. Provide an "instr" line that
4865 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4866 * This could be an ARM instruction or a function call. (If the result
4867 * comes back in a register other than r0, you can override "result".)
4868 *
4869 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4870 * vCC (r1). Useful for integer division and modulus.
4871 *
4872 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4873 * xor-long, add-double, sub-double, mul-double, div-double,
4874 * rem-double
4875 *
4876 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4877 */
4878 /* binop vAA, vBB, vCC */
4879 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004880 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004881 and r2, r0, #255 @ r2<- BB
4882 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08004883 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA]
4884 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
4885 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08004886 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4887 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4888 .if 0
4889 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4890 beq common_errDivideByZero
4891 .endif
buzbee50cf6002016-02-10 08:59:12 -08004892 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004893 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004894 orr r0, r0, r2 @ optional op; may set condition codes
4895 orr r1, r1, r3 @ result<- op, r0-r3 changed
4896 GET_INST_OPCODE ip @ extract opcode from rINST
4897 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4898 GOTO_OPCODE ip @ jump to next instruction
4899 /* 14-17 instructions */
4900
4901
4902/* ------------------------------ */
4903 .balign 128
4904.L_op_xor_long: /* 0xa2 */
4905/* File: arm/op_xor_long.S */
4906/* File: arm/binopWide.S */
4907 /*
4908 * Generic 64-bit binary operation. Provide an "instr" line that
4909 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4910 * This could be an ARM instruction or a function call. (If the result
4911 * comes back in a register other than r0, you can override "result".)
4912 *
4913 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4914 * vCC (r1). Useful for integer division and modulus.
4915 *
4916 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4917 * xor-long, add-double, sub-double, mul-double, div-double,
4918 * rem-double
4919 *
4920 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4921 */
4922 /* binop vAA, vBB, vCC */
4923 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004924 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004925 and r2, r0, #255 @ r2<- BB
4926 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08004927 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA]
4928 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
4929 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08004930 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4931 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4932 .if 0
4933 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4934 beq common_errDivideByZero
4935 .endif
buzbee50cf6002016-02-10 08:59:12 -08004936 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004937 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004938 eor r0, r0, r2 @ optional op; may set condition codes
4939 eor r1, r1, r3 @ result<- op, r0-r3 changed
4940 GET_INST_OPCODE ip @ extract opcode from rINST
4941 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4942 GOTO_OPCODE ip @ jump to next instruction
4943 /* 14-17 instructions */
4944
4945
4946/* ------------------------------ */
4947 .balign 128
4948.L_op_shl_long: /* 0xa3 */
4949/* File: arm/op_shl_long.S */
4950 /*
4951 * Long integer shift. This is different from the generic 32/64-bit
4952 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4953 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4954 * 6 bits of the shift distance.
4955 */
4956 /* shl-long vAA, vBB, vCC */
4957 FETCH r0, 1 @ r0<- CCBB
4958 mov r9, rINST, lsr #8 @ r9<- AA
4959 and r3, r0, #255 @ r3<- BB
4960 mov r0, r0, lsr #8 @ r0<- CC
buzbeeace690f2016-03-11 09:51:11 -08004961 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BB]
buzbee1452bee2015-03-06 14:43:04 -08004962 GET_VREG r2, r0 @ r2<- vCC
4963 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08004964 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004965 and r2, r2, #63 @ r2<- r2 & 0x3f
buzbeeace690f2016-03-11 09:51:11 -08004966 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08004967 mov r1, r1, asl r2 @ r1<- r1 << r2
4968 rsb r3, r2, #32 @ r3<- 32 - r2
4969 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
4970 subs ip, r2, #32 @ ip<- r2 - 32
4971 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08004972 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08004973 mov r0, r0, asl r2 @ r0<- r0 << r2
buzbee1452bee2015-03-06 14:43:04 -08004974 GET_INST_OPCODE ip @ extract opcode from rINST
4975 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4976 GOTO_OPCODE ip @ jump to next instruction
4977
4978/* ------------------------------ */
4979 .balign 128
4980.L_op_shr_long: /* 0xa4 */
4981/* File: arm/op_shr_long.S */
4982 /*
4983 * Long integer shift. This is different from the generic 32/64-bit
4984 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4985 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4986 * 6 bits of the shift distance.
4987 */
4988 /* shr-long vAA, vBB, vCC */
4989 FETCH r0, 1 @ r0<- CCBB
4990 mov r9, rINST, lsr #8 @ r9<- AA
4991 and r3, r0, #255 @ r3<- BB
4992 mov r0, r0, lsr #8 @ r0<- CC
buzbeeace690f2016-03-11 09:51:11 -08004993 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BB]
buzbee1452bee2015-03-06 14:43:04 -08004994 GET_VREG r2, r0 @ r2<- vCC
4995 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08004996 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004997 and r2, r2, #63 @ r0<- r0 & 0x3f
buzbeeace690f2016-03-11 09:51:11 -08004998 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08004999 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5000 rsb r3, r2, #32 @ r3<- 32 - r2
5001 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5002 subs ip, r2, #32 @ ip<- r2 - 32
5003 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08005004 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08005005 mov r1, r1, asr r2 @ r1<- r1 >> r2
buzbee1452bee2015-03-06 14:43:04 -08005006 GET_INST_OPCODE ip @ extract opcode from rINST
5007 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5008 GOTO_OPCODE ip @ jump to next instruction
5009
5010/* ------------------------------ */
5011 .balign 128
5012.L_op_ushr_long: /* 0xa5 */
5013/* File: arm/op_ushr_long.S */
5014 /*
5015 * Long integer shift. This is different from the generic 32/64-bit
5016 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5017 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5018 * 6 bits of the shift distance.
5019 */
5020 /* ushr-long vAA, vBB, vCC */
5021 FETCH r0, 1 @ r0<- CCBB
5022 mov r9, rINST, lsr #8 @ r9<- AA
5023 and r3, r0, #255 @ r3<- BB
5024 mov r0, r0, lsr #8 @ r0<- CC
buzbeeace690f2016-03-11 09:51:11 -08005025 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[BB]
buzbee1452bee2015-03-06 14:43:04 -08005026 GET_VREG r2, r0 @ r2<- vCC
5027 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
buzbeec3b4c6e2016-02-19 10:10:20 -08005028 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005029 and r2, r2, #63 @ r0<- r0 & 0x3f
buzbeeace690f2016-03-11 09:51:11 -08005030 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[AA]
buzbeec3b4c6e2016-02-19 10:10:20 -08005031 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5032 rsb r3, r2, #32 @ r3<- 32 - r2
5033 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5034 subs ip, r2, #32 @ ip<- r2 - 32
5035 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
buzbee1452bee2015-03-06 14:43:04 -08005036 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08005037 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
buzbee1452bee2015-03-06 14:43:04 -08005038 GET_INST_OPCODE ip @ extract opcode from rINST
5039 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5040 GOTO_OPCODE ip @ jump to next instruction
5041
5042/* ------------------------------ */
5043 .balign 128
5044.L_op_add_float: /* 0xa6 */
5045/* File: arm/op_add_float.S */
5046/* File: arm/fbinop.S */
5047 /*
5048 * Generic 32-bit floating-point operation. Provide an "instr" line that
5049 * specifies an instruction that performs "s2 = s0 op s1". Because we
5050 * use the "softfp" ABI, this must be an instruction, not a function call.
5051 *
5052 * For: add-float, sub-float, mul-float, div-float
5053 */
5054 /* floatop vAA, vBB, vCC */
5055 FETCH r0, 1 @ r0<- CCBB
5056 mov r9, rINST, lsr #8 @ r9<- AA
5057 mov r3, r0, lsr #8 @ r3<- CC
5058 and r2, r0, #255 @ r2<- BB
5059 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5060 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5061 flds s1, [r3] @ s1<- vCC
5062 flds s0, [r2] @ s0<- vBB
5063
5064 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5065 fadds s2, s0, s1 @ s2<- op
5066 GET_INST_OPCODE ip @ extract opcode from rINST
5067 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5068 fsts s2, [r9] @ vAA<- s2
5069 GOTO_OPCODE ip @ jump to next instruction
5070
5071
5072/* ------------------------------ */
5073 .balign 128
5074.L_op_sub_float: /* 0xa7 */
5075/* File: arm/op_sub_float.S */
5076/* File: arm/fbinop.S */
5077 /*
5078 * Generic 32-bit floating-point operation. Provide an "instr" line that
5079 * specifies an instruction that performs "s2 = s0 op s1". Because we
5080 * use the "softfp" ABI, this must be an instruction, not a function call.
5081 *
5082 * For: add-float, sub-float, mul-float, div-float
5083 */
5084 /* floatop vAA, vBB, vCC */
5085 FETCH r0, 1 @ r0<- CCBB
5086 mov r9, rINST, lsr #8 @ r9<- AA
5087 mov r3, r0, lsr #8 @ r3<- CC
5088 and r2, r0, #255 @ r2<- BB
5089 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5090 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5091 flds s1, [r3] @ s1<- vCC
5092 flds s0, [r2] @ s0<- vBB
5093
5094 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5095 fsubs s2, s0, s1 @ s2<- op
5096 GET_INST_OPCODE ip @ extract opcode from rINST
5097 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5098 fsts s2, [r9] @ vAA<- s2
5099 GOTO_OPCODE ip @ jump to next instruction
5100
5101
5102/* ------------------------------ */
5103 .balign 128
5104.L_op_mul_float: /* 0xa8 */
5105/* File: arm/op_mul_float.S */
5106/* File: arm/fbinop.S */
5107 /*
5108 * Generic 32-bit floating-point operation. Provide an "instr" line that
5109 * specifies an instruction that performs "s2 = s0 op s1". Because we
5110 * use the "softfp" ABI, this must be an instruction, not a function call.
5111 *
5112 * For: add-float, sub-float, mul-float, div-float
5113 */
5114 /* floatop vAA, vBB, vCC */
5115 FETCH r0, 1 @ r0<- CCBB
5116 mov r9, rINST, lsr #8 @ r9<- AA
5117 mov r3, r0, lsr #8 @ r3<- CC
5118 and r2, r0, #255 @ r2<- BB
5119 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5120 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5121 flds s1, [r3] @ s1<- vCC
5122 flds s0, [r2] @ s0<- vBB
5123
5124 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5125 fmuls s2, s0, s1 @ s2<- op
5126 GET_INST_OPCODE ip @ extract opcode from rINST
5127 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5128 fsts s2, [r9] @ vAA<- s2
5129 GOTO_OPCODE ip @ jump to next instruction
5130
5131
5132/* ------------------------------ */
5133 .balign 128
5134.L_op_div_float: /* 0xa9 */
5135/* File: arm/op_div_float.S */
5136/* File: arm/fbinop.S */
5137 /*
5138 * Generic 32-bit floating-point operation. Provide an "instr" line that
5139 * specifies an instruction that performs "s2 = s0 op s1". Because we
5140 * use the "softfp" ABI, this must be an instruction, not a function call.
5141 *
5142 * For: add-float, sub-float, mul-float, div-float
5143 */
5144 /* floatop vAA, vBB, vCC */
5145 FETCH r0, 1 @ r0<- CCBB
5146 mov r9, rINST, lsr #8 @ r9<- AA
5147 mov r3, r0, lsr #8 @ r3<- CC
5148 and r2, r0, #255 @ r2<- BB
5149 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5150 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5151 flds s1, [r3] @ s1<- vCC
5152 flds s0, [r2] @ s0<- vBB
5153
5154 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5155 fdivs s2, s0, s1 @ s2<- op
5156 GET_INST_OPCODE ip @ extract opcode from rINST
5157 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5158 fsts s2, [r9] @ vAA<- s2
5159 GOTO_OPCODE ip @ jump to next instruction
5160
5161
5162/* ------------------------------ */
5163 .balign 128
5164.L_op_rem_float: /* 0xaa */
5165/* File: arm/op_rem_float.S */
5166/* EABI doesn't define a float remainder function, but libm does */
5167/* File: arm/binop.S */
5168 /*
5169 * Generic 32-bit binary operation. Provide an "instr" line that
5170 * specifies an instruction that performs "result = r0 op r1".
5171 * This could be an ARM instruction or a function call. (If the result
5172 * comes back in a register other than r0, you can override "result".)
5173 *
5174 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5175 * vCC (r1). Useful for integer division and modulus. Note that we
5176 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5177 * handles it correctly.
5178 *
5179 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5180 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5181 * mul-float, div-float, rem-float
5182 */
5183 /* binop vAA, vBB, vCC */
5184 FETCH r0, 1 @ r0<- CCBB
5185 mov r9, rINST, lsr #8 @ r9<- AA
5186 mov r3, r0, lsr #8 @ r3<- CC
5187 and r2, r0, #255 @ r2<- BB
5188 GET_VREG r1, r3 @ r1<- vCC
5189 GET_VREG r0, r2 @ r0<- vBB
5190 .if 0
5191 cmp r1, #0 @ is second operand zero?
5192 beq common_errDivideByZero
5193 .endif
5194
5195 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5196 @ optional op; may set condition codes
5197 bl fmodf @ r0<- op, r0-r3 changed
5198 GET_INST_OPCODE ip @ extract opcode from rINST
5199 SET_VREG r0, r9 @ vAA<- r0
5200 GOTO_OPCODE ip @ jump to next instruction
5201 /* 11-14 instructions */
5202
5203
5204/* ------------------------------ */
5205 .balign 128
5206.L_op_add_double: /* 0xab */
5207/* File: arm/op_add_double.S */
5208/* File: arm/fbinopWide.S */
5209 /*
5210 * Generic 64-bit double-precision floating point binary operation.
5211 * Provide an "instr" line that specifies an instruction that performs
5212 * "d2 = d0 op d1".
5213 *
5214 * for: add-double, sub-double, mul-double, div-double
5215 */
5216 /* doubleop vAA, vBB, vCC */
5217 FETCH r0, 1 @ r0<- CCBB
5218 mov r9, rINST, lsr #8 @ r9<- AA
5219 mov r3, r0, lsr #8 @ r3<- CC
5220 and r2, r0, #255 @ r2<- BB
5221 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5222 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5223 fldd d1, [r3] @ d1<- vCC
5224 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005225 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5226 faddd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005227 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005228 GET_INST_OPCODE ip @ extract opcode from rINST
5229 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5230 fstd d2, [r9] @ vAA<- d2
5231 GOTO_OPCODE ip @ jump to next instruction
5232
5233
5234/* ------------------------------ */
5235 .balign 128
5236.L_op_sub_double: /* 0xac */
5237/* File: arm/op_sub_double.S */
5238/* File: arm/fbinopWide.S */
5239 /*
5240 * Generic 64-bit double-precision floating point binary operation.
5241 * Provide an "instr" line that specifies an instruction that performs
5242 * "d2 = d0 op d1".
5243 *
5244 * for: add-double, sub-double, mul-double, div-double
5245 */
5246 /* doubleop vAA, vBB, vCC */
5247 FETCH r0, 1 @ r0<- CCBB
5248 mov r9, rINST, lsr #8 @ r9<- AA
5249 mov r3, r0, lsr #8 @ r3<- CC
5250 and r2, r0, #255 @ r2<- BB
5251 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5252 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5253 fldd d1, [r3] @ d1<- vCC
5254 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005255 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5256 fsubd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005257 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005258 GET_INST_OPCODE ip @ extract opcode from rINST
5259 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5260 fstd d2, [r9] @ vAA<- d2
5261 GOTO_OPCODE ip @ jump to next instruction
5262
5263
5264/* ------------------------------ */
5265 .balign 128
5266.L_op_mul_double: /* 0xad */
5267/* File: arm/op_mul_double.S */
5268/* File: arm/fbinopWide.S */
5269 /*
5270 * Generic 64-bit double-precision floating point binary operation.
5271 * Provide an "instr" line that specifies an instruction that performs
5272 * "d2 = d0 op d1".
5273 *
5274 * for: add-double, sub-double, mul-double, div-double
5275 */
5276 /* doubleop vAA, vBB, vCC */
5277 FETCH r0, 1 @ r0<- CCBB
5278 mov r9, rINST, lsr #8 @ r9<- AA
5279 mov r3, r0, lsr #8 @ r3<- CC
5280 and r2, r0, #255 @ r2<- BB
5281 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5282 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5283 fldd d1, [r3] @ d1<- vCC
5284 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005285 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5286 fmuld d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005287 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005288 GET_INST_OPCODE ip @ extract opcode from rINST
5289 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5290 fstd d2, [r9] @ vAA<- d2
5291 GOTO_OPCODE ip @ jump to next instruction
5292
5293
5294/* ------------------------------ */
5295 .balign 128
5296.L_op_div_double: /* 0xae */
5297/* File: arm/op_div_double.S */
5298/* File: arm/fbinopWide.S */
5299 /*
5300 * Generic 64-bit double-precision floating point binary operation.
5301 * Provide an "instr" line that specifies an instruction that performs
5302 * "d2 = d0 op d1".
5303 *
5304 * for: add-double, sub-double, mul-double, div-double
5305 */
5306 /* doubleop vAA, vBB, vCC */
5307 FETCH r0, 1 @ r0<- CCBB
5308 mov r9, rINST, lsr #8 @ r9<- AA
5309 mov r3, r0, lsr #8 @ r3<- CC
5310 and r2, r0, #255 @ r2<- BB
5311 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5312 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5313 fldd d1, [r3] @ d1<- vCC
5314 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005315 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5316 fdivd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005317 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005318 GET_INST_OPCODE ip @ extract opcode from rINST
5319 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5320 fstd d2, [r9] @ vAA<- d2
5321 GOTO_OPCODE ip @ jump to next instruction
5322
5323
5324/* ------------------------------ */
5325 .balign 128
5326.L_op_rem_double: /* 0xaf */
5327/* File: arm/op_rem_double.S */
5328/* EABI doesn't define a double remainder function, but libm does */
5329/* File: arm/binopWide.S */
5330 /*
5331 * Generic 64-bit binary operation. Provide an "instr" line that
5332 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5333 * This could be an ARM instruction or a function call. (If the result
5334 * comes back in a register other than r0, you can override "result".)
5335 *
5336 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5337 * vCC (r1). Useful for integer division and modulus.
5338 *
5339 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5340 * xor-long, add-double, sub-double, mul-double, div-double,
5341 * rem-double
5342 *
5343 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5344 */
5345 /* binop vAA, vBB, vCC */
5346 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08005347 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08005348 and r2, r0, #255 @ r2<- BB
5349 mov r3, r0, lsr #8 @ r3<- CC
buzbeeace690f2016-03-11 09:51:11 -08005350 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[AA]
5351 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[BB]
5352 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[CC]
buzbee1452bee2015-03-06 14:43:04 -08005353 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5354 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5355 .if 0
5356 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5357 beq common_errDivideByZero
5358 .endif
buzbee50cf6002016-02-10 08:59:12 -08005359 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005360 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005361 @ optional op; may set condition codes
5362 bl fmod @ result<- op, r0-r3 changed
5363 GET_INST_OPCODE ip @ extract opcode from rINST
5364 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5365 GOTO_OPCODE ip @ jump to next instruction
5366 /* 14-17 instructions */
5367
5368
5369/* ------------------------------ */
5370 .balign 128
5371.L_op_add_int_2addr: /* 0xb0 */
5372/* File: arm/op_add_int_2addr.S */
5373/* File: arm/binop2addr.S */
5374 /*
5375 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5376 * that specifies an instruction that performs "result = r0 op r1".
5377 * This could be an ARM instruction or a function call. (If the result
5378 * comes back in a register other than r0, you can override "result".)
5379 *
5380 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5381 * vCC (r1). Useful for integer division and modulus.
5382 *
5383 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5384 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5385 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5386 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5387 */
5388 /* binop/2addr vA, vB */
5389 mov r3, rINST, lsr #12 @ r3<- B
5390 ubfx r9, rINST, #8, #4 @ r9<- A
5391 GET_VREG r1, r3 @ r1<- vB
5392 GET_VREG r0, r9 @ r0<- vA
5393 .if 0
5394 cmp r1, #0 @ is second operand zero?
5395 beq common_errDivideByZero
5396 .endif
5397 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5398
5399 @ optional op; may set condition codes
5400 add r0, r0, r1 @ r0<- op, r0-r3 changed
5401 GET_INST_OPCODE ip @ extract opcode from rINST
5402 SET_VREG r0, r9 @ vAA<- r0
5403 GOTO_OPCODE ip @ jump to next instruction
5404 /* 10-13 instructions */
5405
5406
5407/* ------------------------------ */
5408 .balign 128
5409.L_op_sub_int_2addr: /* 0xb1 */
5410/* File: arm/op_sub_int_2addr.S */
5411/* File: arm/binop2addr.S */
5412 /*
5413 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5414 * that specifies an instruction that performs "result = r0 op r1".
5415 * This could be an ARM instruction or a function call. (If the result
5416 * comes back in a register other than r0, you can override "result".)
5417 *
5418 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5419 * vCC (r1). Useful for integer division and modulus.
5420 *
5421 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5422 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5423 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5424 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5425 */
5426 /* binop/2addr vA, vB */
5427 mov r3, rINST, lsr #12 @ r3<- B
5428 ubfx r9, rINST, #8, #4 @ r9<- A
5429 GET_VREG r1, r3 @ r1<- vB
5430 GET_VREG r0, r9 @ r0<- vA
5431 .if 0
5432 cmp r1, #0 @ is second operand zero?
5433 beq common_errDivideByZero
5434 .endif
5435 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5436
5437 @ optional op; may set condition codes
5438 sub r0, r0, r1 @ r0<- op, r0-r3 changed
5439 GET_INST_OPCODE ip @ extract opcode from rINST
5440 SET_VREG r0, r9 @ vAA<- r0
5441 GOTO_OPCODE ip @ jump to next instruction
5442 /* 10-13 instructions */
5443
5444
5445/* ------------------------------ */
5446 .balign 128
5447.L_op_mul_int_2addr: /* 0xb2 */
5448/* File: arm/op_mul_int_2addr.S */
5449/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5450/* File: arm/binop2addr.S */
5451 /*
5452 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5453 * that specifies an instruction that performs "result = r0 op r1".
5454 * This could be an ARM instruction or a function call. (If the result
5455 * comes back in a register other than r0, you can override "result".)
5456 *
5457 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5458 * vCC (r1). Useful for integer division and modulus.
5459 *
5460 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5461 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5462 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5463 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5464 */
5465 /* binop/2addr vA, vB */
5466 mov r3, rINST, lsr #12 @ r3<- B
5467 ubfx r9, rINST, #8, #4 @ r9<- A
5468 GET_VREG r1, r3 @ r1<- vB
5469 GET_VREG r0, r9 @ r0<- vA
5470 .if 0
5471 cmp r1, #0 @ is second operand zero?
5472 beq common_errDivideByZero
5473 .endif
5474 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5475
5476 @ optional op; may set condition codes
5477 mul r0, r1, r0 @ r0<- op, r0-r3 changed
5478 GET_INST_OPCODE ip @ extract opcode from rINST
5479 SET_VREG r0, r9 @ vAA<- r0
5480 GOTO_OPCODE ip @ jump to next instruction
5481 /* 10-13 instructions */
5482
5483
5484/* ------------------------------ */
5485 .balign 128
5486.L_op_div_int_2addr: /* 0xb3 */
5487/* File: arm/op_div_int_2addr.S */
5488 /*
5489 * Specialized 32-bit binary operation
5490 *
5491 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5492 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5493 * ARMv7 CPUs that have hardware division support).
5494 *
5495 * div-int/2addr
5496 *
5497 */
5498 mov r3, rINST, lsr #12 @ r3<- B
5499 ubfx r9, rINST, #8, #4 @ r9<- A
5500 GET_VREG r1, r3 @ r1<- vB
5501 GET_VREG r0, r9 @ r0<- vA
5502 cmp r1, #0 @ is second operand zero?
5503 beq common_errDivideByZero
5504 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5505
5506#ifdef __ARM_ARCH_EXT_IDIV__
5507 sdiv r0, r0, r1 @ r0<- op
5508#else
5509 bl __aeabi_idiv @ r0<- op, r0-r3 changed
5510#endif
5511 GET_INST_OPCODE ip @ extract opcode from rINST
5512 SET_VREG r0, r9 @ vAA<- r0
5513 GOTO_OPCODE ip @ jump to next instruction
5514 /* 10-13 instructions */
5515
5516
5517/* ------------------------------ */
5518 .balign 128
5519.L_op_rem_int_2addr: /* 0xb4 */
5520/* File: arm/op_rem_int_2addr.S */
5521 /*
5522 * Specialized 32-bit binary operation
5523 *
5524 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5525 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5526 * ARMv7 CPUs that have hardware division support).
5527 *
5528 * NOTE: idivmod returns quotient in r0 and remainder in r1
5529 *
5530 * rem-int/2addr
5531 *
5532 */
5533 mov r3, rINST, lsr #12 @ r3<- B
5534 ubfx r9, rINST, #8, #4 @ r9<- A
5535 GET_VREG r1, r3 @ r1<- vB
5536 GET_VREG r0, r9 @ r0<- vA
5537 cmp r1, #0 @ is second operand zero?
5538 beq common_errDivideByZero
5539 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5540
5541#ifdef __ARM_ARCH_EXT_IDIV__
5542 sdiv r2, r0, r1
5543 mls r1, r1, r2, r0 @ r1<- op
5544#else
5545 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
5546#endif
5547 GET_INST_OPCODE ip @ extract opcode from rINST
5548 SET_VREG r1, r9 @ vAA<- r1
5549 GOTO_OPCODE ip @ jump to next instruction
5550 /* 10-13 instructions */
5551
5552
5553/* ------------------------------ */
5554 .balign 128
5555.L_op_and_int_2addr: /* 0xb5 */
5556/* File: arm/op_and_int_2addr.S */
5557/* File: arm/binop2addr.S */
5558 /*
5559 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5560 * that specifies an instruction that performs "result = r0 op r1".
5561 * This could be an ARM instruction or a function call. (If the result
5562 * comes back in a register other than r0, you can override "result".)
5563 *
5564 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5565 * vCC (r1). Useful for integer division and modulus.
5566 *
5567 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5568 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5569 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5570 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5571 */
5572 /* binop/2addr vA, vB */
5573 mov r3, rINST, lsr #12 @ r3<- B
5574 ubfx r9, rINST, #8, #4 @ r9<- A
5575 GET_VREG r1, r3 @ r1<- vB
5576 GET_VREG r0, r9 @ r0<- vA
5577 .if 0
5578 cmp r1, #0 @ is second operand zero?
5579 beq common_errDivideByZero
5580 .endif
5581 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5582
5583 @ optional op; may set condition codes
5584 and r0, r0, r1 @ r0<- op, r0-r3 changed
5585 GET_INST_OPCODE ip @ extract opcode from rINST
5586 SET_VREG r0, r9 @ vAA<- r0
5587 GOTO_OPCODE ip @ jump to next instruction
5588 /* 10-13 instructions */
5589
5590
5591/* ------------------------------ */
5592 .balign 128
5593.L_op_or_int_2addr: /* 0xb6 */
5594/* File: arm/op_or_int_2addr.S */
5595/* File: arm/binop2addr.S */
5596 /*
5597 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5598 * that specifies an instruction that performs "result = r0 op r1".
5599 * This could be an ARM instruction or a function call. (If the result
5600 * comes back in a register other than r0, you can override "result".)
5601 *
5602 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5603 * vCC (r1). Useful for integer division and modulus.
5604 *
5605 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5606 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5607 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5608 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5609 */
5610 /* binop/2addr vA, vB */
5611 mov r3, rINST, lsr #12 @ r3<- B
5612 ubfx r9, rINST, #8, #4 @ r9<- A
5613 GET_VREG r1, r3 @ r1<- vB
5614 GET_VREG r0, r9 @ r0<- vA
5615 .if 0
5616 cmp r1, #0 @ is second operand zero?
5617 beq common_errDivideByZero
5618 .endif
5619 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5620
5621 @ optional op; may set condition codes
5622 orr r0, r0, r1 @ r0<- op, r0-r3 changed
5623 GET_INST_OPCODE ip @ extract opcode from rINST
5624 SET_VREG r0, r9 @ vAA<- r0
5625 GOTO_OPCODE ip @ jump to next instruction
5626 /* 10-13 instructions */
5627
5628
5629/* ------------------------------ */
5630 .balign 128
5631.L_op_xor_int_2addr: /* 0xb7 */
5632/* File: arm/op_xor_int_2addr.S */
5633/* File: arm/binop2addr.S */
5634 /*
5635 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5636 * that specifies an instruction that performs "result = r0 op r1".
5637 * This could be an ARM instruction or a function call. (If the result
5638 * comes back in a register other than r0, you can override "result".)
5639 *
5640 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5641 * vCC (r1). Useful for integer division and modulus.
5642 *
5643 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5644 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5645 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5646 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5647 */
5648 /* binop/2addr vA, vB */
5649 mov r3, rINST, lsr #12 @ r3<- B
5650 ubfx r9, rINST, #8, #4 @ r9<- A
5651 GET_VREG r1, r3 @ r1<- vB
5652 GET_VREG r0, r9 @ r0<- vA
5653 .if 0
5654 cmp r1, #0 @ is second operand zero?
5655 beq common_errDivideByZero
5656 .endif
5657 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5658
5659 @ optional op; may set condition codes
5660 eor r0, r0, r1 @ r0<- op, r0-r3 changed
5661 GET_INST_OPCODE ip @ extract opcode from rINST
5662 SET_VREG r0, r9 @ vAA<- r0
5663 GOTO_OPCODE ip @ jump to next instruction
5664 /* 10-13 instructions */
5665
5666
5667/* ------------------------------ */
5668 .balign 128
5669.L_op_shl_int_2addr: /* 0xb8 */
5670/* File: arm/op_shl_int_2addr.S */
5671/* File: arm/binop2addr.S */
5672 /*
5673 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5674 * that specifies an instruction that performs "result = r0 op r1".
5675 * This could be an ARM instruction or a function call. (If the result
5676 * comes back in a register other than r0, you can override "result".)
5677 *
5678 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5679 * vCC (r1). Useful for integer division and modulus.
5680 *
5681 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5682 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5683 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5684 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5685 */
5686 /* binop/2addr vA, vB */
5687 mov r3, rINST, lsr #12 @ r3<- B
5688 ubfx r9, rINST, #8, #4 @ r9<- A
5689 GET_VREG r1, r3 @ r1<- vB
5690 GET_VREG r0, r9 @ r0<- vA
5691 .if 0
5692 cmp r1, #0 @ is second operand zero?
5693 beq common_errDivideByZero
5694 .endif
5695 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5696
5697 and r1, r1, #31 @ optional op; may set condition codes
5698 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
5699 GET_INST_OPCODE ip @ extract opcode from rINST
5700 SET_VREG r0, r9 @ vAA<- r0
5701 GOTO_OPCODE ip @ jump to next instruction
5702 /* 10-13 instructions */
5703
5704
5705/* ------------------------------ */
5706 .balign 128
5707.L_op_shr_int_2addr: /* 0xb9 */
5708/* File: arm/op_shr_int_2addr.S */
5709/* File: arm/binop2addr.S */
5710 /*
5711 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5712 * that specifies an instruction that performs "result = r0 op r1".
5713 * This could be an ARM instruction or a function call. (If the result
5714 * comes back in a register other than r0, you can override "result".)
5715 *
5716 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5717 * vCC (r1). Useful for integer division and modulus.
5718 *
5719 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5720 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5721 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5722 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5723 */
5724 /* binop/2addr vA, vB */
5725 mov r3, rINST, lsr #12 @ r3<- B
5726 ubfx r9, rINST, #8, #4 @ r9<- A
5727 GET_VREG r1, r3 @ r1<- vB
5728 GET_VREG r0, r9 @ r0<- vA
5729 .if 0
5730 cmp r1, #0 @ is second operand zero?
5731 beq common_errDivideByZero
5732 .endif
5733 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5734
5735 and r1, r1, #31 @ optional op; may set condition codes
5736 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
5737 GET_INST_OPCODE ip @ extract opcode from rINST
5738 SET_VREG r0, r9 @ vAA<- r0
5739 GOTO_OPCODE ip @ jump to next instruction
5740 /* 10-13 instructions */
5741
5742
5743/* ------------------------------ */
5744 .balign 128
5745.L_op_ushr_int_2addr: /* 0xba */
5746/* File: arm/op_ushr_int_2addr.S */
5747/* File: arm/binop2addr.S */
5748 /*
5749 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5750 * that specifies an instruction that performs "result = r0 op r1".
5751 * This could be an ARM instruction or a function call. (If the result
5752 * comes back in a register other than r0, you can override "result".)
5753 *
5754 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5755 * vCC (r1). Useful for integer division and modulus.
5756 *
5757 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5758 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5759 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5760 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5761 */
5762 /* binop/2addr vA, vB */
5763 mov r3, rINST, lsr #12 @ r3<- B
5764 ubfx r9, rINST, #8, #4 @ r9<- A
5765 GET_VREG r1, r3 @ r1<- vB
5766 GET_VREG r0, r9 @ r0<- vA
5767 .if 0
5768 cmp r1, #0 @ is second operand zero?
5769 beq common_errDivideByZero
5770 .endif
5771 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5772
5773 and r1, r1, #31 @ optional op; may set condition codes
5774 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
5775 GET_INST_OPCODE ip @ extract opcode from rINST
5776 SET_VREG r0, r9 @ vAA<- r0
5777 GOTO_OPCODE ip @ jump to next instruction
5778 /* 10-13 instructions */
5779
5780
5781/* ------------------------------ */
5782 .balign 128
5783.L_op_add_long_2addr: /* 0xbb */
5784/* File: arm/op_add_long_2addr.S */
5785/* File: arm/binopWide2addr.S */
5786 /*
5787 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5788 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5789 * This could be an ARM instruction or a function call. (If the result
5790 * comes back in a register other than r0, you can override "result".)
5791 *
5792 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5793 * vCC (r1). Useful for integer division and modulus.
5794 *
5795 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5796 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5797 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5798 * rem-double/2addr
5799 */
5800 /* binop/2addr vA, vB */
5801 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005802 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08005803 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
5804 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005805 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5806 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5807 .if 0
5808 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5809 beq common_errDivideByZero
5810 .endif
buzbee50cf6002016-02-10 08:59:12 -08005811 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005812 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005813 adds r0, r0, r2 @ optional op; may set condition codes
5814 adc r1, r1, r3 @ result<- op, r0-r3 changed
5815 GET_INST_OPCODE ip @ extract opcode from rINST
5816 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5817 GOTO_OPCODE ip @ jump to next instruction
5818 /* 12-15 instructions */
5819
5820
5821/* ------------------------------ */
5822 .balign 128
5823.L_op_sub_long_2addr: /* 0xbc */
5824/* File: arm/op_sub_long_2addr.S */
5825/* File: arm/binopWide2addr.S */
5826 /*
5827 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5828 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5829 * This could be an ARM instruction or a function call. (If the result
5830 * comes back in a register other than r0, you can override "result".)
5831 *
5832 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5833 * vCC (r1). Useful for integer division and modulus.
5834 *
5835 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5836 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5837 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5838 * rem-double/2addr
5839 */
5840 /* binop/2addr vA, vB */
5841 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005842 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08005843 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
5844 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005845 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5846 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5847 .if 0
5848 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5849 beq common_errDivideByZero
5850 .endif
buzbee50cf6002016-02-10 08:59:12 -08005851 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005852 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005853 subs r0, r0, r2 @ optional op; may set condition codes
5854 sbc r1, r1, r3 @ result<- op, r0-r3 changed
5855 GET_INST_OPCODE ip @ extract opcode from rINST
5856 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5857 GOTO_OPCODE ip @ jump to next instruction
5858 /* 12-15 instructions */
5859
5860
5861/* ------------------------------ */
5862 .balign 128
5863.L_op_mul_long_2addr: /* 0xbd */
5864/* File: arm/op_mul_long_2addr.S */
5865 /*
5866 * Signed 64-bit integer multiply, "/2addr" version.
5867 *
5868 * See op_mul_long for an explanation.
5869 *
5870 * We get a little tight on registers, so to avoid looking up &fp[A]
5871 * again we stuff it into rINST.
5872 */
5873 /* mul-long/2addr vA, vB */
5874 mov r1, rINST, lsr #12 @ r1<- B
5875 ubfx r9, rINST, #8, #4 @ r9<- A
buzbeeace690f2016-03-11 09:51:11 -08005876 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
5877 VREG_INDEX_TO_ADDR rINST, r9 @ rINST<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005878 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5879 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1
5880 mul ip, r2, r1 @ ip<- ZxW
5881 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
5882 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
5883 mov r0, rINST @ r0<- &fp[A] (free up rINST)
5884 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5885 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
5886 GET_INST_OPCODE ip @ extract opcode from rINST
5887 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
5888 GOTO_OPCODE ip @ jump to next instruction
5889
5890/* ------------------------------ */
5891 .balign 128
5892.L_op_div_long_2addr: /* 0xbe */
5893/* File: arm/op_div_long_2addr.S */
5894/* File: arm/binopWide2addr.S */
5895 /*
5896 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5897 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5898 * This could be an ARM instruction or a function call. (If the result
5899 * comes back in a register other than r0, you can override "result".)
5900 *
5901 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5902 * vCC (r1). Useful for integer division and modulus.
5903 *
5904 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5905 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5906 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5907 * rem-double/2addr
5908 */
5909 /* binop/2addr vA, vB */
5910 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005911 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08005912 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
5913 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005914 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5915 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5916 .if 1
5917 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5918 beq common_errDivideByZero
5919 .endif
buzbee50cf6002016-02-10 08:59:12 -08005920 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005921 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005922 @ optional op; may set condition codes
5923 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5924 GET_INST_OPCODE ip @ extract opcode from rINST
5925 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5926 GOTO_OPCODE ip @ jump to next instruction
5927 /* 12-15 instructions */
5928
5929
5930/* ------------------------------ */
5931 .balign 128
5932.L_op_rem_long_2addr: /* 0xbf */
5933/* File: arm/op_rem_long_2addr.S */
5934/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5935/* File: arm/binopWide2addr.S */
5936 /*
5937 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5938 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5939 * This could be an ARM instruction or a function call. (If the result
5940 * comes back in a register other than r0, you can override "result".)
5941 *
5942 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5943 * vCC (r1). Useful for integer division and modulus.
5944 *
5945 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5946 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5947 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5948 * rem-double/2addr
5949 */
5950 /* binop/2addr vA, vB */
5951 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005952 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08005953 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
5954 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005955 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5956 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5957 .if 1
5958 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5959 beq common_errDivideByZero
5960 .endif
buzbee50cf6002016-02-10 08:59:12 -08005961 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005962 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005963 @ optional op; may set condition codes
5964 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5965 GET_INST_OPCODE ip @ extract opcode from rINST
5966 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
5967 GOTO_OPCODE ip @ jump to next instruction
5968 /* 12-15 instructions */
5969
5970
5971/* ------------------------------ */
5972 .balign 128
5973.L_op_and_long_2addr: /* 0xc0 */
5974/* File: arm/op_and_long_2addr.S */
5975/* File: arm/binopWide2addr.S */
5976 /*
5977 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5978 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5979 * This could be an ARM instruction or a function call. (If the result
5980 * comes back in a register other than r0, you can override "result".)
5981 *
5982 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5983 * vCC (r1). Useful for integer division and modulus.
5984 *
5985 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5986 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5987 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5988 * rem-double/2addr
5989 */
5990 /* binop/2addr vA, vB */
5991 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005992 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08005993 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
5994 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005995 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5996 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5997 .if 0
5998 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5999 beq common_errDivideByZero
6000 .endif
buzbee50cf6002016-02-10 08:59:12 -08006001 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006002 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006003 and r0, r0, r2 @ optional op; may set condition codes
6004 and r1, r1, r3 @ result<- op, r0-r3 changed
6005 GET_INST_OPCODE ip @ extract opcode from rINST
6006 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6007 GOTO_OPCODE ip @ jump to next instruction
6008 /* 12-15 instructions */
6009
6010
6011/* ------------------------------ */
6012 .balign 128
6013.L_op_or_long_2addr: /* 0xc1 */
6014/* File: arm/op_or_long_2addr.S */
6015/* File: arm/binopWide2addr.S */
6016 /*
6017 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6018 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6019 * This could be an ARM instruction or a function call. (If the result
6020 * comes back in a register other than r0, you can override "result".)
6021 *
6022 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6023 * vCC (r1). Useful for integer division and modulus.
6024 *
6025 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6026 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6027 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6028 * rem-double/2addr
6029 */
6030 /* binop/2addr vA, vB */
6031 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006032 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08006033 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
6034 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006035 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6036 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6037 .if 0
6038 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6039 beq common_errDivideByZero
6040 .endif
buzbee50cf6002016-02-10 08:59:12 -08006041 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006042 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006043 orr r0, r0, r2 @ optional op; may set condition codes
6044 orr r1, r1, r3 @ result<- op, r0-r3 changed
6045 GET_INST_OPCODE ip @ extract opcode from rINST
6046 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6047 GOTO_OPCODE ip @ jump to next instruction
6048 /* 12-15 instructions */
6049
6050
6051/* ------------------------------ */
6052 .balign 128
6053.L_op_xor_long_2addr: /* 0xc2 */
6054/* File: arm/op_xor_long_2addr.S */
6055/* File: arm/binopWide2addr.S */
6056 /*
6057 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6058 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6059 * This could be an ARM instruction or a function call. (If the result
6060 * comes back in a register other than r0, you can override "result".)
6061 *
6062 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6063 * vCC (r1). Useful for integer division and modulus.
6064 *
6065 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6066 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6067 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6068 * rem-double/2addr
6069 */
6070 /* binop/2addr vA, vB */
6071 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006072 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08006073 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
6074 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006075 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6076 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6077 .if 0
6078 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6079 beq common_errDivideByZero
6080 .endif
buzbee50cf6002016-02-10 08:59:12 -08006081 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006082 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006083 eor r0, r0, r2 @ optional op; may set condition codes
6084 eor r1, r1, r3 @ result<- op, r0-r3 changed
6085 GET_INST_OPCODE ip @ extract opcode from rINST
6086 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6087 GOTO_OPCODE ip @ jump to next instruction
6088 /* 12-15 instructions */
6089
6090
6091/* ------------------------------ */
6092 .balign 128
6093.L_op_shl_long_2addr: /* 0xc3 */
6094/* File: arm/op_shl_long_2addr.S */
6095 /*
6096 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6097 * 32-bit shift distance.
6098 */
6099 /* shl-long/2addr vA, vB */
6100 mov r3, rINST, lsr #12 @ r3<- B
6101 ubfx r9, rINST, #8, #4 @ r9<- A
6102 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006103 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbeeace690f2016-03-11 09:51:11 -08006104 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006105 and r2, r2, #63 @ r2<- r2 & 0x3f
6106 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006107 mov r1, r1, asl r2 @ r1<- r1 << r2
6108 rsb r3, r2, #32 @ r3<- 32 - r2
6109 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
6110 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006111 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006112 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
6113 mov r0, r0, asl r2 @ r0<- r0 << r2
buzbee1452bee2015-03-06 14:43:04 -08006114 GET_INST_OPCODE ip @ extract opcode from rINST
6115 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6116 GOTO_OPCODE ip @ jump to next instruction
6117
6118/* ------------------------------ */
6119 .balign 128
6120.L_op_shr_long_2addr: /* 0xc4 */
6121/* File: arm/op_shr_long_2addr.S */
6122 /*
6123 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6124 * 32-bit shift distance.
6125 */
6126 /* shr-long/2addr vA, vB */
6127 mov r3, rINST, lsr #12 @ r3<- B
6128 ubfx r9, rINST, #8, #4 @ r9<- A
6129 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006130 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbeeace690f2016-03-11 09:51:11 -08006131 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006132 and r2, r2, #63 @ r2<- r2 & 0x3f
6133 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006134 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6135 rsb r3, r2, #32 @ r3<- 32 - r2
6136 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6137 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006138 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006139 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
6140 mov r1, r1, asr r2 @ r1<- r1 >> r2
buzbee1452bee2015-03-06 14:43:04 -08006141 GET_INST_OPCODE ip @ extract opcode from rINST
6142 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6143 GOTO_OPCODE ip @ jump to next instruction
6144
6145/* ------------------------------ */
6146 .balign 128
6147.L_op_ushr_long_2addr: /* 0xc5 */
6148/* File: arm/op_ushr_long_2addr.S */
6149 /*
6150 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6151 * 32-bit shift distance.
6152 */
6153 /* ushr-long/2addr vA, vB */
6154 mov r3, rINST, lsr #12 @ r3<- B
6155 ubfx r9, rINST, #8, #4 @ r9<- A
6156 GET_VREG r2, r3 @ r2<- vB
buzbeec3b4c6e2016-02-19 10:10:20 -08006157 CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs
buzbeeace690f2016-03-11 09:51:11 -08006158 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006159 and r2, r2, #63 @ r2<- r2 & 0x3f
6160 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
buzbeec3b4c6e2016-02-19 10:10:20 -08006161 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6162 rsb r3, r2, #32 @ r3<- 32 - r2
6163 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6164 subs ip, r2, #32 @ ip<- r2 - 32
buzbee1452bee2015-03-06 14:43:04 -08006165 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbeec3b4c6e2016-02-19 10:10:20 -08006166 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
6167 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
buzbee1452bee2015-03-06 14:43:04 -08006168 GET_INST_OPCODE ip @ extract opcode from rINST
6169 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6170 GOTO_OPCODE ip @ jump to next instruction
6171
6172/* ------------------------------ */
6173 .balign 128
6174.L_op_add_float_2addr: /* 0xc6 */
6175/* File: arm/op_add_float_2addr.S */
6176/* File: arm/fbinop2addr.S */
6177 /*
6178 * Generic 32-bit floating point "/2addr" binary operation. Provide
6179 * an "instr" line that specifies an instruction that performs
6180 * "s2 = s0 op s1".
6181 *
6182 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6183 */
6184 /* binop/2addr vA, vB */
6185 mov r3, rINST, lsr #12 @ r3<- B
buzbeeace690f2016-03-11 09:51:11 -08006186 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08006187 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
buzbee1452bee2015-03-06 14:43:04 -08006188 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
buzbeeace690f2016-03-11 09:51:11 -08006189 flds s1, [r3] @ s1<- vB
buzbee1452bee2015-03-06 14:43:04 -08006190 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6191 flds s0, [r9] @ s0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006192 fadds s2, s0, s1 @ s2<- op
6193 GET_INST_OPCODE ip @ extract opcode from rINST
6194 fsts s2, [r9] @ vAA<- s2
6195 GOTO_OPCODE ip @ jump to next instruction
6196
6197
6198/* ------------------------------ */
6199 .balign 128
6200.L_op_sub_float_2addr: /* 0xc7 */
6201/* File: arm/op_sub_float_2addr.S */
6202/* File: arm/fbinop2addr.S */
6203 /*
6204 * Generic 32-bit floating point "/2addr" binary operation. Provide
6205 * an "instr" line that specifies an instruction that performs
6206 * "s2 = s0 op s1".
6207 *
6208 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6209 */
6210 /* binop/2addr vA, vB */
6211 mov r3, rINST, lsr #12 @ r3<- B
buzbeeace690f2016-03-11 09:51:11 -08006212 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08006213 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
buzbee1452bee2015-03-06 14:43:04 -08006214 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
buzbeeace690f2016-03-11 09:51:11 -08006215 flds s1, [r3] @ s1<- vB
buzbee1452bee2015-03-06 14:43:04 -08006216 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6217 flds s0, [r9] @ s0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006218 fsubs s2, s0, s1 @ s2<- op
6219 GET_INST_OPCODE ip @ extract opcode from rINST
6220 fsts s2, [r9] @ vAA<- s2
6221 GOTO_OPCODE ip @ jump to next instruction
6222
6223
6224/* ------------------------------ */
6225 .balign 128
6226.L_op_mul_float_2addr: /* 0xc8 */
6227/* File: arm/op_mul_float_2addr.S */
6228/* File: arm/fbinop2addr.S */
6229 /*
6230 * Generic 32-bit floating point "/2addr" binary operation. Provide
6231 * an "instr" line that specifies an instruction that performs
6232 * "s2 = s0 op s1".
6233 *
6234 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6235 */
6236 /* binop/2addr vA, vB */
6237 mov r3, rINST, lsr #12 @ r3<- B
buzbeeace690f2016-03-11 09:51:11 -08006238 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08006239 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
buzbee1452bee2015-03-06 14:43:04 -08006240 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
buzbeeace690f2016-03-11 09:51:11 -08006241 flds s1, [r3] @ s1<- vB
buzbee1452bee2015-03-06 14:43:04 -08006242 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6243 flds s0, [r9] @ s0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006244 fmuls s2, s0, s1 @ s2<- op
6245 GET_INST_OPCODE ip @ extract opcode from rINST
6246 fsts s2, [r9] @ vAA<- s2
6247 GOTO_OPCODE ip @ jump to next instruction
6248
6249
6250/* ------------------------------ */
6251 .balign 128
6252.L_op_div_float_2addr: /* 0xc9 */
6253/* File: arm/op_div_float_2addr.S */
6254/* File: arm/fbinop2addr.S */
6255 /*
6256 * Generic 32-bit floating point "/2addr" binary operation. Provide
6257 * an "instr" line that specifies an instruction that performs
6258 * "s2 = s0 op s1".
6259 *
6260 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6261 */
6262 /* binop/2addr vA, vB */
6263 mov r3, rINST, lsr #12 @ r3<- B
buzbeeace690f2016-03-11 09:51:11 -08006264 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08006265 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
buzbee1452bee2015-03-06 14:43:04 -08006266 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
buzbeeace690f2016-03-11 09:51:11 -08006267 flds s1, [r3] @ s1<- vB
buzbee1452bee2015-03-06 14:43:04 -08006268 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6269 flds s0, [r9] @ s0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006270 fdivs s2, s0, s1 @ s2<- op
6271 GET_INST_OPCODE ip @ extract opcode from rINST
6272 fsts s2, [r9] @ vAA<- s2
6273 GOTO_OPCODE ip @ jump to next instruction
6274
6275
6276/* ------------------------------ */
6277 .balign 128
6278.L_op_rem_float_2addr: /* 0xca */
6279/* File: arm/op_rem_float_2addr.S */
6280/* EABI doesn't define a float remainder function, but libm does */
6281/* File: arm/binop2addr.S */
6282 /*
6283 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
6284 * that specifies an instruction that performs "result = r0 op r1".
6285 * This could be an ARM instruction or a function call. (If the result
6286 * comes back in a register other than r0, you can override "result".)
6287 *
6288 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6289 * vCC (r1). Useful for integer division and modulus.
6290 *
6291 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6292 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6293 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6294 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6295 */
6296 /* binop/2addr vA, vB */
6297 mov r3, rINST, lsr #12 @ r3<- B
6298 ubfx r9, rINST, #8, #4 @ r9<- A
6299 GET_VREG r1, r3 @ r1<- vB
6300 GET_VREG r0, r9 @ r0<- vA
6301 .if 0
6302 cmp r1, #0 @ is second operand zero?
6303 beq common_errDivideByZero
6304 .endif
6305 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6306
6307 @ optional op; may set condition codes
6308 bl fmodf @ r0<- op, r0-r3 changed
6309 GET_INST_OPCODE ip @ extract opcode from rINST
6310 SET_VREG r0, r9 @ vAA<- r0
6311 GOTO_OPCODE ip @ jump to next instruction
6312 /* 10-13 instructions */
6313
6314
6315/* ------------------------------ */
6316 .balign 128
6317.L_op_add_double_2addr: /* 0xcb */
6318/* File: arm/op_add_double_2addr.S */
6319/* File: arm/fbinopWide2addr.S */
6320 /*
6321 * Generic 64-bit floating point "/2addr" binary operation. Provide
6322 * an "instr" line that specifies an instruction that performs
6323 * "d2 = d0 op d1".
6324 *
6325 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6326 * div-double/2addr
6327 */
6328 /* binop/2addr vA, vB */
6329 mov r3, rINST, lsr #12 @ r3<- B
buzbeeace690f2016-03-11 09:51:11 -08006330 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08006331 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
buzbee50cf6002016-02-10 08:59:12 -08006332 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbeeace690f2016-03-11 09:51:11 -08006333 fldd d1, [r3] @ d1<- vB
buzbee1452bee2015-03-06 14:43:04 -08006334 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6335 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6336 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006337 faddd d2, d0, d1 @ d2<- op
6338 GET_INST_OPCODE ip @ extract opcode from rINST
6339 fstd d2, [r9] @ vAA<- d2
6340 GOTO_OPCODE ip @ jump to next instruction
6341
6342
6343/* ------------------------------ */
6344 .balign 128
6345.L_op_sub_double_2addr: /* 0xcc */
6346/* File: arm/op_sub_double_2addr.S */
6347/* File: arm/fbinopWide2addr.S */
6348 /*
6349 * Generic 64-bit floating point "/2addr" binary operation. Provide
6350 * an "instr" line that specifies an instruction that performs
6351 * "d2 = d0 op d1".
6352 *
6353 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6354 * div-double/2addr
6355 */
6356 /* binop/2addr vA, vB */
6357 mov r3, rINST, lsr #12 @ r3<- B
buzbeeace690f2016-03-11 09:51:11 -08006358 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08006359 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
buzbee50cf6002016-02-10 08:59:12 -08006360 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbeeace690f2016-03-11 09:51:11 -08006361 fldd d1, [r3] @ d1<- vB
buzbee1452bee2015-03-06 14:43:04 -08006362 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6363 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6364 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006365 fsubd d2, d0, d1 @ d2<- op
6366 GET_INST_OPCODE ip @ extract opcode from rINST
6367 fstd d2, [r9] @ vAA<- d2
6368 GOTO_OPCODE ip @ jump to next instruction
6369
6370
6371/* ------------------------------ */
6372 .balign 128
6373.L_op_mul_double_2addr: /* 0xcd */
6374/* File: arm/op_mul_double_2addr.S */
6375/* File: arm/fbinopWide2addr.S */
6376 /*
6377 * Generic 64-bit floating point "/2addr" binary operation. Provide
6378 * an "instr" line that specifies an instruction that performs
6379 * "d2 = d0 op d1".
6380 *
6381 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6382 * div-double/2addr
6383 */
6384 /* binop/2addr vA, vB */
6385 mov r3, rINST, lsr #12 @ r3<- B
buzbeeace690f2016-03-11 09:51:11 -08006386 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08006387 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
buzbee50cf6002016-02-10 08:59:12 -08006388 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbeeace690f2016-03-11 09:51:11 -08006389 fldd d1, [r3] @ d1<- vB
buzbee1452bee2015-03-06 14:43:04 -08006390 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6391 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6392 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006393 fmuld d2, d0, d1 @ d2<- op
6394 GET_INST_OPCODE ip @ extract opcode from rINST
6395 fstd d2, [r9] @ vAA<- d2
6396 GOTO_OPCODE ip @ jump to next instruction
6397
6398
6399/* ------------------------------ */
6400 .balign 128
6401.L_op_div_double_2addr: /* 0xce */
6402/* File: arm/op_div_double_2addr.S */
6403/* File: arm/fbinopWide2addr.S */
6404 /*
6405 * Generic 64-bit floating point "/2addr" binary operation. Provide
6406 * an "instr" line that specifies an instruction that performs
6407 * "d2 = d0 op d1".
6408 *
6409 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6410 * div-double/2addr
6411 */
6412 /* binop/2addr vA, vB */
6413 mov r3, rINST, lsr #12 @ r3<- B
buzbeeace690f2016-03-11 09:51:11 -08006414 ubfx r9, rINST, #8, #4 @ r9<- A
buzbee1452bee2015-03-06 14:43:04 -08006415 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
buzbee50cf6002016-02-10 08:59:12 -08006416 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbeeace690f2016-03-11 09:51:11 -08006417 fldd d1, [r3] @ d1<- vB
buzbee1452bee2015-03-06 14:43:04 -08006418 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6419 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6420 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006421 fdivd d2, d0, d1 @ d2<- op
6422 GET_INST_OPCODE ip @ extract opcode from rINST
6423 fstd d2, [r9] @ vAA<- d2
6424 GOTO_OPCODE ip @ jump to next instruction
6425
6426
6427/* ------------------------------ */
6428 .balign 128
6429.L_op_rem_double_2addr: /* 0xcf */
6430/* File: arm/op_rem_double_2addr.S */
6431/* EABI doesn't define a double remainder function, but libm does */
6432/* File: arm/binopWide2addr.S */
6433 /*
6434 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6435 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6436 * This could be an ARM instruction or a function call. (If the result
6437 * comes back in a register other than r0, you can override "result".)
6438 *
6439 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6440 * vCC (r1). Useful for integer division and modulus.
6441 *
6442 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6443 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6444 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6445 * rem-double/2addr
6446 */
6447 /* binop/2addr vA, vB */
6448 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006449 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbeeace690f2016-03-11 09:51:11 -08006450 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B]
6451 VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006452 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6453 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6454 .if 0
6455 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6456 beq common_errDivideByZero
6457 .endif
buzbee50cf6002016-02-10 08:59:12 -08006458 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006459 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006460 @ optional op; may set condition codes
6461 bl fmod @ result<- op, r0-r3 changed
6462 GET_INST_OPCODE ip @ extract opcode from rINST
6463 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6464 GOTO_OPCODE ip @ jump to next instruction
6465 /* 12-15 instructions */
6466
6467
6468/* ------------------------------ */
6469 .balign 128
6470.L_op_add_int_lit16: /* 0xd0 */
6471/* File: arm/op_add_int_lit16.S */
6472/* File: arm/binopLit16.S */
6473 /*
6474 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6475 * that specifies an instruction that performs "result = r0 op r1".
6476 * This could be an ARM instruction or a function call. (If the result
6477 * comes back in a register other than r0, you can override "result".)
6478 *
6479 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6480 * vCC (r1). Useful for integer division and modulus.
6481 *
6482 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6483 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6484 */
6485 /* binop/lit16 vA, vB, #+CCCC */
6486 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6487 mov r2, rINST, lsr #12 @ r2<- B
6488 ubfx r9, rINST, #8, #4 @ r9<- A
6489 GET_VREG r0, r2 @ r0<- vB
6490 .if 0
6491 cmp r1, #0 @ is second operand zero?
6492 beq common_errDivideByZero
6493 .endif
6494 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6495
6496 add r0, r0, r1 @ r0<- op, r0-r3 changed
6497 GET_INST_OPCODE ip @ extract opcode from rINST
6498 SET_VREG r0, r9 @ vAA<- r0
6499 GOTO_OPCODE ip @ jump to next instruction
6500 /* 10-13 instructions */
6501
6502
6503/* ------------------------------ */
6504 .balign 128
6505.L_op_rsub_int: /* 0xd1 */
6506/* File: arm/op_rsub_int.S */
6507/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6508/* File: arm/binopLit16.S */
6509 /*
6510 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6511 * that specifies an instruction that performs "result = r0 op r1".
6512 * This could be an ARM instruction or a function call. (If the result
6513 * comes back in a register other than r0, you can override "result".)
6514 *
6515 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6516 * vCC (r1). Useful for integer division and modulus.
6517 *
6518 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6519 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6520 */
6521 /* binop/lit16 vA, vB, #+CCCC */
6522 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6523 mov r2, rINST, lsr #12 @ r2<- B
6524 ubfx r9, rINST, #8, #4 @ r9<- A
6525 GET_VREG r0, r2 @ r0<- vB
6526 .if 0
6527 cmp r1, #0 @ is second operand zero?
6528 beq common_errDivideByZero
6529 .endif
6530 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6531
6532 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6533 GET_INST_OPCODE ip @ extract opcode from rINST
6534 SET_VREG r0, r9 @ vAA<- r0
6535 GOTO_OPCODE ip @ jump to next instruction
6536 /* 10-13 instructions */
6537
6538
6539/* ------------------------------ */
6540 .balign 128
6541.L_op_mul_int_lit16: /* 0xd2 */
6542/* File: arm/op_mul_int_lit16.S */
6543/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6544/* File: arm/binopLit16.S */
6545 /*
6546 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6547 * that specifies an instruction that performs "result = r0 op r1".
6548 * This could be an ARM instruction or a function call. (If the result
6549 * comes back in a register other than r0, you can override "result".)
6550 *
6551 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6552 * vCC (r1). Useful for integer division and modulus.
6553 *
6554 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6555 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6556 */
6557 /* binop/lit16 vA, vB, #+CCCC */
6558 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6559 mov r2, rINST, lsr #12 @ r2<- B
6560 ubfx r9, rINST, #8, #4 @ r9<- A
6561 GET_VREG r0, r2 @ r0<- vB
6562 .if 0
6563 cmp r1, #0 @ is second operand zero?
6564 beq common_errDivideByZero
6565 .endif
6566 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6567
6568 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6569 GET_INST_OPCODE ip @ extract opcode from rINST
6570 SET_VREG r0, r9 @ vAA<- r0
6571 GOTO_OPCODE ip @ jump to next instruction
6572 /* 10-13 instructions */
6573
6574
6575/* ------------------------------ */
6576 .balign 128
6577.L_op_div_int_lit16: /* 0xd3 */
6578/* File: arm/op_div_int_lit16.S */
6579 /*
6580 * Specialized 32-bit binary operation
6581 *
6582 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6583 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6584 * ARMv7 CPUs that have hardware division support).
6585 *
6586 * div-int/lit16
6587 *
6588 */
6589 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6590 mov r2, rINST, lsr #12 @ r2<- B
6591 ubfx r9, rINST, #8, #4 @ r9<- A
6592 GET_VREG r0, r2 @ r0<- vB
6593 cmp r1, #0 @ is second operand zero?
6594 beq common_errDivideByZero
6595 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6596
6597#ifdef __ARM_ARCH_EXT_IDIV__
6598 sdiv r0, r0, r1 @ r0<- op
6599#else
6600 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6601#endif
6602 GET_INST_OPCODE ip @ extract opcode from rINST
6603 SET_VREG r0, r9 @ vAA<- r0
6604 GOTO_OPCODE ip @ jump to next instruction
6605 /* 10-13 instructions */
6606
6607/* ------------------------------ */
6608 .balign 128
6609.L_op_rem_int_lit16: /* 0xd4 */
6610/* File: arm/op_rem_int_lit16.S */
6611 /*
6612 * Specialized 32-bit binary operation
6613 *
6614 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6615 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6616 * ARMv7 CPUs that have hardware division support).
6617 *
6618 * NOTE: idivmod returns quotient in r0 and remainder in r1
6619 *
6620 * rem-int/lit16
6621 *
6622 */
6623 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6624 mov r2, rINST, lsr #12 @ r2<- B
6625 ubfx r9, rINST, #8, #4 @ r9<- A
6626 GET_VREG r0, r2 @ r0<- vB
6627 cmp r1, #0 @ is second operand zero?
6628 beq common_errDivideByZero
6629 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6630
6631#ifdef __ARM_ARCH_EXT_IDIV__
6632 sdiv r2, r0, r1
6633 mls r1, r1, r2, r0 @ r1<- op
6634#else
6635 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6636#endif
6637 GET_INST_OPCODE ip @ extract opcode from rINST
6638 SET_VREG r1, r9 @ vAA<- r1
6639 GOTO_OPCODE ip @ jump to next instruction
6640 /* 10-13 instructions */
6641
6642/* ------------------------------ */
6643 .balign 128
6644.L_op_and_int_lit16: /* 0xd5 */
6645/* File: arm/op_and_int_lit16.S */
6646/* File: arm/binopLit16.S */
6647 /*
6648 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6649 * that specifies an instruction that performs "result = r0 op r1".
6650 * This could be an ARM instruction or a function call. (If the result
6651 * comes back in a register other than r0, you can override "result".)
6652 *
6653 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6654 * vCC (r1). Useful for integer division and modulus.
6655 *
6656 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6657 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6658 */
6659 /* binop/lit16 vA, vB, #+CCCC */
6660 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6661 mov r2, rINST, lsr #12 @ r2<- B
6662 ubfx r9, rINST, #8, #4 @ r9<- A
6663 GET_VREG r0, r2 @ r0<- vB
6664 .if 0
6665 cmp r1, #0 @ is second operand zero?
6666 beq common_errDivideByZero
6667 .endif
6668 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6669
6670 and r0, r0, r1 @ r0<- op, r0-r3 changed
6671 GET_INST_OPCODE ip @ extract opcode from rINST
6672 SET_VREG r0, r9 @ vAA<- r0
6673 GOTO_OPCODE ip @ jump to next instruction
6674 /* 10-13 instructions */
6675
6676
6677/* ------------------------------ */
6678 .balign 128
6679.L_op_or_int_lit16: /* 0xd6 */
6680/* File: arm/op_or_int_lit16.S */
6681/* File: arm/binopLit16.S */
6682 /*
6683 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6684 * that specifies an instruction that performs "result = r0 op r1".
6685 * This could be an ARM instruction or a function call. (If the result
6686 * comes back in a register other than r0, you can override "result".)
6687 *
6688 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6689 * vCC (r1). Useful for integer division and modulus.
6690 *
6691 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6692 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6693 */
6694 /* binop/lit16 vA, vB, #+CCCC */
6695 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6696 mov r2, rINST, lsr #12 @ r2<- B
6697 ubfx r9, rINST, #8, #4 @ r9<- A
6698 GET_VREG r0, r2 @ r0<- vB
6699 .if 0
6700 cmp r1, #0 @ is second operand zero?
6701 beq common_errDivideByZero
6702 .endif
6703 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6704
6705 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6706 GET_INST_OPCODE ip @ extract opcode from rINST
6707 SET_VREG r0, r9 @ vAA<- r0
6708 GOTO_OPCODE ip @ jump to next instruction
6709 /* 10-13 instructions */
6710
6711
6712/* ------------------------------ */
6713 .balign 128
6714.L_op_xor_int_lit16: /* 0xd7 */
6715/* File: arm/op_xor_int_lit16.S */
6716/* File: arm/binopLit16.S */
6717 /*
6718 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6719 * that specifies an instruction that performs "result = r0 op r1".
6720 * This could be an ARM instruction or a function call. (If the result
6721 * comes back in a register other than r0, you can override "result".)
6722 *
6723 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6724 * vCC (r1). Useful for integer division and modulus.
6725 *
6726 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6727 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6728 */
6729 /* binop/lit16 vA, vB, #+CCCC */
6730 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6731 mov r2, rINST, lsr #12 @ r2<- B
6732 ubfx r9, rINST, #8, #4 @ r9<- A
6733 GET_VREG r0, r2 @ r0<- vB
6734 .if 0
6735 cmp r1, #0 @ is second operand zero?
6736 beq common_errDivideByZero
6737 .endif
6738 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6739
6740 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6741 GET_INST_OPCODE ip @ extract opcode from rINST
6742 SET_VREG r0, r9 @ vAA<- r0
6743 GOTO_OPCODE ip @ jump to next instruction
6744 /* 10-13 instructions */
6745
6746
6747/* ------------------------------ */
6748 .balign 128
6749.L_op_add_int_lit8: /* 0xd8 */
6750/* File: arm/op_add_int_lit8.S */
6751/* File: arm/binopLit8.S */
6752 /*
6753 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6754 * that specifies an instruction that performs "result = r0 op r1".
6755 * This could be an ARM instruction or a function call. (If the result
6756 * comes back in a register other than r0, you can override "result".)
6757 *
6758 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6759 * vCC (r1). Useful for integer division and modulus.
6760 *
6761 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6762 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6763 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6764 */
6765 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08006766 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08006767 mov r9, rINST, lsr #8 @ r9<- AA
6768 and r2, r3, #255 @ r2<- BB
6769 GET_VREG r0, r2 @ r0<- vBB
6770 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6771 .if 0
6772 @cmp r1, #0 @ is second operand zero?
6773 beq common_errDivideByZero
6774 .endif
6775 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6776
6777 @ optional op; may set condition codes
6778 add r0, r0, r1 @ r0<- op, r0-r3 changed
6779 GET_INST_OPCODE ip @ extract opcode from rINST
6780 SET_VREG r0, r9 @ vAA<- r0
6781 GOTO_OPCODE ip @ jump to next instruction
6782 /* 10-12 instructions */
6783
6784
6785/* ------------------------------ */
6786 .balign 128
6787.L_op_rsub_int_lit8: /* 0xd9 */
6788/* File: arm/op_rsub_int_lit8.S */
6789/* File: arm/binopLit8.S */
6790 /*
6791 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6792 * that specifies an instruction that performs "result = r0 op r1".
6793 * This could be an ARM instruction or a function call. (If the result
6794 * comes back in a register other than r0, you can override "result".)
6795 *
6796 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6797 * vCC (r1). Useful for integer division and modulus.
6798 *
6799 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6800 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6801 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6802 */
6803 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08006804 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08006805 mov r9, rINST, lsr #8 @ r9<- AA
6806 and r2, r3, #255 @ r2<- BB
6807 GET_VREG r0, r2 @ r0<- vBB
6808 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6809 .if 0
6810 @cmp r1, #0 @ is second operand zero?
6811 beq common_errDivideByZero
6812 .endif
6813 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6814
6815 @ optional op; may set condition codes
6816 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6817 GET_INST_OPCODE ip @ extract opcode from rINST
6818 SET_VREG r0, r9 @ vAA<- r0
6819 GOTO_OPCODE ip @ jump to next instruction
6820 /* 10-12 instructions */
6821
6822
6823/* ------------------------------ */
6824 .balign 128
6825.L_op_mul_int_lit8: /* 0xda */
6826/* File: arm/op_mul_int_lit8.S */
6827/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6828/* File: arm/binopLit8.S */
6829 /*
6830 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6831 * that specifies an instruction that performs "result = r0 op r1".
6832 * This could be an ARM instruction or a function call. (If the result
6833 * comes back in a register other than r0, you can override "result".)
6834 *
6835 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6836 * vCC (r1). Useful for integer division and modulus.
6837 *
6838 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6839 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6840 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6841 */
6842 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08006843 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08006844 mov r9, rINST, lsr #8 @ r9<- AA
6845 and r2, r3, #255 @ r2<- BB
6846 GET_VREG r0, r2 @ r0<- vBB
6847 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6848 .if 0
6849 @cmp r1, #0 @ is second operand zero?
6850 beq common_errDivideByZero
6851 .endif
6852 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6853
6854 @ optional op; may set condition codes
6855 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6856 GET_INST_OPCODE ip @ extract opcode from rINST
6857 SET_VREG r0, r9 @ vAA<- r0
6858 GOTO_OPCODE ip @ jump to next instruction
6859 /* 10-12 instructions */
6860
6861
6862/* ------------------------------ */
6863 .balign 128
6864.L_op_div_int_lit8: /* 0xdb */
6865/* File: arm/op_div_int_lit8.S */
6866 /*
6867 * Specialized 32-bit binary operation
6868 *
6869 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6870 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6871 * ARMv7 CPUs that have hardware division support).
6872 *
6873 * div-int/lit8
6874 *
6875 */
6876 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6877 mov r9, rINST, lsr #8 @ r9<- AA
6878 and r2, r3, #255 @ r2<- BB
6879 GET_VREG r0, r2 @ r0<- vBB
6880 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6881 @cmp r1, #0 @ is second operand zero?
6882 beq common_errDivideByZero
6883 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6884
6885#ifdef __ARM_ARCH_EXT_IDIV__
6886 sdiv r0, r0, r1 @ r0<- op
6887#else
6888 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6889#endif
6890 GET_INST_OPCODE ip @ extract opcode from rINST
6891 SET_VREG r0, r9 @ vAA<- r0
6892 GOTO_OPCODE ip @ jump to next instruction
6893 /* 10-12 instructions */
6894
6895/* ------------------------------ */
6896 .balign 128
6897.L_op_rem_int_lit8: /* 0xdc */
6898/* File: arm/op_rem_int_lit8.S */
6899 /*
6900 * Specialized 32-bit binary operation
6901 *
6902 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6903 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6904 * ARMv7 CPUs that have hardware division support).
6905 *
6906 * NOTE: idivmod returns quotient in r0 and remainder in r1
6907 *
6908 * rem-int/lit8
6909 *
6910 */
6911 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
6912 mov r9, rINST, lsr #8 @ r9<- AA
6913 and r2, r3, #255 @ r2<- BB
6914 GET_VREG r0, r2 @ r0<- vBB
6915 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6916 @cmp r1, #0 @ is second operand zero?
6917 beq common_errDivideByZero
6918 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6919
6920#ifdef __ARM_ARCH_EXT_IDIV__
6921 sdiv r2, r0, r1
6922 mls r1, r1, r2, r0 @ r1<- op
6923#else
6924 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6925#endif
6926 GET_INST_OPCODE ip @ extract opcode from rINST
6927 SET_VREG r1, r9 @ vAA<- r1
6928 GOTO_OPCODE ip @ jump to next instruction
6929 /* 10-12 instructions */
6930
6931/* ------------------------------ */
6932 .balign 128
6933.L_op_and_int_lit8: /* 0xdd */
6934/* File: arm/op_and_int_lit8.S */
6935/* File: arm/binopLit8.S */
6936 /*
6937 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6938 * that specifies an instruction that performs "result = r0 op r1".
6939 * This could be an ARM instruction or a function call. (If the result
6940 * comes back in a register other than r0, you can override "result".)
6941 *
6942 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6943 * vCC (r1). Useful for integer division and modulus.
6944 *
6945 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6946 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6947 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6948 */
6949 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08006950 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08006951 mov r9, rINST, lsr #8 @ r9<- AA
6952 and r2, r3, #255 @ r2<- BB
6953 GET_VREG r0, r2 @ r0<- vBB
6954 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6955 .if 0
6956 @cmp r1, #0 @ is second operand zero?
6957 beq common_errDivideByZero
6958 .endif
6959 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6960
6961 @ optional op; may set condition codes
6962 and r0, r0, r1 @ r0<- op, r0-r3 changed
6963 GET_INST_OPCODE ip @ extract opcode from rINST
6964 SET_VREG r0, r9 @ vAA<- r0
6965 GOTO_OPCODE ip @ jump to next instruction
6966 /* 10-12 instructions */
6967
6968
6969/* ------------------------------ */
6970 .balign 128
6971.L_op_or_int_lit8: /* 0xde */
6972/* File: arm/op_or_int_lit8.S */
6973/* File: arm/binopLit8.S */
6974 /*
6975 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6976 * that specifies an instruction that performs "result = r0 op r1".
6977 * This could be an ARM instruction or a function call. (If the result
6978 * comes back in a register other than r0, you can override "result".)
6979 *
6980 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6981 * vCC (r1). Useful for integer division and modulus.
6982 *
6983 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6984 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6985 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6986 */
6987 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08006988 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08006989 mov r9, rINST, lsr #8 @ r9<- AA
6990 and r2, r3, #255 @ r2<- BB
6991 GET_VREG r0, r2 @ r0<- vBB
6992 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6993 .if 0
6994 @cmp r1, #0 @ is second operand zero?
6995 beq common_errDivideByZero
6996 .endif
6997 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6998
6999 @ optional op; may set condition codes
7000 orr r0, r0, r1 @ r0<- op, r0-r3 changed
7001 GET_INST_OPCODE ip @ extract opcode from rINST
7002 SET_VREG r0, r9 @ vAA<- r0
7003 GOTO_OPCODE ip @ jump to next instruction
7004 /* 10-12 instructions */
7005
7006
7007/* ------------------------------ */
7008 .balign 128
7009.L_op_xor_int_lit8: /* 0xdf */
7010/* File: arm/op_xor_int_lit8.S */
7011/* File: arm/binopLit8.S */
7012 /*
7013 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7014 * that specifies an instruction that performs "result = r0 op r1".
7015 * This could be an ARM instruction or a function call. (If the result
7016 * comes back in a register other than r0, you can override "result".)
7017 *
7018 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7019 * vCC (r1). Useful for integer division and modulus.
7020 *
7021 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7022 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7023 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7024 */
7025 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08007026 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08007027 mov r9, rINST, lsr #8 @ r9<- AA
7028 and r2, r3, #255 @ r2<- BB
7029 GET_VREG r0, r2 @ r0<- vBB
7030 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7031 .if 0
7032 @cmp r1, #0 @ is second operand zero?
7033 beq common_errDivideByZero
7034 .endif
7035 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7036
7037 @ optional op; may set condition codes
7038 eor r0, r0, r1 @ r0<- op, r0-r3 changed
7039 GET_INST_OPCODE ip @ extract opcode from rINST
7040 SET_VREG r0, r9 @ vAA<- r0
7041 GOTO_OPCODE ip @ jump to next instruction
7042 /* 10-12 instructions */
7043
7044
7045/* ------------------------------ */
7046 .balign 128
7047.L_op_shl_int_lit8: /* 0xe0 */
7048/* File: arm/op_shl_int_lit8.S */
7049/* File: arm/binopLit8.S */
7050 /*
7051 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7052 * that specifies an instruction that performs "result = r0 op r1".
7053 * This could be an ARM instruction or a function call. (If the result
7054 * comes back in a register other than r0, you can override "result".)
7055 *
7056 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7057 * vCC (r1). Useful for integer division and modulus.
7058 *
7059 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7060 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7061 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7062 */
7063 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08007064 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08007065 mov r9, rINST, lsr #8 @ r9<- AA
7066 and r2, r3, #255 @ r2<- BB
7067 GET_VREG r0, r2 @ r0<- vBB
7068 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7069 .if 0
7070 @cmp r1, #0 @ is second operand zero?
7071 beq common_errDivideByZero
7072 .endif
7073 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7074
7075 and r1, r1, #31 @ optional op; may set condition codes
7076 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
7077 GET_INST_OPCODE ip @ extract opcode from rINST
7078 SET_VREG r0, r9 @ vAA<- r0
7079 GOTO_OPCODE ip @ jump to next instruction
7080 /* 10-12 instructions */
7081
7082
7083/* ------------------------------ */
7084 .balign 128
7085.L_op_shr_int_lit8: /* 0xe1 */
7086/* File: arm/op_shr_int_lit8.S */
7087/* File: arm/binopLit8.S */
7088 /*
7089 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7090 * that specifies an instruction that performs "result = r0 op r1".
7091 * This could be an ARM instruction or a function call. (If the result
7092 * comes back in a register other than r0, you can override "result".)
7093 *
7094 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7095 * vCC (r1). Useful for integer division and modulus.
7096 *
7097 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7098 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7099 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7100 */
7101 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08007102 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08007103 mov r9, rINST, lsr #8 @ r9<- AA
7104 and r2, r3, #255 @ r2<- BB
7105 GET_VREG r0, r2 @ r0<- vBB
7106 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7107 .if 0
7108 @cmp r1, #0 @ is second operand zero?
7109 beq common_errDivideByZero
7110 .endif
7111 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7112
7113 and r1, r1, #31 @ optional op; may set condition codes
7114 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
7115 GET_INST_OPCODE ip @ extract opcode from rINST
7116 SET_VREG r0, r9 @ vAA<- r0
7117 GOTO_OPCODE ip @ jump to next instruction
7118 /* 10-12 instructions */
7119
7120
7121/* ------------------------------ */
7122 .balign 128
7123.L_op_ushr_int_lit8: /* 0xe2 */
7124/* File: arm/op_ushr_int_lit8.S */
7125/* File: arm/binopLit8.S */
7126 /*
7127 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7128 * that specifies an instruction that performs "result = r0 op r1".
7129 * This could be an ARM instruction or a function call. (If the result
7130 * comes back in a register other than r0, you can override "result".)
7131 *
7132 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7133 * vCC (r1). Useful for integer division and modulus.
7134 *
7135 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7136 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7137 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7138 */
7139 /* binop/lit8 vAA, vBB, #+CC */
buzbeeace690f2016-03-11 09:51:11 -08007140 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
buzbee1452bee2015-03-06 14:43:04 -08007141 mov r9, rINST, lsr #8 @ r9<- AA
7142 and r2, r3, #255 @ r2<- BB
7143 GET_VREG r0, r2 @ r0<- vBB
7144 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7145 .if 0
7146 @cmp r1, #0 @ is second operand zero?
7147 beq common_errDivideByZero
7148 .endif
7149 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7150
7151 and r1, r1, #31 @ optional op; may set condition codes
7152 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
7153 GET_INST_OPCODE ip @ extract opcode from rINST
7154 SET_VREG r0, r9 @ vAA<- r0
7155 GOTO_OPCODE ip @ jump to next instruction
7156 /* 10-12 instructions */
7157
7158
7159/* ------------------------------ */
7160 .balign 128
7161.L_op_iget_quick: /* 0xe3 */
7162/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007163 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007164 /* op vA, vB, offset@CCCC */
7165 mov r2, rINST, lsr #12 @ r2<- B
7166 FETCH r1, 1 @ r1<- field byte offset
7167 GET_VREG r3, r2 @ r3<- object we're operating on
7168 ubfx r2, rINST, #8, #4 @ r2<- A
7169 cmp r3, #0 @ check object for null
7170 beq common_errNullObject @ object was null
7171 ldr r0, [r3, r1] @ r0<- obj.field
7172 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007173 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007174 GET_INST_OPCODE ip @ extract opcode from rINST
7175 GOTO_OPCODE ip @ jump to next instruction
7176
7177/* ------------------------------ */
7178 .balign 128
7179.L_op_iget_wide_quick: /* 0xe4 */
7180/* File: arm/op_iget_wide_quick.S */
7181 /* iget-wide-quick vA, vB, offset@CCCC */
7182 mov r2, rINST, lsr #12 @ r2<- B
7183 FETCH ip, 1 @ ip<- field byte offset
7184 GET_VREG r3, r2 @ r3<- object we're operating on
7185 ubfx r2, rINST, #8, #4 @ r2<- A
7186 cmp r3, #0 @ check object for null
7187 beq common_errNullObject @ object was null
7188 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
7189 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbeeace690f2016-03-11 09:51:11 -08007190 VREG_INDEX_TO_ADDR r3, r2 @ r3<- &fp[A]
buzbee50cf6002016-02-10 08:59:12 -08007191 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08007192 GET_INST_OPCODE ip @ extract opcode from rINST
7193 stmia r3, {r0-r1} @ fp[A]<- r0/r1
7194 GOTO_OPCODE ip @ jump to next instruction
7195
7196/* ------------------------------ */
7197 .balign 128
7198.L_op_iget_object_quick: /* 0xe5 */
7199/* File: arm/op_iget_object_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007200 /* For: iget-object-quick */
buzbee1452bee2015-03-06 14:43:04 -08007201 /* op vA, vB, offset@CCCC */
7202 mov r2, rINST, lsr #12 @ r2<- B
7203 FETCH r1, 1 @ r1<- field byte offset
buzbeebb6e7262016-01-14 05:34:34 -08007204 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -08007205 GET_VREG r0, r2 @ r0<- object we're operating on
buzbee76833da2016-01-13 13:06:22 -08007206 bl artIGetObjectFromMterp @ (obj, offset)
7207 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
7208 ubfx r2, rINST, #8, #4 @ r2<- A
7209 PREFETCH_INST 2
7210 cmp r3, #0
7211 bne MterpPossibleException @ bail out
buzbee1452bee2015-03-06 14:43:04 -08007212 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
buzbee76833da2016-01-13 13:06:22 -08007213 ADVANCE 2 @ advance rPC
buzbee1452bee2015-03-06 14:43:04 -08007214 GET_INST_OPCODE ip @ extract opcode from rINST
7215 GOTO_OPCODE ip @ jump to next instruction
7216
buzbee1452bee2015-03-06 14:43:04 -08007217/* ------------------------------ */
7218 .balign 128
7219.L_op_iput_quick: /* 0xe6 */
7220/* File: arm/op_iput_quick.S */
7221 /* For: iput-quick, iput-object-quick */
7222 /* op vA, vB, offset@CCCC */
7223 mov r2, rINST, lsr #12 @ r2<- B
7224 FETCH r1, 1 @ r1<- field byte offset
7225 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7226 ubfx r2, rINST, #8, #4 @ r2<- A
7227 cmp r3, #0 @ check object for null
7228 beq common_errNullObject @ object was null
7229 GET_VREG r0, r2 @ r0<- fp[A]
7230 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7231 str r0, [r3, r1] @ obj.field<- r0
7232 GET_INST_OPCODE ip @ extract opcode from rINST
7233 GOTO_OPCODE ip @ jump to next instruction
7234
7235/* ------------------------------ */
7236 .balign 128
7237.L_op_iput_wide_quick: /* 0xe7 */
7238/* File: arm/op_iput_wide_quick.S */
7239 /* iput-wide-quick vA, vB, offset@CCCC */
7240 mov r2, rINST, lsr #12 @ r2<- B
7241 FETCH r3, 1 @ r3<- field byte offset
7242 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7243 ubfx r0, rINST, #8, #4 @ r0<- A
7244 cmp r2, #0 @ check object for null
7245 beq common_errNullObject @ object was null
buzbeeace690f2016-03-11 09:51:11 -08007246 VREG_INDEX_TO_ADDR r0, r0 @ r0<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08007247 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7248 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7249 strd r0, [r2, r3] @ obj.field<- r0/r1
7250 GET_INST_OPCODE ip @ extract opcode from rINST
7251 GOTO_OPCODE ip @ jump to next instruction
7252
7253/* ------------------------------ */
7254 .balign 128
7255.L_op_iput_object_quick: /* 0xe8 */
7256/* File: arm/op_iput_object_quick.S */
7257 EXPORT_PC
7258 add r0, rFP, #OFF_FP_SHADOWFRAME
7259 mov r1, rPC
7260 mov r2, rINST
7261 bl MterpIputObjectQuick
7262 cmp r0, #0
7263 beq MterpException
7264 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7265 GET_INST_OPCODE ip @ extract opcode from rINST
7266 GOTO_OPCODE ip @ jump to next instruction
7267
7268/* ------------------------------ */
7269 .balign 128
7270.L_op_invoke_virtual_quick: /* 0xe9 */
7271/* File: arm/op_invoke_virtual_quick.S */
7272/* File: arm/invoke.S */
7273 /*
7274 * Generic invoke handler wrapper.
7275 */
7276 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7277 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7278 .extern MterpInvokeVirtualQuick
7279 EXPORT_PC
7280 mov r0, rSELF
7281 add r1, rFP, #OFF_FP_SHADOWFRAME
7282 mov r2, rPC
7283 mov r3, rINST
7284 bl MterpInvokeVirtualQuick
7285 cmp r0, #0
7286 beq MterpException
7287 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00007288 bl MterpShouldSwitchInterpreters
7289 cmp r0, #0
7290 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08007291 GET_INST_OPCODE ip
7292 GOTO_OPCODE ip
7293
7294
7295
7296/* ------------------------------ */
7297 .balign 128
7298.L_op_invoke_virtual_range_quick: /* 0xea */
7299/* File: arm/op_invoke_virtual_range_quick.S */
7300/* File: arm/invoke.S */
7301 /*
7302 * Generic invoke handler wrapper.
7303 */
7304 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7305 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7306 .extern MterpInvokeVirtualQuickRange
7307 EXPORT_PC
7308 mov r0, rSELF
7309 add r1, rFP, #OFF_FP_SHADOWFRAME
7310 mov r2, rPC
7311 mov r3, rINST
7312 bl MterpInvokeVirtualQuickRange
7313 cmp r0, #0
7314 beq MterpException
7315 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00007316 bl MterpShouldSwitchInterpreters
7317 cmp r0, #0
7318 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -08007319 GET_INST_OPCODE ip
7320 GOTO_OPCODE ip
7321
7322
7323
7324/* ------------------------------ */
7325 .balign 128
7326.L_op_iput_boolean_quick: /* 0xeb */
7327/* File: arm/op_iput_boolean_quick.S */
7328/* File: arm/op_iput_quick.S */
7329 /* For: iput-quick, iput-object-quick */
7330 /* op vA, vB, offset@CCCC */
7331 mov r2, rINST, lsr #12 @ r2<- B
7332 FETCH r1, 1 @ r1<- field byte offset
7333 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7334 ubfx r2, rINST, #8, #4 @ r2<- A
7335 cmp r3, #0 @ check object for null
7336 beq common_errNullObject @ object was null
7337 GET_VREG r0, r2 @ r0<- fp[A]
7338 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7339 strb r0, [r3, r1] @ obj.field<- r0
7340 GET_INST_OPCODE ip @ extract opcode from rINST
7341 GOTO_OPCODE ip @ jump to next instruction
7342
7343
7344/* ------------------------------ */
7345 .balign 128
7346.L_op_iput_byte_quick: /* 0xec */
7347/* File: arm/op_iput_byte_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_char_quick: /* 0xed */
7367/* File: arm/op_iput_char_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 strh 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_short_quick: /* 0xee */
7387/* File: arm/op_iput_short_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_iget_boolean_quick: /* 0xef */
7407/* File: arm/op_iget_boolean_quick.S */
7408/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007409 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007410 /* op vA, vB, offset@CCCC */
7411 mov r2, rINST, lsr #12 @ r2<- B
7412 FETCH r1, 1 @ r1<- field byte offset
7413 GET_VREG r3, r2 @ r3<- object we're operating on
7414 ubfx r2, rINST, #8, #4 @ r2<- A
7415 cmp r3, #0 @ check object for null
7416 beq common_errNullObject @ object was null
7417 ldrb r0, [r3, r1] @ r0<- obj.field
7418 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007419 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007420 GET_INST_OPCODE ip @ extract opcode from rINST
7421 GOTO_OPCODE ip @ jump to next instruction
7422
7423
7424/* ------------------------------ */
7425 .balign 128
7426.L_op_iget_byte_quick: /* 0xf0 */
7427/* File: arm/op_iget_byte_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 ldrsb 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_char_quick: /* 0xf1 */
7447/* File: arm/op_iget_char_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 ldrh 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_short_quick: /* 0xf2 */
7467/* File: arm/op_iget_short_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 ldrsh 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_invoke_lambda: /* 0xf3 */
7487/* Transfer stub to alternate interpreter */
7488 b MterpFallback
7489
7490
7491/* ------------------------------ */
7492 .balign 128
7493.L_op_unused_f4: /* 0xf4 */
7494/* File: arm/op_unused_f4.S */
7495/* File: arm/unused.S */
7496/*
7497 * Bail to reference interpreter to throw.
7498 */
7499 b MterpFallback
7500
7501
7502/* ------------------------------ */
7503 .balign 128
7504.L_op_capture_variable: /* 0xf5 */
7505/* Transfer stub to alternate interpreter */
7506 b MterpFallback
7507
7508
7509/* ------------------------------ */
7510 .balign 128
7511.L_op_create_lambda: /* 0xf6 */
7512/* Transfer stub to alternate interpreter */
7513 b MterpFallback
7514
7515
7516/* ------------------------------ */
7517 .balign 128
7518.L_op_liberate_variable: /* 0xf7 */
7519/* Transfer stub to alternate interpreter */
7520 b MterpFallback
7521
7522
7523/* ------------------------------ */
7524 .balign 128
7525.L_op_box_lambda: /* 0xf8 */
7526/* Transfer stub to alternate interpreter */
7527 b MterpFallback
7528
7529
7530/* ------------------------------ */
7531 .balign 128
7532.L_op_unbox_lambda: /* 0xf9 */
7533/* Transfer stub to alternate interpreter */
7534 b MterpFallback
7535
7536
7537/* ------------------------------ */
7538 .balign 128
7539.L_op_unused_fa: /* 0xfa */
7540/* File: arm/op_unused_fa.S */
7541/* File: arm/unused.S */
7542/*
7543 * Bail to reference interpreter to throw.
7544 */
7545 b MterpFallback
7546
7547
7548/* ------------------------------ */
7549 .balign 128
7550.L_op_unused_fb: /* 0xfb */
7551/* File: arm/op_unused_fb.S */
7552/* File: arm/unused.S */
7553/*
7554 * Bail to reference interpreter to throw.
7555 */
7556 b MterpFallback
7557
7558
7559/* ------------------------------ */
7560 .balign 128
7561.L_op_unused_fc: /* 0xfc */
7562/* File: arm/op_unused_fc.S */
7563/* File: arm/unused.S */
7564/*
7565 * Bail to reference interpreter to throw.
7566 */
7567 b MterpFallback
7568
7569
7570/* ------------------------------ */
7571 .balign 128
7572.L_op_unused_fd: /* 0xfd */
7573/* File: arm/op_unused_fd.S */
7574/* File: arm/unused.S */
7575/*
7576 * Bail to reference interpreter to throw.
7577 */
7578 b MterpFallback
7579
7580
7581/* ------------------------------ */
7582 .balign 128
7583.L_op_unused_fe: /* 0xfe */
7584/* File: arm/op_unused_fe.S */
7585/* File: arm/unused.S */
7586/*
7587 * Bail to reference interpreter to throw.
7588 */
7589 b MterpFallback
7590
7591
7592/* ------------------------------ */
7593 .balign 128
7594.L_op_unused_ff: /* 0xff */
7595/* File: arm/op_unused_ff.S */
7596/* File: arm/unused.S */
7597/*
7598 * Bail to reference interpreter to throw.
7599 */
7600 b MterpFallback
7601
7602
7603 .balign 128
7604 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7605 .global artMterpAsmInstructionEnd
7606artMterpAsmInstructionEnd:
7607
7608/*
7609 * ===========================================================================
7610 * Sister implementations
7611 * ===========================================================================
7612 */
7613 .global artMterpAsmSisterStart
7614 .type artMterpAsmSisterStart, %function
7615 .text
7616 .balign 4
7617artMterpAsmSisterStart:
7618
7619/* continuation for op_cmp_long */
7620
7621.Lop_cmp_long_less:
7622 mvn r1, #0 @ r1<- -1
7623 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7624 @ instead, we just replicate the tail end.
7625 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7626 SET_VREG r1, r9 @ vAA<- r1
7627 GET_INST_OPCODE ip @ extract opcode from rINST
7628 GOTO_OPCODE ip @ jump to next instruction
7629
7630.Lop_cmp_long_greater:
7631 mov r1, #1 @ r1<- 1
7632 @ fall through to _finish
7633
7634.Lop_cmp_long_finish:
7635 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7636 SET_VREG r1, r9 @ vAA<- r1
7637 GET_INST_OPCODE ip @ extract opcode from rINST
7638 GOTO_OPCODE ip @ jump to next instruction
7639
7640/* continuation for op_float_to_long */
7641/*
7642 * Convert the float in r0 to a long in r0/r1.
7643 *
7644 * We have to clip values to long min/max per the specification. The
7645 * expected common case is a "reasonable" value that converts directly
7646 * to modest integer. The EABI convert function isn't doing this for us.
7647 */
7648f2l_doconv:
7649 stmfd sp!, {r4, lr}
7650 mov r1, #0x5f000000 @ (float)maxlong
7651 mov r4, r0
7652 bl __aeabi_fcmpge @ is arg >= maxlong?
7653 cmp r0, #0 @ nonzero == yes
7654 mvnne r0, #0 @ return maxlong (7fffffff)
7655 mvnne r1, #0x80000000
buzbee96530d32016-03-04 08:03:51 -08007656 popne {r4, pc}
buzbee1452bee2015-03-06 14:43:04 -08007657
7658 mov r0, r4 @ recover arg
7659 mov r1, #0xdf000000 @ (float)minlong
7660 bl __aeabi_fcmple @ is arg <= minlong?
7661 cmp r0, #0 @ nonzero == yes
7662 movne r0, #0 @ return minlong (80000000)
7663 movne r1, #0x80000000
buzbee96530d32016-03-04 08:03:51 -08007664 popne {r4, pc}
buzbee1452bee2015-03-06 14:43:04 -08007665
7666 mov r0, r4 @ recover arg
7667 mov r1, r4
7668 bl __aeabi_fcmpeq @ is arg == self?
7669 cmp r0, #0 @ zero == no
7670 moveq r1, #0 @ return zero for NaN
buzbee96530d32016-03-04 08:03:51 -08007671 popeq {r4, pc}
buzbee1452bee2015-03-06 14:43:04 -08007672
7673 mov r0, r4 @ recover arg
7674 bl __aeabi_f2lz @ convert float to long
7675 ldmfd sp!, {r4, pc}
7676
7677/* continuation for op_double_to_long */
7678/*
7679 * Convert the double in r0/r1 to a long in r0/r1.
7680 *
7681 * We have to clip values to long min/max per the specification. The
7682 * expected common case is a "reasonable" value that converts directly
7683 * to modest integer. The EABI convert function isn't doing this for us.
7684 */
7685d2l_doconv:
7686 stmfd sp!, {r4, r5, lr} @ save regs
7687 mov r3, #0x43000000 @ maxlong, as a double (high word)
7688 add r3, #0x00e00000 @ 0x43e00000
7689 mov r2, #0 @ maxlong, as a double (low word)
7690 sub sp, sp, #4 @ align for EABI
7691 mov r4, r0 @ save a copy of r0
7692 mov r5, r1 @ and r1
7693 bl __aeabi_dcmpge @ is arg >= maxlong?
7694 cmp r0, #0 @ nonzero == yes
7695 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7696 mvnne r1, #0x80000000
7697 bne 1f
7698
7699 mov r0, r4 @ recover arg
7700 mov r1, r5
7701 mov r3, #0xc3000000 @ minlong, as a double (high word)
7702 add r3, #0x00e00000 @ 0xc3e00000
7703 mov r2, #0 @ minlong, as a double (low word)
7704 bl __aeabi_dcmple @ is arg <= minlong?
7705 cmp r0, #0 @ nonzero == yes
7706 movne r0, #0 @ return minlong (8000000000000000)
7707 movne r1, #0x80000000
7708 bne 1f
7709
7710 mov r0, r4 @ recover arg
7711 mov r1, r5
7712 mov r2, r4 @ compare against self
7713 mov r3, r5
7714 bl __aeabi_dcmpeq @ is arg == self?
7715 cmp r0, #0 @ zero == no
7716 moveq r1, #0 @ return zero for NaN
7717 beq 1f
7718
7719 mov r0, r4 @ recover arg
7720 mov r1, r5
7721 bl __aeabi_d2lz @ convert double to long
7722
77231:
7724 add sp, sp, #4
7725 ldmfd sp!, {r4, r5, pc}
7726
7727 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7728 .global artMterpAsmSisterEnd
7729artMterpAsmSisterEnd:
7730
7731
7732 .global artMterpAsmAltInstructionStart
7733 .type artMterpAsmAltInstructionStart, %function
7734 .text
7735
7736artMterpAsmAltInstructionStart = .L_ALT_op_nop
7737/* ------------------------------ */
7738 .balign 128
7739.L_ALT_op_nop: /* 0x00 */
7740/* File: arm/alt_stub.S */
7741/*
7742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7743 * any interesting requests and then jump to the real instruction
7744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7745 */
7746 .extern MterpCheckBefore
7747 EXPORT_PC
7748 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7749 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7750 mov r0, rSELF
7751 add r1, rFP, #OFF_FP_SHADOWFRAME
7752 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7753
7754/* ------------------------------ */
7755 .balign 128
7756.L_ALT_op_move: /* 0x01 */
7757/* File: arm/alt_stub.S */
7758/*
7759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7760 * any interesting requests and then jump to the real instruction
7761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7762 */
7763 .extern MterpCheckBefore
7764 EXPORT_PC
7765 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7766 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7767 mov r0, rSELF
7768 add r1, rFP, #OFF_FP_SHADOWFRAME
7769 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7770
7771/* ------------------------------ */
7772 .balign 128
7773.L_ALT_op_move_from16: /* 0x02 */
7774/* File: arm/alt_stub.S */
7775/*
7776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7777 * any interesting requests and then jump to the real instruction
7778 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7779 */
7780 .extern MterpCheckBefore
7781 EXPORT_PC
7782 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7783 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7784 mov r0, rSELF
7785 add r1, rFP, #OFF_FP_SHADOWFRAME
7786 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7787
7788/* ------------------------------ */
7789 .balign 128
7790.L_ALT_op_move_16: /* 0x03 */
7791/* File: arm/alt_stub.S */
7792/*
7793 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7794 * any interesting requests and then jump to the real instruction
7795 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7796 */
7797 .extern MterpCheckBefore
7798 EXPORT_PC
7799 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7800 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
7801 mov r0, rSELF
7802 add r1, rFP, #OFF_FP_SHADOWFRAME
7803 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7804
7805/* ------------------------------ */
7806 .balign 128
7807.L_ALT_op_move_wide: /* 0x04 */
7808/* File: arm/alt_stub.S */
7809/*
7810 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7811 * any interesting requests and then jump to the real instruction
7812 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7813 */
7814 .extern MterpCheckBefore
7815 EXPORT_PC
7816 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7817 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
7818 mov r0, rSELF
7819 add r1, rFP, #OFF_FP_SHADOWFRAME
7820 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7821
7822/* ------------------------------ */
7823 .balign 128
7824.L_ALT_op_move_wide_from16: /* 0x05 */
7825/* File: arm/alt_stub.S */
7826/*
7827 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7828 * any interesting requests and then jump to the real instruction
7829 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7830 */
7831 .extern MterpCheckBefore
7832 EXPORT_PC
7833 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7834 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
7835 mov r0, rSELF
7836 add r1, rFP, #OFF_FP_SHADOWFRAME
7837 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7838
7839/* ------------------------------ */
7840 .balign 128
7841.L_ALT_op_move_wide_16: /* 0x06 */
7842/* File: arm/alt_stub.S */
7843/*
7844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7845 * any interesting requests and then jump to the real instruction
7846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7847 */
7848 .extern MterpCheckBefore
7849 EXPORT_PC
7850 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7851 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
7852 mov r0, rSELF
7853 add r1, rFP, #OFF_FP_SHADOWFRAME
7854 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7855
7856/* ------------------------------ */
7857 .balign 128
7858.L_ALT_op_move_object: /* 0x07 */
7859/* File: arm/alt_stub.S */
7860/*
7861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7862 * any interesting requests and then jump to the real instruction
7863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7864 */
7865 .extern MterpCheckBefore
7866 EXPORT_PC
7867 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7868 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
7869 mov r0, rSELF
7870 add r1, rFP, #OFF_FP_SHADOWFRAME
7871 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7872
7873/* ------------------------------ */
7874 .balign 128
7875.L_ALT_op_move_object_from16: /* 0x08 */
7876/* File: arm/alt_stub.S */
7877/*
7878 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7879 * any interesting requests and then jump to the real instruction
7880 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7881 */
7882 .extern MterpCheckBefore
7883 EXPORT_PC
7884 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7885 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
7886 mov r0, rSELF
7887 add r1, rFP, #OFF_FP_SHADOWFRAME
7888 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7889
7890/* ------------------------------ */
7891 .balign 128
7892.L_ALT_op_move_object_16: /* 0x09 */
7893/* File: arm/alt_stub.S */
7894/*
7895 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7896 * any interesting requests and then jump to the real instruction
7897 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7898 */
7899 .extern MterpCheckBefore
7900 EXPORT_PC
7901 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7902 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
7903 mov r0, rSELF
7904 add r1, rFP, #OFF_FP_SHADOWFRAME
7905 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7906
7907/* ------------------------------ */
7908 .balign 128
7909.L_ALT_op_move_result: /* 0x0a */
7910/* File: arm/alt_stub.S */
7911/*
7912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7913 * any interesting requests and then jump to the real instruction
7914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7915 */
7916 .extern MterpCheckBefore
7917 EXPORT_PC
7918 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7919 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
7920 mov r0, rSELF
7921 add r1, rFP, #OFF_FP_SHADOWFRAME
7922 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7923
7924/* ------------------------------ */
7925 .balign 128
7926.L_ALT_op_move_result_wide: /* 0x0b */
7927/* File: arm/alt_stub.S */
7928/*
7929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7930 * any interesting requests and then jump to the real instruction
7931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7932 */
7933 .extern MterpCheckBefore
7934 EXPORT_PC
7935 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7936 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
7937 mov r0, rSELF
7938 add r1, rFP, #OFF_FP_SHADOWFRAME
7939 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7940
7941/* ------------------------------ */
7942 .balign 128
7943.L_ALT_op_move_result_object: /* 0x0c */
7944/* File: arm/alt_stub.S */
7945/*
7946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7947 * any interesting requests and then jump to the real instruction
7948 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7949 */
7950 .extern MterpCheckBefore
7951 EXPORT_PC
7952 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7953 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
7954 mov r0, rSELF
7955 add r1, rFP, #OFF_FP_SHADOWFRAME
7956 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7957
7958/* ------------------------------ */
7959 .balign 128
7960.L_ALT_op_move_exception: /* 0x0d */
7961/* File: arm/alt_stub.S */
7962/*
7963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7964 * any interesting requests and then jump to the real instruction
7965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7966 */
7967 .extern MterpCheckBefore
7968 EXPORT_PC
7969 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7970 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
7971 mov r0, rSELF
7972 add r1, rFP, #OFF_FP_SHADOWFRAME
7973 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7974
7975/* ------------------------------ */
7976 .balign 128
7977.L_ALT_op_return_void: /* 0x0e */
7978/* File: arm/alt_stub.S */
7979/*
7980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7981 * any interesting requests and then jump to the real instruction
7982 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7983 */
7984 .extern MterpCheckBefore
7985 EXPORT_PC
7986 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7987 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
7988 mov r0, rSELF
7989 add r1, rFP, #OFF_FP_SHADOWFRAME
7990 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7991
7992/* ------------------------------ */
7993 .balign 128
7994.L_ALT_op_return: /* 0x0f */
7995/* File: arm/alt_stub.S */
7996/*
7997 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7998 * any interesting requests and then jump to the real instruction
7999 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8000 */
8001 .extern MterpCheckBefore
8002 EXPORT_PC
8003 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8004 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
8005 mov r0, rSELF
8006 add r1, rFP, #OFF_FP_SHADOWFRAME
8007 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8008
8009/* ------------------------------ */
8010 .balign 128
8011.L_ALT_op_return_wide: /* 0x10 */
8012/* File: arm/alt_stub.S */
8013/*
8014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8015 * any interesting requests and then jump to the real instruction
8016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8017 */
8018 .extern MterpCheckBefore
8019 EXPORT_PC
8020 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8021 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
8022 mov r0, rSELF
8023 add r1, rFP, #OFF_FP_SHADOWFRAME
8024 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8025
8026/* ------------------------------ */
8027 .balign 128
8028.L_ALT_op_return_object: /* 0x11 */
8029/* File: arm/alt_stub.S */
8030/*
8031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8032 * any interesting requests and then jump to the real instruction
8033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8034 */
8035 .extern MterpCheckBefore
8036 EXPORT_PC
8037 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8038 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
8039 mov r0, rSELF
8040 add r1, rFP, #OFF_FP_SHADOWFRAME
8041 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8042
8043/* ------------------------------ */
8044 .balign 128
8045.L_ALT_op_const_4: /* 0x12 */
8046/* File: arm/alt_stub.S */
8047/*
8048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8049 * any interesting requests and then jump to the real instruction
8050 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8051 */
8052 .extern MterpCheckBefore
8053 EXPORT_PC
8054 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8055 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
8056 mov r0, rSELF
8057 add r1, rFP, #OFF_FP_SHADOWFRAME
8058 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8059
8060/* ------------------------------ */
8061 .balign 128
8062.L_ALT_op_const_16: /* 0x13 */
8063/* File: arm/alt_stub.S */
8064/*
8065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8066 * any interesting requests and then jump to the real instruction
8067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8068 */
8069 .extern MterpCheckBefore
8070 EXPORT_PC
8071 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8072 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8073 mov r0, rSELF
8074 add r1, rFP, #OFF_FP_SHADOWFRAME
8075 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8076
8077/* ------------------------------ */
8078 .balign 128
8079.L_ALT_op_const: /* 0x14 */
8080/* File: arm/alt_stub.S */
8081/*
8082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8083 * any interesting requests and then jump to the real instruction
8084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8085 */
8086 .extern MterpCheckBefore
8087 EXPORT_PC
8088 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8089 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8090 mov r0, rSELF
8091 add r1, rFP, #OFF_FP_SHADOWFRAME
8092 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8093
8094/* ------------------------------ */
8095 .balign 128
8096.L_ALT_op_const_high16: /* 0x15 */
8097/* File: arm/alt_stub.S */
8098/*
8099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8100 * any interesting requests and then jump to the real instruction
8101 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8102 */
8103 .extern MterpCheckBefore
8104 EXPORT_PC
8105 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8106 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8107 mov r0, rSELF
8108 add r1, rFP, #OFF_FP_SHADOWFRAME
8109 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8110
8111/* ------------------------------ */
8112 .balign 128
8113.L_ALT_op_const_wide_16: /* 0x16 */
8114/* File: arm/alt_stub.S */
8115/*
8116 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8117 * any interesting requests and then jump to the real instruction
8118 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8119 */
8120 .extern MterpCheckBefore
8121 EXPORT_PC
8122 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8123 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8124 mov r0, rSELF
8125 add r1, rFP, #OFF_FP_SHADOWFRAME
8126 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8127
8128/* ------------------------------ */
8129 .balign 128
8130.L_ALT_op_const_wide_32: /* 0x17 */
8131/* File: arm/alt_stub.S */
8132/*
8133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8134 * any interesting requests and then jump to the real instruction
8135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8136 */
8137 .extern MterpCheckBefore
8138 EXPORT_PC
8139 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8140 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8141 mov r0, rSELF
8142 add r1, rFP, #OFF_FP_SHADOWFRAME
8143 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8144
8145/* ------------------------------ */
8146 .balign 128
8147.L_ALT_op_const_wide: /* 0x18 */
8148/* File: arm/alt_stub.S */
8149/*
8150 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8151 * any interesting requests and then jump to the real instruction
8152 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8153 */
8154 .extern MterpCheckBefore
8155 EXPORT_PC
8156 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8157 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8158 mov r0, rSELF
8159 add r1, rFP, #OFF_FP_SHADOWFRAME
8160 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8161
8162/* ------------------------------ */
8163 .balign 128
8164.L_ALT_op_const_wide_high16: /* 0x19 */
8165/* File: arm/alt_stub.S */
8166/*
8167 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8168 * any interesting requests and then jump to the real instruction
8169 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8170 */
8171 .extern MterpCheckBefore
8172 EXPORT_PC
8173 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8174 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8175 mov r0, rSELF
8176 add r1, rFP, #OFF_FP_SHADOWFRAME
8177 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8178
8179/* ------------------------------ */
8180 .balign 128
8181.L_ALT_op_const_string: /* 0x1a */
8182/* File: arm/alt_stub.S */
8183/*
8184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8185 * any interesting requests and then jump to the real instruction
8186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8187 */
8188 .extern MterpCheckBefore
8189 EXPORT_PC
8190 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8191 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8192 mov r0, rSELF
8193 add r1, rFP, #OFF_FP_SHADOWFRAME
8194 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8195
8196/* ------------------------------ */
8197 .balign 128
8198.L_ALT_op_const_string_jumbo: /* 0x1b */
8199/* File: arm/alt_stub.S */
8200/*
8201 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8202 * any interesting requests and then jump to the real instruction
8203 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8204 */
8205 .extern MterpCheckBefore
8206 EXPORT_PC
8207 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8208 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8209 mov r0, rSELF
8210 add r1, rFP, #OFF_FP_SHADOWFRAME
8211 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8212
8213/* ------------------------------ */
8214 .balign 128
8215.L_ALT_op_const_class: /* 0x1c */
8216/* File: arm/alt_stub.S */
8217/*
8218 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8219 * any interesting requests and then jump to the real instruction
8220 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8221 */
8222 .extern MterpCheckBefore
8223 EXPORT_PC
8224 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8225 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8226 mov r0, rSELF
8227 add r1, rFP, #OFF_FP_SHADOWFRAME
8228 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8229
8230/* ------------------------------ */
8231 .balign 128
8232.L_ALT_op_monitor_enter: /* 0x1d */
8233/* File: arm/alt_stub.S */
8234/*
8235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8236 * any interesting requests and then jump to the real instruction
8237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8238 */
8239 .extern MterpCheckBefore
8240 EXPORT_PC
8241 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8242 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8243 mov r0, rSELF
8244 add r1, rFP, #OFF_FP_SHADOWFRAME
8245 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8246
8247/* ------------------------------ */
8248 .balign 128
8249.L_ALT_op_monitor_exit: /* 0x1e */
8250/* File: arm/alt_stub.S */
8251/*
8252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8253 * any interesting requests and then jump to the real instruction
8254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8255 */
8256 .extern MterpCheckBefore
8257 EXPORT_PC
8258 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8259 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8260 mov r0, rSELF
8261 add r1, rFP, #OFF_FP_SHADOWFRAME
8262 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8263
8264/* ------------------------------ */
8265 .balign 128
8266.L_ALT_op_check_cast: /* 0x1f */
8267/* File: arm/alt_stub.S */
8268/*
8269 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8270 * any interesting requests and then jump to the real instruction
8271 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8272 */
8273 .extern MterpCheckBefore
8274 EXPORT_PC
8275 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8276 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8277 mov r0, rSELF
8278 add r1, rFP, #OFF_FP_SHADOWFRAME
8279 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8280
8281/* ------------------------------ */
8282 .balign 128
8283.L_ALT_op_instance_of: /* 0x20 */
8284/* File: arm/alt_stub.S */
8285/*
8286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8287 * any interesting requests and then jump to the real instruction
8288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8289 */
8290 .extern MterpCheckBefore
8291 EXPORT_PC
8292 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8293 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8294 mov r0, rSELF
8295 add r1, rFP, #OFF_FP_SHADOWFRAME
8296 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8297
8298/* ------------------------------ */
8299 .balign 128
8300.L_ALT_op_array_length: /* 0x21 */
8301/* File: arm/alt_stub.S */
8302/*
8303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8304 * any interesting requests and then jump to the real instruction
8305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8306 */
8307 .extern MterpCheckBefore
8308 EXPORT_PC
8309 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8310 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8311 mov r0, rSELF
8312 add r1, rFP, #OFF_FP_SHADOWFRAME
8313 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8314
8315/* ------------------------------ */
8316 .balign 128
8317.L_ALT_op_new_instance: /* 0x22 */
8318/* File: arm/alt_stub.S */
8319/*
8320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8321 * any interesting requests and then jump to the real instruction
8322 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8323 */
8324 .extern MterpCheckBefore
8325 EXPORT_PC
8326 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8327 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8328 mov r0, rSELF
8329 add r1, rFP, #OFF_FP_SHADOWFRAME
8330 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8331
8332/* ------------------------------ */
8333 .balign 128
8334.L_ALT_op_new_array: /* 0x23 */
8335/* File: arm/alt_stub.S */
8336/*
8337 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8338 * any interesting requests and then jump to the real instruction
8339 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8340 */
8341 .extern MterpCheckBefore
8342 EXPORT_PC
8343 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8344 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8345 mov r0, rSELF
8346 add r1, rFP, #OFF_FP_SHADOWFRAME
8347 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8348
8349/* ------------------------------ */
8350 .balign 128
8351.L_ALT_op_filled_new_array: /* 0x24 */
8352/* File: arm/alt_stub.S */
8353/*
8354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8355 * any interesting requests and then jump to the real instruction
8356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8357 */
8358 .extern MterpCheckBefore
8359 EXPORT_PC
8360 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8361 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8362 mov r0, rSELF
8363 add r1, rFP, #OFF_FP_SHADOWFRAME
8364 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8365
8366/* ------------------------------ */
8367 .balign 128
8368.L_ALT_op_filled_new_array_range: /* 0x25 */
8369/* File: arm/alt_stub.S */
8370/*
8371 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8372 * any interesting requests and then jump to the real instruction
8373 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8374 */
8375 .extern MterpCheckBefore
8376 EXPORT_PC
8377 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8378 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8379 mov r0, rSELF
8380 add r1, rFP, #OFF_FP_SHADOWFRAME
8381 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8382
8383/* ------------------------------ */
8384 .balign 128
8385.L_ALT_op_fill_array_data: /* 0x26 */
8386/* File: arm/alt_stub.S */
8387/*
8388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8389 * any interesting requests and then jump to the real instruction
8390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8391 */
8392 .extern MterpCheckBefore
8393 EXPORT_PC
8394 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8395 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8396 mov r0, rSELF
8397 add r1, rFP, #OFF_FP_SHADOWFRAME
8398 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8399
8400/* ------------------------------ */
8401 .balign 128
8402.L_ALT_op_throw: /* 0x27 */
8403/* File: arm/alt_stub.S */
8404/*
8405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8406 * any interesting requests and then jump to the real instruction
8407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8408 */
8409 .extern MterpCheckBefore
8410 EXPORT_PC
8411 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8412 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8413 mov r0, rSELF
8414 add r1, rFP, #OFF_FP_SHADOWFRAME
8415 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8416
8417/* ------------------------------ */
8418 .balign 128
8419.L_ALT_op_goto: /* 0x28 */
8420/* File: arm/alt_stub.S */
8421/*
8422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8423 * any interesting requests and then jump to the real instruction
8424 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8425 */
8426 .extern MterpCheckBefore
8427 EXPORT_PC
8428 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8429 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8430 mov r0, rSELF
8431 add r1, rFP, #OFF_FP_SHADOWFRAME
8432 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8433
8434/* ------------------------------ */
8435 .balign 128
8436.L_ALT_op_goto_16: /* 0x29 */
8437/* File: arm/alt_stub.S */
8438/*
8439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8440 * any interesting requests and then jump to the real instruction
8441 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8442 */
8443 .extern MterpCheckBefore
8444 EXPORT_PC
8445 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8446 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8447 mov r0, rSELF
8448 add r1, rFP, #OFF_FP_SHADOWFRAME
8449 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8450
8451/* ------------------------------ */
8452 .balign 128
8453.L_ALT_op_goto_32: /* 0x2a */
8454/* File: arm/alt_stub.S */
8455/*
8456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8457 * any interesting requests and then jump to the real instruction
8458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8459 */
8460 .extern MterpCheckBefore
8461 EXPORT_PC
8462 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8463 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8464 mov r0, rSELF
8465 add r1, rFP, #OFF_FP_SHADOWFRAME
8466 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8467
8468/* ------------------------------ */
8469 .balign 128
8470.L_ALT_op_packed_switch: /* 0x2b */
8471/* File: arm/alt_stub.S */
8472/*
8473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8474 * any interesting requests and then jump to the real instruction
8475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8476 */
8477 .extern MterpCheckBefore
8478 EXPORT_PC
8479 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8480 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8481 mov r0, rSELF
8482 add r1, rFP, #OFF_FP_SHADOWFRAME
8483 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8484
8485/* ------------------------------ */
8486 .balign 128
8487.L_ALT_op_sparse_switch: /* 0x2c */
8488/* File: arm/alt_stub.S */
8489/*
8490 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8491 * any interesting requests and then jump to the real instruction
8492 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8493 */
8494 .extern MterpCheckBefore
8495 EXPORT_PC
8496 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8497 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8498 mov r0, rSELF
8499 add r1, rFP, #OFF_FP_SHADOWFRAME
8500 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8501
8502/* ------------------------------ */
8503 .balign 128
8504.L_ALT_op_cmpl_float: /* 0x2d */
8505/* File: arm/alt_stub.S */
8506/*
8507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8508 * any interesting requests and then jump to the real instruction
8509 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8510 */
8511 .extern MterpCheckBefore
8512 EXPORT_PC
8513 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8514 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8515 mov r0, rSELF
8516 add r1, rFP, #OFF_FP_SHADOWFRAME
8517 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8518
8519/* ------------------------------ */
8520 .balign 128
8521.L_ALT_op_cmpg_float: /* 0x2e */
8522/* File: arm/alt_stub.S */
8523/*
8524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8525 * any interesting requests and then jump to the real instruction
8526 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8527 */
8528 .extern MterpCheckBefore
8529 EXPORT_PC
8530 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8531 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8532 mov r0, rSELF
8533 add r1, rFP, #OFF_FP_SHADOWFRAME
8534 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8535
8536/* ------------------------------ */
8537 .balign 128
8538.L_ALT_op_cmpl_double: /* 0x2f */
8539/* File: arm/alt_stub.S */
8540/*
8541 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8542 * any interesting requests and then jump to the real instruction
8543 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8544 */
8545 .extern MterpCheckBefore
8546 EXPORT_PC
8547 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8548 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8549 mov r0, rSELF
8550 add r1, rFP, #OFF_FP_SHADOWFRAME
8551 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8552
8553/* ------------------------------ */
8554 .balign 128
8555.L_ALT_op_cmpg_double: /* 0x30 */
8556/* File: arm/alt_stub.S */
8557/*
8558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8559 * any interesting requests and then jump to the real instruction
8560 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8561 */
8562 .extern MterpCheckBefore
8563 EXPORT_PC
8564 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8565 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8566 mov r0, rSELF
8567 add r1, rFP, #OFF_FP_SHADOWFRAME
8568 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8569
8570/* ------------------------------ */
8571 .balign 128
8572.L_ALT_op_cmp_long: /* 0x31 */
8573/* File: arm/alt_stub.S */
8574/*
8575 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8576 * any interesting requests and then jump to the real instruction
8577 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8578 */
8579 .extern MterpCheckBefore
8580 EXPORT_PC
8581 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8582 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8583 mov r0, rSELF
8584 add r1, rFP, #OFF_FP_SHADOWFRAME
8585 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8586
8587/* ------------------------------ */
8588 .balign 128
8589.L_ALT_op_if_eq: /* 0x32 */
8590/* File: arm/alt_stub.S */
8591/*
8592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8593 * any interesting requests and then jump to the real instruction
8594 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8595 */
8596 .extern MterpCheckBefore
8597 EXPORT_PC
8598 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8599 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8600 mov r0, rSELF
8601 add r1, rFP, #OFF_FP_SHADOWFRAME
8602 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8603
8604/* ------------------------------ */
8605 .balign 128
8606.L_ALT_op_if_ne: /* 0x33 */
8607/* File: arm/alt_stub.S */
8608/*
8609 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8610 * any interesting requests and then jump to the real instruction
8611 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8612 */
8613 .extern MterpCheckBefore
8614 EXPORT_PC
8615 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8616 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8617 mov r0, rSELF
8618 add r1, rFP, #OFF_FP_SHADOWFRAME
8619 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8620
8621/* ------------------------------ */
8622 .balign 128
8623.L_ALT_op_if_lt: /* 0x34 */
8624/* File: arm/alt_stub.S */
8625/*
8626 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8627 * any interesting requests and then jump to the real instruction
8628 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8629 */
8630 .extern MterpCheckBefore
8631 EXPORT_PC
8632 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8633 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8634 mov r0, rSELF
8635 add r1, rFP, #OFF_FP_SHADOWFRAME
8636 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8637
8638/* ------------------------------ */
8639 .balign 128
8640.L_ALT_op_if_ge: /* 0x35 */
8641/* File: arm/alt_stub.S */
8642/*
8643 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8644 * any interesting requests and then jump to the real instruction
8645 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8646 */
8647 .extern MterpCheckBefore
8648 EXPORT_PC
8649 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8650 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8651 mov r0, rSELF
8652 add r1, rFP, #OFF_FP_SHADOWFRAME
8653 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8654
8655/* ------------------------------ */
8656 .balign 128
8657.L_ALT_op_if_gt: /* 0x36 */
8658/* File: arm/alt_stub.S */
8659/*
8660 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8661 * any interesting requests and then jump to the real instruction
8662 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8663 */
8664 .extern MterpCheckBefore
8665 EXPORT_PC
8666 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8667 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8668 mov r0, rSELF
8669 add r1, rFP, #OFF_FP_SHADOWFRAME
8670 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8671
8672/* ------------------------------ */
8673 .balign 128
8674.L_ALT_op_if_le: /* 0x37 */
8675/* File: arm/alt_stub.S */
8676/*
8677 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8678 * any interesting requests and then jump to the real instruction
8679 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8680 */
8681 .extern MterpCheckBefore
8682 EXPORT_PC
8683 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8684 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8685 mov r0, rSELF
8686 add r1, rFP, #OFF_FP_SHADOWFRAME
8687 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8688
8689/* ------------------------------ */
8690 .balign 128
8691.L_ALT_op_if_eqz: /* 0x38 */
8692/* File: arm/alt_stub.S */
8693/*
8694 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8695 * any interesting requests and then jump to the real instruction
8696 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8697 */
8698 .extern MterpCheckBefore
8699 EXPORT_PC
8700 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8701 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8702 mov r0, rSELF
8703 add r1, rFP, #OFF_FP_SHADOWFRAME
8704 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8705
8706/* ------------------------------ */
8707 .balign 128
8708.L_ALT_op_if_nez: /* 0x39 */
8709/* File: arm/alt_stub.S */
8710/*
8711 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8712 * any interesting requests and then jump to the real instruction
8713 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8714 */
8715 .extern MterpCheckBefore
8716 EXPORT_PC
8717 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8718 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8719 mov r0, rSELF
8720 add r1, rFP, #OFF_FP_SHADOWFRAME
8721 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8722
8723/* ------------------------------ */
8724 .balign 128
8725.L_ALT_op_if_ltz: /* 0x3a */
8726/* File: arm/alt_stub.S */
8727/*
8728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8729 * any interesting requests and then jump to the real instruction
8730 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8731 */
8732 .extern MterpCheckBefore
8733 EXPORT_PC
8734 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8735 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8736 mov r0, rSELF
8737 add r1, rFP, #OFF_FP_SHADOWFRAME
8738 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8739
8740/* ------------------------------ */
8741 .balign 128
8742.L_ALT_op_if_gez: /* 0x3b */
8743/* File: arm/alt_stub.S */
8744/*
8745 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8746 * any interesting requests and then jump to the real instruction
8747 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8748 */
8749 .extern MterpCheckBefore
8750 EXPORT_PC
8751 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8752 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8753 mov r0, rSELF
8754 add r1, rFP, #OFF_FP_SHADOWFRAME
8755 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8756
8757/* ------------------------------ */
8758 .balign 128
8759.L_ALT_op_if_gtz: /* 0x3c */
8760/* File: arm/alt_stub.S */
8761/*
8762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8763 * any interesting requests and then jump to the real instruction
8764 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8765 */
8766 .extern MterpCheckBefore
8767 EXPORT_PC
8768 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8769 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8770 mov r0, rSELF
8771 add r1, rFP, #OFF_FP_SHADOWFRAME
8772 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8773
8774/* ------------------------------ */
8775 .balign 128
8776.L_ALT_op_if_lez: /* 0x3d */
8777/* File: arm/alt_stub.S */
8778/*
8779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8780 * any interesting requests and then jump to the real instruction
8781 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8782 */
8783 .extern MterpCheckBefore
8784 EXPORT_PC
8785 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8786 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8787 mov r0, rSELF
8788 add r1, rFP, #OFF_FP_SHADOWFRAME
8789 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8790
8791/* ------------------------------ */
8792 .balign 128
8793.L_ALT_op_unused_3e: /* 0x3e */
8794/* File: arm/alt_stub.S */
8795/*
8796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8797 * any interesting requests and then jump to the real instruction
8798 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8799 */
8800 .extern MterpCheckBefore
8801 EXPORT_PC
8802 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8803 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
8804 mov r0, rSELF
8805 add r1, rFP, #OFF_FP_SHADOWFRAME
8806 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8807
8808/* ------------------------------ */
8809 .balign 128
8810.L_ALT_op_unused_3f: /* 0x3f */
8811/* File: arm/alt_stub.S */
8812/*
8813 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8814 * any interesting requests and then jump to the real instruction
8815 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8816 */
8817 .extern MterpCheckBefore
8818 EXPORT_PC
8819 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8820 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
8821 mov r0, rSELF
8822 add r1, rFP, #OFF_FP_SHADOWFRAME
8823 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8824
8825/* ------------------------------ */
8826 .balign 128
8827.L_ALT_op_unused_40: /* 0x40 */
8828/* File: arm/alt_stub.S */
8829/*
8830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8831 * any interesting requests and then jump to the real instruction
8832 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8833 */
8834 .extern MterpCheckBefore
8835 EXPORT_PC
8836 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8837 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
8838 mov r0, rSELF
8839 add r1, rFP, #OFF_FP_SHADOWFRAME
8840 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8841
8842/* ------------------------------ */
8843 .balign 128
8844.L_ALT_op_unused_41: /* 0x41 */
8845/* File: arm/alt_stub.S */
8846/*
8847 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8848 * any interesting requests and then jump to the real instruction
8849 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8850 */
8851 .extern MterpCheckBefore
8852 EXPORT_PC
8853 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8854 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
8855 mov r0, rSELF
8856 add r1, rFP, #OFF_FP_SHADOWFRAME
8857 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8858
8859/* ------------------------------ */
8860 .balign 128
8861.L_ALT_op_unused_42: /* 0x42 */
8862/* File: arm/alt_stub.S */
8863/*
8864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8865 * any interesting requests and then jump to the real instruction
8866 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8867 */
8868 .extern MterpCheckBefore
8869 EXPORT_PC
8870 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8871 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
8872 mov r0, rSELF
8873 add r1, rFP, #OFF_FP_SHADOWFRAME
8874 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8875
8876/* ------------------------------ */
8877 .balign 128
8878.L_ALT_op_unused_43: /* 0x43 */
8879/* File: arm/alt_stub.S */
8880/*
8881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8882 * any interesting requests and then jump to the real instruction
8883 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8884 */
8885 .extern MterpCheckBefore
8886 EXPORT_PC
8887 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8888 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
8889 mov r0, rSELF
8890 add r1, rFP, #OFF_FP_SHADOWFRAME
8891 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8892
8893/* ------------------------------ */
8894 .balign 128
8895.L_ALT_op_aget: /* 0x44 */
8896/* File: arm/alt_stub.S */
8897/*
8898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8899 * any interesting requests and then jump to the real instruction
8900 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8901 */
8902 .extern MterpCheckBefore
8903 EXPORT_PC
8904 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8905 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
8906 mov r0, rSELF
8907 add r1, rFP, #OFF_FP_SHADOWFRAME
8908 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8909
8910/* ------------------------------ */
8911 .balign 128
8912.L_ALT_op_aget_wide: /* 0x45 */
8913/* File: arm/alt_stub.S */
8914/*
8915 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8916 * any interesting requests and then jump to the real instruction
8917 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8918 */
8919 .extern MterpCheckBefore
8920 EXPORT_PC
8921 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8922 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
8923 mov r0, rSELF
8924 add r1, rFP, #OFF_FP_SHADOWFRAME
8925 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8926
8927/* ------------------------------ */
8928 .balign 128
8929.L_ALT_op_aget_object: /* 0x46 */
8930/* File: arm/alt_stub.S */
8931/*
8932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8933 * any interesting requests and then jump to the real instruction
8934 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8935 */
8936 .extern MterpCheckBefore
8937 EXPORT_PC
8938 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8939 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
8940 mov r0, rSELF
8941 add r1, rFP, #OFF_FP_SHADOWFRAME
8942 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8943
8944/* ------------------------------ */
8945 .balign 128
8946.L_ALT_op_aget_boolean: /* 0x47 */
8947/* File: arm/alt_stub.S */
8948/*
8949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8950 * any interesting requests and then jump to the real instruction
8951 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8952 */
8953 .extern MterpCheckBefore
8954 EXPORT_PC
8955 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8956 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
8957 mov r0, rSELF
8958 add r1, rFP, #OFF_FP_SHADOWFRAME
8959 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8960
8961/* ------------------------------ */
8962 .balign 128
8963.L_ALT_op_aget_byte: /* 0x48 */
8964/* File: arm/alt_stub.S */
8965/*
8966 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8967 * any interesting requests and then jump to the real instruction
8968 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8969 */
8970 .extern MterpCheckBefore
8971 EXPORT_PC
8972 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8973 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
8974 mov r0, rSELF
8975 add r1, rFP, #OFF_FP_SHADOWFRAME
8976 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8977
8978/* ------------------------------ */
8979 .balign 128
8980.L_ALT_op_aget_char: /* 0x49 */
8981/* File: arm/alt_stub.S */
8982/*
8983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8984 * any interesting requests and then jump to the real instruction
8985 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8986 */
8987 .extern MterpCheckBefore
8988 EXPORT_PC
8989 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8990 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
8991 mov r0, rSELF
8992 add r1, rFP, #OFF_FP_SHADOWFRAME
8993 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8994
8995/* ------------------------------ */
8996 .balign 128
8997.L_ALT_op_aget_short: /* 0x4a */
8998/* File: arm/alt_stub.S */
8999/*
9000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9001 * any interesting requests and then jump to the real instruction
9002 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9003 */
9004 .extern MterpCheckBefore
9005 EXPORT_PC
9006 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9007 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
9008 mov r0, rSELF
9009 add r1, rFP, #OFF_FP_SHADOWFRAME
9010 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9011
9012/* ------------------------------ */
9013 .balign 128
9014.L_ALT_op_aput: /* 0x4b */
9015/* File: arm/alt_stub.S */
9016/*
9017 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9018 * any interesting requests and then jump to the real instruction
9019 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9020 */
9021 .extern MterpCheckBefore
9022 EXPORT_PC
9023 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9024 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
9025 mov r0, rSELF
9026 add r1, rFP, #OFF_FP_SHADOWFRAME
9027 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9028
9029/* ------------------------------ */
9030 .balign 128
9031.L_ALT_op_aput_wide: /* 0x4c */
9032/* File: arm/alt_stub.S */
9033/*
9034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9035 * any interesting requests and then jump to the real instruction
9036 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9037 */
9038 .extern MterpCheckBefore
9039 EXPORT_PC
9040 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9041 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
9042 mov r0, rSELF
9043 add r1, rFP, #OFF_FP_SHADOWFRAME
9044 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9045
9046/* ------------------------------ */
9047 .balign 128
9048.L_ALT_op_aput_object: /* 0x4d */
9049/* File: arm/alt_stub.S */
9050/*
9051 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9052 * any interesting requests and then jump to the real instruction
9053 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9054 */
9055 .extern MterpCheckBefore
9056 EXPORT_PC
9057 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9058 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
9059 mov r0, rSELF
9060 add r1, rFP, #OFF_FP_SHADOWFRAME
9061 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9062
9063/* ------------------------------ */
9064 .balign 128
9065.L_ALT_op_aput_boolean: /* 0x4e */
9066/* File: arm/alt_stub.S */
9067/*
9068 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9069 * any interesting requests and then jump to the real instruction
9070 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9071 */
9072 .extern MterpCheckBefore
9073 EXPORT_PC
9074 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9075 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9076 mov r0, rSELF
9077 add r1, rFP, #OFF_FP_SHADOWFRAME
9078 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9079
9080/* ------------------------------ */
9081 .balign 128
9082.L_ALT_op_aput_byte: /* 0x4f */
9083/* File: arm/alt_stub.S */
9084/*
9085 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9086 * any interesting requests and then jump to the real instruction
9087 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9088 */
9089 .extern MterpCheckBefore
9090 EXPORT_PC
9091 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9092 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9093 mov r0, rSELF
9094 add r1, rFP, #OFF_FP_SHADOWFRAME
9095 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9096
9097/* ------------------------------ */
9098 .balign 128
9099.L_ALT_op_aput_char: /* 0x50 */
9100/* File: arm/alt_stub.S */
9101/*
9102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9103 * any interesting requests and then jump to the real instruction
9104 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9105 */
9106 .extern MterpCheckBefore
9107 EXPORT_PC
9108 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9109 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9110 mov r0, rSELF
9111 add r1, rFP, #OFF_FP_SHADOWFRAME
9112 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9113
9114/* ------------------------------ */
9115 .balign 128
9116.L_ALT_op_aput_short: /* 0x51 */
9117/* File: arm/alt_stub.S */
9118/*
9119 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9120 * any interesting requests and then jump to the real instruction
9121 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9122 */
9123 .extern MterpCheckBefore
9124 EXPORT_PC
9125 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9126 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9127 mov r0, rSELF
9128 add r1, rFP, #OFF_FP_SHADOWFRAME
9129 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9130
9131/* ------------------------------ */
9132 .balign 128
9133.L_ALT_op_iget: /* 0x52 */
9134/* File: arm/alt_stub.S */
9135/*
9136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9137 * any interesting requests and then jump to the real instruction
9138 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9139 */
9140 .extern MterpCheckBefore
9141 EXPORT_PC
9142 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9143 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9144 mov r0, rSELF
9145 add r1, rFP, #OFF_FP_SHADOWFRAME
9146 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9147
9148/* ------------------------------ */
9149 .balign 128
9150.L_ALT_op_iget_wide: /* 0x53 */
9151/* File: arm/alt_stub.S */
9152/*
9153 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9154 * any interesting requests and then jump to the real instruction
9155 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9156 */
9157 .extern MterpCheckBefore
9158 EXPORT_PC
9159 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9160 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9161 mov r0, rSELF
9162 add r1, rFP, #OFF_FP_SHADOWFRAME
9163 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9164
9165/* ------------------------------ */
9166 .balign 128
9167.L_ALT_op_iget_object: /* 0x54 */
9168/* File: arm/alt_stub.S */
9169/*
9170 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9171 * any interesting requests and then jump to the real instruction
9172 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9173 */
9174 .extern MterpCheckBefore
9175 EXPORT_PC
9176 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9177 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9178 mov r0, rSELF
9179 add r1, rFP, #OFF_FP_SHADOWFRAME
9180 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9181
9182/* ------------------------------ */
9183 .balign 128
9184.L_ALT_op_iget_boolean: /* 0x55 */
9185/* File: arm/alt_stub.S */
9186/*
9187 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9188 * any interesting requests and then jump to the real instruction
9189 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9190 */
9191 .extern MterpCheckBefore
9192 EXPORT_PC
9193 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9194 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9195 mov r0, rSELF
9196 add r1, rFP, #OFF_FP_SHADOWFRAME
9197 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9198
9199/* ------------------------------ */
9200 .balign 128
9201.L_ALT_op_iget_byte: /* 0x56 */
9202/* File: arm/alt_stub.S */
9203/*
9204 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9205 * any interesting requests and then jump to the real instruction
9206 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9207 */
9208 .extern MterpCheckBefore
9209 EXPORT_PC
9210 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9211 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9212 mov r0, rSELF
9213 add r1, rFP, #OFF_FP_SHADOWFRAME
9214 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9215
9216/* ------------------------------ */
9217 .balign 128
9218.L_ALT_op_iget_char: /* 0x57 */
9219/* File: arm/alt_stub.S */
9220/*
9221 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9222 * any interesting requests and then jump to the real instruction
9223 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9224 */
9225 .extern MterpCheckBefore
9226 EXPORT_PC
9227 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9228 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9229 mov r0, rSELF
9230 add r1, rFP, #OFF_FP_SHADOWFRAME
9231 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9232
9233/* ------------------------------ */
9234 .balign 128
9235.L_ALT_op_iget_short: /* 0x58 */
9236/* File: arm/alt_stub.S */
9237/*
9238 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9239 * any interesting requests and then jump to the real instruction
9240 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9241 */
9242 .extern MterpCheckBefore
9243 EXPORT_PC
9244 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9245 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9246 mov r0, rSELF
9247 add r1, rFP, #OFF_FP_SHADOWFRAME
9248 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9249
9250/* ------------------------------ */
9251 .balign 128
9252.L_ALT_op_iput: /* 0x59 */
9253/* File: arm/alt_stub.S */
9254/*
9255 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9256 * any interesting requests and then jump to the real instruction
9257 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9258 */
9259 .extern MterpCheckBefore
9260 EXPORT_PC
9261 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9262 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9263 mov r0, rSELF
9264 add r1, rFP, #OFF_FP_SHADOWFRAME
9265 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9266
9267/* ------------------------------ */
9268 .balign 128
9269.L_ALT_op_iput_wide: /* 0x5a */
9270/* File: arm/alt_stub.S */
9271/*
9272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9273 * any interesting requests and then jump to the real instruction
9274 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9275 */
9276 .extern MterpCheckBefore
9277 EXPORT_PC
9278 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9279 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9280 mov r0, rSELF
9281 add r1, rFP, #OFF_FP_SHADOWFRAME
9282 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9283
9284/* ------------------------------ */
9285 .balign 128
9286.L_ALT_op_iput_object: /* 0x5b */
9287/* File: arm/alt_stub.S */
9288/*
9289 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9290 * any interesting requests and then jump to the real instruction
9291 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9292 */
9293 .extern MterpCheckBefore
9294 EXPORT_PC
9295 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9296 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9297 mov r0, rSELF
9298 add r1, rFP, #OFF_FP_SHADOWFRAME
9299 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9300
9301/* ------------------------------ */
9302 .balign 128
9303.L_ALT_op_iput_boolean: /* 0x5c */
9304/* File: arm/alt_stub.S */
9305/*
9306 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9307 * any interesting requests and then jump to the real instruction
9308 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9309 */
9310 .extern MterpCheckBefore
9311 EXPORT_PC
9312 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9313 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9314 mov r0, rSELF
9315 add r1, rFP, #OFF_FP_SHADOWFRAME
9316 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9317
9318/* ------------------------------ */
9319 .balign 128
9320.L_ALT_op_iput_byte: /* 0x5d */
9321/* File: arm/alt_stub.S */
9322/*
9323 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9324 * any interesting requests and then jump to the real instruction
9325 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9326 */
9327 .extern MterpCheckBefore
9328 EXPORT_PC
9329 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9330 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9331 mov r0, rSELF
9332 add r1, rFP, #OFF_FP_SHADOWFRAME
9333 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9334
9335/* ------------------------------ */
9336 .balign 128
9337.L_ALT_op_iput_char: /* 0x5e */
9338/* File: arm/alt_stub.S */
9339/*
9340 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9341 * any interesting requests and then jump to the real instruction
9342 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9343 */
9344 .extern MterpCheckBefore
9345 EXPORT_PC
9346 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9347 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9348 mov r0, rSELF
9349 add r1, rFP, #OFF_FP_SHADOWFRAME
9350 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9351
9352/* ------------------------------ */
9353 .balign 128
9354.L_ALT_op_iput_short: /* 0x5f */
9355/* File: arm/alt_stub.S */
9356/*
9357 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9358 * any interesting requests and then jump to the real instruction
9359 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9360 */
9361 .extern MterpCheckBefore
9362 EXPORT_PC
9363 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9364 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9365 mov r0, rSELF
9366 add r1, rFP, #OFF_FP_SHADOWFRAME
9367 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9368
9369/* ------------------------------ */
9370 .balign 128
9371.L_ALT_op_sget: /* 0x60 */
9372/* File: arm/alt_stub.S */
9373/*
9374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9375 * any interesting requests and then jump to the real instruction
9376 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9377 */
9378 .extern MterpCheckBefore
9379 EXPORT_PC
9380 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9381 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9382 mov r0, rSELF
9383 add r1, rFP, #OFF_FP_SHADOWFRAME
9384 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9385
9386/* ------------------------------ */
9387 .balign 128
9388.L_ALT_op_sget_wide: /* 0x61 */
9389/* File: arm/alt_stub.S */
9390/*
9391 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9392 * any interesting requests and then jump to the real instruction
9393 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9394 */
9395 .extern MterpCheckBefore
9396 EXPORT_PC
9397 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9398 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9399 mov r0, rSELF
9400 add r1, rFP, #OFF_FP_SHADOWFRAME
9401 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9402
9403/* ------------------------------ */
9404 .balign 128
9405.L_ALT_op_sget_object: /* 0x62 */
9406/* File: arm/alt_stub.S */
9407/*
9408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9409 * any interesting requests and then jump to the real instruction
9410 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9411 */
9412 .extern MterpCheckBefore
9413 EXPORT_PC
9414 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9415 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9416 mov r0, rSELF
9417 add r1, rFP, #OFF_FP_SHADOWFRAME
9418 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9419
9420/* ------------------------------ */
9421 .balign 128
9422.L_ALT_op_sget_boolean: /* 0x63 */
9423/* File: arm/alt_stub.S */
9424/*
9425 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9426 * any interesting requests and then jump to the real instruction
9427 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9428 */
9429 .extern MterpCheckBefore
9430 EXPORT_PC
9431 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9432 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9433 mov r0, rSELF
9434 add r1, rFP, #OFF_FP_SHADOWFRAME
9435 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9436
9437/* ------------------------------ */
9438 .balign 128
9439.L_ALT_op_sget_byte: /* 0x64 */
9440/* File: arm/alt_stub.S */
9441/*
9442 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9443 * any interesting requests and then jump to the real instruction
9444 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9445 */
9446 .extern MterpCheckBefore
9447 EXPORT_PC
9448 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9449 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9450 mov r0, rSELF
9451 add r1, rFP, #OFF_FP_SHADOWFRAME
9452 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9453
9454/* ------------------------------ */
9455 .balign 128
9456.L_ALT_op_sget_char: /* 0x65 */
9457/* File: arm/alt_stub.S */
9458/*
9459 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9460 * any interesting requests and then jump to the real instruction
9461 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9462 */
9463 .extern MterpCheckBefore
9464 EXPORT_PC
9465 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9466 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9467 mov r0, rSELF
9468 add r1, rFP, #OFF_FP_SHADOWFRAME
9469 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9470
9471/* ------------------------------ */
9472 .balign 128
9473.L_ALT_op_sget_short: /* 0x66 */
9474/* File: arm/alt_stub.S */
9475/*
9476 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9477 * any interesting requests and then jump to the real instruction
9478 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9479 */
9480 .extern MterpCheckBefore
9481 EXPORT_PC
9482 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9483 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9484 mov r0, rSELF
9485 add r1, rFP, #OFF_FP_SHADOWFRAME
9486 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9487
9488/* ------------------------------ */
9489 .balign 128
9490.L_ALT_op_sput: /* 0x67 */
9491/* File: arm/alt_stub.S */
9492/*
9493 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9494 * any interesting requests and then jump to the real instruction
9495 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9496 */
9497 .extern MterpCheckBefore
9498 EXPORT_PC
9499 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9500 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9501 mov r0, rSELF
9502 add r1, rFP, #OFF_FP_SHADOWFRAME
9503 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9504
9505/* ------------------------------ */
9506 .balign 128
9507.L_ALT_op_sput_wide: /* 0x68 */
9508/* File: arm/alt_stub.S */
9509/*
9510 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9511 * any interesting requests and then jump to the real instruction
9512 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9513 */
9514 .extern MterpCheckBefore
9515 EXPORT_PC
9516 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9517 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9518 mov r0, rSELF
9519 add r1, rFP, #OFF_FP_SHADOWFRAME
9520 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9521
9522/* ------------------------------ */
9523 .balign 128
9524.L_ALT_op_sput_object: /* 0x69 */
9525/* File: arm/alt_stub.S */
9526/*
9527 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9528 * any interesting requests and then jump to the real instruction
9529 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9530 */
9531 .extern MterpCheckBefore
9532 EXPORT_PC
9533 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9534 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9535 mov r0, rSELF
9536 add r1, rFP, #OFF_FP_SHADOWFRAME
9537 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9538
9539/* ------------------------------ */
9540 .balign 128
9541.L_ALT_op_sput_boolean: /* 0x6a */
9542/* File: arm/alt_stub.S */
9543/*
9544 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9545 * any interesting requests and then jump to the real instruction
9546 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9547 */
9548 .extern MterpCheckBefore
9549 EXPORT_PC
9550 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9551 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9552 mov r0, rSELF
9553 add r1, rFP, #OFF_FP_SHADOWFRAME
9554 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9555
9556/* ------------------------------ */
9557 .balign 128
9558.L_ALT_op_sput_byte: /* 0x6b */
9559/* File: arm/alt_stub.S */
9560/*
9561 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9562 * any interesting requests and then jump to the real instruction
9563 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9564 */
9565 .extern MterpCheckBefore
9566 EXPORT_PC
9567 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9568 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9569 mov r0, rSELF
9570 add r1, rFP, #OFF_FP_SHADOWFRAME
9571 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9572
9573/* ------------------------------ */
9574 .balign 128
9575.L_ALT_op_sput_char: /* 0x6c */
9576/* File: arm/alt_stub.S */
9577/*
9578 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9579 * any interesting requests and then jump to the real instruction
9580 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9581 */
9582 .extern MterpCheckBefore
9583 EXPORT_PC
9584 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9585 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9586 mov r0, rSELF
9587 add r1, rFP, #OFF_FP_SHADOWFRAME
9588 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9589
9590/* ------------------------------ */
9591 .balign 128
9592.L_ALT_op_sput_short: /* 0x6d */
9593/* File: arm/alt_stub.S */
9594/*
9595 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9596 * any interesting requests and then jump to the real instruction
9597 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9598 */
9599 .extern MterpCheckBefore
9600 EXPORT_PC
9601 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9602 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9603 mov r0, rSELF
9604 add r1, rFP, #OFF_FP_SHADOWFRAME
9605 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9606
9607/* ------------------------------ */
9608 .balign 128
9609.L_ALT_op_invoke_virtual: /* 0x6e */
9610/* File: arm/alt_stub.S */
9611/*
9612 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9613 * any interesting requests and then jump to the real instruction
9614 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9615 */
9616 .extern MterpCheckBefore
9617 EXPORT_PC
9618 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9619 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9620 mov r0, rSELF
9621 add r1, rFP, #OFF_FP_SHADOWFRAME
9622 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9623
9624/* ------------------------------ */
9625 .balign 128
9626.L_ALT_op_invoke_super: /* 0x6f */
9627/* File: arm/alt_stub.S */
9628/*
9629 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9630 * any interesting requests and then jump to the real instruction
9631 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9632 */
9633 .extern MterpCheckBefore
9634 EXPORT_PC
9635 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9636 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9637 mov r0, rSELF
9638 add r1, rFP, #OFF_FP_SHADOWFRAME
9639 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9640
9641/* ------------------------------ */
9642 .balign 128
9643.L_ALT_op_invoke_direct: /* 0x70 */
9644/* File: arm/alt_stub.S */
9645/*
9646 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9647 * any interesting requests and then jump to the real instruction
9648 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9649 */
9650 .extern MterpCheckBefore
9651 EXPORT_PC
9652 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9653 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9654 mov r0, rSELF
9655 add r1, rFP, #OFF_FP_SHADOWFRAME
9656 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9657
9658/* ------------------------------ */
9659 .balign 128
9660.L_ALT_op_invoke_static: /* 0x71 */
9661/* File: arm/alt_stub.S */
9662/*
9663 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9664 * any interesting requests and then jump to the real instruction
9665 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9666 */
9667 .extern MterpCheckBefore
9668 EXPORT_PC
9669 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9670 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9671 mov r0, rSELF
9672 add r1, rFP, #OFF_FP_SHADOWFRAME
9673 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9674
9675/* ------------------------------ */
9676 .balign 128
9677.L_ALT_op_invoke_interface: /* 0x72 */
9678/* File: arm/alt_stub.S */
9679/*
9680 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9681 * any interesting requests and then jump to the real instruction
9682 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9683 */
9684 .extern MterpCheckBefore
9685 EXPORT_PC
9686 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9687 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9688 mov r0, rSELF
9689 add r1, rFP, #OFF_FP_SHADOWFRAME
9690 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9691
9692/* ------------------------------ */
9693 .balign 128
9694.L_ALT_op_return_void_no_barrier: /* 0x73 */
9695/* File: arm/alt_stub.S */
9696/*
9697 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9698 * any interesting requests and then jump to the real instruction
9699 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9700 */
9701 .extern MterpCheckBefore
9702 EXPORT_PC
9703 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9704 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9705 mov r0, rSELF
9706 add r1, rFP, #OFF_FP_SHADOWFRAME
9707 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9708
9709/* ------------------------------ */
9710 .balign 128
9711.L_ALT_op_invoke_virtual_range: /* 0x74 */
9712/* File: arm/alt_stub.S */
9713/*
9714 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9715 * any interesting requests and then jump to the real instruction
9716 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9717 */
9718 .extern MterpCheckBefore
9719 EXPORT_PC
9720 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9721 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9722 mov r0, rSELF
9723 add r1, rFP, #OFF_FP_SHADOWFRAME
9724 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9725
9726/* ------------------------------ */
9727 .balign 128
9728.L_ALT_op_invoke_super_range: /* 0x75 */
9729/* File: arm/alt_stub.S */
9730/*
9731 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9732 * any interesting requests and then jump to the real instruction
9733 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9734 */
9735 .extern MterpCheckBefore
9736 EXPORT_PC
9737 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9738 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9739 mov r0, rSELF
9740 add r1, rFP, #OFF_FP_SHADOWFRAME
9741 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9742
9743/* ------------------------------ */
9744 .balign 128
9745.L_ALT_op_invoke_direct_range: /* 0x76 */
9746/* File: arm/alt_stub.S */
9747/*
9748 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9749 * any interesting requests and then jump to the real instruction
9750 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9751 */
9752 .extern MterpCheckBefore
9753 EXPORT_PC
9754 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9755 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9756 mov r0, rSELF
9757 add r1, rFP, #OFF_FP_SHADOWFRAME
9758 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9759
9760/* ------------------------------ */
9761 .balign 128
9762.L_ALT_op_invoke_static_range: /* 0x77 */
9763/* File: arm/alt_stub.S */
9764/*
9765 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9766 * any interesting requests and then jump to the real instruction
9767 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9768 */
9769 .extern MterpCheckBefore
9770 EXPORT_PC
9771 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9772 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9773 mov r0, rSELF
9774 add r1, rFP, #OFF_FP_SHADOWFRAME
9775 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9776
9777/* ------------------------------ */
9778 .balign 128
9779.L_ALT_op_invoke_interface_range: /* 0x78 */
9780/* File: arm/alt_stub.S */
9781/*
9782 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9783 * any interesting requests and then jump to the real instruction
9784 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9785 */
9786 .extern MterpCheckBefore
9787 EXPORT_PC
9788 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9789 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
9790 mov r0, rSELF
9791 add r1, rFP, #OFF_FP_SHADOWFRAME
9792 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9793
9794/* ------------------------------ */
9795 .balign 128
9796.L_ALT_op_unused_79: /* 0x79 */
9797/* File: arm/alt_stub.S */
9798/*
9799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9800 * any interesting requests and then jump to the real instruction
9801 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9802 */
9803 .extern MterpCheckBefore
9804 EXPORT_PC
9805 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9806 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
9807 mov r0, rSELF
9808 add r1, rFP, #OFF_FP_SHADOWFRAME
9809 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9810
9811/* ------------------------------ */
9812 .balign 128
9813.L_ALT_op_unused_7a: /* 0x7a */
9814/* File: arm/alt_stub.S */
9815/*
9816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9817 * any interesting requests and then jump to the real instruction
9818 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9819 */
9820 .extern MterpCheckBefore
9821 EXPORT_PC
9822 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9823 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
9824 mov r0, rSELF
9825 add r1, rFP, #OFF_FP_SHADOWFRAME
9826 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9827
9828/* ------------------------------ */
9829 .balign 128
9830.L_ALT_op_neg_int: /* 0x7b */
9831/* File: arm/alt_stub.S */
9832/*
9833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9834 * any interesting requests and then jump to the real instruction
9835 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9836 */
9837 .extern MterpCheckBefore
9838 EXPORT_PC
9839 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9840 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
9841 mov r0, rSELF
9842 add r1, rFP, #OFF_FP_SHADOWFRAME
9843 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9844
9845/* ------------------------------ */
9846 .balign 128
9847.L_ALT_op_not_int: /* 0x7c */
9848/* File: arm/alt_stub.S */
9849/*
9850 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9851 * any interesting requests and then jump to the real instruction
9852 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9853 */
9854 .extern MterpCheckBefore
9855 EXPORT_PC
9856 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9857 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
9858 mov r0, rSELF
9859 add r1, rFP, #OFF_FP_SHADOWFRAME
9860 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9861
9862/* ------------------------------ */
9863 .balign 128
9864.L_ALT_op_neg_long: /* 0x7d */
9865/* File: arm/alt_stub.S */
9866/*
9867 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9868 * any interesting requests and then jump to the real instruction
9869 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9870 */
9871 .extern MterpCheckBefore
9872 EXPORT_PC
9873 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9874 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
9875 mov r0, rSELF
9876 add r1, rFP, #OFF_FP_SHADOWFRAME
9877 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9878
9879/* ------------------------------ */
9880 .balign 128
9881.L_ALT_op_not_long: /* 0x7e */
9882/* File: arm/alt_stub.S */
9883/*
9884 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9885 * any interesting requests and then jump to the real instruction
9886 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9887 */
9888 .extern MterpCheckBefore
9889 EXPORT_PC
9890 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9891 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
9892 mov r0, rSELF
9893 add r1, rFP, #OFF_FP_SHADOWFRAME
9894 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9895
9896/* ------------------------------ */
9897 .balign 128
9898.L_ALT_op_neg_float: /* 0x7f */
9899/* File: arm/alt_stub.S */
9900/*
9901 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9902 * any interesting requests and then jump to the real instruction
9903 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9904 */
9905 .extern MterpCheckBefore
9906 EXPORT_PC
9907 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9908 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
9909 mov r0, rSELF
9910 add r1, rFP, #OFF_FP_SHADOWFRAME
9911 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9912
9913/* ------------------------------ */
9914 .balign 128
9915.L_ALT_op_neg_double: /* 0x80 */
9916/* File: arm/alt_stub.S */
9917/*
9918 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9919 * any interesting requests and then jump to the real instruction
9920 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9921 */
9922 .extern MterpCheckBefore
9923 EXPORT_PC
9924 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9925 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
9926 mov r0, rSELF
9927 add r1, rFP, #OFF_FP_SHADOWFRAME
9928 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9929
9930/* ------------------------------ */
9931 .balign 128
9932.L_ALT_op_int_to_long: /* 0x81 */
9933/* File: arm/alt_stub.S */
9934/*
9935 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9936 * any interesting requests and then jump to the real instruction
9937 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9938 */
9939 .extern MterpCheckBefore
9940 EXPORT_PC
9941 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9942 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
9943 mov r0, rSELF
9944 add r1, rFP, #OFF_FP_SHADOWFRAME
9945 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9946
9947/* ------------------------------ */
9948 .balign 128
9949.L_ALT_op_int_to_float: /* 0x82 */
9950/* File: arm/alt_stub.S */
9951/*
9952 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9953 * any interesting requests and then jump to the real instruction
9954 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9955 */
9956 .extern MterpCheckBefore
9957 EXPORT_PC
9958 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9959 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
9960 mov r0, rSELF
9961 add r1, rFP, #OFF_FP_SHADOWFRAME
9962 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9963
9964/* ------------------------------ */
9965 .balign 128
9966.L_ALT_op_int_to_double: /* 0x83 */
9967/* File: arm/alt_stub.S */
9968/*
9969 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9970 * any interesting requests and then jump to the real instruction
9971 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9972 */
9973 .extern MterpCheckBefore
9974 EXPORT_PC
9975 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9976 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
9977 mov r0, rSELF
9978 add r1, rFP, #OFF_FP_SHADOWFRAME
9979 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9980
9981/* ------------------------------ */
9982 .balign 128
9983.L_ALT_op_long_to_int: /* 0x84 */
9984/* File: arm/alt_stub.S */
9985/*
9986 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9987 * any interesting requests and then jump to the real instruction
9988 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9989 */
9990 .extern MterpCheckBefore
9991 EXPORT_PC
9992 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9993 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
9994 mov r0, rSELF
9995 add r1, rFP, #OFF_FP_SHADOWFRAME
9996 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9997
9998/* ------------------------------ */
9999 .balign 128
10000.L_ALT_op_long_to_float: /* 0x85 */
10001/* File: arm/alt_stub.S */
10002/*
10003 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10004 * any interesting requests and then jump to the real instruction
10005 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10006 */
10007 .extern MterpCheckBefore
10008 EXPORT_PC
10009 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10010 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
10011 mov r0, rSELF
10012 add r1, rFP, #OFF_FP_SHADOWFRAME
10013 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10014
10015/* ------------------------------ */
10016 .balign 128
10017.L_ALT_op_long_to_double: /* 0x86 */
10018/* File: arm/alt_stub.S */
10019/*
10020 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10021 * any interesting requests and then jump to the real instruction
10022 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10023 */
10024 .extern MterpCheckBefore
10025 EXPORT_PC
10026 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10027 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
10028 mov r0, rSELF
10029 add r1, rFP, #OFF_FP_SHADOWFRAME
10030 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10031
10032/* ------------------------------ */
10033 .balign 128
10034.L_ALT_op_float_to_int: /* 0x87 */
10035/* File: arm/alt_stub.S */
10036/*
10037 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10038 * any interesting requests and then jump to the real instruction
10039 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10040 */
10041 .extern MterpCheckBefore
10042 EXPORT_PC
10043 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10044 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
10045 mov r0, rSELF
10046 add r1, rFP, #OFF_FP_SHADOWFRAME
10047 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10048
10049/* ------------------------------ */
10050 .balign 128
10051.L_ALT_op_float_to_long: /* 0x88 */
10052/* File: arm/alt_stub.S */
10053/*
10054 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10055 * any interesting requests and then jump to the real instruction
10056 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10057 */
10058 .extern MterpCheckBefore
10059 EXPORT_PC
10060 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10061 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10062 mov r0, rSELF
10063 add r1, rFP, #OFF_FP_SHADOWFRAME
10064 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10065
10066/* ------------------------------ */
10067 .balign 128
10068.L_ALT_op_float_to_double: /* 0x89 */
10069/* File: arm/alt_stub.S */
10070/*
10071 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10072 * any interesting requests and then jump to the real instruction
10073 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10074 */
10075 .extern MterpCheckBefore
10076 EXPORT_PC
10077 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10078 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10079 mov r0, rSELF
10080 add r1, rFP, #OFF_FP_SHADOWFRAME
10081 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10082
10083/* ------------------------------ */
10084 .balign 128
10085.L_ALT_op_double_to_int: /* 0x8a */
10086/* File: arm/alt_stub.S */
10087/*
10088 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10089 * any interesting requests and then jump to the real instruction
10090 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10091 */
10092 .extern MterpCheckBefore
10093 EXPORT_PC
10094 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10095 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10096 mov r0, rSELF
10097 add r1, rFP, #OFF_FP_SHADOWFRAME
10098 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10099
10100/* ------------------------------ */
10101 .balign 128
10102.L_ALT_op_double_to_long: /* 0x8b */
10103/* File: arm/alt_stub.S */
10104/*
10105 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10106 * any interesting requests and then jump to the real instruction
10107 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10108 */
10109 .extern MterpCheckBefore
10110 EXPORT_PC
10111 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10112 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10113 mov r0, rSELF
10114 add r1, rFP, #OFF_FP_SHADOWFRAME
10115 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10116
10117/* ------------------------------ */
10118 .balign 128
10119.L_ALT_op_double_to_float: /* 0x8c */
10120/* File: arm/alt_stub.S */
10121/*
10122 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10123 * any interesting requests and then jump to the real instruction
10124 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10125 */
10126 .extern MterpCheckBefore
10127 EXPORT_PC
10128 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10129 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10130 mov r0, rSELF
10131 add r1, rFP, #OFF_FP_SHADOWFRAME
10132 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10133
10134/* ------------------------------ */
10135 .balign 128
10136.L_ALT_op_int_to_byte: /* 0x8d */
10137/* File: arm/alt_stub.S */
10138/*
10139 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10140 * any interesting requests and then jump to the real instruction
10141 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10142 */
10143 .extern MterpCheckBefore
10144 EXPORT_PC
10145 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10146 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10147 mov r0, rSELF
10148 add r1, rFP, #OFF_FP_SHADOWFRAME
10149 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10150
10151/* ------------------------------ */
10152 .balign 128
10153.L_ALT_op_int_to_char: /* 0x8e */
10154/* File: arm/alt_stub.S */
10155/*
10156 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10157 * any interesting requests and then jump to the real instruction
10158 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10159 */
10160 .extern MterpCheckBefore
10161 EXPORT_PC
10162 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10163 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10164 mov r0, rSELF
10165 add r1, rFP, #OFF_FP_SHADOWFRAME
10166 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10167
10168/* ------------------------------ */
10169 .balign 128
10170.L_ALT_op_int_to_short: /* 0x8f */
10171/* File: arm/alt_stub.S */
10172/*
10173 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10174 * any interesting requests and then jump to the real instruction
10175 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10176 */
10177 .extern MterpCheckBefore
10178 EXPORT_PC
10179 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10180 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10181 mov r0, rSELF
10182 add r1, rFP, #OFF_FP_SHADOWFRAME
10183 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10184
10185/* ------------------------------ */
10186 .balign 128
10187.L_ALT_op_add_int: /* 0x90 */
10188/* File: arm/alt_stub.S */
10189/*
10190 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10191 * any interesting requests and then jump to the real instruction
10192 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10193 */
10194 .extern MterpCheckBefore
10195 EXPORT_PC
10196 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10197 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10198 mov r0, rSELF
10199 add r1, rFP, #OFF_FP_SHADOWFRAME
10200 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10201
10202/* ------------------------------ */
10203 .balign 128
10204.L_ALT_op_sub_int: /* 0x91 */
10205/* File: arm/alt_stub.S */
10206/*
10207 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10208 * any interesting requests and then jump to the real instruction
10209 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10210 */
10211 .extern MterpCheckBefore
10212 EXPORT_PC
10213 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10214 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10215 mov r0, rSELF
10216 add r1, rFP, #OFF_FP_SHADOWFRAME
10217 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10218
10219/* ------------------------------ */
10220 .balign 128
10221.L_ALT_op_mul_int: /* 0x92 */
10222/* File: arm/alt_stub.S */
10223/*
10224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10225 * any interesting requests and then jump to the real instruction
10226 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10227 */
10228 .extern MterpCheckBefore
10229 EXPORT_PC
10230 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10231 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10232 mov r0, rSELF
10233 add r1, rFP, #OFF_FP_SHADOWFRAME
10234 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10235
10236/* ------------------------------ */
10237 .balign 128
10238.L_ALT_op_div_int: /* 0x93 */
10239/* File: arm/alt_stub.S */
10240/*
10241 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10242 * any interesting requests and then jump to the real instruction
10243 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10244 */
10245 .extern MterpCheckBefore
10246 EXPORT_PC
10247 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10248 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10249 mov r0, rSELF
10250 add r1, rFP, #OFF_FP_SHADOWFRAME
10251 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10252
10253/* ------------------------------ */
10254 .balign 128
10255.L_ALT_op_rem_int: /* 0x94 */
10256/* File: arm/alt_stub.S */
10257/*
10258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10259 * any interesting requests and then jump to the real instruction
10260 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10261 */
10262 .extern MterpCheckBefore
10263 EXPORT_PC
10264 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10265 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10266 mov r0, rSELF
10267 add r1, rFP, #OFF_FP_SHADOWFRAME
10268 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10269
10270/* ------------------------------ */
10271 .balign 128
10272.L_ALT_op_and_int: /* 0x95 */
10273/* File: arm/alt_stub.S */
10274/*
10275 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10276 * any interesting requests and then jump to the real instruction
10277 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10278 */
10279 .extern MterpCheckBefore
10280 EXPORT_PC
10281 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10282 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10283 mov r0, rSELF
10284 add r1, rFP, #OFF_FP_SHADOWFRAME
10285 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10286
10287/* ------------------------------ */
10288 .balign 128
10289.L_ALT_op_or_int: /* 0x96 */
10290/* File: arm/alt_stub.S */
10291/*
10292 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10293 * any interesting requests and then jump to the real instruction
10294 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10295 */
10296 .extern MterpCheckBefore
10297 EXPORT_PC
10298 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10299 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10300 mov r0, rSELF
10301 add r1, rFP, #OFF_FP_SHADOWFRAME
10302 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10303
10304/* ------------------------------ */
10305 .balign 128
10306.L_ALT_op_xor_int: /* 0x97 */
10307/* File: arm/alt_stub.S */
10308/*
10309 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10310 * any interesting requests and then jump to the real instruction
10311 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10312 */
10313 .extern MterpCheckBefore
10314 EXPORT_PC
10315 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10316 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10317 mov r0, rSELF
10318 add r1, rFP, #OFF_FP_SHADOWFRAME
10319 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10320
10321/* ------------------------------ */
10322 .balign 128
10323.L_ALT_op_shl_int: /* 0x98 */
10324/* File: arm/alt_stub.S */
10325/*
10326 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10327 * any interesting requests and then jump to the real instruction
10328 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10329 */
10330 .extern MterpCheckBefore
10331 EXPORT_PC
10332 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10333 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10334 mov r0, rSELF
10335 add r1, rFP, #OFF_FP_SHADOWFRAME
10336 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10337
10338/* ------------------------------ */
10339 .balign 128
10340.L_ALT_op_shr_int: /* 0x99 */
10341/* File: arm/alt_stub.S */
10342/*
10343 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10344 * any interesting requests and then jump to the real instruction
10345 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10346 */
10347 .extern MterpCheckBefore
10348 EXPORT_PC
10349 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10350 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10351 mov r0, rSELF
10352 add r1, rFP, #OFF_FP_SHADOWFRAME
10353 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10354
10355/* ------------------------------ */
10356 .balign 128
10357.L_ALT_op_ushr_int: /* 0x9a */
10358/* File: arm/alt_stub.S */
10359/*
10360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10361 * any interesting requests and then jump to the real instruction
10362 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10363 */
10364 .extern MterpCheckBefore
10365 EXPORT_PC
10366 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10367 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10368 mov r0, rSELF
10369 add r1, rFP, #OFF_FP_SHADOWFRAME
10370 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10371
10372/* ------------------------------ */
10373 .balign 128
10374.L_ALT_op_add_long: /* 0x9b */
10375/* File: arm/alt_stub.S */
10376/*
10377 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10378 * any interesting requests and then jump to the real instruction
10379 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10380 */
10381 .extern MterpCheckBefore
10382 EXPORT_PC
10383 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10384 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10385 mov r0, rSELF
10386 add r1, rFP, #OFF_FP_SHADOWFRAME
10387 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10388
10389/* ------------------------------ */
10390 .balign 128
10391.L_ALT_op_sub_long: /* 0x9c */
10392/* File: arm/alt_stub.S */
10393/*
10394 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10395 * any interesting requests and then jump to the real instruction
10396 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10397 */
10398 .extern MterpCheckBefore
10399 EXPORT_PC
10400 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10401 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10402 mov r0, rSELF
10403 add r1, rFP, #OFF_FP_SHADOWFRAME
10404 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10405
10406/* ------------------------------ */
10407 .balign 128
10408.L_ALT_op_mul_long: /* 0x9d */
10409/* File: arm/alt_stub.S */
10410/*
10411 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10412 * any interesting requests and then jump to the real instruction
10413 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10414 */
10415 .extern MterpCheckBefore
10416 EXPORT_PC
10417 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10418 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10419 mov r0, rSELF
10420 add r1, rFP, #OFF_FP_SHADOWFRAME
10421 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10422
10423/* ------------------------------ */
10424 .balign 128
10425.L_ALT_op_div_long: /* 0x9e */
10426/* File: arm/alt_stub.S */
10427/*
10428 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10429 * any interesting requests and then jump to the real instruction
10430 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10431 */
10432 .extern MterpCheckBefore
10433 EXPORT_PC
10434 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10435 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10436 mov r0, rSELF
10437 add r1, rFP, #OFF_FP_SHADOWFRAME
10438 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10439
10440/* ------------------------------ */
10441 .balign 128
10442.L_ALT_op_rem_long: /* 0x9f */
10443/* File: arm/alt_stub.S */
10444/*
10445 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10446 * any interesting requests and then jump to the real instruction
10447 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10448 */
10449 .extern MterpCheckBefore
10450 EXPORT_PC
10451 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10452 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10453 mov r0, rSELF
10454 add r1, rFP, #OFF_FP_SHADOWFRAME
10455 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10456
10457/* ------------------------------ */
10458 .balign 128
10459.L_ALT_op_and_long: /* 0xa0 */
10460/* File: arm/alt_stub.S */
10461/*
10462 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10463 * any interesting requests and then jump to the real instruction
10464 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10465 */
10466 .extern MterpCheckBefore
10467 EXPORT_PC
10468 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10469 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10470 mov r0, rSELF
10471 add r1, rFP, #OFF_FP_SHADOWFRAME
10472 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10473
10474/* ------------------------------ */
10475 .balign 128
10476.L_ALT_op_or_long: /* 0xa1 */
10477/* File: arm/alt_stub.S */
10478/*
10479 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10480 * any interesting requests and then jump to the real instruction
10481 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10482 */
10483 .extern MterpCheckBefore
10484 EXPORT_PC
10485 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10486 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10487 mov r0, rSELF
10488 add r1, rFP, #OFF_FP_SHADOWFRAME
10489 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10490
10491/* ------------------------------ */
10492 .balign 128
10493.L_ALT_op_xor_long: /* 0xa2 */
10494/* File: arm/alt_stub.S */
10495/*
10496 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10497 * any interesting requests and then jump to the real instruction
10498 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10499 */
10500 .extern MterpCheckBefore
10501 EXPORT_PC
10502 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10503 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10504 mov r0, rSELF
10505 add r1, rFP, #OFF_FP_SHADOWFRAME
10506 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10507
10508/* ------------------------------ */
10509 .balign 128
10510.L_ALT_op_shl_long: /* 0xa3 */
10511/* File: arm/alt_stub.S */
10512/*
10513 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10514 * any interesting requests and then jump to the real instruction
10515 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10516 */
10517 .extern MterpCheckBefore
10518 EXPORT_PC
10519 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10520 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10521 mov r0, rSELF
10522 add r1, rFP, #OFF_FP_SHADOWFRAME
10523 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10524
10525/* ------------------------------ */
10526 .balign 128
10527.L_ALT_op_shr_long: /* 0xa4 */
10528/* File: arm/alt_stub.S */
10529/*
10530 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10531 * any interesting requests and then jump to the real instruction
10532 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10533 */
10534 .extern MterpCheckBefore
10535 EXPORT_PC
10536 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10537 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10538 mov r0, rSELF
10539 add r1, rFP, #OFF_FP_SHADOWFRAME
10540 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10541
10542/* ------------------------------ */
10543 .balign 128
10544.L_ALT_op_ushr_long: /* 0xa5 */
10545/* File: arm/alt_stub.S */
10546/*
10547 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10548 * any interesting requests and then jump to the real instruction
10549 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10550 */
10551 .extern MterpCheckBefore
10552 EXPORT_PC
10553 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10554 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10555 mov r0, rSELF
10556 add r1, rFP, #OFF_FP_SHADOWFRAME
10557 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10558
10559/* ------------------------------ */
10560 .balign 128
10561.L_ALT_op_add_float: /* 0xa6 */
10562/* File: arm/alt_stub.S */
10563/*
10564 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10565 * any interesting requests and then jump to the real instruction
10566 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10567 */
10568 .extern MterpCheckBefore
10569 EXPORT_PC
10570 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10571 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10572 mov r0, rSELF
10573 add r1, rFP, #OFF_FP_SHADOWFRAME
10574 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10575
10576/* ------------------------------ */
10577 .balign 128
10578.L_ALT_op_sub_float: /* 0xa7 */
10579/* File: arm/alt_stub.S */
10580/*
10581 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10582 * any interesting requests and then jump to the real instruction
10583 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10584 */
10585 .extern MterpCheckBefore
10586 EXPORT_PC
10587 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10588 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10589 mov r0, rSELF
10590 add r1, rFP, #OFF_FP_SHADOWFRAME
10591 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10592
10593/* ------------------------------ */
10594 .balign 128
10595.L_ALT_op_mul_float: /* 0xa8 */
10596/* File: arm/alt_stub.S */
10597/*
10598 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10599 * any interesting requests and then jump to the real instruction
10600 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10601 */
10602 .extern MterpCheckBefore
10603 EXPORT_PC
10604 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10605 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10606 mov r0, rSELF
10607 add r1, rFP, #OFF_FP_SHADOWFRAME
10608 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10609
10610/* ------------------------------ */
10611 .balign 128
10612.L_ALT_op_div_float: /* 0xa9 */
10613/* File: arm/alt_stub.S */
10614/*
10615 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10616 * any interesting requests and then jump to the real instruction
10617 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10618 */
10619 .extern MterpCheckBefore
10620 EXPORT_PC
10621 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10622 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10623 mov r0, rSELF
10624 add r1, rFP, #OFF_FP_SHADOWFRAME
10625 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10626
10627/* ------------------------------ */
10628 .balign 128
10629.L_ALT_op_rem_float: /* 0xaa */
10630/* File: arm/alt_stub.S */
10631/*
10632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10633 * any interesting requests and then jump to the real instruction
10634 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10635 */
10636 .extern MterpCheckBefore
10637 EXPORT_PC
10638 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10639 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10640 mov r0, rSELF
10641 add r1, rFP, #OFF_FP_SHADOWFRAME
10642 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10643
10644/* ------------------------------ */
10645 .balign 128
10646.L_ALT_op_add_double: /* 0xab */
10647/* File: arm/alt_stub.S */
10648/*
10649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10650 * any interesting requests and then jump to the real instruction
10651 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10652 */
10653 .extern MterpCheckBefore
10654 EXPORT_PC
10655 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10656 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10657 mov r0, rSELF
10658 add r1, rFP, #OFF_FP_SHADOWFRAME
10659 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10660
10661/* ------------------------------ */
10662 .balign 128
10663.L_ALT_op_sub_double: /* 0xac */
10664/* File: arm/alt_stub.S */
10665/*
10666 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10667 * any interesting requests and then jump to the real instruction
10668 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10669 */
10670 .extern MterpCheckBefore
10671 EXPORT_PC
10672 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10673 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10674 mov r0, rSELF
10675 add r1, rFP, #OFF_FP_SHADOWFRAME
10676 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10677
10678/* ------------------------------ */
10679 .balign 128
10680.L_ALT_op_mul_double: /* 0xad */
10681/* File: arm/alt_stub.S */
10682/*
10683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10684 * any interesting requests and then jump to the real instruction
10685 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10686 */
10687 .extern MterpCheckBefore
10688 EXPORT_PC
10689 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10690 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10691 mov r0, rSELF
10692 add r1, rFP, #OFF_FP_SHADOWFRAME
10693 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10694
10695/* ------------------------------ */
10696 .balign 128
10697.L_ALT_op_div_double: /* 0xae */
10698/* File: arm/alt_stub.S */
10699/*
10700 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10701 * any interesting requests and then jump to the real instruction
10702 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10703 */
10704 .extern MterpCheckBefore
10705 EXPORT_PC
10706 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10707 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10708 mov r0, rSELF
10709 add r1, rFP, #OFF_FP_SHADOWFRAME
10710 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10711
10712/* ------------------------------ */
10713 .balign 128
10714.L_ALT_op_rem_double: /* 0xaf */
10715/* File: arm/alt_stub.S */
10716/*
10717 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10718 * any interesting requests and then jump to the real instruction
10719 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10720 */
10721 .extern MterpCheckBefore
10722 EXPORT_PC
10723 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10724 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10725 mov r0, rSELF
10726 add r1, rFP, #OFF_FP_SHADOWFRAME
10727 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10728
10729/* ------------------------------ */
10730 .balign 128
10731.L_ALT_op_add_int_2addr: /* 0xb0 */
10732/* File: arm/alt_stub.S */
10733/*
10734 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10735 * any interesting requests and then jump to the real instruction
10736 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10737 */
10738 .extern MterpCheckBefore
10739 EXPORT_PC
10740 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10741 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10742 mov r0, rSELF
10743 add r1, rFP, #OFF_FP_SHADOWFRAME
10744 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10745
10746/* ------------------------------ */
10747 .balign 128
10748.L_ALT_op_sub_int_2addr: /* 0xb1 */
10749/* File: arm/alt_stub.S */
10750/*
10751 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10752 * any interesting requests and then jump to the real instruction
10753 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10754 */
10755 .extern MterpCheckBefore
10756 EXPORT_PC
10757 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10758 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10759 mov r0, rSELF
10760 add r1, rFP, #OFF_FP_SHADOWFRAME
10761 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10762
10763/* ------------------------------ */
10764 .balign 128
10765.L_ALT_op_mul_int_2addr: /* 0xb2 */
10766/* File: arm/alt_stub.S */
10767/*
10768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10769 * any interesting requests and then jump to the real instruction
10770 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10771 */
10772 .extern MterpCheckBefore
10773 EXPORT_PC
10774 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10775 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10776 mov r0, rSELF
10777 add r1, rFP, #OFF_FP_SHADOWFRAME
10778 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10779
10780/* ------------------------------ */
10781 .balign 128
10782.L_ALT_op_div_int_2addr: /* 0xb3 */
10783/* File: arm/alt_stub.S */
10784/*
10785 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10786 * any interesting requests and then jump to the real instruction
10787 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10788 */
10789 .extern MterpCheckBefore
10790 EXPORT_PC
10791 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10792 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
10793 mov r0, rSELF
10794 add r1, rFP, #OFF_FP_SHADOWFRAME
10795 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10796
10797/* ------------------------------ */
10798 .balign 128
10799.L_ALT_op_rem_int_2addr: /* 0xb4 */
10800/* File: arm/alt_stub.S */
10801/*
10802 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10803 * any interesting requests and then jump to the real instruction
10804 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10805 */
10806 .extern MterpCheckBefore
10807 EXPORT_PC
10808 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10809 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
10810 mov r0, rSELF
10811 add r1, rFP, #OFF_FP_SHADOWFRAME
10812 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10813
10814/* ------------------------------ */
10815 .balign 128
10816.L_ALT_op_and_int_2addr: /* 0xb5 */
10817/* File: arm/alt_stub.S */
10818/*
10819 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10820 * any interesting requests and then jump to the real instruction
10821 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10822 */
10823 .extern MterpCheckBefore
10824 EXPORT_PC
10825 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10826 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
10827 mov r0, rSELF
10828 add r1, rFP, #OFF_FP_SHADOWFRAME
10829 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10830
10831/* ------------------------------ */
10832 .balign 128
10833.L_ALT_op_or_int_2addr: /* 0xb6 */
10834/* File: arm/alt_stub.S */
10835/*
10836 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10837 * any interesting requests and then jump to the real instruction
10838 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10839 */
10840 .extern MterpCheckBefore
10841 EXPORT_PC
10842 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10843 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
10844 mov r0, rSELF
10845 add r1, rFP, #OFF_FP_SHADOWFRAME
10846 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10847
10848/* ------------------------------ */
10849 .balign 128
10850.L_ALT_op_xor_int_2addr: /* 0xb7 */
10851/* File: arm/alt_stub.S */
10852/*
10853 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10854 * any interesting requests and then jump to the real instruction
10855 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10856 */
10857 .extern MterpCheckBefore
10858 EXPORT_PC
10859 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10860 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
10861 mov r0, rSELF
10862 add r1, rFP, #OFF_FP_SHADOWFRAME
10863 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10864
10865/* ------------------------------ */
10866 .balign 128
10867.L_ALT_op_shl_int_2addr: /* 0xb8 */
10868/* File: arm/alt_stub.S */
10869/*
10870 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10871 * any interesting requests and then jump to the real instruction
10872 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10873 */
10874 .extern MterpCheckBefore
10875 EXPORT_PC
10876 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10877 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
10878 mov r0, rSELF
10879 add r1, rFP, #OFF_FP_SHADOWFRAME
10880 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10881
10882/* ------------------------------ */
10883 .balign 128
10884.L_ALT_op_shr_int_2addr: /* 0xb9 */
10885/* File: arm/alt_stub.S */
10886/*
10887 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10888 * any interesting requests and then jump to the real instruction
10889 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10890 */
10891 .extern MterpCheckBefore
10892 EXPORT_PC
10893 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10894 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
10895 mov r0, rSELF
10896 add r1, rFP, #OFF_FP_SHADOWFRAME
10897 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10898
10899/* ------------------------------ */
10900 .balign 128
10901.L_ALT_op_ushr_int_2addr: /* 0xba */
10902/* File: arm/alt_stub.S */
10903/*
10904 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10905 * any interesting requests and then jump to the real instruction
10906 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10907 */
10908 .extern MterpCheckBefore
10909 EXPORT_PC
10910 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10911 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
10912 mov r0, rSELF
10913 add r1, rFP, #OFF_FP_SHADOWFRAME
10914 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10915
10916/* ------------------------------ */
10917 .balign 128
10918.L_ALT_op_add_long_2addr: /* 0xbb */
10919/* File: arm/alt_stub.S */
10920/*
10921 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10922 * any interesting requests and then jump to the real instruction
10923 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10924 */
10925 .extern MterpCheckBefore
10926 EXPORT_PC
10927 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10928 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
10929 mov r0, rSELF
10930 add r1, rFP, #OFF_FP_SHADOWFRAME
10931 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10932
10933/* ------------------------------ */
10934 .balign 128
10935.L_ALT_op_sub_long_2addr: /* 0xbc */
10936/* File: arm/alt_stub.S */
10937/*
10938 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10939 * any interesting requests and then jump to the real instruction
10940 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10941 */
10942 .extern MterpCheckBefore
10943 EXPORT_PC
10944 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10945 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
10946 mov r0, rSELF
10947 add r1, rFP, #OFF_FP_SHADOWFRAME
10948 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10949
10950/* ------------------------------ */
10951 .balign 128
10952.L_ALT_op_mul_long_2addr: /* 0xbd */
10953/* File: arm/alt_stub.S */
10954/*
10955 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10956 * any interesting requests and then jump to the real instruction
10957 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10958 */
10959 .extern MterpCheckBefore
10960 EXPORT_PC
10961 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10962 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
10963 mov r0, rSELF
10964 add r1, rFP, #OFF_FP_SHADOWFRAME
10965 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10966
10967/* ------------------------------ */
10968 .balign 128
10969.L_ALT_op_div_long_2addr: /* 0xbe */
10970/* File: arm/alt_stub.S */
10971/*
10972 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10973 * any interesting requests and then jump to the real instruction
10974 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10975 */
10976 .extern MterpCheckBefore
10977 EXPORT_PC
10978 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10979 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
10980 mov r0, rSELF
10981 add r1, rFP, #OFF_FP_SHADOWFRAME
10982 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10983
10984/* ------------------------------ */
10985 .balign 128
10986.L_ALT_op_rem_long_2addr: /* 0xbf */
10987/* File: arm/alt_stub.S */
10988/*
10989 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10990 * any interesting requests and then jump to the real instruction
10991 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10992 */
10993 .extern MterpCheckBefore
10994 EXPORT_PC
10995 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10996 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
10997 mov r0, rSELF
10998 add r1, rFP, #OFF_FP_SHADOWFRAME
10999 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11000
11001/* ------------------------------ */
11002 .balign 128
11003.L_ALT_op_and_long_2addr: /* 0xc0 */
11004/* File: arm/alt_stub.S */
11005/*
11006 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11007 * any interesting requests and then jump to the real instruction
11008 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11009 */
11010 .extern MterpCheckBefore
11011 EXPORT_PC
11012 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11013 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
11014 mov r0, rSELF
11015 add r1, rFP, #OFF_FP_SHADOWFRAME
11016 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11017
11018/* ------------------------------ */
11019 .balign 128
11020.L_ALT_op_or_long_2addr: /* 0xc1 */
11021/* File: arm/alt_stub.S */
11022/*
11023 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11024 * any interesting requests and then jump to the real instruction
11025 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11026 */
11027 .extern MterpCheckBefore
11028 EXPORT_PC
11029 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11030 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
11031 mov r0, rSELF
11032 add r1, rFP, #OFF_FP_SHADOWFRAME
11033 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11034
11035/* ------------------------------ */
11036 .balign 128
11037.L_ALT_op_xor_long_2addr: /* 0xc2 */
11038/* File: arm/alt_stub.S */
11039/*
11040 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11041 * any interesting requests and then jump to the real instruction
11042 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11043 */
11044 .extern MterpCheckBefore
11045 EXPORT_PC
11046 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11047 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
11048 mov r0, rSELF
11049 add r1, rFP, #OFF_FP_SHADOWFRAME
11050 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11051
11052/* ------------------------------ */
11053 .balign 128
11054.L_ALT_op_shl_long_2addr: /* 0xc3 */
11055/* File: arm/alt_stub.S */
11056/*
11057 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11058 * any interesting requests and then jump to the real instruction
11059 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11060 */
11061 .extern MterpCheckBefore
11062 EXPORT_PC
11063 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11064 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11065 mov r0, rSELF
11066 add r1, rFP, #OFF_FP_SHADOWFRAME
11067 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11068
11069/* ------------------------------ */
11070 .balign 128
11071.L_ALT_op_shr_long_2addr: /* 0xc4 */
11072/* File: arm/alt_stub.S */
11073/*
11074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11075 * any interesting requests and then jump to the real instruction
11076 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11077 */
11078 .extern MterpCheckBefore
11079 EXPORT_PC
11080 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11081 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11082 mov r0, rSELF
11083 add r1, rFP, #OFF_FP_SHADOWFRAME
11084 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11085
11086/* ------------------------------ */
11087 .balign 128
11088.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11089/* File: arm/alt_stub.S */
11090/*
11091 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11092 * any interesting requests and then jump to the real instruction
11093 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11094 */
11095 .extern MterpCheckBefore
11096 EXPORT_PC
11097 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11098 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11099 mov r0, rSELF
11100 add r1, rFP, #OFF_FP_SHADOWFRAME
11101 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11102
11103/* ------------------------------ */
11104 .balign 128
11105.L_ALT_op_add_float_2addr: /* 0xc6 */
11106/* File: arm/alt_stub.S */
11107/*
11108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11109 * any interesting requests and then jump to the real instruction
11110 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11111 */
11112 .extern MterpCheckBefore
11113 EXPORT_PC
11114 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11115 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11116 mov r0, rSELF
11117 add r1, rFP, #OFF_FP_SHADOWFRAME
11118 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11119
11120/* ------------------------------ */
11121 .balign 128
11122.L_ALT_op_sub_float_2addr: /* 0xc7 */
11123/* File: arm/alt_stub.S */
11124/*
11125 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11126 * any interesting requests and then jump to the real instruction
11127 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11128 */
11129 .extern MterpCheckBefore
11130 EXPORT_PC
11131 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11132 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11133 mov r0, rSELF
11134 add r1, rFP, #OFF_FP_SHADOWFRAME
11135 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11136
11137/* ------------------------------ */
11138 .balign 128
11139.L_ALT_op_mul_float_2addr: /* 0xc8 */
11140/* File: arm/alt_stub.S */
11141/*
11142 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11143 * any interesting requests and then jump to the real instruction
11144 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11145 */
11146 .extern MterpCheckBefore
11147 EXPORT_PC
11148 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11149 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11150 mov r0, rSELF
11151 add r1, rFP, #OFF_FP_SHADOWFRAME
11152 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11153
11154/* ------------------------------ */
11155 .balign 128
11156.L_ALT_op_div_float_2addr: /* 0xc9 */
11157/* File: arm/alt_stub.S */
11158/*
11159 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11160 * any interesting requests and then jump to the real instruction
11161 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11162 */
11163 .extern MterpCheckBefore
11164 EXPORT_PC
11165 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11166 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11167 mov r0, rSELF
11168 add r1, rFP, #OFF_FP_SHADOWFRAME
11169 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11170
11171/* ------------------------------ */
11172 .balign 128
11173.L_ALT_op_rem_float_2addr: /* 0xca */
11174/* File: arm/alt_stub.S */
11175/*
11176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11177 * any interesting requests and then jump to the real instruction
11178 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11179 */
11180 .extern MterpCheckBefore
11181 EXPORT_PC
11182 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11183 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11184 mov r0, rSELF
11185 add r1, rFP, #OFF_FP_SHADOWFRAME
11186 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11187
11188/* ------------------------------ */
11189 .balign 128
11190.L_ALT_op_add_double_2addr: /* 0xcb */
11191/* File: arm/alt_stub.S */
11192/*
11193 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11194 * any interesting requests and then jump to the real instruction
11195 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11196 */
11197 .extern MterpCheckBefore
11198 EXPORT_PC
11199 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11200 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11201 mov r0, rSELF
11202 add r1, rFP, #OFF_FP_SHADOWFRAME
11203 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11204
11205/* ------------------------------ */
11206 .balign 128
11207.L_ALT_op_sub_double_2addr: /* 0xcc */
11208/* File: arm/alt_stub.S */
11209/*
11210 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11211 * any interesting requests and then jump to the real instruction
11212 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11213 */
11214 .extern MterpCheckBefore
11215 EXPORT_PC
11216 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11217 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11218 mov r0, rSELF
11219 add r1, rFP, #OFF_FP_SHADOWFRAME
11220 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11221
11222/* ------------------------------ */
11223 .balign 128
11224.L_ALT_op_mul_double_2addr: /* 0xcd */
11225/* File: arm/alt_stub.S */
11226/*
11227 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11228 * any interesting requests and then jump to the real instruction
11229 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11230 */
11231 .extern MterpCheckBefore
11232 EXPORT_PC
11233 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11234 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11235 mov r0, rSELF
11236 add r1, rFP, #OFF_FP_SHADOWFRAME
11237 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11238
11239/* ------------------------------ */
11240 .balign 128
11241.L_ALT_op_div_double_2addr: /* 0xce */
11242/* File: arm/alt_stub.S */
11243/*
11244 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11245 * any interesting requests and then jump to the real instruction
11246 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11247 */
11248 .extern MterpCheckBefore
11249 EXPORT_PC
11250 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11251 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11252 mov r0, rSELF
11253 add r1, rFP, #OFF_FP_SHADOWFRAME
11254 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11255
11256/* ------------------------------ */
11257 .balign 128
11258.L_ALT_op_rem_double_2addr: /* 0xcf */
11259/* File: arm/alt_stub.S */
11260/*
11261 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11262 * any interesting requests and then jump to the real instruction
11263 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11264 */
11265 .extern MterpCheckBefore
11266 EXPORT_PC
11267 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11268 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11269 mov r0, rSELF
11270 add r1, rFP, #OFF_FP_SHADOWFRAME
11271 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11272
11273/* ------------------------------ */
11274 .balign 128
11275.L_ALT_op_add_int_lit16: /* 0xd0 */
11276/* File: arm/alt_stub.S */
11277/*
11278 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11279 * any interesting requests and then jump to the real instruction
11280 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11281 */
11282 .extern MterpCheckBefore
11283 EXPORT_PC
11284 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11285 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11286 mov r0, rSELF
11287 add r1, rFP, #OFF_FP_SHADOWFRAME
11288 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11289
11290/* ------------------------------ */
11291 .balign 128
11292.L_ALT_op_rsub_int: /* 0xd1 */
11293/* File: arm/alt_stub.S */
11294/*
11295 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11296 * any interesting requests and then jump to the real instruction
11297 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11298 */
11299 .extern MterpCheckBefore
11300 EXPORT_PC
11301 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11302 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11303 mov r0, rSELF
11304 add r1, rFP, #OFF_FP_SHADOWFRAME
11305 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11306
11307/* ------------------------------ */
11308 .balign 128
11309.L_ALT_op_mul_int_lit16: /* 0xd2 */
11310/* File: arm/alt_stub.S */
11311/*
11312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11313 * any interesting requests and then jump to the real instruction
11314 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11315 */
11316 .extern MterpCheckBefore
11317 EXPORT_PC
11318 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11319 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11320 mov r0, rSELF
11321 add r1, rFP, #OFF_FP_SHADOWFRAME
11322 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11323
11324/* ------------------------------ */
11325 .balign 128
11326.L_ALT_op_div_int_lit16: /* 0xd3 */
11327/* File: arm/alt_stub.S */
11328/*
11329 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11330 * any interesting requests and then jump to the real instruction
11331 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11332 */
11333 .extern MterpCheckBefore
11334 EXPORT_PC
11335 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11336 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11337 mov r0, rSELF
11338 add r1, rFP, #OFF_FP_SHADOWFRAME
11339 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11340
11341/* ------------------------------ */
11342 .balign 128
11343.L_ALT_op_rem_int_lit16: /* 0xd4 */
11344/* File: arm/alt_stub.S */
11345/*
11346 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11347 * any interesting requests and then jump to the real instruction
11348 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11349 */
11350 .extern MterpCheckBefore
11351 EXPORT_PC
11352 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11353 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11354 mov r0, rSELF
11355 add r1, rFP, #OFF_FP_SHADOWFRAME
11356 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11357
11358/* ------------------------------ */
11359 .balign 128
11360.L_ALT_op_and_int_lit16: /* 0xd5 */
11361/* File: arm/alt_stub.S */
11362/*
11363 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11364 * any interesting requests and then jump to the real instruction
11365 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11366 */
11367 .extern MterpCheckBefore
11368 EXPORT_PC
11369 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11370 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11371 mov r0, rSELF
11372 add r1, rFP, #OFF_FP_SHADOWFRAME
11373 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11374
11375/* ------------------------------ */
11376 .balign 128
11377.L_ALT_op_or_int_lit16: /* 0xd6 */
11378/* File: arm/alt_stub.S */
11379/*
11380 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11381 * any interesting requests and then jump to the real instruction
11382 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11383 */
11384 .extern MterpCheckBefore
11385 EXPORT_PC
11386 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11387 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11388 mov r0, rSELF
11389 add r1, rFP, #OFF_FP_SHADOWFRAME
11390 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11391
11392/* ------------------------------ */
11393 .balign 128
11394.L_ALT_op_xor_int_lit16: /* 0xd7 */
11395/* File: arm/alt_stub.S */
11396/*
11397 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11398 * any interesting requests and then jump to the real instruction
11399 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11400 */
11401 .extern MterpCheckBefore
11402 EXPORT_PC
11403 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11404 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11405 mov r0, rSELF
11406 add r1, rFP, #OFF_FP_SHADOWFRAME
11407 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11408
11409/* ------------------------------ */
11410 .balign 128
11411.L_ALT_op_add_int_lit8: /* 0xd8 */
11412/* File: arm/alt_stub.S */
11413/*
11414 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11415 * any interesting requests and then jump to the real instruction
11416 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11417 */
11418 .extern MterpCheckBefore
11419 EXPORT_PC
11420 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11421 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11422 mov r0, rSELF
11423 add r1, rFP, #OFF_FP_SHADOWFRAME
11424 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11425
11426/* ------------------------------ */
11427 .balign 128
11428.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11429/* File: arm/alt_stub.S */
11430/*
11431 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11432 * any interesting requests and then jump to the real instruction
11433 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11434 */
11435 .extern MterpCheckBefore
11436 EXPORT_PC
11437 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11438 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11439 mov r0, rSELF
11440 add r1, rFP, #OFF_FP_SHADOWFRAME
11441 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11442
11443/* ------------------------------ */
11444 .balign 128
11445.L_ALT_op_mul_int_lit8: /* 0xda */
11446/* File: arm/alt_stub.S */
11447/*
11448 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11449 * any interesting requests and then jump to the real instruction
11450 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11451 */
11452 .extern MterpCheckBefore
11453 EXPORT_PC
11454 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11455 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11456 mov r0, rSELF
11457 add r1, rFP, #OFF_FP_SHADOWFRAME
11458 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11459
11460/* ------------------------------ */
11461 .balign 128
11462.L_ALT_op_div_int_lit8: /* 0xdb */
11463/* File: arm/alt_stub.S */
11464/*
11465 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11466 * any interesting requests and then jump to the real instruction
11467 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11468 */
11469 .extern MterpCheckBefore
11470 EXPORT_PC
11471 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11472 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11473 mov r0, rSELF
11474 add r1, rFP, #OFF_FP_SHADOWFRAME
11475 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11476
11477/* ------------------------------ */
11478 .balign 128
11479.L_ALT_op_rem_int_lit8: /* 0xdc */
11480/* File: arm/alt_stub.S */
11481/*
11482 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11483 * any interesting requests and then jump to the real instruction
11484 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11485 */
11486 .extern MterpCheckBefore
11487 EXPORT_PC
11488 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11489 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11490 mov r0, rSELF
11491 add r1, rFP, #OFF_FP_SHADOWFRAME
11492 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11493
11494/* ------------------------------ */
11495 .balign 128
11496.L_ALT_op_and_int_lit8: /* 0xdd */
11497/* File: arm/alt_stub.S */
11498/*
11499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11500 * any interesting requests and then jump to the real instruction
11501 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11502 */
11503 .extern MterpCheckBefore
11504 EXPORT_PC
11505 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11506 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11507 mov r0, rSELF
11508 add r1, rFP, #OFF_FP_SHADOWFRAME
11509 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11510
11511/* ------------------------------ */
11512 .balign 128
11513.L_ALT_op_or_int_lit8: /* 0xde */
11514/* File: arm/alt_stub.S */
11515/*
11516 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11517 * any interesting requests and then jump to the real instruction
11518 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11519 */
11520 .extern MterpCheckBefore
11521 EXPORT_PC
11522 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11523 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11524 mov r0, rSELF
11525 add r1, rFP, #OFF_FP_SHADOWFRAME
11526 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11527
11528/* ------------------------------ */
11529 .balign 128
11530.L_ALT_op_xor_int_lit8: /* 0xdf */
11531/* File: arm/alt_stub.S */
11532/*
11533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11534 * any interesting requests and then jump to the real instruction
11535 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11536 */
11537 .extern MterpCheckBefore
11538 EXPORT_PC
11539 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11540 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11541 mov r0, rSELF
11542 add r1, rFP, #OFF_FP_SHADOWFRAME
11543 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11544
11545/* ------------------------------ */
11546 .balign 128
11547.L_ALT_op_shl_int_lit8: /* 0xe0 */
11548/* File: arm/alt_stub.S */
11549/*
11550 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11551 * any interesting requests and then jump to the real instruction
11552 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11553 */
11554 .extern MterpCheckBefore
11555 EXPORT_PC
11556 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11557 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11558 mov r0, rSELF
11559 add r1, rFP, #OFF_FP_SHADOWFRAME
11560 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11561
11562/* ------------------------------ */
11563 .balign 128
11564.L_ALT_op_shr_int_lit8: /* 0xe1 */
11565/* File: arm/alt_stub.S */
11566/*
11567 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11568 * any interesting requests and then jump to the real instruction
11569 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11570 */
11571 .extern MterpCheckBefore
11572 EXPORT_PC
11573 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11574 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11575 mov r0, rSELF
11576 add r1, rFP, #OFF_FP_SHADOWFRAME
11577 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11578
11579/* ------------------------------ */
11580 .balign 128
11581.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11582/* File: arm/alt_stub.S */
11583/*
11584 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11585 * any interesting requests and then jump to the real instruction
11586 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11587 */
11588 .extern MterpCheckBefore
11589 EXPORT_PC
11590 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11591 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11592 mov r0, rSELF
11593 add r1, rFP, #OFF_FP_SHADOWFRAME
11594 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11595
11596/* ------------------------------ */
11597 .balign 128
11598.L_ALT_op_iget_quick: /* 0xe3 */
11599/* File: arm/alt_stub.S */
11600/*
11601 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11602 * any interesting requests and then jump to the real instruction
11603 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11604 */
11605 .extern MterpCheckBefore
11606 EXPORT_PC
11607 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11608 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11609 mov r0, rSELF
11610 add r1, rFP, #OFF_FP_SHADOWFRAME
11611 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11612
11613/* ------------------------------ */
11614 .balign 128
11615.L_ALT_op_iget_wide_quick: /* 0xe4 */
11616/* File: arm/alt_stub.S */
11617/*
11618 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11619 * any interesting requests and then jump to the real instruction
11620 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11621 */
11622 .extern MterpCheckBefore
11623 EXPORT_PC
11624 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11625 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11626 mov r0, rSELF
11627 add r1, rFP, #OFF_FP_SHADOWFRAME
11628 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11629
11630/* ------------------------------ */
11631 .balign 128
11632.L_ALT_op_iget_object_quick: /* 0xe5 */
11633/* File: arm/alt_stub.S */
11634/*
11635 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11636 * any interesting requests and then jump to the real instruction
11637 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11638 */
11639 .extern MterpCheckBefore
11640 EXPORT_PC
11641 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11642 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11643 mov r0, rSELF
11644 add r1, rFP, #OFF_FP_SHADOWFRAME
11645 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11646
11647/* ------------------------------ */
11648 .balign 128
11649.L_ALT_op_iput_quick: /* 0xe6 */
11650/* File: arm/alt_stub.S */
11651/*
11652 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11653 * any interesting requests and then jump to the real instruction
11654 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11655 */
11656 .extern MterpCheckBefore
11657 EXPORT_PC
11658 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11659 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11660 mov r0, rSELF
11661 add r1, rFP, #OFF_FP_SHADOWFRAME
11662 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11663
11664/* ------------------------------ */
11665 .balign 128
11666.L_ALT_op_iput_wide_quick: /* 0xe7 */
11667/* File: arm/alt_stub.S */
11668/*
11669 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11670 * any interesting requests and then jump to the real instruction
11671 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11672 */
11673 .extern MterpCheckBefore
11674 EXPORT_PC
11675 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11676 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11677 mov r0, rSELF
11678 add r1, rFP, #OFF_FP_SHADOWFRAME
11679 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11680
11681/* ------------------------------ */
11682 .balign 128
11683.L_ALT_op_iput_object_quick: /* 0xe8 */
11684/* File: arm/alt_stub.S */
11685/*
11686 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11687 * any interesting requests and then jump to the real instruction
11688 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11689 */
11690 .extern MterpCheckBefore
11691 EXPORT_PC
11692 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11693 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11694 mov r0, rSELF
11695 add r1, rFP, #OFF_FP_SHADOWFRAME
11696 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11697
11698/* ------------------------------ */
11699 .balign 128
11700.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11701/* File: arm/alt_stub.S */
11702/*
11703 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11704 * any interesting requests and then jump to the real instruction
11705 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11706 */
11707 .extern MterpCheckBefore
11708 EXPORT_PC
11709 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11710 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11711 mov r0, rSELF
11712 add r1, rFP, #OFF_FP_SHADOWFRAME
11713 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11714
11715/* ------------------------------ */
11716 .balign 128
11717.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11718/* File: arm/alt_stub.S */
11719/*
11720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11721 * any interesting requests and then jump to the real instruction
11722 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11723 */
11724 .extern MterpCheckBefore
11725 EXPORT_PC
11726 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11727 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11728 mov r0, rSELF
11729 add r1, rFP, #OFF_FP_SHADOWFRAME
11730 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11731
11732/* ------------------------------ */
11733 .balign 128
11734.L_ALT_op_iput_boolean_quick: /* 0xeb */
11735/* File: arm/alt_stub.S */
11736/*
11737 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11738 * any interesting requests and then jump to the real instruction
11739 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11740 */
11741 .extern MterpCheckBefore
11742 EXPORT_PC
11743 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11744 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11745 mov r0, rSELF
11746 add r1, rFP, #OFF_FP_SHADOWFRAME
11747 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11748
11749/* ------------------------------ */
11750 .balign 128
11751.L_ALT_op_iput_byte_quick: /* 0xec */
11752/* File: arm/alt_stub.S */
11753/*
11754 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11755 * any interesting requests and then jump to the real instruction
11756 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11757 */
11758 .extern MterpCheckBefore
11759 EXPORT_PC
11760 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11761 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11762 mov r0, rSELF
11763 add r1, rFP, #OFF_FP_SHADOWFRAME
11764 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11765
11766/* ------------------------------ */
11767 .balign 128
11768.L_ALT_op_iput_char_quick: /* 0xed */
11769/* File: arm/alt_stub.S */
11770/*
11771 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11772 * any interesting requests and then jump to the real instruction
11773 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11774 */
11775 .extern MterpCheckBefore
11776 EXPORT_PC
11777 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11778 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11779 mov r0, rSELF
11780 add r1, rFP, #OFF_FP_SHADOWFRAME
11781 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11782
11783/* ------------------------------ */
11784 .balign 128
11785.L_ALT_op_iput_short_quick: /* 0xee */
11786/* File: arm/alt_stub.S */
11787/*
11788 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11789 * any interesting requests and then jump to the real instruction
11790 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11791 */
11792 .extern MterpCheckBefore
11793 EXPORT_PC
11794 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11795 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
11796 mov r0, rSELF
11797 add r1, rFP, #OFF_FP_SHADOWFRAME
11798 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11799
11800/* ------------------------------ */
11801 .balign 128
11802.L_ALT_op_iget_boolean_quick: /* 0xef */
11803/* File: arm/alt_stub.S */
11804/*
11805 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11806 * any interesting requests and then jump to the real instruction
11807 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11808 */
11809 .extern MterpCheckBefore
11810 EXPORT_PC
11811 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11812 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
11813 mov r0, rSELF
11814 add r1, rFP, #OFF_FP_SHADOWFRAME
11815 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11816
11817/* ------------------------------ */
11818 .balign 128
11819.L_ALT_op_iget_byte_quick: /* 0xf0 */
11820/* File: arm/alt_stub.S */
11821/*
11822 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11823 * any interesting requests and then jump to the real instruction
11824 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11825 */
11826 .extern MterpCheckBefore
11827 EXPORT_PC
11828 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11829 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
11830 mov r0, rSELF
11831 add r1, rFP, #OFF_FP_SHADOWFRAME
11832 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11833
11834/* ------------------------------ */
11835 .balign 128
11836.L_ALT_op_iget_char_quick: /* 0xf1 */
11837/* File: arm/alt_stub.S */
11838/*
11839 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11840 * any interesting requests and then jump to the real instruction
11841 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11842 */
11843 .extern MterpCheckBefore
11844 EXPORT_PC
11845 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11846 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
11847 mov r0, rSELF
11848 add r1, rFP, #OFF_FP_SHADOWFRAME
11849 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11850
11851/* ------------------------------ */
11852 .balign 128
11853.L_ALT_op_iget_short_quick: /* 0xf2 */
11854/* File: arm/alt_stub.S */
11855/*
11856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11857 * any interesting requests and then jump to the real instruction
11858 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11859 */
11860 .extern MterpCheckBefore
11861 EXPORT_PC
11862 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11863 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
11864 mov r0, rSELF
11865 add r1, rFP, #OFF_FP_SHADOWFRAME
11866 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11867
11868/* ------------------------------ */
11869 .balign 128
11870.L_ALT_op_invoke_lambda: /* 0xf3 */
11871/* File: arm/alt_stub.S */
11872/*
11873 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11874 * any interesting requests and then jump to the real instruction
11875 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11876 */
11877 .extern MterpCheckBefore
11878 EXPORT_PC
11879 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11880 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
11881 mov r0, rSELF
11882 add r1, rFP, #OFF_FP_SHADOWFRAME
11883 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11884
11885/* ------------------------------ */
11886 .balign 128
11887.L_ALT_op_unused_f4: /* 0xf4 */
11888/* File: arm/alt_stub.S */
11889/*
11890 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11891 * any interesting requests and then jump to the real instruction
11892 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11893 */
11894 .extern MterpCheckBefore
11895 EXPORT_PC
11896 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11897 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
11898 mov r0, rSELF
11899 add r1, rFP, #OFF_FP_SHADOWFRAME
11900 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11901
11902/* ------------------------------ */
11903 .balign 128
11904.L_ALT_op_capture_variable: /* 0xf5 */
11905/* File: arm/alt_stub.S */
11906/*
11907 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11908 * any interesting requests and then jump to the real instruction
11909 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11910 */
11911 .extern MterpCheckBefore
11912 EXPORT_PC
11913 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11914 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
11915 mov r0, rSELF
11916 add r1, rFP, #OFF_FP_SHADOWFRAME
11917 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11918
11919/* ------------------------------ */
11920 .balign 128
11921.L_ALT_op_create_lambda: /* 0xf6 */
11922/* File: arm/alt_stub.S */
11923/*
11924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11925 * any interesting requests and then jump to the real instruction
11926 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11927 */
11928 .extern MterpCheckBefore
11929 EXPORT_PC
11930 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11931 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
11932 mov r0, rSELF
11933 add r1, rFP, #OFF_FP_SHADOWFRAME
11934 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11935
11936/* ------------------------------ */
11937 .balign 128
11938.L_ALT_op_liberate_variable: /* 0xf7 */
11939/* File: arm/alt_stub.S */
11940/*
11941 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11942 * any interesting requests and then jump to the real instruction
11943 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11944 */
11945 .extern MterpCheckBefore
11946 EXPORT_PC
11947 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11948 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
11949 mov r0, rSELF
11950 add r1, rFP, #OFF_FP_SHADOWFRAME
11951 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11952
11953/* ------------------------------ */
11954 .balign 128
11955.L_ALT_op_box_lambda: /* 0xf8 */
11956/* File: arm/alt_stub.S */
11957/*
11958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11959 * any interesting requests and then jump to the real instruction
11960 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11961 */
11962 .extern MterpCheckBefore
11963 EXPORT_PC
11964 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11965 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
11966 mov r0, rSELF
11967 add r1, rFP, #OFF_FP_SHADOWFRAME
11968 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11969
11970/* ------------------------------ */
11971 .balign 128
11972.L_ALT_op_unbox_lambda: /* 0xf9 */
11973/* File: arm/alt_stub.S */
11974/*
11975 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11976 * any interesting requests and then jump to the real instruction
11977 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11978 */
11979 .extern MterpCheckBefore
11980 EXPORT_PC
11981 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11982 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
11983 mov r0, rSELF
11984 add r1, rFP, #OFF_FP_SHADOWFRAME
11985 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11986
11987/* ------------------------------ */
11988 .balign 128
11989.L_ALT_op_unused_fa: /* 0xfa */
11990/* File: arm/alt_stub.S */
11991/*
11992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11993 * any interesting requests and then jump to the real instruction
11994 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11995 */
11996 .extern MterpCheckBefore
11997 EXPORT_PC
11998 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11999 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
12000 mov r0, rSELF
12001 add r1, rFP, #OFF_FP_SHADOWFRAME
12002 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12003
12004/* ------------------------------ */
12005 .balign 128
12006.L_ALT_op_unused_fb: /* 0xfb */
12007/* File: arm/alt_stub.S */
12008/*
12009 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12010 * any interesting requests and then jump to the real instruction
12011 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12012 */
12013 .extern MterpCheckBefore
12014 EXPORT_PC
12015 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12016 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
12017 mov r0, rSELF
12018 add r1, rFP, #OFF_FP_SHADOWFRAME
12019 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12020
12021/* ------------------------------ */
12022 .balign 128
12023.L_ALT_op_unused_fc: /* 0xfc */
12024/* File: arm/alt_stub.S */
12025/*
12026 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12027 * any interesting requests and then jump to the real instruction
12028 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12029 */
12030 .extern MterpCheckBefore
12031 EXPORT_PC
12032 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12033 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
12034 mov r0, rSELF
12035 add r1, rFP, #OFF_FP_SHADOWFRAME
12036 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12037
12038/* ------------------------------ */
12039 .balign 128
12040.L_ALT_op_unused_fd: /* 0xfd */
12041/* File: arm/alt_stub.S */
12042/*
12043 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12044 * any interesting requests and then jump to the real instruction
12045 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12046 */
12047 .extern MterpCheckBefore
12048 EXPORT_PC
12049 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12050 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
12051 mov r0, rSELF
12052 add r1, rFP, #OFF_FP_SHADOWFRAME
12053 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12054
12055/* ------------------------------ */
12056 .balign 128
12057.L_ALT_op_unused_fe: /* 0xfe */
12058/* File: arm/alt_stub.S */
12059/*
12060 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12061 * any interesting requests and then jump to the real instruction
12062 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12063 */
12064 .extern MterpCheckBefore
12065 EXPORT_PC
12066 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12067 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12068 mov r0, rSELF
12069 add r1, rFP, #OFF_FP_SHADOWFRAME
12070 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12071
12072/* ------------------------------ */
12073 .balign 128
12074.L_ALT_op_unused_ff: /* 0xff */
12075/* File: arm/alt_stub.S */
12076/*
12077 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12078 * any interesting requests and then jump to the real instruction
12079 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12080 */
12081 .extern MterpCheckBefore
12082 EXPORT_PC
12083 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12084 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12085 mov r0, rSELF
12086 add r1, rFP, #OFF_FP_SHADOWFRAME
12087 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12088
12089 .balign 128
12090 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12091 .global artMterpAsmAltInstructionEnd
12092artMterpAsmAltInstructionEnd:
12093/* File: arm/footer.S */
12094/*
12095 * ===========================================================================
12096 * Common subroutines and data
12097 * ===========================================================================
12098 */
12099
12100 .text
12101 .align 2
12102
12103/*
12104 * We've detected a condition that will result in an exception, but the exception
12105 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12106 * TUNING: for consistency, we may want to just go ahead and handle these here.
12107 */
buzbee1452bee2015-03-06 14:43:04 -080012108common_errDivideByZero:
12109 EXPORT_PC
12110#if MTERP_LOGGING
12111 mov r0, rSELF
12112 add r1, rFP, #OFF_FP_SHADOWFRAME
12113 bl MterpLogDivideByZeroException
12114#endif
12115 b MterpCommonFallback
12116
12117common_errArrayIndex:
12118 EXPORT_PC
12119#if MTERP_LOGGING
12120 mov r0, rSELF
12121 add r1, rFP, #OFF_FP_SHADOWFRAME
12122 bl MterpLogArrayIndexException
12123#endif
12124 b MterpCommonFallback
12125
12126common_errNegativeArraySize:
12127 EXPORT_PC
12128#if MTERP_LOGGING
12129 mov r0, rSELF
12130 add r1, rFP, #OFF_FP_SHADOWFRAME
12131 bl MterpLogNegativeArraySizeException
12132#endif
12133 b MterpCommonFallback
12134
12135common_errNoSuchMethod:
12136 EXPORT_PC
12137#if MTERP_LOGGING
12138 mov r0, rSELF
12139 add r1, rFP, #OFF_FP_SHADOWFRAME
12140 bl MterpLogNoSuchMethodException
12141#endif
12142 b MterpCommonFallback
12143
12144common_errNullObject:
12145 EXPORT_PC
12146#if MTERP_LOGGING
12147 mov r0, rSELF
12148 add r1, rFP, #OFF_FP_SHADOWFRAME
12149 bl MterpLogNullObjectException
12150#endif
12151 b MterpCommonFallback
12152
12153common_exceptionThrown:
12154 EXPORT_PC
12155#if MTERP_LOGGING
12156 mov r0, rSELF
12157 add r1, rFP, #OFF_FP_SHADOWFRAME
12158 bl MterpLogExceptionThrownException
12159#endif
12160 b MterpCommonFallback
12161
12162MterpSuspendFallback:
12163 EXPORT_PC
12164#if MTERP_LOGGING
12165 mov r0, rSELF
12166 add r1, rFP, #OFF_FP_SHADOWFRAME
12167 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12168 bl MterpLogSuspendFallback
12169#endif
12170 b MterpCommonFallback
12171
12172/*
12173 * If we're here, something is out of the ordinary. If there is a pending
12174 * exception, handle it. Otherwise, roll back and retry with the reference
12175 * interpreter.
12176 */
12177MterpPossibleException:
12178 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12179 cmp r0, #0 @ Exception pending?
12180 beq MterpFallback @ If not, fall back to reference interpreter.
12181 /* intentional fallthrough - handle pending exception. */
12182/*
12183 * On return from a runtime helper routine, we've found a pending exception.
12184 * Can we handle it here - or need to bail out to caller?
12185 *
12186 */
12187MterpException:
12188 mov r0, rSELF
12189 add r1, rFP, #OFF_FP_SHADOWFRAME
12190 bl MterpHandleException @ (self, shadow_frame)
12191 cmp r0, #0
12192 beq MterpExceptionReturn @ no local catch, back to caller.
12193 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12194 ldr r1, [rFP, #OFF_FP_DEX_PC]
12195 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12196 add rPC, r0, #CODEITEM_INSNS_OFFSET
12197 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
Bill Buzbeefd522f92016-02-11 22:37:42 +000012198 /* Do we need to switch interpreters? */
12199 bl MterpShouldSwitchInterpreters
12200 cmp r0, #0
12201 bne MterpFallback
buzbee1452bee2015-03-06 14:43:04 -080012202 /* resume execution at catch block */
Bill Buzbeefd522f92016-02-11 22:37:42 +000012203 EXPORT_PC
buzbee1452bee2015-03-06 14:43:04 -080012204 FETCH_INST
12205 GET_INST_OPCODE ip
12206 GOTO_OPCODE ip
12207 /* NOTE: no fallthrough */
12208
12209/*
12210 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12211 * still needs to get the opcode and branch to it, and flags are in lr.
12212 */
12213MterpCheckSuspendAndContinue:
12214 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
buzbee1452bee2015-03-06 14:43:04 -080012215 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
Bill Buzbeefd522f92016-02-11 22:37:42 +000012216 bne 1f
buzbee1452bee2015-03-06 14:43:04 -080012217 GET_INST_OPCODE ip @ extract opcode from rINST
12218 GOTO_OPCODE ip @ jump to next instruction
Bill Buzbeefd522f92016-02-11 22:37:42 +0000122191:
12220 EXPORT_PC
12221 mov r0, rSELF
12222 bl MterpSuspendCheck @ (self)
12223 cmp r0, #0
12224 bne MterpFallback
12225 GET_INST_OPCODE ip @ extract opcode from rINST
12226 GOTO_OPCODE ip @ jump to next instruction
12227
12228/*
12229 * On-stack replacement has happened, and now we've returned from the compiled method.
12230 */
12231MterpOnStackReplacement:
12232#if MTERP_LOGGING
12233 mov r0, rSELF
12234 add r1, rFP, #OFF_FP_SHADOWFRAME
12235 mov r2, rINST
12236 bl MterpLogOSR
12237#endif
12238 mov r0, #1 @ Signal normal return
12239 b MterpDone
buzbee1452bee2015-03-06 14:43:04 -080012240
12241/*
12242 * Bail out to reference interpreter.
12243 */
12244MterpFallback:
12245 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -080012246#if MTERP_LOGGING
buzbee1452bee2015-03-06 14:43:04 -080012247 mov r0, rSELF
12248 add r1, rFP, #OFF_FP_SHADOWFRAME
12249 bl MterpLogFallback
buzbee76833da2016-01-13 13:06:22 -080012250#endif
buzbee1452bee2015-03-06 14:43:04 -080012251MterpCommonFallback:
12252 mov r0, #0 @ signal retry with reference interpreter.
12253 b MterpDone
12254
12255/*
12256 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12257 * SP and LR. Here we restore SP, restore the registers, and then restore
12258 * LR to PC.
12259 *
12260 * On entry:
12261 * uint32_t* rFP (should still be live, pointer to base of vregs)
12262 */
12263MterpExceptionReturn:
buzbee1452bee2015-03-06 14:43:04 -080012264 mov r0, #1 @ signal return to caller.
12265 b MterpDone
12266MterpReturn:
12267 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
buzbee1452bee2015-03-06 14:43:04 -080012268 str r0, [r2]
12269 str r1, [r2, #4]
buzbee1452bee2015-03-06 14:43:04 -080012270 mov r0, #1 @ signal return to caller.
12271MterpDone:
12272 add sp, sp, #4 @ un-align 64
12273 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12274
12275
12276 .fnend
12277 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12278
12279