blob: 7d442c0b4b887cef8b4f1cbbca846c5847e21dd4 [file] [log] [blame]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001/*
2 * This file was generated automatically by gen-mterp.py for 'arm64'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: arm64/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 xFP 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 xFP &
37 number_of_vregs_.
38
39 */
40
41/*
42ARM64 Runtime register usage conventions.
43
44 r0 : w0 is 32-bit return register and x0 is 64-bit.
45 r0-r7 : Argument registers.
46 r8-r15 : Caller save registers (used as temporary registers).
47 r16-r17: Also known as ip0-ip1, respectively. Used as scratch registers by
48 the linker, by the trampolines and other stubs (the backend uses
49 these as temporary registers).
50 r18 : Caller save register (used as temporary register).
51 r19 : Pointer to thread-local storage.
52 r20-r29: Callee save registers.
53 r30 : (lr) is reserved (the link register).
54 rsp : (sp) is reserved (the stack pointer).
55 rzr : (zr) is reserved (the zero register).
56
57 Floating-point registers
58 v0-v31
59
60 v0 : s0 is return register for singles (32-bit) and d0 for doubles (64-bit).
61 This is analogous to the C/C++ (hard-float) calling convention.
62 v0-v7 : Floating-point argument registers in both Dalvik and C/C++ conventions.
63 Also used as temporary and codegen scratch registers.
64
65 v0-v7 and v16-v31 : trashed across C calls.
66 v8-v15 : bottom 64-bits preserved across C calls (d8-d15 are preserved).
67
68 v16-v31: Used as codegen temp/scratch.
69 v8-v15 : Can be used for promotion.
70
71 Must maintain 16-byte stack alignment.
72
73Mterp notes:
74
75The following registers have fixed assignments:
76
77 reg nick purpose
78 x20 xPC interpreted program counter, used for fetching instructions
79 x21 xFP interpreted frame pointer, used for accessing locals and args
80 x22 xSELF self (Thread) pointer
81 x23 xINST first 16-bit code unit of current instruction
82 x24 xIBASE interpreted instruction base pointer, used for computed goto
83 x25 xREFS base of object references in shadow frame (ideally, we'll get rid of this later).
Bill Buzbee1d011d92016-04-04 16:59:29 +000084 x26 wPROFILE jit profile hotness countdown
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000085 x16 ip scratch reg
86 x17 ip2 scratch reg (used by macros)
87
88Macros are provided for common operations. They MUST NOT alter unspecified registers or condition
89codes.
90*/
91
92/*
93 * This is a #include, not a %include, because we want the C pre-processor
94 * to expand the macros into assembler assignment statements.
95 */
96#include "asm_support.h"
97
Bill Buzbeefd522f92016-02-11 22:37:42 +000098#define MTERP_PROFILE_BRANCHES 1
99#define MTERP_LOGGING 0
100
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000101/* During bringup, we'll use the shadow frame model instead of xFP */
102/* single-purpose registers, given names for clarity */
Bill Buzbee1d011d92016-04-04 16:59:29 +0000103#define xPC x20
104#define xFP x21
105#define xSELF x22
106#define xINST x23
107#define wINST w23
108#define xIBASE x24
109#define xREFS x25
110#define wPROFILE w26
111#define xPROFILE x26
112#define ip x16
113#define ip2 x17
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000114
115/*
116 * Instead of holding a pointer to the shadow frame, we keep xFP at the base of the vregs. So,
117 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
118 */
119#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
120#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
121#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
122#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
123#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
124#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
125#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
126#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
Bill Buzbee1d011d92016-04-04 16:59:29 +0000127#define OFF_FP_SHADOWFRAME OFF_FP(0)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000128
129/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000130 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
131 * be done *before* something throws.
132 *
133 * It's okay to do this more than once.
134 *
135 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
136 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
137 * offset into the code_items_[] array. For effiency, we will "export" the
138 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
139 * to convert to a dex pc when needed.
140 */
141.macro EXPORT_PC
142 str xPC, [xFP, #OFF_FP_DEX_PC_PTR]
143.endm
144
145/*
146 * Fetch the next instruction from xPC into wINST. Does not advance xPC.
147 */
148.macro FETCH_INST
149 ldrh wINST, [xPC]
150.endm
151
152/*
153 * Fetch the next instruction from the specified offset. Advances xPC
154 * to point to the next instruction. "_count" is in 16-bit code units.
155 *
156 * Because of the limited size of immediate constants on ARM, this is only
157 * suitable for small forward movements (i.e. don't try to implement "goto"
158 * with this).
159 *
160 * This must come AFTER anything that can throw an exception, or the
161 * exception catch may miss. (This also implies that it must come after
162 * EXPORT_PC.)
163 */
164.macro FETCH_ADVANCE_INST count
165 ldrh wINST, [xPC, #((\count)*2)]!
166.endm
167
168/*
169 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
170 * src and dest registers are parameterized (not hard-wired to xPC and xINST).
171 */
172.macro PREFETCH_ADVANCE_INST dreg, sreg, count
173 ldrh \dreg, [\sreg, #((\count)*2)]!
174.endm
175
176/*
177 * Similar to FETCH_ADVANCE_INST, but does not update xPC. Used to load
178 * xINST ahead of possible exception point. Be sure to manually advance xPC
179 * later.
180 */
181.macro PREFETCH_INST count
182 ldrh wINST, [xPC, #((\count)*2)]
183.endm
184
185/* Advance xPC by some number of code units. */
186.macro ADVANCE count
187 add xPC, xPC, #((\count)*2)
188.endm
189
190/*
191 * Fetch the next instruction from an offset specified by _reg and advance xPC.
192 * xPC to point to the next instruction. "_reg" must specify the distance
193 * in bytes, *not* 16-bit code units, and may be a signed value. Must not set flags.
194 *
195 */
196.macro FETCH_ADVANCE_INST_RB reg
197 add xPC, xPC, \reg, sxtw
198 ldrh wINST, [xPC]
199.endm
200
201/*
202 * Fetch a half-word code unit from an offset past the current PC. The
203 * "_count" value is in 16-bit code units. Does not advance xPC.
204 *
205 * The "_S" variant works the same but treats the value as signed.
206 */
207.macro FETCH reg, count
208 ldrh \reg, [xPC, #((\count)*2)]
209.endm
210
211.macro FETCH_S reg, count
212 ldrsh \reg, [xPC, #((\count)*2)]
213.endm
214
215/*
216 * Fetch one byte from an offset past the current PC. Pass in the same
217 * "_count" as you would for FETCH, and an additional 0/1 indicating which
218 * byte of the halfword you want (lo/hi).
219 */
220.macro FETCH_B reg, count, byte
221 ldrb \reg, [xPC, #((\count)*2+(\byte))]
222.endm
223
224/*
225 * Put the instruction's opcode field into the specified register.
226 */
227.macro GET_INST_OPCODE reg
228 and \reg, xINST, #255
229.endm
230
231/*
232 * Put the prefetched instruction's opcode field into the specified register.
233 */
234.macro GET_PREFETCHED_OPCODE oreg, ireg
235 and \oreg, \ireg, #255
236.endm
237
238/*
239 * Begin executing the opcode in _reg. Clobbers reg
240 */
241
242.macro GOTO_OPCODE reg
243 add \reg, xIBASE, \reg, lsl #7
244 br \reg
245.endm
246.macro GOTO_OPCODE_BASE base,reg
247 add \reg, \base, \reg, lsl #7
248 br \reg
249.endm
250
251/*
252 * Get/set the 32-bit value from a Dalvik register.
253 */
254.macro GET_VREG reg, vreg
255 ldr \reg, [xFP, \vreg, uxtw #2]
256.endm
257.macro SET_VREG reg, vreg
258 str \reg, [xFP, \vreg, uxtw #2]
259 str wzr, [xREFS, \vreg, uxtw #2]
260.endm
261.macro SET_VREG_OBJECT reg, vreg, tmpreg
262 str \reg, [xFP, \vreg, uxtw #2]
263 str \reg, [xREFS, \vreg, uxtw #2]
264.endm
265
266/*
267 * Get/set the 64-bit value from a Dalvik register.
268 * TUNING: can we do better here?
269 */
270.macro GET_VREG_WIDE reg, vreg
271 add ip2, xFP, \vreg, lsl #2
272 ldr \reg, [ip2]
273.endm
274.macro SET_VREG_WIDE reg, vreg
275 add ip2, xFP, \vreg, lsl #2
276 str \reg, [ip2]
277 add ip2, xREFS, \vreg, lsl #2
278 str xzr, [ip2]
279.endm
280
281/*
Vladimir Marko20421b92016-07-26 16:38:11 +0100282 * Get the 32-bit value from a Dalvik register and sign-extend to 64-bit.
283 * Used to avoid an extra instruction in int-to-long.
284 */
285.macro GET_VREG_S reg, vreg
286 ldrsw \reg, [xFP, \vreg, uxtw #2]
287.endm
288
289/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000290 * Convert a virtual register index into an address.
291 */
292.macro VREG_INDEX_TO_ADDR reg, vreg
buzbeeace690f2016-03-11 09:51:11 -0800293 add \reg, xFP, \vreg, lsl #2 /* WARNING: handle shadow frame vreg zero if store */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000294.endm
295
296/*
297 * Refresh handler table.
298 */
299.macro REFRESH_IBASE
300 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
301.endm
302
Vladimir Marko112aa102016-12-01 11:53:54 +0000303/*
304 * Save two registers to the stack.
305 */
306.macro SAVE_TWO_REGS reg1, reg2, offset
307 stp \reg1, \reg2, [sp, #(\offset)]
308 .cfi_rel_offset \reg1, (\offset)
309 .cfi_rel_offset \reg2, (\offset) + 8
310.endm
311
312/*
313 * Restore two registers from the stack.
314 */
315.macro RESTORE_TWO_REGS reg1, reg2, offset
316 ldp \reg1, \reg2, [sp, #(\offset)]
317 .cfi_restore \reg1
318 .cfi_restore \reg2
319.endm
320
321/*
322 * Increase frame size and save two registers to the bottom of the stack.
323 */
324.macro SAVE_TWO_REGS_INCREASE_FRAME reg1, reg2, frame_adjustment
325 stp \reg1, \reg2, [sp, #-(\frame_adjustment)]!
326 .cfi_adjust_cfa_offset (\frame_adjustment)
327 .cfi_rel_offset \reg1, 0
328 .cfi_rel_offset \reg2, 8
329.endm
330
331/*
332 * Restore two registers from the bottom of the stack and decrease frame size.
333 */
334.macro RESTORE_TWO_REGS_DECREASE_FRAME reg1, reg2, frame_adjustment
335 ldp \reg1, \reg2, [sp], #(\frame_adjustment)
336 .cfi_restore \reg1
337 .cfi_restore \reg2
338 .cfi_adjust_cfa_offset -(\frame_adjustment)
339.endm
340
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000341/* File: arm64/entry.S */
342/*
343 * Copyright (C) 2016 The Android Open Source Project
344 *
345 * Licensed under the Apache License, Version 2.0 (the "License");
346 * you may not use this file except in compliance with the License.
347 * You may obtain a copy of the License at
348 *
349 * http://www.apache.org/licenses/LICENSE-2.0
350 *
351 * Unless required by applicable law or agreed to in writing, software
352 * distributed under the License is distributed on an "AS IS" BASIS,
353 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
354 * See the License for the specific language governing permissions and
355 * limitations under the License.
356 */
357
358 .text
359
360/*
361 * Interpreter entry point.
362 * On entry:
363 * x0 Thread* self/
364 * x1 code_item
365 * x2 ShadowFrame
366 * x3 JValue* result_register
367 *
368 */
369 .global ExecuteMterpImpl
370 .type ExecuteMterpImpl, %function
371 .balign 16
372
373ExecuteMterpImpl:
374 .cfi_startproc
Vladimir Marko112aa102016-12-01 11:53:54 +0000375 SAVE_TWO_REGS_INCREASE_FRAME xPROFILE, x27, 80
376 SAVE_TWO_REGS xIBASE, xREFS, 16
377 SAVE_TWO_REGS xSELF, xINST, 32
378 SAVE_TWO_REGS xPC, xFP, 48
379 SAVE_TWO_REGS fp, lr, 64
Bill Buzbee1d011d92016-04-04 16:59:29 +0000380 add fp, sp, #64
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000381
382 /* Remember the return register */
383 str x3, [x2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
384
385 /* Remember the code_item */
386 str x1, [x2, #SHADOWFRAME_CODE_ITEM_OFFSET]
387
388 /* set up "named" registers */
389 mov xSELF, x0
390 ldr w0, [x2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
buzbeeace690f2016-03-11 09:51:11 -0800391 add xFP, x2, #SHADOWFRAME_VREGS_OFFSET // point to vregs.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000392 add xREFS, xFP, w0, lsl #2 // point to reference array in shadow frame
393 ldr w0, [x2, #SHADOWFRAME_DEX_PC_OFFSET] // Get starting dex_pc.
394 add xPC, x1, #CODEITEM_INSNS_OFFSET // Point to base of insns[]
395 add xPC, xPC, w0, lsl #1 // Create direct pointer to 1st dex opcode
396 EXPORT_PC
397
398 /* Starting ibase */
399 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
400
Bill Buzbee1d011d92016-04-04 16:59:29 +0000401 /* Set up for backwards branches & osr profiling */
402 ldr x0, [xFP, #OFF_FP_METHOD]
403 add x1, xFP, #OFF_FP_SHADOWFRAME
404 bl MterpSetUpHotnessCountdown
405 mov wPROFILE, w0 // Starting hotness countdown to xPROFILE
406
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000407 /* start executing the instruction at rPC */
408 FETCH_INST // load wINST from rPC
409 GET_INST_OPCODE ip // extract opcode from wINST
410 GOTO_OPCODE ip // jump to next instruction
411 /* NOTE: no fallthrough */
412
413
414 .global artMterpAsmInstructionStart
415 .type artMterpAsmInstructionStart, %function
416artMterpAsmInstructionStart = .L_op_nop
417 .text
418
419/* ------------------------------ */
420 .balign 128
421.L_op_nop: /* 0x00 */
422/* File: arm64/op_nop.S */
423 FETCH_ADVANCE_INST 1 // advance to next instr, load rINST
424 GET_INST_OPCODE ip // ip<- opcode from rINST
425 GOTO_OPCODE ip // execute it
426
427/* ------------------------------ */
428 .balign 128
429.L_op_move: /* 0x01 */
430/* File: arm64/op_move.S */
431 /* for move, move-object, long-to-int */
432 /* op vA, vB */
433 lsr w1, wINST, #12 // x1<- B from 15:12
434 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
435 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
436 GET_VREG w2, w1 // x2<- fp[B]
437 GET_INST_OPCODE ip // ip<- opcode from wINST
438 .if 0
439 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
440 .else
441 SET_VREG w2, w0 // fp[A]<- x2
442 .endif
443 GOTO_OPCODE ip // execute next instruction
444
445/* ------------------------------ */
446 .balign 128
447.L_op_move_from16: /* 0x02 */
448/* File: arm64/op_move_from16.S */
449 /* for: move/from16, move-object/from16 */
450 /* op vAA, vBBBB */
451 FETCH w1, 1 // r1<- BBBB
452 lsr w0, wINST, #8 // r0<- AA
453 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
454 GET_VREG w2, w1 // r2<- fp[BBBB]
455 GET_INST_OPCODE ip // extract opcode from wINST
456 .if 0
457 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
458 .else
459 SET_VREG w2, w0 // fp[AA]<- r2
460 .endif
461 GOTO_OPCODE ip // jump to next instruction
462
463/* ------------------------------ */
464 .balign 128
465.L_op_move_16: /* 0x03 */
466/* File: arm64/op_move_16.S */
467 /* for: move/16, move-object/16 */
468 /* op vAAAA, vBBBB */
469 FETCH w1, 2 // w1<- BBBB
470 FETCH w0, 1 // w0<- AAAA
471 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
472 GET_VREG w2, w1 // w2<- fp[BBBB]
473 GET_INST_OPCODE ip // extract opcode from xINST
474 .if 0
475 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
476 .else
477 SET_VREG w2, w0 // fp[AAAA]<- w2
478 .endif
479 GOTO_OPCODE ip // jump to next instruction
480
481/* ------------------------------ */
482 .balign 128
483.L_op_move_wide: /* 0x04 */
484/* File: arm64/op_move_wide.S */
485 /* move-wide vA, vB */
486 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
487 lsr w3, wINST, #12 // w3<- B
488 ubfx w2, wINST, #8, #4 // w2<- A
489 GET_VREG_WIDE x3, w3
490 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
491 GET_INST_OPCODE ip // extract opcode from wINST
492 SET_VREG_WIDE x3, w2
493 GOTO_OPCODE ip // jump to next instruction
494
495/* ------------------------------ */
496 .balign 128
497.L_op_move_wide_from16: /* 0x05 */
498/* File: arm64/op_move_wide_from16.S */
499 /* move-wide/from16 vAA, vBBBB */
500 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
501 FETCH w3, 1 // w3<- BBBB
502 lsr w2, wINST, #8 // w2<- AA
503 GET_VREG_WIDE x3, w3
504 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
505 GET_INST_OPCODE ip // extract opcode from wINST
506 SET_VREG_WIDE x3, w2
507 GOTO_OPCODE ip // jump to next instruction
508
509/* ------------------------------ */
510 .balign 128
511.L_op_move_wide_16: /* 0x06 */
512/* File: arm64/op_move_wide_16.S */
513 /* move-wide/16 vAAAA, vBBBB */
514 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
515 FETCH w3, 2 // w3<- BBBB
516 FETCH w2, 1 // w2<- AAAA
517 GET_VREG_WIDE x3, w3
518 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
519 SET_VREG_WIDE x3, w2
520 GET_INST_OPCODE ip // extract opcode from rINST
521 GOTO_OPCODE ip // jump to next instruction
522
523/* ------------------------------ */
524 .balign 128
525.L_op_move_object: /* 0x07 */
526/* File: arm64/op_move_object.S */
527/* File: arm64/op_move.S */
528 /* for move, move-object, long-to-int */
529 /* op vA, vB */
530 lsr w1, wINST, #12 // x1<- B from 15:12
531 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
532 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
533 GET_VREG w2, w1 // x2<- fp[B]
534 GET_INST_OPCODE ip // ip<- opcode from wINST
535 .if 1
536 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
537 .else
538 SET_VREG w2, w0 // fp[A]<- x2
539 .endif
540 GOTO_OPCODE ip // execute next instruction
541
542
543/* ------------------------------ */
544 .balign 128
545.L_op_move_object_from16: /* 0x08 */
546/* File: arm64/op_move_object_from16.S */
547/* File: arm64/op_move_from16.S */
548 /* for: move/from16, move-object/from16 */
549 /* op vAA, vBBBB */
550 FETCH w1, 1 // r1<- BBBB
551 lsr w0, wINST, #8 // r0<- AA
552 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
553 GET_VREG w2, w1 // r2<- fp[BBBB]
554 GET_INST_OPCODE ip // extract opcode from wINST
555 .if 1
556 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
557 .else
558 SET_VREG w2, w0 // fp[AA]<- r2
559 .endif
560 GOTO_OPCODE ip // jump to next instruction
561
562
563/* ------------------------------ */
564 .balign 128
565.L_op_move_object_16: /* 0x09 */
566/* File: arm64/op_move_object_16.S */
567/* File: arm64/op_move_16.S */
568 /* for: move/16, move-object/16 */
569 /* op vAAAA, vBBBB */
570 FETCH w1, 2 // w1<- BBBB
571 FETCH w0, 1 // w0<- AAAA
572 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
573 GET_VREG w2, w1 // w2<- fp[BBBB]
574 GET_INST_OPCODE ip // extract opcode from xINST
575 .if 1
576 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
577 .else
578 SET_VREG w2, w0 // fp[AAAA]<- w2
579 .endif
580 GOTO_OPCODE ip // jump to next instruction
581
582
583/* ------------------------------ */
584 .balign 128
585.L_op_move_result: /* 0x0a */
586/* File: arm64/op_move_result.S */
587 /* for: move-result, move-result-object */
588 /* op vAA */
589 lsr w2, wINST, #8 // r2<- AA
590 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
591 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
592 ldr w0, [x0] // r0 <- result.i.
593 GET_INST_OPCODE ip // extract opcode from wINST
594 .if 0
595 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
596 .else
597 SET_VREG w0, w2 // fp[AA]<- r0
598 .endif
599 GOTO_OPCODE ip // jump to next instruction
600
601/* ------------------------------ */
602 .balign 128
603.L_op_move_result_wide: /* 0x0b */
604/* File: arm64/op_move_result_wide.S */
605 /* for: move-result-wide */
606 /* op vAA */
607 lsr w2, wINST, #8 // r2<- AA
608 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
609 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
610 ldr x0, [x0] // r0 <- result.i.
611 GET_INST_OPCODE ip // extract opcode from wINST
612 SET_VREG_WIDE x0, x2 // fp[AA]<- r0
613 GOTO_OPCODE ip // jump to next instruction
614
615/* ------------------------------ */
616 .balign 128
617.L_op_move_result_object: /* 0x0c */
618/* File: arm64/op_move_result_object.S */
619/* File: arm64/op_move_result.S */
620 /* for: move-result, move-result-object */
621 /* op vAA */
622 lsr w2, wINST, #8 // r2<- AA
623 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
624 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
625 ldr w0, [x0] // r0 <- result.i.
626 GET_INST_OPCODE ip // extract opcode from wINST
627 .if 1
628 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
629 .else
630 SET_VREG w0, w2 // fp[AA]<- r0
631 .endif
632 GOTO_OPCODE ip // jump to next instruction
633
634
635/* ------------------------------ */
636 .balign 128
637.L_op_move_exception: /* 0x0d */
638/* File: arm64/op_move_exception.S */
639 /* move-exception vAA */
640 lsr w2, wINST, #8 // w2<- AA
641 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
642 mov x1, #0 // w1<- 0
643 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
644 SET_VREG_OBJECT w3, w2 // fp[AA]<- exception obj
645 GET_INST_OPCODE ip // extract opcode from rINST
646 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // clear exception
647 GOTO_OPCODE ip // jump to next instruction
648
649/* ------------------------------ */
650 .balign 128
651.L_op_return_void: /* 0x0e */
652/* File: arm64/op_return_void.S */
653 .extern MterpThreadFenceForConstructor
654 bl MterpThreadFenceForConstructor
655 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
656 mov x0, xSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700657 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000658 b.ne .Lop_return_void_check
659.Lop_return_void_return:
660 mov x0, #0
661 b MterpReturn
662.Lop_return_void_check:
663 bl MterpSuspendCheck // (self)
664 b .Lop_return_void_return
665
666/* ------------------------------ */
667 .balign 128
668.L_op_return: /* 0x0f */
669/* File: arm64/op_return.S */
670 /*
671 * Return a 32-bit value.
672 *
673 * for: return, return-object
674 */
675 /* op vAA */
676 .extern MterpThreadFenceForConstructor
677 bl MterpThreadFenceForConstructor
678 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
679 mov x0, xSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700680 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000681 b.ne .Lop_return_check
682.Lop_return_return:
683 lsr w2, wINST, #8 // r2<- AA
684 GET_VREG w0, w2 // r0<- vAA
685 b MterpReturn
686.Lop_return_check:
687 bl MterpSuspendCheck // (self)
688 b .Lop_return_return
689
690/* ------------------------------ */
691 .balign 128
692.L_op_return_wide: /* 0x10 */
693/* File: arm64/op_return_wide.S */
694 /*
695 * Return a 64-bit value.
696 */
697 /* return-wide vAA */
698 /* op vAA */
699 .extern MterpThreadFenceForConstructor
700 bl MterpThreadFenceForConstructor
701 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
702 mov x0, xSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700703 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000704 b.ne .Lop_return_wide_check
705.Lop_return_wide_return:
706 lsr w2, wINST, #8 // w2<- AA
707 GET_VREG_WIDE x0, w2 // x0<- vAA
708 b MterpReturn
709.Lop_return_wide_check:
710 bl MterpSuspendCheck // (self)
711 b .Lop_return_wide_return
712
713/* ------------------------------ */
714 .balign 128
715.L_op_return_object: /* 0x11 */
716/* File: arm64/op_return_object.S */
717/* File: arm64/op_return.S */
718 /*
719 * Return a 32-bit value.
720 *
721 * for: return, return-object
722 */
723 /* op vAA */
724 .extern MterpThreadFenceForConstructor
725 bl MterpThreadFenceForConstructor
726 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
727 mov x0, xSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700728 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000729 b.ne .Lop_return_object_check
730.Lop_return_object_return:
731 lsr w2, wINST, #8 // r2<- AA
732 GET_VREG w0, w2 // r0<- vAA
733 b MterpReturn
734.Lop_return_object_check:
735 bl MterpSuspendCheck // (self)
736 b .Lop_return_object_return
737
738
739/* ------------------------------ */
740 .balign 128
741.L_op_const_4: /* 0x12 */
742/* File: arm64/op_const_4.S */
743 /* const/4 vA, #+B */
Vladimir Marko20421b92016-07-26 16:38:11 +0100744 sbfx w1, wINST, #12, #4 // w1<- sssssssB
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000745 ubfx w0, wINST, #8, #4 // w0<- A
746 FETCH_ADVANCE_INST 1 // advance xPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000747 GET_INST_OPCODE ip // ip<- opcode from xINST
748 SET_VREG w1, w0 // fp[A]<- w1
749 GOTO_OPCODE ip // execute next instruction
750
751/* ------------------------------ */
752 .balign 128
753.L_op_const_16: /* 0x13 */
754/* File: arm64/op_const_16.S */
755 /* const/16 vAA, #+BBBB */
Vladimir Marko20421b92016-07-26 16:38:11 +0100756 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000757 lsr w3, wINST, #8 // w3<- AA
758 FETCH_ADVANCE_INST 2 // advance xPC, load wINST
759 SET_VREG w0, w3 // vAA<- w0
760 GET_INST_OPCODE ip // extract opcode from wINST
761 GOTO_OPCODE ip // jump to next instruction
762
763/* ------------------------------ */
764 .balign 128
765.L_op_const: /* 0x14 */
766/* File: arm64/op_const.S */
767 /* const vAA, #+BBBBbbbb */
768 lsr w3, wINST, #8 // w3<- AA
769 FETCH w0, 1 // w0<- bbbb (low
770 FETCH w1, 2 // w1<- BBBB (high
771 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
772 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
773 GET_INST_OPCODE ip // extract opcode from wINST
774 SET_VREG w0, w3 // vAA<- w0
775 GOTO_OPCODE ip // jump to next instruction
776
777/* ------------------------------ */
778 .balign 128
779.L_op_const_high16: /* 0x15 */
780/* File: arm64/op_const_high16.S */
781 /* const/high16 vAA, #+BBBB0000 */
Vladimir Marko20421b92016-07-26 16:38:11 +0100782 FETCH w0, 1 // r0<- 0000BBBB (zero-extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000783 lsr w3, wINST, #8 // r3<- AA
784 lsl w0, w0, #16 // r0<- BBBB0000
785 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
786 SET_VREG w0, w3 // vAA<- r0
787 GET_INST_OPCODE ip // extract opcode from rINST
788 GOTO_OPCODE ip // jump to next instruction
789
790/* ------------------------------ */
791 .balign 128
792.L_op_const_wide_16: /* 0x16 */
793/* File: arm64/op_const_wide_16.S */
794 /* const-wide/16 vAA, #+BBBB */
Vladimir Markoe6220222016-07-20 14:25:30 +0100795 FETCH_S x0, 1 // x0<- ssssssssssssBBBB (sign-extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000796 lsr w3, wINST, #8 // w3<- AA
797 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000798 GET_INST_OPCODE ip // extract opcode from rINST
799 SET_VREG_WIDE x0, w3
800 GOTO_OPCODE ip // jump to next instruction
801
802/* ------------------------------ */
803 .balign 128
804.L_op_const_wide_32: /* 0x17 */
805/* File: arm64/op_const_wide_32.S */
806 /* const-wide/32 vAA, #+BBBBbbbb */
Vladimir Markoe6220222016-07-20 14:25:30 +0100807 FETCH w0, 1 // x0<- 000000000000bbbb (low)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000808 lsr w3, wINST, #8 // w3<- AA
Vladimir Markoe6220222016-07-20 14:25:30 +0100809 FETCH_S x2, 2 // x2<- ssssssssssssBBBB (high)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000810 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
811 GET_INST_OPCODE ip // extract opcode from wINST
Vladimir Markoe6220222016-07-20 14:25:30 +0100812 orr x0, x0, x2, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000813 SET_VREG_WIDE x0, w3
814 GOTO_OPCODE ip // jump to next instruction
815
816/* ------------------------------ */
817 .balign 128
818.L_op_const_wide: /* 0x18 */
819/* File: arm64/op_const_wide.S */
820 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
821 FETCH w0, 1 // w0<- bbbb (low)
822 FETCH w1, 2 // w1<- BBBB (low middle)
823 FETCH w2, 3 // w2<- hhhh (high middle)
824 FETCH w3, 4 // w3<- HHHH (high)
825 lsr w4, wINST, #8 // r4<- AA
826 FETCH_ADVANCE_INST 5 // advance rPC, load wINST
827 GET_INST_OPCODE ip // extract opcode from wINST
828 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
829 orr x0, x0, x2, lsl #32 // w0<- hhhhBBBBbbbb
830 orr x0, x0, x3, lsl #48 // w0<- HHHHhhhhBBBBbbbb
831 SET_VREG_WIDE x0, w4
832 GOTO_OPCODE ip // jump to next instruction
833
834/* ------------------------------ */
835 .balign 128
836.L_op_const_wide_high16: /* 0x19 */
837/* File: arm64/op_const_wide_high16.S */
838 /* const-wide/high16 vAA, #+BBBB000000000000 */
839 FETCH w0, 1 // w0<- 0000BBBB (zero-extended)
840 lsr w1, wINST, #8 // w1<- AA
841 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
842 lsl x0, x0, #48
843 SET_VREG_WIDE x0, w1
844 GET_INST_OPCODE ip // extract opcode from wINST
845 GOTO_OPCODE ip // jump to next instruction
846
847/* ------------------------------ */
848 .balign 128
849.L_op_const_string: /* 0x1a */
850/* File: arm64/op_const_string.S */
851 /* const/string vAA, String//BBBB */
852 EXPORT_PC
853 FETCH w0, 1 // w0<- BBBB
854 lsr w1, wINST, #8 // w1<- AA
855 add x2, xFP, #OFF_FP_SHADOWFRAME
856 mov x3, xSELF
857 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
858 PREFETCH_INST 2 // load rINST
859 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
860 ADVANCE 2 // advance rPC
861 GET_INST_OPCODE ip // extract opcode from rINST
862 GOTO_OPCODE ip // jump to next instruction
863
864/* ------------------------------ */
865 .balign 128
866.L_op_const_string_jumbo: /* 0x1b */
867/* File: arm64/op_const_string_jumbo.S */
868 /* const/string vAA, String//BBBBBBBB */
869 EXPORT_PC
870 FETCH w0, 1 // w0<- bbbb (low
871 FETCH w2, 2 // w2<- BBBB (high
872 lsr w1, wINST, #8 // w1<- AA
873 orr w0, w0, w2, lsl #16 // w1<- BBBBbbbb
874 add x2, xFP, #OFF_FP_SHADOWFRAME
875 mov x3, xSELF
876 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
877 PREFETCH_INST 3 // advance rPC
878 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
879 ADVANCE 3 // advance rPC
880 GET_INST_OPCODE ip // extract opcode from rINST
881 GOTO_OPCODE ip // jump to next instruction
882
883/* ------------------------------ */
884 .balign 128
885.L_op_const_class: /* 0x1c */
886/* File: arm64/op_const_class.S */
887 /* const/class vAA, Class//BBBB */
888 EXPORT_PC
889 FETCH w0, 1 // w0<- BBBB
890 lsr w1, wINST, #8 // w1<- AA
891 add x2, xFP, #OFF_FP_SHADOWFRAME
892 mov x3, xSELF
893 bl MterpConstClass // (index, tgt_reg, shadow_frame, self)
894 PREFETCH_INST 2
895 cbnz w0, MterpPossibleException
896 ADVANCE 2
897 GET_INST_OPCODE ip // extract opcode from rINST
898 GOTO_OPCODE ip // jump to next instruction
899
900/* ------------------------------ */
901 .balign 128
902.L_op_monitor_enter: /* 0x1d */
903/* File: arm64/op_monitor_enter.S */
904 /*
905 * Synchronize on an object.
906 */
907 /* monitor-enter vAA */
908 EXPORT_PC
909 lsr w2, wINST, #8 // w2<- AA
910 GET_VREG w0, w2 // w0<- vAA (object)
911 mov x1, xSELF // w1<- self
912 bl artLockObjectFromCode
913 cbnz w0, MterpException
914 FETCH_ADVANCE_INST 1
915 GET_INST_OPCODE ip // extract opcode from rINST
916 GOTO_OPCODE ip // jump to next instruction
917
918/* ------------------------------ */
919 .balign 128
920.L_op_monitor_exit: /* 0x1e */
921/* File: arm64/op_monitor_exit.S */
922 /*
923 * Unlock an object.
924 *
925 * Exceptions that occur when unlocking a monitor need to appear as
926 * if they happened at the following instruction. See the Dalvik
927 * instruction spec.
928 */
929 /* monitor-exit vAA */
930 EXPORT_PC
931 lsr w2, wINST, #8 // w2<- AA
932 GET_VREG w0, w2 // w0<- vAA (object)
933 mov x1, xSELF // w0<- self
934 bl artUnlockObjectFromCode // w0<- success for unlock(self, obj)
935 cbnz w0, MterpException
936 FETCH_ADVANCE_INST 1 // before throw: advance rPC, load rINST
937 GET_INST_OPCODE ip // extract opcode from rINST
938 GOTO_OPCODE ip // jump to next instruction
939
940/* ------------------------------ */
941 .balign 128
942.L_op_check_cast: /* 0x1f */
943/* File: arm64/op_check_cast.S */
944 /*
945 * Check to see if a cast from one class to another is allowed.
946 */
947 /* check-cast vAA, class//BBBB */
948 EXPORT_PC
949 FETCH w0, 1 // w0<- BBBB
950 lsr w1, wINST, #8 // w1<- AA
951 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
952 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
953 mov x3, xSELF // w3<- self
954 bl MterpCheckCast // (index, &obj, method, self)
955 PREFETCH_INST 2
956 cbnz w0, MterpPossibleException
957 ADVANCE 2
958 GET_INST_OPCODE ip // extract opcode from rINST
959 GOTO_OPCODE ip // jump to next instruction
960
961/* ------------------------------ */
962 .balign 128
963.L_op_instance_of: /* 0x20 */
964/* File: arm64/op_instance_of.S */
965 /*
966 * Check to see if an object reference is an instance of a class.
967 *
968 * Most common situation is a non-null object, being compared against
969 * an already-resolved class.
970 */
971 /* instance-of vA, vB, class//CCCC */
972 EXPORT_PC
973 FETCH w0, 1 // w0<- CCCC
974 lsr w1, wINST, #12 // w1<- B
975 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
976 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
977 mov x3, xSELF // w3<- self
978 bl MterpInstanceOf // (index, &obj, method, self)
979 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
Vladimir Markoe6220222016-07-20 14:25:30 +0100980 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000981 PREFETCH_INST 2
982 cbnz x1, MterpException
983 ADVANCE 2 // advance rPC
984 SET_VREG w0, w2 // vA<- w0
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_array_length: /* 0x21 */
991/* File: arm64/op_array_length.S */
992 /*
993 * Return the length of an array.
994 */
995 lsr w1, wINST, #12 // w1<- B
996 ubfx w2, wINST, #8, #4 // w2<- A
997 GET_VREG w0, w1 // w0<- vB (object ref)
998 cbz w0, common_errNullObject // yup, fail
999 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
1000 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- array length
1001 GET_INST_OPCODE ip // extract opcode from rINST
1002 SET_VREG w3, w2 // vB<- length
1003 GOTO_OPCODE ip // jump to next instruction
1004
1005/* ------------------------------ */
1006 .balign 128
1007.L_op_new_instance: /* 0x22 */
1008/* File: arm64/op_new_instance.S */
1009 /*
1010 * Create a new instance of a class.
1011 */
1012 /* new-instance vAA, class//BBBB */
1013 EXPORT_PC
1014 add x0, xFP, #OFF_FP_SHADOWFRAME
1015 mov x1, xSELF
1016 mov w2, wINST
1017 bl MterpNewInstance // (shadow_frame, self, inst_data)
1018 cbz w0, MterpPossibleException
1019 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1020 GET_INST_OPCODE ip // extract opcode from rINST
1021 GOTO_OPCODE ip // jump to next instruction
1022
1023/* ------------------------------ */
1024 .balign 128
1025.L_op_new_array: /* 0x23 */
1026/* File: arm64/op_new_array.S */
1027 /*
1028 * Allocate an array of objects, specified with the array class
1029 * and a count.
1030 *
1031 * The verifier guarantees that this is an array class, so we don't
1032 * check for it here.
1033 */
1034 /* new-array vA, vB, class//CCCC */
1035 EXPORT_PC
1036 add x0, xFP, #OFF_FP_SHADOWFRAME
1037 mov x1, xPC
1038 mov w2, wINST
1039 mov x3, xSELF
1040 bl MterpNewArray
1041 cbz w0, MterpPossibleException
1042 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1043 GET_INST_OPCODE ip // extract opcode from rINST
1044 GOTO_OPCODE ip // jump to next instruction
1045
1046/* ------------------------------ */
1047 .balign 128
1048.L_op_filled_new_array: /* 0x24 */
1049/* File: arm64/op_filled_new_array.S */
1050 /*
1051 * Create a new array with elements filled from registers.
1052 *
1053 * for: filled-new-array, filled-new-array/range
1054 */
1055 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1056 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1057 .extern MterpFilledNewArray
1058 EXPORT_PC
1059 add x0, xFP, #OFF_FP_SHADOWFRAME
1060 mov x1, xPC
1061 mov x2, xSELF
1062 bl MterpFilledNewArray
1063 cbz w0, MterpPossibleException
1064 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1065 GET_INST_OPCODE ip // extract opcode from rINST
1066 GOTO_OPCODE ip // jump to next instruction
1067
1068/* ------------------------------ */
1069 .balign 128
1070.L_op_filled_new_array_range: /* 0x25 */
1071/* File: arm64/op_filled_new_array_range.S */
1072/* File: arm64/op_filled_new_array.S */
1073 /*
1074 * Create a new array with elements filled from registers.
1075 *
1076 * for: filled-new-array, filled-new-array/range
1077 */
1078 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1079 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1080 .extern MterpFilledNewArrayRange
1081 EXPORT_PC
1082 add x0, xFP, #OFF_FP_SHADOWFRAME
1083 mov x1, xPC
1084 mov x2, xSELF
1085 bl MterpFilledNewArrayRange
1086 cbz w0, MterpPossibleException
1087 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1088 GET_INST_OPCODE ip // extract opcode from rINST
1089 GOTO_OPCODE ip // jump to next instruction
1090
1091
1092/* ------------------------------ */
1093 .balign 128
1094.L_op_fill_array_data: /* 0x26 */
1095/* File: arm64/op_fill_array_data.S */
1096 /* fill-array-data vAA, +BBBBBBBB */
1097 EXPORT_PC
Vladimir Markod9ad3572016-07-22 10:52:24 +01001098 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1099 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001100 lsr w3, wINST, #8 // w3<- AA
Vladimir Markod9ad3572016-07-22 10:52:24 +01001101 orr x1, x0, x1, lsl #16 // x1<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001102 GET_VREG w0, w3 // w0<- vAA (array object)
Vladimir Markod9ad3572016-07-22 10:52:24 +01001103 add x1, xPC, x1, lsl #1 // x1<- PC + ssssssssBBBBbbbb*2 (array data off.)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001104 bl MterpFillArrayData // (obj, payload)
1105 cbz w0, MterpPossibleException // exception?
1106 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1107 GET_INST_OPCODE ip // extract opcode from rINST
1108 GOTO_OPCODE ip // jump to next instruction
1109
1110/* ------------------------------ */
1111 .balign 128
1112.L_op_throw: /* 0x27 */
1113/* File: arm64/op_throw.S */
1114 /*
1115 * Throw an exception object in the current thread.
1116 */
1117 /* throw vAA */
1118 EXPORT_PC
1119 lsr w2, wINST, #8 // r2<- AA
1120 GET_VREG w1, w2 // r1<- vAA (exception object)
1121 cbz w1, common_errNullObject
1122 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // thread->exception<- obj
1123 b MterpException
1124
1125/* ------------------------------ */
1126 .balign 128
1127.L_op_goto: /* 0x28 */
1128/* File: arm64/op_goto.S */
1129 /*
1130 * Unconditional branch, 8-bit offset.
1131 *
1132 * The branch distance is a signed code-unit offset, which we need to
1133 * double to get a byte offset.
1134 */
1135 /* goto +AA */
Bill Buzbee1d011d92016-04-04 16:59:29 +00001136 sbfx wINST, wINST, #8, #8 // wINST<- ssssssAA (sign-extended)
1137 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001138
1139/* ------------------------------ */
1140 .balign 128
1141.L_op_goto_16: /* 0x29 */
1142/* File: arm64/op_goto_16.S */
1143 /*
1144 * Unconditional branch, 16-bit offset.
1145 *
1146 * The branch distance is a signed code-unit offset, which we need to
1147 * double to get a byte offset.
1148 */
1149 /* goto/16 +AAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001150 FETCH_S wINST, 1 // wINST<- ssssAAAA (sign-extended)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001151 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001152
1153/* ------------------------------ */
1154 .balign 128
1155.L_op_goto_32: /* 0x2a */
1156/* File: arm64/op_goto_32.S */
1157 /*
1158 * Unconditional branch, 32-bit offset.
1159 *
1160 * The branch distance is a signed code-unit offset, which we need to
1161 * double to get a byte offset.
1162 *
1163 * Unlike most opcodes, this one is allowed to branch to itself, so
1164 * our "backward branch" test must be "<=0" instead of "<0". Because
1165 * we need the V bit set, we'll use an adds to convert from Dalvik
1166 * offset to byte offset.
1167 */
1168 /* goto/32 +AAAAAAAA */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001169 FETCH w0, 1 // w0<- aaaa (lo)
1170 FETCH w1, 2 // w1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001171 orr wINST, w0, w1, lsl #16 // wINST<- AAAAaaaa
Bill Buzbee1d011d92016-04-04 16:59:29 +00001172 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001173
1174/* ------------------------------ */
1175 .balign 128
1176.L_op_packed_switch: /* 0x2b */
1177/* File: arm64/op_packed_switch.S */
1178 /*
1179 * Handle a packed-switch or sparse-switch instruction. In both cases
1180 * we decode it and hand it off to a helper function.
1181 *
1182 * We don't really expect backward branches in a switch statement, but
1183 * they're perfectly legal, so we check for them here.
1184 *
1185 * for: packed-switch, sparse-switch
1186 */
1187 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001188 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1189 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001190 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001191 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001192 GET_VREG w1, w3 // w1<- vAA
Vladimir Markod9ad3572016-07-22 10:52:24 +01001193 add x0, xPC, x0, lsl #1 // x0<- PC + ssssssssBBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001194 bl MterpDoPackedSwitch // w0<- code-unit branch offset
Vladimir Markoe6220222016-07-20 14:25:30 +01001195 sxtw xINST, w0
Bill Buzbee1d011d92016-04-04 16:59:29 +00001196 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001197
1198/* ------------------------------ */
1199 .balign 128
1200.L_op_sparse_switch: /* 0x2c */
1201/* File: arm64/op_sparse_switch.S */
1202/* File: arm64/op_packed_switch.S */
1203 /*
1204 * Handle a packed-switch or sparse-switch instruction. In both cases
1205 * we decode it and hand it off to a helper function.
1206 *
1207 * We don't really expect backward branches in a switch statement, but
1208 * they're perfectly legal, so we check for them here.
1209 *
1210 * for: packed-switch, sparse-switch
1211 */
1212 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001213 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1214 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001215 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001216 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001217 GET_VREG w1, w3 // w1<- vAA
Vladimir Markod9ad3572016-07-22 10:52:24 +01001218 add x0, xPC, x0, lsl #1 // x0<- PC + ssssssssBBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001219 bl MterpDoSparseSwitch // w0<- code-unit branch offset
Vladimir Markoe6220222016-07-20 14:25:30 +01001220 sxtw xINST, w0
Bill Buzbee1d011d92016-04-04 16:59:29 +00001221 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001222
1223
1224/* ------------------------------ */
1225 .balign 128
1226.L_op_cmpl_float: /* 0x2d */
1227/* File: arm64/op_cmpl_float.S */
1228/* File: arm64/fcmp.S */
1229 /*
1230 * Compare two floating-point values. Puts 0, 1, or -1 into the
1231 * destination register based on the results of the comparison.
1232 */
1233 /* op vAA, vBB, vCC */
1234 FETCH w0, 1 // w0<- CCBB
1235 lsr w4, wINST, #8 // w4<- AA
1236 and w2, w0, #255 // w2<- BB
1237 lsr w3, w0, #8 // w3<- CC
1238 GET_VREG s1, w2
1239 GET_VREG s2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001240 fcmp s1, s2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001241 cset w0, ne
1242 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001243 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1244 GET_INST_OPCODE ip // extract opcode from rINST
1245 SET_VREG w0, w4 // vAA<- w0
1246 GOTO_OPCODE ip // jump to next instruction
1247
1248
1249/* ------------------------------ */
1250 .balign 128
1251.L_op_cmpg_float: /* 0x2e */
1252/* File: arm64/op_cmpg_float.S */
1253/* File: arm64/fcmp.S */
1254 /*
1255 * Compare two floating-point values. Puts 0, 1, or -1 into the
1256 * destination register based on the results of the comparison.
1257 */
1258 /* op vAA, vBB, vCC */
1259 FETCH w0, 1 // w0<- CCBB
1260 lsr w4, wINST, #8 // w4<- AA
1261 and w2, w0, #255 // w2<- BB
1262 lsr w3, w0, #8 // w3<- CC
1263 GET_VREG s1, w2
1264 GET_VREG s2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001265 fcmp s1, s2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001266 cset w0, ne
1267 cneg w0, w0, cc
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001268 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1269 GET_INST_OPCODE ip // extract opcode from rINST
1270 SET_VREG w0, w4 // vAA<- w0
1271 GOTO_OPCODE ip // jump to next instruction
1272
1273
1274/* ------------------------------ */
1275 .balign 128
1276.L_op_cmpl_double: /* 0x2f */
1277/* File: arm64/op_cmpl_double.S */
1278/* File: arm64/fcmp.S */
1279 /*
1280 * Compare two floating-point values. Puts 0, 1, or -1 into the
1281 * destination register based on the results of the comparison.
1282 */
1283 /* op vAA, vBB, vCC */
1284 FETCH w0, 1 // w0<- CCBB
1285 lsr w4, wINST, #8 // w4<- AA
1286 and w2, w0, #255 // w2<- BB
1287 lsr w3, w0, #8 // w3<- CC
1288 GET_VREG_WIDE d1, w2
1289 GET_VREG_WIDE d2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001290 fcmp d1, d2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001291 cset w0, ne
1292 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001293 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1294 GET_INST_OPCODE ip // extract opcode from rINST
1295 SET_VREG w0, w4 // vAA<- w0
1296 GOTO_OPCODE ip // jump to next instruction
1297
1298
1299/* ------------------------------ */
1300 .balign 128
1301.L_op_cmpg_double: /* 0x30 */
1302/* File: arm64/op_cmpg_double.S */
1303/* File: arm64/fcmp.S */
1304 /*
1305 * Compare two floating-point values. Puts 0, 1, or -1 into the
1306 * destination register based on the results of the comparison.
1307 */
1308 /* op vAA, vBB, vCC */
1309 FETCH w0, 1 // w0<- CCBB
1310 lsr w4, wINST, #8 // w4<- AA
1311 and w2, w0, #255 // w2<- BB
1312 lsr w3, w0, #8 // w3<- CC
1313 GET_VREG_WIDE d1, w2
1314 GET_VREG_WIDE d2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001315 fcmp d1, d2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001316 cset w0, ne
1317 cneg w0, w0, cc
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001318 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1319 GET_INST_OPCODE ip // extract opcode from rINST
1320 SET_VREG w0, w4 // vAA<- w0
1321 GOTO_OPCODE ip // jump to next instruction
1322
1323
1324/* ------------------------------ */
1325 .balign 128
1326.L_op_cmp_long: /* 0x31 */
1327/* File: arm64/op_cmp_long.S */
1328 FETCH w0, 1 // w0<- CCBB
1329 lsr w4, wINST, #8 // w4<- AA
1330 and w2, w0, #255 // w2<- BB
1331 lsr w3, w0, #8 // w3<- CC
1332 GET_VREG_WIDE x1, w2
1333 GET_VREG_WIDE x2, w3
1334 cmp x1, x2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001335 cset w0, ne
1336 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001337 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1338 SET_VREG w0, w4
1339 GET_INST_OPCODE ip // extract opcode from wINST
1340 GOTO_OPCODE ip // jump to next instruction
1341
1342/* ------------------------------ */
1343 .balign 128
1344.L_op_if_eq: /* 0x32 */
1345/* File: arm64/op_if_eq.S */
1346/* File: arm64/bincmp.S */
1347 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001348 * Generic two-operand compare-and-branch operation. Provide a "condition"
1349 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001350 *
1351 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1352 */
1353 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001354 lsr w1, wINST, #12 // w1<- B
1355 ubfx w0, wINST, #8, #4 // w0<- A
1356 GET_VREG w3, w1 // w3<- vB
1357 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001358 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001359 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001360 b.eq MterpCommonTakenBranchNoFlags
1361 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1362 b.eq .L_check_not_taken_osr
1363 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001364 GET_INST_OPCODE ip // extract opcode from wINST
1365 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001366
1367
1368/* ------------------------------ */
1369 .balign 128
1370.L_op_if_ne: /* 0x33 */
1371/* File: arm64/op_if_ne.S */
1372/* File: arm64/bincmp.S */
1373 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001374 * Generic two-operand compare-and-branch operation. Provide a "condition"
1375 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001376 *
1377 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1378 */
1379 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001380 lsr w1, wINST, #12 // w1<- B
1381 ubfx w0, wINST, #8, #4 // w0<- A
1382 GET_VREG w3, w1 // w3<- vB
1383 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001384 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001385 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001386 b.ne MterpCommonTakenBranchNoFlags
1387 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1388 b.eq .L_check_not_taken_osr
1389 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001390 GET_INST_OPCODE ip // extract opcode from wINST
1391 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001392
1393
1394/* ------------------------------ */
1395 .balign 128
1396.L_op_if_lt: /* 0x34 */
1397/* File: arm64/op_if_lt.S */
1398/* File: arm64/bincmp.S */
1399 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001400 * Generic two-operand compare-and-branch operation. Provide a "condition"
1401 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001402 *
1403 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1404 */
1405 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001406 lsr w1, wINST, #12 // w1<- B
1407 ubfx w0, wINST, #8, #4 // w0<- A
1408 GET_VREG w3, w1 // w3<- vB
1409 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001410 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001411 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001412 b.lt MterpCommonTakenBranchNoFlags
1413 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1414 b.eq .L_check_not_taken_osr
1415 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001416 GET_INST_OPCODE ip // extract opcode from wINST
1417 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001418
1419
1420/* ------------------------------ */
1421 .balign 128
1422.L_op_if_ge: /* 0x35 */
1423/* File: arm64/op_if_ge.S */
1424/* File: arm64/bincmp.S */
1425 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001426 * Generic two-operand compare-and-branch operation. Provide a "condition"
1427 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001428 *
1429 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1430 */
1431 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001432 lsr w1, wINST, #12 // w1<- B
1433 ubfx w0, wINST, #8, #4 // w0<- A
1434 GET_VREG w3, w1 // w3<- vB
1435 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001436 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001437 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001438 b.ge MterpCommonTakenBranchNoFlags
1439 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1440 b.eq .L_check_not_taken_osr
1441 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001442 GET_INST_OPCODE ip // extract opcode from wINST
1443 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001444
1445
1446/* ------------------------------ */
1447 .balign 128
1448.L_op_if_gt: /* 0x36 */
1449/* File: arm64/op_if_gt.S */
1450/* File: arm64/bincmp.S */
1451 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001452 * Generic two-operand compare-and-branch operation. Provide a "condition"
1453 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001454 *
1455 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1456 */
1457 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001458 lsr w1, wINST, #12 // w1<- B
1459 ubfx w0, wINST, #8, #4 // w0<- A
1460 GET_VREG w3, w1 // w3<- vB
1461 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001462 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001463 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001464 b.gt MterpCommonTakenBranchNoFlags
1465 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1466 b.eq .L_check_not_taken_osr
1467 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001468 GET_INST_OPCODE ip // extract opcode from wINST
1469 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001470
1471
1472/* ------------------------------ */
1473 .balign 128
1474.L_op_if_le: /* 0x37 */
1475/* File: arm64/op_if_le.S */
1476/* File: arm64/bincmp.S */
1477 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001478 * Generic two-operand compare-and-branch operation. Provide a "condition"
1479 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001480 *
1481 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1482 */
1483 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001484 lsr w1, wINST, #12 // w1<- B
1485 ubfx w0, wINST, #8, #4 // w0<- A
1486 GET_VREG w3, w1 // w3<- vB
1487 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001488 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001489 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001490 b.le MterpCommonTakenBranchNoFlags
1491 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1492 b.eq .L_check_not_taken_osr
1493 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001494 GET_INST_OPCODE ip // extract opcode from wINST
1495 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001496
1497
1498/* ------------------------------ */
1499 .balign 128
1500.L_op_if_eqz: /* 0x38 */
1501/* File: arm64/op_if_eqz.S */
1502/* File: arm64/zcmp.S */
1503 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001504 * Generic one-operand compare-and-branch operation. Provide a "condition"
1505 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001506 *
1507 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1508 */
1509 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001510 lsr w0, wINST, #8 // w0<- AA
1511 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001512 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001513 .if 0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001514 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001515 .endif
1516 cbz w2, MterpCommonTakenBranchNoFlags
Bill Buzbee1d011d92016-04-04 16:59:29 +00001517 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1518 b.eq .L_check_not_taken_osr
1519 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001520 GET_INST_OPCODE ip // extract opcode from wINST
1521 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001522
1523
1524/* ------------------------------ */
1525 .balign 128
1526.L_op_if_nez: /* 0x39 */
1527/* File: arm64/op_if_nez.S */
1528/* File: arm64/zcmp.S */
1529 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001530 * Generic one-operand compare-and-branch operation. Provide a "condition"
1531 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001532 *
1533 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1534 */
1535 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001536 lsr w0, wINST, #8 // w0<- AA
1537 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001538 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001539 .if 0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001540 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001541 .endif
1542 cbnz w2, MterpCommonTakenBranchNoFlags
Bill Buzbee1d011d92016-04-04 16:59:29 +00001543 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1544 b.eq .L_check_not_taken_osr
1545 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001546 GET_INST_OPCODE ip // extract opcode from wINST
1547 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001548
1549
1550/* ------------------------------ */
1551 .balign 128
1552.L_op_if_ltz: /* 0x3a */
1553/* File: arm64/op_if_ltz.S */
1554/* File: arm64/zcmp.S */
1555 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001556 * Generic one-operand compare-and-branch operation. Provide a "condition"
1557 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001558 *
1559 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1560 */
1561 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001562 lsr w0, wINST, #8 // w0<- AA
1563 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001564 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001565 .if 0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001566 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001567 .endif
1568 tbnz w2, #31, MterpCommonTakenBranchNoFlags
Bill Buzbee1d011d92016-04-04 16:59:29 +00001569 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1570 b.eq .L_check_not_taken_osr
1571 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001572 GET_INST_OPCODE ip // extract opcode from wINST
1573 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001574
1575
1576/* ------------------------------ */
1577 .balign 128
1578.L_op_if_gez: /* 0x3b */
1579/* File: arm64/op_if_gez.S */
1580/* File: arm64/zcmp.S */
1581 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001582 * Generic one-operand compare-and-branch operation. Provide a "condition"
1583 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001584 *
1585 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1586 */
1587 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001588 lsr w0, wINST, #8 // w0<- AA
1589 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001590 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001591 .if 0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001592 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001593 .endif
1594 tbz w2, #31, MterpCommonTakenBranchNoFlags
Bill Buzbee1d011d92016-04-04 16:59:29 +00001595 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1596 b.eq .L_check_not_taken_osr
1597 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001598 GET_INST_OPCODE ip // extract opcode from wINST
1599 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001600
1601
1602/* ------------------------------ */
1603 .balign 128
1604.L_op_if_gtz: /* 0x3c */
1605/* File: arm64/op_if_gtz.S */
1606/* File: arm64/zcmp.S */
1607 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001608 * Generic one-operand compare-and-branch operation. Provide a "condition"
1609 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001610 *
1611 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1612 */
1613 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001614 lsr w0, wINST, #8 // w0<- AA
1615 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001616 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001617 .if 1
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001618 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001619 .endif
Bill Buzbee1d011d92016-04-04 16:59:29 +00001620 b.gt MterpCommonTakenBranchNoFlags
1621 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1622 b.eq .L_check_not_taken_osr
1623 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001624 GET_INST_OPCODE ip // extract opcode from wINST
1625 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001626
1627
1628/* ------------------------------ */
1629 .balign 128
1630.L_op_if_lez: /* 0x3d */
1631/* File: arm64/op_if_lez.S */
1632/* File: arm64/zcmp.S */
1633 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001634 * Generic one-operand compare-and-branch operation. Provide a "condition"
1635 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001636 *
1637 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1638 */
1639 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001640 lsr w0, wINST, #8 // w0<- AA
1641 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001642 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001643 .if 1
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001644 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001645 .endif
Bill Buzbee1d011d92016-04-04 16:59:29 +00001646 b.le MterpCommonTakenBranchNoFlags
1647 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1648 b.eq .L_check_not_taken_osr
1649 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001650 GET_INST_OPCODE ip // extract opcode from wINST
1651 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001652
1653
1654/* ------------------------------ */
1655 .balign 128
1656.L_op_unused_3e: /* 0x3e */
1657/* File: arm64/op_unused_3e.S */
1658/* File: arm64/unused.S */
1659/*
1660 * Bail to reference interpreter to throw.
1661 */
1662 b MterpFallback
1663
1664
1665/* ------------------------------ */
1666 .balign 128
1667.L_op_unused_3f: /* 0x3f */
1668/* File: arm64/op_unused_3f.S */
1669/* File: arm64/unused.S */
1670/*
1671 * Bail to reference interpreter to throw.
1672 */
1673 b MterpFallback
1674
1675
1676/* ------------------------------ */
1677 .balign 128
1678.L_op_unused_40: /* 0x40 */
1679/* File: arm64/op_unused_40.S */
1680/* File: arm64/unused.S */
1681/*
1682 * Bail to reference interpreter to throw.
1683 */
1684 b MterpFallback
1685
1686
1687/* ------------------------------ */
1688 .balign 128
1689.L_op_unused_41: /* 0x41 */
1690/* File: arm64/op_unused_41.S */
1691/* File: arm64/unused.S */
1692/*
1693 * Bail to reference interpreter to throw.
1694 */
1695 b MterpFallback
1696
1697
1698/* ------------------------------ */
1699 .balign 128
1700.L_op_unused_42: /* 0x42 */
1701/* File: arm64/op_unused_42.S */
1702/* File: arm64/unused.S */
1703/*
1704 * Bail to reference interpreter to throw.
1705 */
1706 b MterpFallback
1707
1708
1709/* ------------------------------ */
1710 .balign 128
1711.L_op_unused_43: /* 0x43 */
1712/* File: arm64/op_unused_43.S */
1713/* File: arm64/unused.S */
1714/*
1715 * Bail to reference interpreter to throw.
1716 */
1717 b MterpFallback
1718
1719
1720/* ------------------------------ */
1721 .balign 128
1722.L_op_aget: /* 0x44 */
1723/* File: arm64/op_aget.S */
1724 /*
1725 * Array get, 32 bits or less. vAA <- vBB[vCC].
1726 *
1727 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1728 * instructions. We use a pair of FETCH_Bs instead.
1729 *
1730 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1731 *
1732 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1733 * If this changes, specialize.
1734 */
1735 /* op vAA, vBB, vCC */
1736 FETCH_B w2, 1, 0 // w2<- BB
1737 lsr w9, wINST, #8 // w9<- AA
1738 FETCH_B w3, 1, 1 // w3<- CC
1739 GET_VREG w0, w2 // w0<- vBB (array object)
1740 GET_VREG w1, w3 // w1<- vCC (requested index)
1741 cbz x0, common_errNullObject // bail if null array object.
1742 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1743 add x0, x0, w1, uxtw #2 // w0<- arrayObj + index*width
1744 cmp w1, w3 // compare unsigned index, length
1745 bcs common_errArrayIndex // index >= length, bail
1746 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1747 ldr w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1748 GET_INST_OPCODE ip // extract opcode from rINST
1749 SET_VREG w2, w9 // vAA<- w2
1750 GOTO_OPCODE ip // jump to next instruction
1751
1752/* ------------------------------ */
1753 .balign 128
1754.L_op_aget_wide: /* 0x45 */
1755/* File: arm64/op_aget_wide.S */
1756 /*
1757 * Array get, 64 bits. vAA <- vBB[vCC].
1758 *
1759 */
1760 /* aget-wide vAA, vBB, vCC */
1761 FETCH w0, 1 // w0<- CCBB
1762 lsr w4, wINST, #8 // w4<- AA
1763 and w2, w0, #255 // w2<- BB
1764 lsr w3, w0, #8 // w3<- CC
1765 GET_VREG w0, w2 // w0<- vBB (array object)
1766 GET_VREG w1, w3 // w1<- vCC (requested index)
1767 cbz w0, common_errNullObject // yes, bail
1768 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1769 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1770 cmp w1, w3 // compare unsigned index, length
1771 bcs common_errArrayIndex // index >= length, bail
1772 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1773 ldr x2, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] // x2<- vBB[vCC]
1774 GET_INST_OPCODE ip // extract opcode from wINST
1775 SET_VREG_WIDE x2, w4
1776 GOTO_OPCODE ip // jump to next instruction
1777
1778/* ------------------------------ */
1779 .balign 128
1780.L_op_aget_object: /* 0x46 */
1781/* File: arm64/op_aget_object.S */
1782 /*
1783 * Array object get. vAA <- vBB[vCC].
1784 *
1785 * for: aget-object
1786 */
1787 /* op vAA, vBB, vCC */
1788 FETCH_B w2, 1, 0 // w2<- BB
1789 FETCH_B w3, 1, 1 // w3<- CC
1790 EXPORT_PC
1791 GET_VREG w0, w2 // w0<- vBB (array object)
1792 GET_VREG w1, w3 // w1<- vCC (requested index)
1793 bl artAGetObjectFromMterp // (array, index)
1794 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
1795 lsr w2, wINST, #8 // w9<- AA
1796 PREFETCH_INST 2
1797 cbnz w1, MterpException
1798 SET_VREG_OBJECT w0, w2
1799 ADVANCE 2
1800 GET_INST_OPCODE ip
1801 GOTO_OPCODE ip // jump to next instruction
1802
1803/* ------------------------------ */
1804 .balign 128
1805.L_op_aget_boolean: /* 0x47 */
1806/* File: arm64/op_aget_boolean.S */
1807/* File: arm64/op_aget.S */
1808 /*
1809 * Array get, 32 bits or less. vAA <- vBB[vCC].
1810 *
1811 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1812 * instructions. We use a pair of FETCH_Bs instead.
1813 *
1814 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1815 *
1816 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1817 * If this changes, specialize.
1818 */
1819 /* op vAA, vBB, vCC */
1820 FETCH_B w2, 1, 0 // w2<- BB
1821 lsr w9, wINST, #8 // w9<- AA
1822 FETCH_B w3, 1, 1 // w3<- CC
1823 GET_VREG w0, w2 // w0<- vBB (array object)
1824 GET_VREG w1, w3 // w1<- vCC (requested index)
1825 cbz x0, common_errNullObject // bail if null array object.
1826 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1827 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1828 cmp w1, w3 // compare unsigned index, length
1829 bcs common_errArrayIndex // index >= length, bail
1830 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1831 ldrb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1832 GET_INST_OPCODE ip // extract opcode from rINST
1833 SET_VREG w2, w9 // vAA<- w2
1834 GOTO_OPCODE ip // jump to next instruction
1835
1836
1837/* ------------------------------ */
1838 .balign 128
1839.L_op_aget_byte: /* 0x48 */
1840/* File: arm64/op_aget_byte.S */
1841/* File: arm64/op_aget.S */
1842 /*
1843 * Array get, 32 bits or less. vAA <- vBB[vCC].
1844 *
1845 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1846 * instructions. We use a pair of FETCH_Bs instead.
1847 *
1848 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1849 *
1850 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1851 * If this changes, specialize.
1852 */
1853 /* op vAA, vBB, vCC */
1854 FETCH_B w2, 1, 0 // w2<- BB
1855 lsr w9, wINST, #8 // w9<- AA
1856 FETCH_B w3, 1, 1 // w3<- CC
1857 GET_VREG w0, w2 // w0<- vBB (array object)
1858 GET_VREG w1, w3 // w1<- vCC (requested index)
1859 cbz x0, common_errNullObject // bail if null array object.
1860 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1861 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1862 cmp w1, w3 // compare unsigned index, length
1863 bcs common_errArrayIndex // index >= length, bail
1864 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1865 ldrsb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1866 GET_INST_OPCODE ip // extract opcode from rINST
1867 SET_VREG w2, w9 // vAA<- w2
1868 GOTO_OPCODE ip // jump to next instruction
1869
1870
1871/* ------------------------------ */
1872 .balign 128
1873.L_op_aget_char: /* 0x49 */
1874/* File: arm64/op_aget_char.S */
1875/* File: arm64/op_aget.S */
1876 /*
1877 * Array get, 32 bits or less. vAA <- vBB[vCC].
1878 *
1879 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1880 * instructions. We use a pair of FETCH_Bs instead.
1881 *
1882 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1883 *
1884 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1885 * If this changes, specialize.
1886 */
1887 /* op vAA, vBB, vCC */
1888 FETCH_B w2, 1, 0 // w2<- BB
1889 lsr w9, wINST, #8 // w9<- AA
1890 FETCH_B w3, 1, 1 // w3<- CC
1891 GET_VREG w0, w2 // w0<- vBB (array object)
1892 GET_VREG w1, w3 // w1<- vCC (requested index)
1893 cbz x0, common_errNullObject // bail if null array object.
1894 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1895 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1896 cmp w1, w3 // compare unsigned index, length
1897 bcs common_errArrayIndex // index >= length, bail
1898 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1899 ldrh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1900 GET_INST_OPCODE ip // extract opcode from rINST
1901 SET_VREG w2, w9 // vAA<- w2
1902 GOTO_OPCODE ip // jump to next instruction
1903
1904
1905/* ------------------------------ */
1906 .balign 128
1907.L_op_aget_short: /* 0x4a */
1908/* File: arm64/op_aget_short.S */
1909/* File: arm64/op_aget.S */
1910 /*
1911 * Array get, 32 bits or less. vAA <- vBB[vCC].
1912 *
1913 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1914 * instructions. We use a pair of FETCH_Bs instead.
1915 *
1916 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1917 *
1918 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1919 * If this changes, specialize.
1920 */
1921 /* op vAA, vBB, vCC */
1922 FETCH_B w2, 1, 0 // w2<- BB
1923 lsr w9, wINST, #8 // w9<- AA
1924 FETCH_B w3, 1, 1 // w3<- CC
1925 GET_VREG w0, w2 // w0<- vBB (array object)
1926 GET_VREG w1, w3 // w1<- vCC (requested index)
1927 cbz x0, common_errNullObject // bail if null array object.
1928 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1929 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1930 cmp w1, w3 // compare unsigned index, length
1931 bcs common_errArrayIndex // index >= length, bail
1932 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1933 ldrsh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1934 GET_INST_OPCODE ip // extract opcode from rINST
1935 SET_VREG w2, w9 // vAA<- w2
1936 GOTO_OPCODE ip // jump to next instruction
1937
1938
1939/* ------------------------------ */
1940 .balign 128
1941.L_op_aput: /* 0x4b */
1942/* File: arm64/op_aput.S */
1943 /*
1944 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1945 *
1946 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1947 * instructions. We use a pair of FETCH_Bs instead.
1948 *
1949 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1950 *
1951 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1952 * If this changes, specialize.
1953 */
1954 /* op vAA, vBB, vCC */
1955 FETCH_B w2, 1, 0 // w2<- BB
1956 lsr w9, wINST, #8 // w9<- AA
1957 FETCH_B w3, 1, 1 // w3<- CC
1958 GET_VREG w0, w2 // w0<- vBB (array object)
1959 GET_VREG w1, w3 // w1<- vCC (requested index)
1960 cbz w0, common_errNullObject // bail if null
1961 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1962 add x0, x0, w1, lsl #2 // w0<- arrayObj + index*width
1963 cmp w1, w3 // compare unsigned index, length
1964 bcs common_errArrayIndex // index >= length, bail
1965 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1966 GET_VREG w2, w9 // w2<- vAA
1967 GET_INST_OPCODE ip // extract opcode from rINST
1968 str w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
1969 GOTO_OPCODE ip // jump to next instruction
1970
1971/* ------------------------------ */
1972 .balign 128
1973.L_op_aput_wide: /* 0x4c */
1974/* File: arm64/op_aput_wide.S */
1975 /*
1976 * Array put, 64 bits. vBB[vCC] <- vAA.
1977 *
1978 */
1979 /* aput-wide vAA, vBB, vCC */
1980 FETCH w0, 1 // w0<- CCBB
1981 lsr w4, wINST, #8 // w4<- AA
1982 and w2, w0, #255 // w2<- BB
1983 lsr w3, w0, #8 // w3<- CC
1984 GET_VREG w0, w2 // w0<- vBB (array object)
1985 GET_VREG w1, w3 // w1<- vCC (requested index)
1986 cbz w0, common_errNullObject // bail if null
1987 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1988 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1989 cmp w1, w3 // compare unsigned index, length
1990 bcs common_errArrayIndex // index >= length, bail
1991 GET_VREG_WIDE x1, w4
1992 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1993 GET_INST_OPCODE ip // extract opcode from wINST
1994 str x1, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]
1995 GOTO_OPCODE ip // jump to next instruction
1996
1997/* ------------------------------ */
1998 .balign 128
1999.L_op_aput_object: /* 0x4d */
2000/* File: arm64/op_aput_object.S */
2001 /*
2002 * Store an object into an array. vBB[vCC] <- vAA.
2003 */
2004 /* op vAA, vBB, vCC */
2005 EXPORT_PC
2006 add x0, xFP, #OFF_FP_SHADOWFRAME
2007 mov x1, xPC
2008 mov w2, wINST
2009 bl MterpAputObject
2010 cbz w0, MterpPossibleException
2011 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2012 GET_INST_OPCODE ip // extract opcode from rINST
2013 GOTO_OPCODE ip // jump to next instruction
2014
2015/* ------------------------------ */
2016 .balign 128
2017.L_op_aput_boolean: /* 0x4e */
2018/* File: arm64/op_aput_boolean.S */
2019/* File: arm64/op_aput.S */
2020 /*
2021 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2022 *
2023 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2024 * instructions. We use a pair of FETCH_Bs instead.
2025 *
2026 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2027 *
2028 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2029 * If this changes, specialize.
2030 */
2031 /* op vAA, vBB, vCC */
2032 FETCH_B w2, 1, 0 // w2<- BB
2033 lsr w9, wINST, #8 // w9<- AA
2034 FETCH_B w3, 1, 1 // w3<- CC
2035 GET_VREG w0, w2 // w0<- vBB (array object)
2036 GET_VREG w1, w3 // w1<- vCC (requested index)
2037 cbz w0, common_errNullObject // bail if null
2038 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2039 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2040 cmp w1, w3 // compare unsigned index, length
2041 bcs common_errArrayIndex // index >= length, bail
2042 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2043 GET_VREG w2, w9 // w2<- vAA
2044 GET_INST_OPCODE ip // extract opcode from rINST
2045 strb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2046 GOTO_OPCODE ip // jump to next instruction
2047
2048
2049/* ------------------------------ */
2050 .balign 128
2051.L_op_aput_byte: /* 0x4f */
2052/* File: arm64/op_aput_byte.S */
2053/* File: arm64/op_aput.S */
2054 /*
2055 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2056 *
2057 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2058 * instructions. We use a pair of FETCH_Bs instead.
2059 *
2060 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2061 *
2062 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2063 * If this changes, specialize.
2064 */
2065 /* op vAA, vBB, vCC */
2066 FETCH_B w2, 1, 0 // w2<- BB
2067 lsr w9, wINST, #8 // w9<- AA
2068 FETCH_B w3, 1, 1 // w3<- CC
2069 GET_VREG w0, w2 // w0<- vBB (array object)
2070 GET_VREG w1, w3 // w1<- vCC (requested index)
2071 cbz w0, common_errNullObject // bail if null
2072 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2073 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2074 cmp w1, w3 // compare unsigned index, length
2075 bcs common_errArrayIndex // index >= length, bail
2076 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2077 GET_VREG w2, w9 // w2<- vAA
2078 GET_INST_OPCODE ip // extract opcode from rINST
2079 strb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2080 GOTO_OPCODE ip // jump to next instruction
2081
2082
2083/* ------------------------------ */
2084 .balign 128
2085.L_op_aput_char: /* 0x50 */
2086/* File: arm64/op_aput_char.S */
2087/* File: arm64/op_aput.S */
2088 /*
2089 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2090 *
2091 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2092 * instructions. We use a pair of FETCH_Bs instead.
2093 *
2094 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2095 *
2096 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2097 * If this changes, specialize.
2098 */
2099 /* op vAA, vBB, vCC */
2100 FETCH_B w2, 1, 0 // w2<- BB
2101 lsr w9, wINST, #8 // w9<- AA
2102 FETCH_B w3, 1, 1 // w3<- CC
2103 GET_VREG w0, w2 // w0<- vBB (array object)
2104 GET_VREG w1, w3 // w1<- vCC (requested index)
2105 cbz w0, common_errNullObject // bail if null
2106 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2107 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2108 cmp w1, w3 // compare unsigned index, length
2109 bcs common_errArrayIndex // index >= length, bail
2110 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2111 GET_VREG w2, w9 // w2<- vAA
2112 GET_INST_OPCODE ip // extract opcode from rINST
2113 strh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2114 GOTO_OPCODE ip // jump to next instruction
2115
2116
2117/* ------------------------------ */
2118 .balign 128
2119.L_op_aput_short: /* 0x51 */
2120/* File: arm64/op_aput_short.S */
2121/* File: arm64/op_aput.S */
2122 /*
2123 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2124 *
2125 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2126 * instructions. We use a pair of FETCH_Bs instead.
2127 *
2128 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2129 *
2130 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2131 * If this changes, specialize.
2132 */
2133 /* op vAA, vBB, vCC */
2134 FETCH_B w2, 1, 0 // w2<- BB
2135 lsr w9, wINST, #8 // w9<- AA
2136 FETCH_B w3, 1, 1 // w3<- CC
2137 GET_VREG w0, w2 // w0<- vBB (array object)
2138 GET_VREG w1, w3 // w1<- vCC (requested index)
2139 cbz w0, common_errNullObject // bail if null
2140 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2141 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2142 cmp w1, w3 // compare unsigned index, length
2143 bcs common_errArrayIndex // index >= length, bail
2144 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2145 GET_VREG w2, w9 // w2<- vAA
2146 GET_INST_OPCODE ip // extract opcode from rINST
2147 strh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2148 GOTO_OPCODE ip // jump to next instruction
2149
2150
2151/* ------------------------------ */
2152 .balign 128
2153.L_op_iget: /* 0x52 */
2154/* File: arm64/op_iget.S */
2155 /*
2156 * General instance field get.
2157 *
2158 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2159 */
2160 EXPORT_PC
2161 FETCH w0, 1 // w0<- field ref CCCC
2162 lsr w1, wINST, #12 // w1<- B
2163 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2164 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2165 mov x3, xSELF // w3<- self
2166 bl artGet32InstanceFromCode
2167 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002168
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002169 ubfx w2, wINST, #8, #4 // w2<- A
2170 PREFETCH_INST 2
2171 cbnz x3, MterpPossibleException // bail out
2172 .if 0
2173 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2174 .else
2175 SET_VREG w0, w2 // fp[A]<- w0
2176 .endif
2177 ADVANCE 2
2178 GET_INST_OPCODE ip // extract opcode from rINST
2179 GOTO_OPCODE ip // jump to next instruction
2180
2181/* ------------------------------ */
2182 .balign 128
2183.L_op_iget_wide: /* 0x53 */
2184/* File: arm64/op_iget_wide.S */
2185 /*
2186 * 64-bit instance field get.
2187 *
2188 * for: iget-wide
2189 */
2190 EXPORT_PC
2191 FETCH w0, 1 // w0<- field ref CCCC
2192 lsr w1, wINST, #12 // w1<- B
2193 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2194 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2195 mov x3, xSELF // w3<- self
2196 bl artGet64InstanceFromCode
2197 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2198 ubfx w2, wINST, #8, #4 // w2<- A
2199 PREFETCH_INST 2
2200 cmp w3, #0
2201 cbnz w3, MterpException // bail out
2202 SET_VREG_WIDE x0, w2
2203 ADVANCE 2
2204 GET_INST_OPCODE ip // extract opcode from wINST
2205 GOTO_OPCODE ip // jump to next instruction
2206
2207/* ------------------------------ */
2208 .balign 128
2209.L_op_iget_object: /* 0x54 */
2210/* File: arm64/op_iget_object.S */
2211/* File: arm64/op_iget.S */
2212 /*
2213 * General instance field get.
2214 *
2215 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2216 */
2217 EXPORT_PC
2218 FETCH w0, 1 // w0<- field ref CCCC
2219 lsr w1, wINST, #12 // w1<- B
2220 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2221 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2222 mov x3, xSELF // w3<- self
2223 bl artGetObjInstanceFromCode
2224 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002225
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002226 ubfx w2, wINST, #8, #4 // w2<- A
2227 PREFETCH_INST 2
2228 cbnz x3, MterpPossibleException // bail out
2229 .if 1
2230 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2231 .else
2232 SET_VREG w0, w2 // fp[A]<- w0
2233 .endif
2234 ADVANCE 2
2235 GET_INST_OPCODE ip // extract opcode from rINST
2236 GOTO_OPCODE ip // jump to next instruction
2237
2238
2239/* ------------------------------ */
2240 .balign 128
2241.L_op_iget_boolean: /* 0x55 */
2242/* File: arm64/op_iget_boolean.S */
2243/* File: arm64/op_iget.S */
2244 /*
2245 * General instance field get.
2246 *
2247 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2248 */
2249 EXPORT_PC
2250 FETCH w0, 1 // w0<- field ref CCCC
2251 lsr w1, wINST, #12 // w1<- B
2252 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2253 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2254 mov x3, xSELF // w3<- self
2255 bl artGetBooleanInstanceFromCode
2256 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002257 uxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002258 ubfx w2, wINST, #8, #4 // w2<- A
2259 PREFETCH_INST 2
2260 cbnz x3, MterpPossibleException // bail out
2261 .if 0
2262 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2263 .else
2264 SET_VREG w0, w2 // fp[A]<- w0
2265 .endif
2266 ADVANCE 2
2267 GET_INST_OPCODE ip // extract opcode from rINST
2268 GOTO_OPCODE ip // jump to next instruction
2269
2270
2271/* ------------------------------ */
2272 .balign 128
2273.L_op_iget_byte: /* 0x56 */
2274/* File: arm64/op_iget_byte.S */
2275/* File: arm64/op_iget.S */
2276 /*
2277 * General instance field get.
2278 *
2279 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2280 */
2281 EXPORT_PC
2282 FETCH w0, 1 // w0<- field ref CCCC
2283 lsr w1, wINST, #12 // w1<- B
2284 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2285 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2286 mov x3, xSELF // w3<- self
2287 bl artGetByteInstanceFromCode
2288 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002289 sxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002290 ubfx w2, wINST, #8, #4 // w2<- A
2291 PREFETCH_INST 2
2292 cbnz x3, MterpPossibleException // bail out
2293 .if 0
2294 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2295 .else
2296 SET_VREG w0, w2 // fp[A]<- w0
2297 .endif
2298 ADVANCE 2
2299 GET_INST_OPCODE ip // extract opcode from rINST
2300 GOTO_OPCODE ip // jump to next instruction
2301
2302
2303/* ------------------------------ */
2304 .balign 128
2305.L_op_iget_char: /* 0x57 */
2306/* File: arm64/op_iget_char.S */
2307/* File: arm64/op_iget.S */
2308 /*
2309 * General instance field get.
2310 *
2311 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2312 */
2313 EXPORT_PC
2314 FETCH w0, 1 // w0<- field ref CCCC
2315 lsr w1, wINST, #12 // w1<- B
2316 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2317 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2318 mov x3, xSELF // w3<- self
2319 bl artGetCharInstanceFromCode
2320 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002321 uxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002322 ubfx w2, wINST, #8, #4 // w2<- A
2323 PREFETCH_INST 2
2324 cbnz x3, MterpPossibleException // bail out
2325 .if 0
2326 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2327 .else
2328 SET_VREG w0, w2 // fp[A]<- w0
2329 .endif
2330 ADVANCE 2
2331 GET_INST_OPCODE ip // extract opcode from rINST
2332 GOTO_OPCODE ip // jump to next instruction
2333
2334
2335/* ------------------------------ */
2336 .balign 128
2337.L_op_iget_short: /* 0x58 */
2338/* File: arm64/op_iget_short.S */
2339/* File: arm64/op_iget.S */
2340 /*
2341 * General instance field get.
2342 *
2343 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2344 */
2345 EXPORT_PC
2346 FETCH w0, 1 // w0<- field ref CCCC
2347 lsr w1, wINST, #12 // w1<- B
2348 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2349 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2350 mov x3, xSELF // w3<- self
2351 bl artGetShortInstanceFromCode
2352 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002353 sxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002354 ubfx w2, wINST, #8, #4 // w2<- A
2355 PREFETCH_INST 2
2356 cbnz x3, MterpPossibleException // bail out
2357 .if 0
2358 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2359 .else
2360 SET_VREG w0, w2 // fp[A]<- w0
2361 .endif
2362 ADVANCE 2
2363 GET_INST_OPCODE ip // extract opcode from rINST
2364 GOTO_OPCODE ip // jump to next instruction
2365
2366
2367/* ------------------------------ */
2368 .balign 128
2369.L_op_iput: /* 0x59 */
2370/* File: arm64/op_iput.S */
2371 /*
2372 * General 32-bit instance field put.
2373 *
2374 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2375 */
2376 /* op vA, vB, field//CCCC */
2377 .extern artSet32InstanceFromMterp
2378 EXPORT_PC
2379 FETCH w0, 1 // w0<- field ref CCCC
2380 lsr w1, wINST, #12 // w1<- B
2381 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2382 ubfx w2, wINST, #8, #4 // w2<- A
2383 GET_VREG w2, w2 // w2<- fp[A]
2384 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2385 PREFETCH_INST 2
2386 bl artSet32InstanceFromMterp
2387 cbnz w0, MterpPossibleException
2388 ADVANCE 2 // advance rPC
2389 GET_INST_OPCODE ip // extract opcode from rINST
2390 GOTO_OPCODE ip // jump to next instruction
2391
2392/* ------------------------------ */
2393 .balign 128
2394.L_op_iput_wide: /* 0x5a */
2395/* File: arm64/op_iput_wide.S */
2396 /* iput-wide vA, vB, field//CCCC */
2397 .extern artSet64InstanceFromMterp
2398 EXPORT_PC
2399 FETCH w0, 1 // w0<- field ref CCCC
2400 lsr w1, wINST, #12 // w1<- B
2401 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2402 ubfx w2, wINST, #8, #4 // w2<- A
buzbeeace690f2016-03-11 09:51:11 -08002403 VREG_INDEX_TO_ADDR x2, x2 // w2<- &fp[A]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002404 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2405 PREFETCH_INST 2
2406 bl artSet64InstanceFromMterp
2407 cbnz w0, MterpPossibleException
2408 ADVANCE 2 // advance rPC
2409 GET_INST_OPCODE ip // extract opcode from wINST
2410 GOTO_OPCODE ip // jump to next instruction
2411
2412/* ------------------------------ */
2413 .balign 128
2414.L_op_iput_object: /* 0x5b */
2415/* File: arm64/op_iput_object.S */
2416 EXPORT_PC
2417 add x0, xFP, #OFF_FP_SHADOWFRAME
2418 mov x1, xPC
2419 mov w2, wINST
2420 mov x3, xSELF
2421 bl MterpIputObject
2422 cbz w0, MterpException
2423 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2424 GET_INST_OPCODE ip // extract opcode from rINST
2425 GOTO_OPCODE ip // jump to next instruction
2426
2427/* ------------------------------ */
2428 .balign 128
2429.L_op_iput_boolean: /* 0x5c */
2430/* File: arm64/op_iput_boolean.S */
2431/* File: arm64/op_iput.S */
2432 /*
2433 * General 32-bit instance field put.
2434 *
2435 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2436 */
2437 /* op vA, vB, field//CCCC */
2438 .extern artSet8InstanceFromMterp
2439 EXPORT_PC
2440 FETCH w0, 1 // w0<- field ref CCCC
2441 lsr w1, wINST, #12 // w1<- B
2442 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2443 ubfx w2, wINST, #8, #4 // w2<- A
2444 GET_VREG w2, w2 // w2<- fp[A]
2445 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2446 PREFETCH_INST 2
2447 bl artSet8InstanceFromMterp
2448 cbnz w0, MterpPossibleException
2449 ADVANCE 2 // advance rPC
2450 GET_INST_OPCODE ip // extract opcode from rINST
2451 GOTO_OPCODE ip // jump to next instruction
2452
2453
2454/* ------------------------------ */
2455 .balign 128
2456.L_op_iput_byte: /* 0x5d */
2457/* File: arm64/op_iput_byte.S */
2458/* File: arm64/op_iput.S */
2459 /*
2460 * General 32-bit instance field put.
2461 *
2462 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2463 */
2464 /* op vA, vB, field//CCCC */
2465 .extern artSet8InstanceFromMterp
2466 EXPORT_PC
2467 FETCH w0, 1 // w0<- field ref CCCC
2468 lsr w1, wINST, #12 // w1<- B
2469 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2470 ubfx w2, wINST, #8, #4 // w2<- A
2471 GET_VREG w2, w2 // w2<- fp[A]
2472 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2473 PREFETCH_INST 2
2474 bl artSet8InstanceFromMterp
2475 cbnz w0, MterpPossibleException
2476 ADVANCE 2 // advance rPC
2477 GET_INST_OPCODE ip // extract opcode from rINST
2478 GOTO_OPCODE ip // jump to next instruction
2479
2480
2481/* ------------------------------ */
2482 .balign 128
2483.L_op_iput_char: /* 0x5e */
2484/* File: arm64/op_iput_char.S */
2485/* File: arm64/op_iput.S */
2486 /*
2487 * General 32-bit instance field put.
2488 *
2489 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2490 */
2491 /* op vA, vB, field//CCCC */
2492 .extern artSet16InstanceFromMterp
2493 EXPORT_PC
2494 FETCH w0, 1 // w0<- field ref CCCC
2495 lsr w1, wINST, #12 // w1<- B
2496 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2497 ubfx w2, wINST, #8, #4 // w2<- A
2498 GET_VREG w2, w2 // w2<- fp[A]
2499 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2500 PREFETCH_INST 2
2501 bl artSet16InstanceFromMterp
2502 cbnz w0, MterpPossibleException
2503 ADVANCE 2 // advance rPC
2504 GET_INST_OPCODE ip // extract opcode from rINST
2505 GOTO_OPCODE ip // jump to next instruction
2506
2507
2508/* ------------------------------ */
2509 .balign 128
2510.L_op_iput_short: /* 0x5f */
2511/* File: arm64/op_iput_short.S */
2512/* File: arm64/op_iput.S */
2513 /*
2514 * General 32-bit instance field put.
2515 *
2516 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2517 */
2518 /* op vA, vB, field//CCCC */
2519 .extern artSet16InstanceFromMterp
2520 EXPORT_PC
2521 FETCH w0, 1 // w0<- field ref CCCC
2522 lsr w1, wINST, #12 // w1<- B
2523 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2524 ubfx w2, wINST, #8, #4 // w2<- A
2525 GET_VREG w2, w2 // w2<- fp[A]
2526 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2527 PREFETCH_INST 2
2528 bl artSet16InstanceFromMterp
2529 cbnz w0, MterpPossibleException
2530 ADVANCE 2 // advance rPC
2531 GET_INST_OPCODE ip // extract opcode from rINST
2532 GOTO_OPCODE ip // jump to next instruction
2533
2534
2535/* ------------------------------ */
2536 .balign 128
2537.L_op_sget: /* 0x60 */
2538/* File: arm64/op_sget.S */
2539 /*
2540 * General SGET handler wrapper.
2541 *
2542 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2543 */
2544 /* op vAA, field//BBBB */
2545
2546 .extern artGet32StaticFromCode
2547 EXPORT_PC
2548 FETCH w0, 1 // w0<- field ref BBBB
2549 ldr x1, [xFP, #OFF_FP_METHOD]
2550 mov x2, xSELF
2551 bl artGet32StaticFromCode
2552 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2553 lsr w2, wINST, #8 // w2<- AA
2554
2555 PREFETCH_INST 2
2556 cbnz x3, MterpException // bail out
2557.if 0
2558 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2559.else
2560 SET_VREG w0, w2 // fp[AA]<- w0
2561.endif
2562 ADVANCE 2
2563 GET_INST_OPCODE ip // extract opcode from rINST
2564 GOTO_OPCODE ip
2565
2566/* ------------------------------ */
2567 .balign 128
2568.L_op_sget_wide: /* 0x61 */
2569/* File: arm64/op_sget_wide.S */
2570 /*
2571 * SGET_WIDE handler wrapper.
2572 *
2573 */
2574 /* sget-wide vAA, field//BBBB */
2575
2576 .extern artGet64StaticFromCode
2577 EXPORT_PC
2578 FETCH w0, 1 // w0<- field ref BBBB
2579 ldr x1, [xFP, #OFF_FP_METHOD]
2580 mov x2, xSELF
2581 bl artGet64StaticFromCode
2582 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2583 lsr w4, wINST, #8 // w4<- AA
2584 cbnz x3, MterpException // bail out
2585 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2586 SET_VREG_WIDE x0, w4
2587 GET_INST_OPCODE ip // extract opcode from wINST
2588 GOTO_OPCODE ip // jump to next instruction
2589
2590/* ------------------------------ */
2591 .balign 128
2592.L_op_sget_object: /* 0x62 */
2593/* File: arm64/op_sget_object.S */
2594/* File: arm64/op_sget.S */
2595 /*
2596 * General SGET handler wrapper.
2597 *
2598 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2599 */
2600 /* op vAA, field//BBBB */
2601
2602 .extern artGetObjStaticFromCode
2603 EXPORT_PC
2604 FETCH w0, 1 // w0<- field ref BBBB
2605 ldr x1, [xFP, #OFF_FP_METHOD]
2606 mov x2, xSELF
2607 bl artGetObjStaticFromCode
2608 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2609 lsr w2, wINST, #8 // w2<- AA
2610
2611 PREFETCH_INST 2
2612 cbnz x3, MterpException // bail out
2613.if 1
2614 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2615.else
2616 SET_VREG w0, w2 // fp[AA]<- w0
2617.endif
2618 ADVANCE 2
2619 GET_INST_OPCODE ip // extract opcode from rINST
2620 GOTO_OPCODE ip
2621
2622
2623/* ------------------------------ */
2624 .balign 128
2625.L_op_sget_boolean: /* 0x63 */
2626/* File: arm64/op_sget_boolean.S */
2627/* File: arm64/op_sget.S */
2628 /*
2629 * General SGET handler wrapper.
2630 *
2631 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2632 */
2633 /* op vAA, field//BBBB */
2634
2635 .extern artGetBooleanStaticFromCode
2636 EXPORT_PC
2637 FETCH w0, 1 // w0<- field ref BBBB
2638 ldr x1, [xFP, #OFF_FP_METHOD]
2639 mov x2, xSELF
2640 bl artGetBooleanStaticFromCode
2641 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2642 lsr w2, wINST, #8 // w2<- AA
2643 uxtb w0, w0
2644 PREFETCH_INST 2
2645 cbnz x3, MterpException // bail out
2646.if 0
2647 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2648.else
2649 SET_VREG w0, w2 // fp[AA]<- w0
2650.endif
2651 ADVANCE 2
2652 GET_INST_OPCODE ip // extract opcode from rINST
2653 GOTO_OPCODE ip
2654
2655
2656/* ------------------------------ */
2657 .balign 128
2658.L_op_sget_byte: /* 0x64 */
2659/* File: arm64/op_sget_byte.S */
2660/* File: arm64/op_sget.S */
2661 /*
2662 * General SGET handler wrapper.
2663 *
2664 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2665 */
2666 /* op vAA, field//BBBB */
2667
2668 .extern artGetByteStaticFromCode
2669 EXPORT_PC
2670 FETCH w0, 1 // w0<- field ref BBBB
2671 ldr x1, [xFP, #OFF_FP_METHOD]
2672 mov x2, xSELF
2673 bl artGetByteStaticFromCode
2674 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2675 lsr w2, wINST, #8 // w2<- AA
2676 sxtb w0, w0
2677 PREFETCH_INST 2
2678 cbnz x3, MterpException // bail out
2679.if 0
2680 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2681.else
2682 SET_VREG w0, w2 // fp[AA]<- w0
2683.endif
2684 ADVANCE 2
2685 GET_INST_OPCODE ip // extract opcode from rINST
2686 GOTO_OPCODE ip
2687
2688
2689/* ------------------------------ */
2690 .balign 128
2691.L_op_sget_char: /* 0x65 */
2692/* File: arm64/op_sget_char.S */
2693/* File: arm64/op_sget.S */
2694 /*
2695 * General SGET handler wrapper.
2696 *
2697 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2698 */
2699 /* op vAA, field//BBBB */
2700
2701 .extern artGetCharStaticFromCode
2702 EXPORT_PC
2703 FETCH w0, 1 // w0<- field ref BBBB
2704 ldr x1, [xFP, #OFF_FP_METHOD]
2705 mov x2, xSELF
2706 bl artGetCharStaticFromCode
2707 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2708 lsr w2, wINST, #8 // w2<- AA
2709 uxth w0, w0
2710 PREFETCH_INST 2
2711 cbnz x3, MterpException // bail out
2712.if 0
2713 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2714.else
2715 SET_VREG w0, w2 // fp[AA]<- w0
2716.endif
2717 ADVANCE 2
2718 GET_INST_OPCODE ip // extract opcode from rINST
2719 GOTO_OPCODE ip
2720
2721
2722/* ------------------------------ */
2723 .balign 128
2724.L_op_sget_short: /* 0x66 */
2725/* File: arm64/op_sget_short.S */
2726/* File: arm64/op_sget.S */
2727 /*
2728 * General SGET handler wrapper.
2729 *
2730 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2731 */
2732 /* op vAA, field//BBBB */
2733
2734 .extern artGetShortStaticFromCode
2735 EXPORT_PC
2736 FETCH w0, 1 // w0<- field ref BBBB
2737 ldr x1, [xFP, #OFF_FP_METHOD]
2738 mov x2, xSELF
2739 bl artGetShortStaticFromCode
2740 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2741 lsr w2, wINST, #8 // w2<- AA
2742 sxth w0, w0
2743 PREFETCH_INST 2
2744 cbnz x3, MterpException // bail out
2745.if 0
2746 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2747.else
2748 SET_VREG w0, w2 // fp[AA]<- w0
2749.endif
2750 ADVANCE 2
2751 GET_INST_OPCODE ip // extract opcode from rINST
2752 GOTO_OPCODE ip
2753
2754
2755/* ------------------------------ */
2756 .balign 128
2757.L_op_sput: /* 0x67 */
2758/* File: arm64/op_sput.S */
2759 /*
2760 * General SPUT handler wrapper.
2761 *
2762 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2763 */
2764 /* op vAA, field//BBBB */
2765 EXPORT_PC
2766 FETCH w0, 1 // r0<- field ref BBBB
2767 lsr w3, wINST, #8 // r3<- AA
2768 GET_VREG w1, w3 // r1<= fp[AA]
2769 ldr x2, [xFP, #OFF_FP_METHOD]
2770 mov x3, xSELF
2771 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2772 bl artSet32StaticFromCode
2773 cbnz w0, MterpException // 0 on success
2774 ADVANCE 2 // Past exception point - now advance rPC
2775 GET_INST_OPCODE ip // extract opcode from rINST
2776 GOTO_OPCODE ip // jump to next instruction
2777
2778/* ------------------------------ */
2779 .balign 128
2780.L_op_sput_wide: /* 0x68 */
2781/* File: arm64/op_sput_wide.S */
2782 /*
2783 * SPUT_WIDE handler wrapper.
2784 *
2785 */
2786 /* sput-wide vAA, field//BBBB */
2787 .extern artSet64IndirectStaticFromMterp
2788 EXPORT_PC
2789 FETCH w0, 1 // w0<- field ref BBBB
2790 ldr x1, [xFP, #OFF_FP_METHOD]
2791 lsr w2, wINST, #8 // w3<- AA
buzbeeace690f2016-03-11 09:51:11 -08002792 VREG_INDEX_TO_ADDR x2, w2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002793 mov x3, xSELF
2794 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2795 bl artSet64IndirectStaticFromMterp
2796 cbnz w0, MterpException // 0 on success, -1 on failure
2797 ADVANCE 2 // Past exception point - now advance rPC
2798 GET_INST_OPCODE ip // extract opcode from wINST
2799 GOTO_OPCODE ip // jump to next instruction
2800
2801/* ------------------------------ */
2802 .balign 128
2803.L_op_sput_object: /* 0x69 */
2804/* File: arm64/op_sput_object.S */
2805 EXPORT_PC
2806 add x0, xFP, #OFF_FP_SHADOWFRAME
2807 mov x1, xPC
2808 mov x2, xINST
2809 mov x3, xSELF
2810 bl MterpSputObject
2811 cbz w0, MterpException
2812 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2813 GET_INST_OPCODE ip // extract opcode from rINST
2814 GOTO_OPCODE ip // jump to next instruction
2815
2816/* ------------------------------ */
2817 .balign 128
2818.L_op_sput_boolean: /* 0x6a */
2819/* File: arm64/op_sput_boolean.S */
2820/* File: arm64/op_sput.S */
2821 /*
2822 * General SPUT handler wrapper.
2823 *
2824 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2825 */
2826 /* op vAA, field//BBBB */
2827 EXPORT_PC
2828 FETCH w0, 1 // r0<- field ref BBBB
2829 lsr w3, wINST, #8 // r3<- AA
2830 GET_VREG w1, w3 // r1<= fp[AA]
2831 ldr x2, [xFP, #OFF_FP_METHOD]
2832 mov x3, xSELF
2833 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2834 bl artSet8StaticFromCode
2835 cbnz w0, MterpException // 0 on success
2836 ADVANCE 2 // Past exception point - now advance rPC
2837 GET_INST_OPCODE ip // extract opcode from rINST
2838 GOTO_OPCODE ip // jump to next instruction
2839
2840
2841/* ------------------------------ */
2842 .balign 128
2843.L_op_sput_byte: /* 0x6b */
2844/* File: arm64/op_sput_byte.S */
2845/* File: arm64/op_sput.S */
2846 /*
2847 * General SPUT handler wrapper.
2848 *
2849 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2850 */
2851 /* op vAA, field//BBBB */
2852 EXPORT_PC
2853 FETCH w0, 1 // r0<- field ref BBBB
2854 lsr w3, wINST, #8 // r3<- AA
2855 GET_VREG w1, w3 // r1<= fp[AA]
2856 ldr x2, [xFP, #OFF_FP_METHOD]
2857 mov x3, xSELF
2858 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2859 bl artSet8StaticFromCode
2860 cbnz w0, MterpException // 0 on success
2861 ADVANCE 2 // Past exception point - now advance rPC
2862 GET_INST_OPCODE ip // extract opcode from rINST
2863 GOTO_OPCODE ip // jump to next instruction
2864
2865
2866/* ------------------------------ */
2867 .balign 128
2868.L_op_sput_char: /* 0x6c */
2869/* File: arm64/op_sput_char.S */
2870/* File: arm64/op_sput.S */
2871 /*
2872 * General SPUT handler wrapper.
2873 *
2874 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2875 */
2876 /* op vAA, field//BBBB */
2877 EXPORT_PC
2878 FETCH w0, 1 // r0<- field ref BBBB
2879 lsr w3, wINST, #8 // r3<- AA
2880 GET_VREG w1, w3 // r1<= fp[AA]
2881 ldr x2, [xFP, #OFF_FP_METHOD]
2882 mov x3, xSELF
2883 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2884 bl artSet16StaticFromCode
2885 cbnz w0, MterpException // 0 on success
2886 ADVANCE 2 // Past exception point - now advance rPC
2887 GET_INST_OPCODE ip // extract opcode from rINST
2888 GOTO_OPCODE ip // jump to next instruction
2889
2890
2891/* ------------------------------ */
2892 .balign 128
2893.L_op_sput_short: /* 0x6d */
2894/* File: arm64/op_sput_short.S */
2895/* File: arm64/op_sput.S */
2896 /*
2897 * General SPUT handler wrapper.
2898 *
2899 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2900 */
2901 /* op vAA, field//BBBB */
2902 EXPORT_PC
2903 FETCH w0, 1 // r0<- field ref BBBB
2904 lsr w3, wINST, #8 // r3<- AA
2905 GET_VREG w1, w3 // r1<= fp[AA]
2906 ldr x2, [xFP, #OFF_FP_METHOD]
2907 mov x3, xSELF
2908 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2909 bl artSet16StaticFromCode
2910 cbnz w0, MterpException // 0 on success
2911 ADVANCE 2 // Past exception point - now advance rPC
2912 GET_INST_OPCODE ip // extract opcode from rINST
2913 GOTO_OPCODE ip // jump to next instruction
2914
2915
2916/* ------------------------------ */
2917 .balign 128
2918.L_op_invoke_virtual: /* 0x6e */
2919/* File: arm64/op_invoke_virtual.S */
2920/* File: arm64/invoke.S */
2921 /*
2922 * Generic invoke handler wrapper.
2923 */
2924 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2925 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2926 .extern MterpInvokeVirtual
2927 EXPORT_PC
2928 mov x0, xSELF
2929 add x1, xFP, #OFF_FP_SHADOWFRAME
2930 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002931 mov x3, xINST
2932 bl MterpInvokeVirtual
2933 cbz w0, MterpException
2934 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002935 bl MterpShouldSwitchInterpreters
2936 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002937 GET_INST_OPCODE ip
2938 GOTO_OPCODE ip
2939
2940
2941 /*
2942 * Handle a virtual method call.
2943 *
2944 * for: invoke-virtual, invoke-virtual/range
2945 */
2946 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2947 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2948
2949/* ------------------------------ */
2950 .balign 128
2951.L_op_invoke_super: /* 0x6f */
2952/* File: arm64/op_invoke_super.S */
2953/* File: arm64/invoke.S */
2954 /*
2955 * Generic invoke handler wrapper.
2956 */
2957 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2958 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2959 .extern MterpInvokeSuper
2960 EXPORT_PC
2961 mov x0, xSELF
2962 add x1, xFP, #OFF_FP_SHADOWFRAME
2963 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002964 mov x3, xINST
2965 bl MterpInvokeSuper
2966 cbz w0, MterpException
2967 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002968 bl MterpShouldSwitchInterpreters
2969 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002970 GET_INST_OPCODE ip
2971 GOTO_OPCODE ip
2972
2973
2974 /*
2975 * Handle a "super" method call.
2976 *
2977 * for: invoke-super, invoke-super/range
2978 */
2979 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2980 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2981
2982/* ------------------------------ */
2983 .balign 128
2984.L_op_invoke_direct: /* 0x70 */
2985/* File: arm64/op_invoke_direct.S */
2986/* File: arm64/invoke.S */
2987 /*
2988 * Generic invoke handler wrapper.
2989 */
2990 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2991 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2992 .extern MterpInvokeDirect
2993 EXPORT_PC
2994 mov x0, xSELF
2995 add x1, xFP, #OFF_FP_SHADOWFRAME
2996 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002997 mov x3, xINST
2998 bl MterpInvokeDirect
2999 cbz w0, MterpException
3000 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003001 bl MterpShouldSwitchInterpreters
3002 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003003 GET_INST_OPCODE ip
3004 GOTO_OPCODE ip
3005
3006
3007
3008/* ------------------------------ */
3009 .balign 128
3010.L_op_invoke_static: /* 0x71 */
3011/* File: arm64/op_invoke_static.S */
3012/* File: arm64/invoke.S */
3013 /*
3014 * Generic invoke handler wrapper.
3015 */
3016 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3017 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3018 .extern MterpInvokeStatic
3019 EXPORT_PC
3020 mov x0, xSELF
3021 add x1, xFP, #OFF_FP_SHADOWFRAME
3022 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003023 mov x3, xINST
3024 bl MterpInvokeStatic
3025 cbz w0, MterpException
3026 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003027 bl MterpShouldSwitchInterpreters
3028 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003029 GET_INST_OPCODE ip
3030 GOTO_OPCODE ip
3031
3032
3033
3034
3035/* ------------------------------ */
3036 .balign 128
3037.L_op_invoke_interface: /* 0x72 */
3038/* File: arm64/op_invoke_interface.S */
3039/* File: arm64/invoke.S */
3040 /*
3041 * Generic invoke handler wrapper.
3042 */
3043 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3044 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3045 .extern MterpInvokeInterface
3046 EXPORT_PC
3047 mov x0, xSELF
3048 add x1, xFP, #OFF_FP_SHADOWFRAME
3049 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003050 mov x3, xINST
3051 bl MterpInvokeInterface
3052 cbz w0, MterpException
3053 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003054 bl MterpShouldSwitchInterpreters
3055 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003056 GET_INST_OPCODE ip
3057 GOTO_OPCODE ip
3058
3059
3060 /*
3061 * Handle an interface method call.
3062 *
3063 * for: invoke-interface, invoke-interface/range
3064 */
3065 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3066 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3067
3068/* ------------------------------ */
3069 .balign 128
3070.L_op_return_void_no_barrier: /* 0x73 */
3071/* File: arm64/op_return_void_no_barrier.S */
3072 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
3073 mov x0, xSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -07003074 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003075 b.ne .Lop_return_void_no_barrier_check
3076.Lop_return_void_no_barrier_return:
3077 mov x0, #0
3078 b MterpReturn
3079.Lop_return_void_no_barrier_check:
3080 bl MterpSuspendCheck // (self)
3081 b .Lop_return_void_no_barrier_return
3082
3083/* ------------------------------ */
3084 .balign 128
3085.L_op_invoke_virtual_range: /* 0x74 */
3086/* File: arm64/op_invoke_virtual_range.S */
3087/* File: arm64/invoke.S */
3088 /*
3089 * Generic invoke handler wrapper.
3090 */
3091 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3092 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3093 .extern MterpInvokeVirtualRange
3094 EXPORT_PC
3095 mov x0, xSELF
3096 add x1, xFP, #OFF_FP_SHADOWFRAME
3097 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003098 mov x3, xINST
3099 bl MterpInvokeVirtualRange
3100 cbz w0, MterpException
3101 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003102 bl MterpShouldSwitchInterpreters
3103 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003104 GET_INST_OPCODE ip
3105 GOTO_OPCODE ip
3106
3107
3108
3109/* ------------------------------ */
3110 .balign 128
3111.L_op_invoke_super_range: /* 0x75 */
3112/* File: arm64/op_invoke_super_range.S */
3113/* File: arm64/invoke.S */
3114 /*
3115 * Generic invoke handler wrapper.
3116 */
3117 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3118 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3119 .extern MterpInvokeSuperRange
3120 EXPORT_PC
3121 mov x0, xSELF
3122 add x1, xFP, #OFF_FP_SHADOWFRAME
3123 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003124 mov x3, xINST
3125 bl MterpInvokeSuperRange
3126 cbz w0, MterpException
3127 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003128 bl MterpShouldSwitchInterpreters
3129 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003130 GET_INST_OPCODE ip
3131 GOTO_OPCODE ip
3132
3133
3134
3135/* ------------------------------ */
3136 .balign 128
3137.L_op_invoke_direct_range: /* 0x76 */
3138/* File: arm64/op_invoke_direct_range.S */
3139/* File: arm64/invoke.S */
3140 /*
3141 * Generic invoke handler wrapper.
3142 */
3143 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3144 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3145 .extern MterpInvokeDirectRange
3146 EXPORT_PC
3147 mov x0, xSELF
3148 add x1, xFP, #OFF_FP_SHADOWFRAME
3149 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003150 mov x3, xINST
3151 bl MterpInvokeDirectRange
3152 cbz w0, MterpException
3153 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003154 bl MterpShouldSwitchInterpreters
3155 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003156 GET_INST_OPCODE ip
3157 GOTO_OPCODE ip
3158
3159
3160
3161/* ------------------------------ */
3162 .balign 128
3163.L_op_invoke_static_range: /* 0x77 */
3164/* File: arm64/op_invoke_static_range.S */
3165/* File: arm64/invoke.S */
3166 /*
3167 * Generic invoke handler wrapper.
3168 */
3169 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3170 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3171 .extern MterpInvokeStaticRange
3172 EXPORT_PC
3173 mov x0, xSELF
3174 add x1, xFP, #OFF_FP_SHADOWFRAME
3175 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003176 mov x3, xINST
3177 bl MterpInvokeStaticRange
3178 cbz w0, MterpException
3179 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003180 bl MterpShouldSwitchInterpreters
3181 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003182 GET_INST_OPCODE ip
3183 GOTO_OPCODE ip
3184
3185
3186
3187/* ------------------------------ */
3188 .balign 128
3189.L_op_invoke_interface_range: /* 0x78 */
3190/* File: arm64/op_invoke_interface_range.S */
3191/* File: arm64/invoke.S */
3192 /*
3193 * Generic invoke handler wrapper.
3194 */
3195 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3196 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3197 .extern MterpInvokeInterfaceRange
3198 EXPORT_PC
3199 mov x0, xSELF
3200 add x1, xFP, #OFF_FP_SHADOWFRAME
3201 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003202 mov x3, xINST
3203 bl MterpInvokeInterfaceRange
3204 cbz w0, MterpException
3205 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003206 bl MterpShouldSwitchInterpreters
3207 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003208 GET_INST_OPCODE ip
3209 GOTO_OPCODE ip
3210
3211
3212
3213/* ------------------------------ */
3214 .balign 128
3215.L_op_unused_79: /* 0x79 */
3216/* File: arm64/op_unused_79.S */
3217/* File: arm64/unused.S */
3218/*
3219 * Bail to reference interpreter to throw.
3220 */
3221 b MterpFallback
3222
3223
3224/* ------------------------------ */
3225 .balign 128
3226.L_op_unused_7a: /* 0x7a */
3227/* File: arm64/op_unused_7a.S */
3228/* File: arm64/unused.S */
3229/*
3230 * Bail to reference interpreter to throw.
3231 */
3232 b MterpFallback
3233
3234
3235/* ------------------------------ */
3236 .balign 128
3237.L_op_neg_int: /* 0x7b */
3238/* File: arm64/op_neg_int.S */
3239/* File: arm64/unop.S */
3240 /*
3241 * Generic 32-bit unary operation. Provide an "instr" line that
3242 * specifies an instruction that performs "result = op w0".
3243 * This could be an ARM instruction or a function call.
3244 *
3245 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3246 * int-to-byte, int-to-char, int-to-short
3247 */
3248 /* unop vA, vB */
3249 lsr w3, wINST, #12 // w3<- B
3250 GET_VREG w0, w3 // w0<- vB
3251 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003252 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3253 sub w0, wzr, w0 // w0<- op, w0-w3 changed
3254 GET_INST_OPCODE ip // extract opcode from rINST
3255 SET_VREG w0, w9 // vAA<- w0
3256 GOTO_OPCODE ip // jump to next instruction
3257 /* 8-9 instructions */
3258
3259
3260/* ------------------------------ */
3261 .balign 128
3262.L_op_not_int: /* 0x7c */
3263/* File: arm64/op_not_int.S */
3264/* File: arm64/unop.S */
3265 /*
3266 * Generic 32-bit unary operation. Provide an "instr" line that
3267 * specifies an instruction that performs "result = op w0".
3268 * This could be an ARM instruction or a function call.
3269 *
3270 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3271 * int-to-byte, int-to-char, int-to-short
3272 */
3273 /* unop vA, vB */
3274 lsr w3, wINST, #12 // w3<- B
3275 GET_VREG w0, w3 // w0<- vB
3276 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003277 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3278 mvn w0, w0 // w0<- op, w0-w3 changed
3279 GET_INST_OPCODE ip // extract opcode from rINST
3280 SET_VREG w0, w9 // vAA<- w0
3281 GOTO_OPCODE ip // jump to next instruction
3282 /* 8-9 instructions */
3283
3284
3285/* ------------------------------ */
3286 .balign 128
3287.L_op_neg_long: /* 0x7d */
3288/* File: arm64/op_neg_long.S */
3289/* File: arm64/unopWide.S */
3290 /*
3291 * Generic 64-bit unary operation. Provide an "instr" line that
3292 * specifies an instruction that performs "result = op x0".
3293 *
3294 * For: neg-long, not-long
3295 */
3296 /* unop vA, vB */
3297 lsr w3, wINST, #12 // w3<- B
3298 ubfx w4, wINST, #8, #4 // w4<- A
3299 GET_VREG_WIDE x0, w3
3300 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003301 sub x0, xzr, x0
3302 GET_INST_OPCODE ip // extract opcode from wINST
3303 SET_VREG_WIDE x0, w4
3304 GOTO_OPCODE ip // jump to next instruction
3305 /* 10-11 instructions */
3306
3307
3308/* ------------------------------ */
3309 .balign 128
3310.L_op_not_long: /* 0x7e */
3311/* File: arm64/op_not_long.S */
3312/* File: arm64/unopWide.S */
3313 /*
3314 * Generic 64-bit unary operation. Provide an "instr" line that
3315 * specifies an instruction that performs "result = op x0".
3316 *
3317 * For: neg-long, not-long
3318 */
3319 /* unop vA, vB */
3320 lsr w3, wINST, #12 // w3<- B
3321 ubfx w4, wINST, #8, #4 // w4<- A
3322 GET_VREG_WIDE x0, w3
3323 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003324 mvn x0, x0
3325 GET_INST_OPCODE ip // extract opcode from wINST
3326 SET_VREG_WIDE x0, w4
3327 GOTO_OPCODE ip // jump to next instruction
3328 /* 10-11 instructions */
3329
3330
3331/* ------------------------------ */
3332 .balign 128
3333.L_op_neg_float: /* 0x7f */
3334/* File: arm64/op_neg_float.S */
3335/* File: arm64/unop.S */
3336 /*
3337 * Generic 32-bit unary operation. Provide an "instr" line that
3338 * specifies an instruction that performs "result = op w0".
3339 * This could be an ARM instruction or a function call.
3340 *
3341 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3342 * int-to-byte, int-to-char, int-to-short
3343 */
3344 /* unop vA, vB */
3345 lsr w3, wINST, #12 // w3<- B
3346 GET_VREG w0, w3 // w0<- vB
3347 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003348 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003349 eor w0, w0, #0x80000000 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003350 GET_INST_OPCODE ip // extract opcode from rINST
3351 SET_VREG w0, w9 // vAA<- w0
3352 GOTO_OPCODE ip // jump to next instruction
3353 /* 8-9 instructions */
3354
3355
3356/* ------------------------------ */
3357 .balign 128
3358.L_op_neg_double: /* 0x80 */
3359/* File: arm64/op_neg_double.S */
3360/* File: arm64/unopWide.S */
3361 /*
3362 * Generic 64-bit unary operation. Provide an "instr" line that
3363 * specifies an instruction that performs "result = op x0".
3364 *
3365 * For: neg-long, not-long
3366 */
3367 /* unop vA, vB */
3368 lsr w3, wINST, #12 // w3<- B
3369 ubfx w4, wINST, #8, #4 // w4<- A
3370 GET_VREG_WIDE x0, w3
3371 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003372 eor x0, x0, #0x8000000000000000
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003373 GET_INST_OPCODE ip // extract opcode from wINST
3374 SET_VREG_WIDE x0, w4
3375 GOTO_OPCODE ip // jump to next instruction
3376 /* 10-11 instructions */
3377
3378
3379/* ------------------------------ */
3380 .balign 128
3381.L_op_int_to_long: /* 0x81 */
3382/* File: arm64/op_int_to_long.S */
Vladimir Markoc4165022016-07-28 14:04:18 +01003383 /* int-to-long vA, vB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003384 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003385 ubfx w4, wINST, #8, #4 // w4<- A
Vladimir Marko20421b92016-07-26 16:38:11 +01003386 GET_VREG_S x0, w3 // x0<- sign_extend(fp[B])
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003387 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003388 GET_INST_OPCODE ip // extract opcode from wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003389 SET_VREG_WIDE x0, w4 // fp[A]<- x0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003390 GOTO_OPCODE ip // jump to next instruction
3391
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003392/* ------------------------------ */
3393 .balign 128
3394.L_op_int_to_float: /* 0x82 */
3395/* File: arm64/op_int_to_float.S */
3396/* File: arm64/funopNarrow.S */
3397 /*
3398 * Generic 32bit-to-32bit floating point unary operation. Provide an
3399 * "instr" line that specifies an instruction that performs "s0 = op w0".
3400 *
3401 * For: int-to-float, float-to-int
3402 * TODO: refactor all of the conversions - parameterize width and use same template.
3403 */
3404 /* unop vA, vB */
3405 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003406 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003407 GET_VREG w0, w3
3408 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003409 scvtf s0, w0 // d0<- op
3410 GET_INST_OPCODE ip // extract opcode from wINST
3411 SET_VREG s0, w4 // vA<- d0
3412 GOTO_OPCODE ip // jump to next instruction
3413
3414
3415/* ------------------------------ */
3416 .balign 128
3417.L_op_int_to_double: /* 0x83 */
3418/* File: arm64/op_int_to_double.S */
3419/* File: arm64/funopWider.S */
3420 /*
3421 * Generic 32bit-to-64bit floating point unary operation. Provide an
3422 * "instr" line that specifies an instruction that performs "d0 = op w0".
3423 *
3424 * For: int-to-double, float-to-double, float-to-long
3425 */
3426 /* unop vA, vB */
3427 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003428 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003429 GET_VREG w0, w3
3430 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003431 scvtf d0, w0 // d0<- op
3432 GET_INST_OPCODE ip // extract opcode from wINST
3433 SET_VREG_WIDE d0, w4 // vA<- d0
3434 GOTO_OPCODE ip // jump to next instruction
3435
3436
3437/* ------------------------------ */
3438 .balign 128
3439.L_op_long_to_int: /* 0x84 */
3440/* File: arm64/op_long_to_int.S */
Vladimir Marko20421b92016-07-26 16:38:11 +01003441/* we ignore the high word, making this equivalent to a 32-bit reg move */
3442/* File: arm64/op_move.S */
3443 /* for move, move-object, long-to-int */
3444 /* op vA, vB */
3445 lsr w1, wINST, #12 // x1<- B from 15:12
3446 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003447 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003448 GET_VREG w2, w1 // x2<- fp[B]
3449 GET_INST_OPCODE ip // ip<- opcode from wINST
3450 .if 0
3451 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
3452 .else
3453 SET_VREG w2, w0 // fp[A]<- x2
3454 .endif
3455 GOTO_OPCODE ip // execute next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003456
3457
3458/* ------------------------------ */
3459 .balign 128
3460.L_op_long_to_float: /* 0x85 */
3461/* File: arm64/op_long_to_float.S */
3462/* File: arm64/funopNarrower.S */
3463 /*
3464 * Generic 64bit-to-32bit floating point unary operation. Provide an
3465 * "instr" line that specifies an instruction that performs "s0 = op x0".
3466 *
3467 * For: int-to-double, float-to-double, float-to-long
3468 */
3469 /* unop vA, vB */
3470 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003471 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003472 GET_VREG_WIDE x0, w3
3473 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003474 scvtf s0, x0 // d0<- op
3475 GET_INST_OPCODE ip // extract opcode from wINST
3476 SET_VREG s0, w4 // vA<- d0
3477 GOTO_OPCODE ip // jump to next instruction
3478
3479
3480/* ------------------------------ */
3481 .balign 128
3482.L_op_long_to_double: /* 0x86 */
3483/* File: arm64/op_long_to_double.S */
3484/* File: arm64/funopWide.S */
3485 /*
3486 * Generic 64bit-to-64bit floating point unary operation. Provide an
3487 * "instr" line that specifies an instruction that performs "d0 = op x0".
3488 *
3489 * For: long-to-double, double-to-long
3490 */
3491 /* unop vA, vB */
3492 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003493 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003494 GET_VREG_WIDE x0, w3
3495 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003496 scvtf d0, x0 // d0<- op
3497 GET_INST_OPCODE ip // extract opcode from wINST
3498 SET_VREG_WIDE d0, w4 // vA<- d0
3499 GOTO_OPCODE ip // jump to next instruction
3500
3501
3502/* ------------------------------ */
3503 .balign 128
3504.L_op_float_to_int: /* 0x87 */
3505/* File: arm64/op_float_to_int.S */
3506/* File: arm64/funopNarrow.S */
3507 /*
3508 * Generic 32bit-to-32bit floating point unary operation. Provide an
3509 * "instr" line that specifies an instruction that performs "w0 = op s0".
3510 *
3511 * For: int-to-float, float-to-int
3512 * TODO: refactor all of the conversions - parameterize width and use same template.
3513 */
3514 /* unop vA, vB */
3515 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003516 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003517 GET_VREG s0, w3
3518 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003519 fcvtzs w0, s0 // d0<- op
3520 GET_INST_OPCODE ip // extract opcode from wINST
3521 SET_VREG w0, w4 // vA<- d0
3522 GOTO_OPCODE ip // jump to next instruction
3523
3524
3525/* ------------------------------ */
3526 .balign 128
3527.L_op_float_to_long: /* 0x88 */
3528/* File: arm64/op_float_to_long.S */
3529/* File: arm64/funopWider.S */
3530 /*
3531 * Generic 32bit-to-64bit floating point unary operation. Provide an
3532 * "instr" line that specifies an instruction that performs "x0 = op s0".
3533 *
3534 * For: int-to-double, float-to-double, float-to-long
3535 */
3536 /* unop vA, vB */
3537 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003538 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003539 GET_VREG s0, w3
3540 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003541 fcvtzs x0, s0 // d0<- op
3542 GET_INST_OPCODE ip // extract opcode from wINST
3543 SET_VREG_WIDE x0, w4 // vA<- d0
3544 GOTO_OPCODE ip // jump to next instruction
3545
3546
3547/* ------------------------------ */
3548 .balign 128
3549.L_op_float_to_double: /* 0x89 */
3550/* File: arm64/op_float_to_double.S */
3551/* File: arm64/funopWider.S */
3552 /*
3553 * Generic 32bit-to-64bit floating point unary operation. Provide an
3554 * "instr" line that specifies an instruction that performs "d0 = op s0".
3555 *
3556 * For: int-to-double, float-to-double, float-to-long
3557 */
3558 /* unop vA, vB */
3559 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003560 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003561 GET_VREG s0, w3
3562 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003563 fcvt d0, s0 // d0<- op
3564 GET_INST_OPCODE ip // extract opcode from wINST
3565 SET_VREG_WIDE d0, w4 // vA<- d0
3566 GOTO_OPCODE ip // jump to next instruction
3567
3568
3569/* ------------------------------ */
3570 .balign 128
3571.L_op_double_to_int: /* 0x8a */
3572/* File: arm64/op_double_to_int.S */
3573/* File: arm64/funopNarrower.S */
3574 /*
3575 * Generic 64bit-to-32bit floating point unary operation. Provide an
3576 * "instr" line that specifies an instruction that performs "w0 = op d0".
3577 *
3578 * For: int-to-double, float-to-double, float-to-long
3579 */
3580 /* unop vA, vB */
3581 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003582 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003583 GET_VREG_WIDE d0, w3
3584 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003585 fcvtzs w0, d0 // d0<- op
3586 GET_INST_OPCODE ip // extract opcode from wINST
3587 SET_VREG w0, w4 // vA<- d0
3588 GOTO_OPCODE ip // jump to next instruction
3589
3590
3591/* ------------------------------ */
3592 .balign 128
3593.L_op_double_to_long: /* 0x8b */
3594/* File: arm64/op_double_to_long.S */
3595/* File: arm64/funopWide.S */
3596 /*
3597 * Generic 64bit-to-64bit floating point unary operation. Provide an
3598 * "instr" line that specifies an instruction that performs "x0 = op d0".
3599 *
3600 * For: long-to-double, double-to-long
3601 */
3602 /* unop vA, vB */
3603 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003604 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003605 GET_VREG_WIDE d0, w3
3606 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003607 fcvtzs x0, d0 // d0<- op
3608 GET_INST_OPCODE ip // extract opcode from wINST
3609 SET_VREG_WIDE x0, w4 // vA<- d0
3610 GOTO_OPCODE ip // jump to next instruction
3611
3612
3613/* ------------------------------ */
3614 .balign 128
3615.L_op_double_to_float: /* 0x8c */
3616/* File: arm64/op_double_to_float.S */
3617/* File: arm64/funopNarrower.S */
3618 /*
3619 * Generic 64bit-to-32bit floating point unary operation. Provide an
3620 * "instr" line that specifies an instruction that performs "s0 = op d0".
3621 *
3622 * For: int-to-double, float-to-double, float-to-long
3623 */
3624 /* unop vA, vB */
3625 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003626 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003627 GET_VREG_WIDE d0, w3
3628 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003629 fcvt s0, d0 // d0<- op
3630 GET_INST_OPCODE ip // extract opcode from wINST
3631 SET_VREG s0, w4 // vA<- d0
3632 GOTO_OPCODE ip // jump to next instruction
3633
3634
3635/* ------------------------------ */
3636 .balign 128
3637.L_op_int_to_byte: /* 0x8d */
3638/* File: arm64/op_int_to_byte.S */
3639/* File: arm64/unop.S */
3640 /*
3641 * Generic 32-bit unary operation. Provide an "instr" line that
3642 * specifies an instruction that performs "result = op w0".
3643 * This could be an ARM instruction or a function call.
3644 *
3645 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3646 * int-to-byte, int-to-char, int-to-short
3647 */
3648 /* unop vA, vB */
3649 lsr w3, wINST, #12 // w3<- B
3650 GET_VREG w0, w3 // w0<- vB
3651 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003652 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3653 sxtb w0, w0 // w0<- op, w0-w3 changed
3654 GET_INST_OPCODE ip // extract opcode from rINST
3655 SET_VREG w0, w9 // vAA<- w0
3656 GOTO_OPCODE ip // jump to next instruction
3657 /* 8-9 instructions */
3658
3659
3660/* ------------------------------ */
3661 .balign 128
3662.L_op_int_to_char: /* 0x8e */
3663/* File: arm64/op_int_to_char.S */
3664/* File: arm64/unop.S */
3665 /*
3666 * Generic 32-bit unary operation. Provide an "instr" line that
3667 * specifies an instruction that performs "result = op w0".
3668 * This could be an ARM instruction or a function call.
3669 *
3670 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3671 * int-to-byte, int-to-char, int-to-short
3672 */
3673 /* unop vA, vB */
3674 lsr w3, wINST, #12 // w3<- B
3675 GET_VREG w0, w3 // w0<- vB
3676 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003677 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3678 uxth w0, w0 // w0<- op, w0-w3 changed
3679 GET_INST_OPCODE ip // extract opcode from rINST
3680 SET_VREG w0, w9 // vAA<- w0
3681 GOTO_OPCODE ip // jump to next instruction
3682 /* 8-9 instructions */
3683
3684
3685/* ------------------------------ */
3686 .balign 128
3687.L_op_int_to_short: /* 0x8f */
3688/* File: arm64/op_int_to_short.S */
3689/* File: arm64/unop.S */
3690 /*
3691 * Generic 32-bit unary operation. Provide an "instr" line that
3692 * specifies an instruction that performs "result = op w0".
3693 * This could be an ARM instruction or a function call.
3694 *
3695 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3696 * int-to-byte, int-to-char, int-to-short
3697 */
3698 /* unop vA, vB */
3699 lsr w3, wINST, #12 // w3<- B
3700 GET_VREG w0, w3 // w0<- vB
3701 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003702 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3703 sxth w0, w0 // w0<- op, w0-w3 changed
3704 GET_INST_OPCODE ip // extract opcode from rINST
3705 SET_VREG w0, w9 // vAA<- w0
3706 GOTO_OPCODE ip // jump to next instruction
3707 /* 8-9 instructions */
3708
3709
3710/* ------------------------------ */
3711 .balign 128
3712.L_op_add_int: /* 0x90 */
3713/* File: arm64/op_add_int.S */
3714/* File: arm64/binop.S */
3715 /*
3716 * Generic 32-bit binary operation. Provide an "instr" line that
3717 * specifies an instruction that performs "result = w0 op w1".
3718 * This could be an ARM instruction or a function call. (If the result
3719 * comes back in a register other than w0, you can override "result".)
3720 *
3721 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3722 * vCC (w1). Useful for integer division and modulus. Note that we
3723 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3724 * handles it correctly.
3725 *
3726 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3727 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3728 * mul-float, div-float, rem-float
3729 */
3730 /* binop vAA, vBB, vCC */
3731 FETCH w0, 1 // w0<- CCBB
3732 lsr w9, wINST, #8 // w9<- AA
3733 lsr w3, w0, #8 // w3<- CC
3734 and w2, w0, #255 // w2<- BB
3735 GET_VREG w1, w3 // w1<- vCC
3736 GET_VREG w0, w2 // w0<- vBB
3737 .if 0
3738 cbz w1, common_errDivideByZero // is second operand zero?
3739 .endif
3740 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3741 // optional op; may set condition codes
3742 add w0, w0, w1 // w0<- op, w0-w3 changed
3743 GET_INST_OPCODE ip // extract opcode from rINST
3744 SET_VREG w0, w9 // vAA<- w0
3745 GOTO_OPCODE ip // jump to next instruction
3746 /* 11-14 instructions */
3747
3748
3749/* ------------------------------ */
3750 .balign 128
3751.L_op_sub_int: /* 0x91 */
3752/* File: arm64/op_sub_int.S */
3753/* File: arm64/binop.S */
3754 /*
3755 * Generic 32-bit binary operation. Provide an "instr" line that
3756 * specifies an instruction that performs "result = w0 op w1".
3757 * This could be an ARM instruction or a function call. (If the result
3758 * comes back in a register other than w0, you can override "result".)
3759 *
3760 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3761 * vCC (w1). Useful for integer division and modulus. Note that we
3762 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3763 * handles it correctly.
3764 *
3765 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3766 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3767 * mul-float, div-float, rem-float
3768 */
3769 /* binop vAA, vBB, vCC */
3770 FETCH w0, 1 // w0<- CCBB
3771 lsr w9, wINST, #8 // w9<- AA
3772 lsr w3, w0, #8 // w3<- CC
3773 and w2, w0, #255 // w2<- BB
3774 GET_VREG w1, w3 // w1<- vCC
3775 GET_VREG w0, w2 // w0<- vBB
3776 .if 0
3777 cbz w1, common_errDivideByZero // is second operand zero?
3778 .endif
3779 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3780 // optional op; may set condition codes
3781 sub w0, w0, w1 // w0<- op, w0-w3 changed
3782 GET_INST_OPCODE ip // extract opcode from rINST
3783 SET_VREG w0, w9 // vAA<- w0
3784 GOTO_OPCODE ip // jump to next instruction
3785 /* 11-14 instructions */
3786
3787
3788/* ------------------------------ */
3789 .balign 128
3790.L_op_mul_int: /* 0x92 */
3791/* File: arm64/op_mul_int.S */
3792/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
3793/* File: arm64/binop.S */
3794 /*
3795 * Generic 32-bit binary operation. Provide an "instr" line that
3796 * specifies an instruction that performs "result = w0 op w1".
3797 * This could be an ARM instruction or a function call. (If the result
3798 * comes back in a register other than w0, you can override "result".)
3799 *
3800 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3801 * vCC (w1). Useful for integer division and modulus. Note that we
3802 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3803 * handles it correctly.
3804 *
3805 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3806 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3807 * mul-float, div-float, rem-float
3808 */
3809 /* binop vAA, vBB, vCC */
3810 FETCH w0, 1 // w0<- CCBB
3811 lsr w9, wINST, #8 // w9<- AA
3812 lsr w3, w0, #8 // w3<- CC
3813 and w2, w0, #255 // w2<- BB
3814 GET_VREG w1, w3 // w1<- vCC
3815 GET_VREG w0, w2 // w0<- vBB
3816 .if 0
3817 cbz w1, common_errDivideByZero // is second operand zero?
3818 .endif
3819 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3820 // optional op; may set condition codes
3821 mul w0, w1, w0 // w0<- op, w0-w3 changed
3822 GET_INST_OPCODE ip // extract opcode from rINST
3823 SET_VREG w0, w9 // vAA<- w0
3824 GOTO_OPCODE ip // jump to next instruction
3825 /* 11-14 instructions */
3826
3827
3828/* ------------------------------ */
3829 .balign 128
3830.L_op_div_int: /* 0x93 */
3831/* File: arm64/op_div_int.S */
3832/* File: arm64/binop.S */
3833 /*
3834 * Generic 32-bit binary operation. Provide an "instr" line that
3835 * specifies an instruction that performs "result = w0 op w1".
3836 * This could be an ARM instruction or a function call. (If the result
3837 * comes back in a register other than w0, you can override "result".)
3838 *
3839 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3840 * vCC (w1). Useful for integer division and modulus. Note that we
3841 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3842 * handles it correctly.
3843 *
3844 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3845 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3846 * mul-float, div-float, rem-float
3847 */
3848 /* binop vAA, vBB, vCC */
3849 FETCH w0, 1 // w0<- CCBB
3850 lsr w9, wINST, #8 // w9<- AA
3851 lsr w3, w0, #8 // w3<- CC
3852 and w2, w0, #255 // w2<- BB
3853 GET_VREG w1, w3 // w1<- vCC
3854 GET_VREG w0, w2 // w0<- vBB
3855 .if 1
3856 cbz w1, common_errDivideByZero // is second operand zero?
3857 .endif
3858 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3859 // optional op; may set condition codes
3860 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
3861 GET_INST_OPCODE ip // extract opcode from rINST
3862 SET_VREG w0, w9 // vAA<- w0
3863 GOTO_OPCODE ip // jump to next instruction
3864 /* 11-14 instructions */
3865
3866
3867/* ------------------------------ */
3868 .balign 128
3869.L_op_rem_int: /* 0x94 */
3870/* File: arm64/op_rem_int.S */
3871/* File: arm64/binop.S */
3872 /*
3873 * Generic 32-bit binary operation. Provide an "instr" line that
3874 * specifies an instruction that performs "result = w0 op w1".
3875 * This could be an ARM instruction or a function call. (If the result
3876 * comes back in a register other than w0, you can override "result".)
3877 *
3878 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3879 * vCC (w1). Useful for integer division and modulus. Note that we
3880 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3881 * handles it correctly.
3882 *
3883 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3884 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3885 * mul-float, div-float, rem-float
3886 */
3887 /* binop vAA, vBB, vCC */
3888 FETCH w0, 1 // w0<- CCBB
3889 lsr w9, wINST, #8 // w9<- AA
3890 lsr w3, w0, #8 // w3<- CC
3891 and w2, w0, #255 // w2<- BB
3892 GET_VREG w1, w3 // w1<- vCC
3893 GET_VREG w0, w2 // w0<- vBB
3894 .if 1
3895 cbz w1, common_errDivideByZero // is second operand zero?
3896 .endif
3897 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3898 sdiv w2, w0, w1 // optional op; may set condition codes
3899 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
3900 GET_INST_OPCODE ip // extract opcode from rINST
3901 SET_VREG w0, w9 // vAA<- w0
3902 GOTO_OPCODE ip // jump to next instruction
3903 /* 11-14 instructions */
3904
3905
3906/* ------------------------------ */
3907 .balign 128
3908.L_op_and_int: /* 0x95 */
3909/* File: arm64/op_and_int.S */
3910/* File: arm64/binop.S */
3911 /*
3912 * Generic 32-bit binary operation. Provide an "instr" line that
3913 * specifies an instruction that performs "result = w0 op w1".
3914 * This could be an ARM instruction or a function call. (If the result
3915 * comes back in a register other than w0, you can override "result".)
3916 *
3917 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3918 * vCC (w1). Useful for integer division and modulus. Note that we
3919 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3920 * handles it correctly.
3921 *
3922 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3923 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3924 * mul-float, div-float, rem-float
3925 */
3926 /* binop vAA, vBB, vCC */
3927 FETCH w0, 1 // w0<- CCBB
3928 lsr w9, wINST, #8 // w9<- AA
3929 lsr w3, w0, #8 // w3<- CC
3930 and w2, w0, #255 // w2<- BB
3931 GET_VREG w1, w3 // w1<- vCC
3932 GET_VREG w0, w2 // w0<- vBB
3933 .if 0
3934 cbz w1, common_errDivideByZero // is second operand zero?
3935 .endif
3936 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3937 // optional op; may set condition codes
3938 and w0, w0, w1 // w0<- op, w0-w3 changed
3939 GET_INST_OPCODE ip // extract opcode from rINST
3940 SET_VREG w0, w9 // vAA<- w0
3941 GOTO_OPCODE ip // jump to next instruction
3942 /* 11-14 instructions */
3943
3944
3945/* ------------------------------ */
3946 .balign 128
3947.L_op_or_int: /* 0x96 */
3948/* File: arm64/op_or_int.S */
3949/* File: arm64/binop.S */
3950 /*
3951 * Generic 32-bit binary operation. Provide an "instr" line that
3952 * specifies an instruction that performs "result = w0 op w1".
3953 * This could be an ARM instruction or a function call. (If the result
3954 * comes back in a register other than w0, you can override "result".)
3955 *
3956 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3957 * vCC (w1). Useful for integer division and modulus. Note that we
3958 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3959 * handles it correctly.
3960 *
3961 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3962 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3963 * mul-float, div-float, rem-float
3964 */
3965 /* binop vAA, vBB, vCC */
3966 FETCH w0, 1 // w0<- CCBB
3967 lsr w9, wINST, #8 // w9<- AA
3968 lsr w3, w0, #8 // w3<- CC
3969 and w2, w0, #255 // w2<- BB
3970 GET_VREG w1, w3 // w1<- vCC
3971 GET_VREG w0, w2 // w0<- vBB
3972 .if 0
3973 cbz w1, common_errDivideByZero // is second operand zero?
3974 .endif
3975 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3976 // optional op; may set condition codes
3977 orr w0, w0, w1 // w0<- op, w0-w3 changed
3978 GET_INST_OPCODE ip // extract opcode from rINST
3979 SET_VREG w0, w9 // vAA<- w0
3980 GOTO_OPCODE ip // jump to next instruction
3981 /* 11-14 instructions */
3982
3983
3984/* ------------------------------ */
3985 .balign 128
3986.L_op_xor_int: /* 0x97 */
3987/* File: arm64/op_xor_int.S */
3988/* File: arm64/binop.S */
3989 /*
3990 * Generic 32-bit binary operation. Provide an "instr" line that
3991 * specifies an instruction that performs "result = w0 op w1".
3992 * This could be an ARM instruction or a function call. (If the result
3993 * comes back in a register other than w0, you can override "result".)
3994 *
3995 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3996 * vCC (w1). Useful for integer division and modulus. Note that we
3997 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3998 * handles it correctly.
3999 *
4000 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4001 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4002 * mul-float, div-float, rem-float
4003 */
4004 /* binop vAA, vBB, vCC */
4005 FETCH w0, 1 // w0<- CCBB
4006 lsr w9, wINST, #8 // w9<- AA
4007 lsr w3, w0, #8 // w3<- CC
4008 and w2, w0, #255 // w2<- BB
4009 GET_VREG w1, w3 // w1<- vCC
4010 GET_VREG w0, w2 // w0<- vBB
4011 .if 0
4012 cbz w1, common_errDivideByZero // is second operand zero?
4013 .endif
4014 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4015 // optional op; may set condition codes
4016 eor w0, w0, w1 // w0<- op, w0-w3 changed
4017 GET_INST_OPCODE ip // extract opcode from rINST
4018 SET_VREG w0, w9 // vAA<- w0
4019 GOTO_OPCODE ip // jump to next instruction
4020 /* 11-14 instructions */
4021
4022
4023/* ------------------------------ */
4024 .balign 128
4025.L_op_shl_int: /* 0x98 */
4026/* File: arm64/op_shl_int.S */
4027/* File: arm64/binop.S */
4028 /*
4029 * Generic 32-bit binary operation. Provide an "instr" line that
4030 * specifies an instruction that performs "result = w0 op w1".
4031 * This could be an ARM instruction or a function call. (If the result
4032 * comes back in a register other than w0, you can override "result".)
4033 *
4034 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4035 * vCC (w1). Useful for integer division and modulus. Note that we
4036 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4037 * handles it correctly.
4038 *
4039 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4040 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4041 * mul-float, div-float, rem-float
4042 */
4043 /* binop vAA, vBB, vCC */
4044 FETCH w0, 1 // w0<- CCBB
4045 lsr w9, wINST, #8 // w9<- AA
4046 lsr w3, w0, #8 // w3<- CC
4047 and w2, w0, #255 // w2<- BB
4048 GET_VREG w1, w3 // w1<- vCC
4049 GET_VREG w0, w2 // w0<- vBB
4050 .if 0
4051 cbz w1, common_errDivideByZero // is second operand zero?
4052 .endif
4053 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004054 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004055 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4056 GET_INST_OPCODE ip // extract opcode from rINST
4057 SET_VREG w0, w9 // vAA<- w0
4058 GOTO_OPCODE ip // jump to next instruction
4059 /* 11-14 instructions */
4060
4061
4062/* ------------------------------ */
4063 .balign 128
4064.L_op_shr_int: /* 0x99 */
4065/* File: arm64/op_shr_int.S */
4066/* File: arm64/binop.S */
4067 /*
4068 * Generic 32-bit binary operation. Provide an "instr" line that
4069 * specifies an instruction that performs "result = w0 op w1".
4070 * This could be an ARM instruction or a function call. (If the result
4071 * comes back in a register other than w0, you can override "result".)
4072 *
4073 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4074 * vCC (w1). Useful for integer division and modulus. Note that we
4075 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4076 * handles it correctly.
4077 *
4078 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4079 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4080 * mul-float, div-float, rem-float
4081 */
4082 /* binop vAA, vBB, vCC */
4083 FETCH w0, 1 // w0<- CCBB
4084 lsr w9, wINST, #8 // w9<- AA
4085 lsr w3, w0, #8 // w3<- CC
4086 and w2, w0, #255 // w2<- BB
4087 GET_VREG w1, w3 // w1<- vCC
4088 GET_VREG w0, w2 // w0<- vBB
4089 .if 0
4090 cbz w1, common_errDivideByZero // is second operand zero?
4091 .endif
4092 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004093 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004094 asr w0, w0, w1 // w0<- op, w0-w3 changed
4095 GET_INST_OPCODE ip // extract opcode from rINST
4096 SET_VREG w0, w9 // vAA<- w0
4097 GOTO_OPCODE ip // jump to next instruction
4098 /* 11-14 instructions */
4099
4100
4101/* ------------------------------ */
4102 .balign 128
4103.L_op_ushr_int: /* 0x9a */
4104/* File: arm64/op_ushr_int.S */
4105/* File: arm64/binop.S */
4106 /*
4107 * Generic 32-bit binary operation. Provide an "instr" line that
4108 * specifies an instruction that performs "result = w0 op w1".
4109 * This could be an ARM instruction or a function call. (If the result
4110 * comes back in a register other than w0, you can override "result".)
4111 *
4112 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4113 * vCC (w1). Useful for integer division and modulus. Note that we
4114 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4115 * handles it correctly.
4116 *
4117 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4118 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4119 * mul-float, div-float, rem-float
4120 */
4121 /* binop vAA, vBB, vCC */
4122 FETCH w0, 1 // w0<- CCBB
4123 lsr w9, wINST, #8 // w9<- AA
4124 lsr w3, w0, #8 // w3<- CC
4125 and w2, w0, #255 // w2<- BB
4126 GET_VREG w1, w3 // w1<- vCC
4127 GET_VREG w0, w2 // w0<- vBB
4128 .if 0
4129 cbz w1, common_errDivideByZero // is second operand zero?
4130 .endif
4131 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004132 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004133 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4134 GET_INST_OPCODE ip // extract opcode from rINST
4135 SET_VREG w0, w9 // vAA<- w0
4136 GOTO_OPCODE ip // jump to next instruction
4137 /* 11-14 instructions */
4138
4139
4140/* ------------------------------ */
4141 .balign 128
4142.L_op_add_long: /* 0x9b */
4143/* File: arm64/op_add_long.S */
4144/* File: arm64/binopWide.S */
4145 /*
4146 * Generic 64-bit binary operation. Provide an "instr" line that
4147 * specifies an instruction that performs "result = x1 op x2".
4148 * This could be an ARM instruction or a function call. (If the result
4149 * comes back in a register other than x0, you can override "result".)
4150 *
4151 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4152 * vCC (w1). Useful for integer division and modulus.
4153 *
4154 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4155 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4156 */
4157 /* binop vAA, vBB, vCC */
4158 FETCH w0, 1 // w0<- CCBB
4159 lsr w4, wINST, #8 // w4<- AA
4160 lsr w2, w0, #8 // w2<- CC
4161 and w1, w0, #255 // w1<- BB
4162 GET_VREG_WIDE x2, w2 // w2<- vCC
4163 GET_VREG_WIDE x1, w1 // w1<- vBB
4164 .if 0
4165 cbz x2, common_errDivideByZero // is second operand zero?
4166 .endif
4167 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4168
4169 add x0, x1, x2 // x0<- op, w0-w4 changed
4170 GET_INST_OPCODE ip // extract opcode from rINST
4171 SET_VREG_WIDE x0, w4 // vAA<- x0
4172 GOTO_OPCODE ip // jump to next instruction
4173 /* 11-14 instructions */
4174
4175
4176/* ------------------------------ */
4177 .balign 128
4178.L_op_sub_long: /* 0x9c */
4179/* File: arm64/op_sub_long.S */
4180/* File: arm64/binopWide.S */
4181 /*
4182 * Generic 64-bit binary operation. Provide an "instr" line that
4183 * specifies an instruction that performs "result = x1 op x2".
4184 * This could be an ARM instruction or a function call. (If the result
4185 * comes back in a register other than x0, you can override "result".)
4186 *
4187 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4188 * vCC (w1). Useful for integer division and modulus.
4189 *
4190 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4191 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4192 */
4193 /* binop vAA, vBB, vCC */
4194 FETCH w0, 1 // w0<- CCBB
4195 lsr w4, wINST, #8 // w4<- AA
4196 lsr w2, w0, #8 // w2<- CC
4197 and w1, w0, #255 // w1<- BB
4198 GET_VREG_WIDE x2, w2 // w2<- vCC
4199 GET_VREG_WIDE x1, w1 // w1<- vBB
4200 .if 0
4201 cbz x2, common_errDivideByZero // is second operand zero?
4202 .endif
4203 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4204
4205 sub x0, x1, x2 // x0<- op, w0-w4 changed
4206 GET_INST_OPCODE ip // extract opcode from rINST
4207 SET_VREG_WIDE x0, w4 // vAA<- x0
4208 GOTO_OPCODE ip // jump to next instruction
4209 /* 11-14 instructions */
4210
4211
4212/* ------------------------------ */
4213 .balign 128
4214.L_op_mul_long: /* 0x9d */
4215/* File: arm64/op_mul_long.S */
4216/* File: arm64/binopWide.S */
4217 /*
4218 * Generic 64-bit binary operation. Provide an "instr" line that
4219 * specifies an instruction that performs "result = x1 op x2".
4220 * This could be an ARM instruction or a function call. (If the result
4221 * comes back in a register other than x0, you can override "result".)
4222 *
4223 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4224 * vCC (w1). Useful for integer division and modulus.
4225 *
4226 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4227 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4228 */
4229 /* binop vAA, vBB, vCC */
4230 FETCH w0, 1 // w0<- CCBB
4231 lsr w4, wINST, #8 // w4<- AA
4232 lsr w2, w0, #8 // w2<- CC
4233 and w1, w0, #255 // w1<- BB
4234 GET_VREG_WIDE x2, w2 // w2<- vCC
4235 GET_VREG_WIDE x1, w1 // w1<- vBB
4236 .if 0
4237 cbz x2, common_errDivideByZero // is second operand zero?
4238 .endif
4239 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4240
4241 mul x0, x1, x2 // x0<- op, w0-w4 changed
4242 GET_INST_OPCODE ip // extract opcode from rINST
4243 SET_VREG_WIDE x0, w4 // vAA<- x0
4244 GOTO_OPCODE ip // jump to next instruction
4245 /* 11-14 instructions */
4246
4247
4248/* ------------------------------ */
4249 .balign 128
4250.L_op_div_long: /* 0x9e */
4251/* File: arm64/op_div_long.S */
4252/* File: arm64/binopWide.S */
4253 /*
4254 * Generic 64-bit binary operation. Provide an "instr" line that
4255 * specifies an instruction that performs "result = x1 op x2".
4256 * This could be an ARM instruction or a function call. (If the result
4257 * comes back in a register other than x0, you can override "result".)
4258 *
4259 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4260 * vCC (w1). Useful for integer division and modulus.
4261 *
4262 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4263 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4264 */
4265 /* binop vAA, vBB, vCC */
4266 FETCH w0, 1 // w0<- CCBB
4267 lsr w4, wINST, #8 // w4<- AA
4268 lsr w2, w0, #8 // w2<- CC
4269 and w1, w0, #255 // w1<- BB
4270 GET_VREG_WIDE x2, w2 // w2<- vCC
4271 GET_VREG_WIDE x1, w1 // w1<- vBB
4272 .if 1
4273 cbz x2, common_errDivideByZero // is second operand zero?
4274 .endif
4275 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4276
4277 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4278 GET_INST_OPCODE ip // extract opcode from rINST
4279 SET_VREG_WIDE x0, w4 // vAA<- x0
4280 GOTO_OPCODE ip // jump to next instruction
4281 /* 11-14 instructions */
4282
4283
4284/* ------------------------------ */
4285 .balign 128
4286.L_op_rem_long: /* 0x9f */
4287/* File: arm64/op_rem_long.S */
4288/* File: arm64/binopWide.S */
4289 /*
4290 * Generic 64-bit binary operation. Provide an "instr" line that
4291 * specifies an instruction that performs "result = x1 op x2".
4292 * This could be an ARM instruction or a function call. (If the result
4293 * comes back in a register other than x0, you can override "result".)
4294 *
4295 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4296 * vCC (w1). Useful for integer division and modulus.
4297 *
4298 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4299 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4300 */
4301 /* binop vAA, vBB, vCC */
4302 FETCH w0, 1 // w0<- CCBB
4303 lsr w4, wINST, #8 // w4<- AA
4304 lsr w2, w0, #8 // w2<- CC
4305 and w1, w0, #255 // w1<- BB
4306 GET_VREG_WIDE x2, w2 // w2<- vCC
4307 GET_VREG_WIDE x1, w1 // w1<- vBB
4308 .if 1
4309 cbz x2, common_errDivideByZero // is second operand zero?
4310 .endif
4311 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4312 sdiv x3, x1, x2
4313 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4314 GET_INST_OPCODE ip // extract opcode from rINST
4315 SET_VREG_WIDE x0, w4 // vAA<- x0
4316 GOTO_OPCODE ip // jump to next instruction
4317 /* 11-14 instructions */
4318
4319
4320/* ------------------------------ */
4321 .balign 128
4322.L_op_and_long: /* 0xa0 */
4323/* File: arm64/op_and_long.S */
4324/* File: arm64/binopWide.S */
4325 /*
4326 * Generic 64-bit binary operation. Provide an "instr" line that
4327 * specifies an instruction that performs "result = x1 op x2".
4328 * This could be an ARM instruction or a function call. (If the result
4329 * comes back in a register other than x0, you can override "result".)
4330 *
4331 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4332 * vCC (w1). Useful for integer division and modulus.
4333 *
4334 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4335 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4336 */
4337 /* binop vAA, vBB, vCC */
4338 FETCH w0, 1 // w0<- CCBB
4339 lsr w4, wINST, #8 // w4<- AA
4340 lsr w2, w0, #8 // w2<- CC
4341 and w1, w0, #255 // w1<- BB
4342 GET_VREG_WIDE x2, w2 // w2<- vCC
4343 GET_VREG_WIDE x1, w1 // w1<- vBB
4344 .if 0
4345 cbz x2, common_errDivideByZero // is second operand zero?
4346 .endif
4347 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4348
4349 and x0, x1, x2 // x0<- op, w0-w4 changed
4350 GET_INST_OPCODE ip // extract opcode from rINST
4351 SET_VREG_WIDE x0, w4 // vAA<- x0
4352 GOTO_OPCODE ip // jump to next instruction
4353 /* 11-14 instructions */
4354
4355
4356/* ------------------------------ */
4357 .balign 128
4358.L_op_or_long: /* 0xa1 */
4359/* File: arm64/op_or_long.S */
4360/* File: arm64/binopWide.S */
4361 /*
4362 * Generic 64-bit binary operation. Provide an "instr" line that
4363 * specifies an instruction that performs "result = x1 op x2".
4364 * This could be an ARM instruction or a function call. (If the result
4365 * comes back in a register other than x0, you can override "result".)
4366 *
4367 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4368 * vCC (w1). Useful for integer division and modulus.
4369 *
4370 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4371 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4372 */
4373 /* binop vAA, vBB, vCC */
4374 FETCH w0, 1 // w0<- CCBB
4375 lsr w4, wINST, #8 // w4<- AA
4376 lsr w2, w0, #8 // w2<- CC
4377 and w1, w0, #255 // w1<- BB
4378 GET_VREG_WIDE x2, w2 // w2<- vCC
4379 GET_VREG_WIDE x1, w1 // w1<- vBB
4380 .if 0
4381 cbz x2, common_errDivideByZero // is second operand zero?
4382 .endif
4383 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4384
4385 orr x0, x1, x2 // x0<- op, w0-w4 changed
4386 GET_INST_OPCODE ip // extract opcode from rINST
4387 SET_VREG_WIDE x0, w4 // vAA<- x0
4388 GOTO_OPCODE ip // jump to next instruction
4389 /* 11-14 instructions */
4390
4391
4392/* ------------------------------ */
4393 .balign 128
4394.L_op_xor_long: /* 0xa2 */
4395/* File: arm64/op_xor_long.S */
4396/* File: arm64/binopWide.S */
4397 /*
4398 * Generic 64-bit binary operation. Provide an "instr" line that
4399 * specifies an instruction that performs "result = x1 op x2".
4400 * This could be an ARM instruction or a function call. (If the result
4401 * comes back in a register other than x0, you can override "result".)
4402 *
4403 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4404 * vCC (w1). Useful for integer division and modulus.
4405 *
4406 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4407 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4408 */
4409 /* binop vAA, vBB, vCC */
4410 FETCH w0, 1 // w0<- CCBB
4411 lsr w4, wINST, #8 // w4<- AA
4412 lsr w2, w0, #8 // w2<- CC
4413 and w1, w0, #255 // w1<- BB
4414 GET_VREG_WIDE x2, w2 // w2<- vCC
4415 GET_VREG_WIDE x1, w1 // w1<- vBB
4416 .if 0
4417 cbz x2, common_errDivideByZero // is second operand zero?
4418 .endif
4419 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4420
4421 eor x0, x1, x2 // x0<- op, w0-w4 changed
4422 GET_INST_OPCODE ip // extract opcode from rINST
4423 SET_VREG_WIDE x0, w4 // vAA<- x0
4424 GOTO_OPCODE ip // jump to next instruction
4425 /* 11-14 instructions */
4426
4427
4428/* ------------------------------ */
4429 .balign 128
4430.L_op_shl_long: /* 0xa3 */
4431/* File: arm64/op_shl_long.S */
4432/* File: arm64/shiftWide.S */
4433 /*
4434 * 64-bit shift operation.
4435 *
4436 * For: shl-long, shr-long, ushr-long
4437 */
4438 /* binop vAA, vBB, vCC */
4439 FETCH w0, 1 // w0<- CCBB
4440 lsr w3, wINST, #8 // w3<- AA
4441 lsr w2, w0, #8 // w2<- CC
4442 GET_VREG w2, w2 // w2<- vCC (shift count)
4443 and w1, w0, #255 // w1<- BB
4444 GET_VREG_WIDE x1, w1 // x1<- vBB
4445 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004446 lsl x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004447 GET_INST_OPCODE ip // extract opcode from rINST
4448 SET_VREG_WIDE x0, w3 // vAA<- x0
4449 GOTO_OPCODE ip // jump to next instruction
4450 /* 11-14 instructions */
4451
4452
4453/* ------------------------------ */
4454 .balign 128
4455.L_op_shr_long: /* 0xa4 */
4456/* File: arm64/op_shr_long.S */
4457/* File: arm64/shiftWide.S */
4458 /*
4459 * 64-bit shift operation.
4460 *
4461 * For: shl-long, shr-long, ushr-long
4462 */
4463 /* binop vAA, vBB, vCC */
4464 FETCH w0, 1 // w0<- CCBB
4465 lsr w3, wINST, #8 // w3<- AA
4466 lsr w2, w0, #8 // w2<- CC
4467 GET_VREG w2, w2 // w2<- vCC (shift count)
4468 and w1, w0, #255 // w1<- BB
4469 GET_VREG_WIDE x1, w1 // x1<- vBB
4470 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004471 asr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004472 GET_INST_OPCODE ip // extract opcode from rINST
4473 SET_VREG_WIDE x0, w3 // vAA<- x0
4474 GOTO_OPCODE ip // jump to next instruction
4475 /* 11-14 instructions */
4476
4477
4478/* ------------------------------ */
4479 .balign 128
4480.L_op_ushr_long: /* 0xa5 */
4481/* File: arm64/op_ushr_long.S */
4482/* File: arm64/shiftWide.S */
4483 /*
4484 * 64-bit shift operation.
4485 *
4486 * For: shl-long, shr-long, ushr-long
4487 */
4488 /* binop vAA, vBB, vCC */
4489 FETCH w0, 1 // w0<- CCBB
4490 lsr w3, wINST, #8 // w3<- AA
4491 lsr w2, w0, #8 // w2<- CC
4492 GET_VREG w2, w2 // w2<- vCC (shift count)
4493 and w1, w0, #255 // w1<- BB
4494 GET_VREG_WIDE x1, w1 // x1<- vBB
4495 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004496 lsr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004497 GET_INST_OPCODE ip // extract opcode from rINST
4498 SET_VREG_WIDE x0, w3 // vAA<- x0
4499 GOTO_OPCODE ip // jump to next instruction
4500 /* 11-14 instructions */
4501
4502
4503/* ------------------------------ */
4504 .balign 128
4505.L_op_add_float: /* 0xa6 */
4506/* File: arm64/op_add_float.S */
4507/* File: arm64/fbinop.S */
4508 /*:
4509 * Generic 32-bit floating-point operation.
4510 *
4511 * For: add-float, sub-float, mul-float, div-float
4512 * form: <op> s0, s0, s1
4513 */
4514 /* floatop vAA, vBB, vCC */
4515 FETCH w0, 1 // r0<- CCBB
4516 lsr w1, w0, #8 // r2<- CC
4517 and w0, w0, #255 // r1<- BB
4518 GET_VREG s1, w1
4519 GET_VREG s0, w0
4520 fadd s0, s0, s1 // s0<- op
4521 lsr w1, wINST, #8 // r1<- AA
4522 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4523 GET_INST_OPCODE ip // extract opcode from rINST
4524 SET_VREG s0, w1
4525 GOTO_OPCODE ip // jump to next instruction
4526
4527
4528/* ------------------------------ */
4529 .balign 128
4530.L_op_sub_float: /* 0xa7 */
4531/* File: arm64/op_sub_float.S */
4532/* File: arm64/fbinop.S */
4533 /*:
4534 * Generic 32-bit floating-point operation.
4535 *
4536 * For: add-float, sub-float, mul-float, div-float
4537 * form: <op> s0, s0, s1
4538 */
4539 /* floatop vAA, vBB, vCC */
4540 FETCH w0, 1 // r0<- CCBB
4541 lsr w1, w0, #8 // r2<- CC
4542 and w0, w0, #255 // r1<- BB
4543 GET_VREG s1, w1
4544 GET_VREG s0, w0
4545 fsub s0, s0, s1 // s0<- op
4546 lsr w1, wINST, #8 // r1<- AA
4547 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4548 GET_INST_OPCODE ip // extract opcode from rINST
4549 SET_VREG s0, w1
4550 GOTO_OPCODE ip // jump to next instruction
4551
4552
4553/* ------------------------------ */
4554 .balign 128
4555.L_op_mul_float: /* 0xa8 */
4556/* File: arm64/op_mul_float.S */
4557/* File: arm64/fbinop.S */
4558 /*:
4559 * Generic 32-bit floating-point operation.
4560 *
4561 * For: add-float, sub-float, mul-float, div-float
4562 * form: <op> s0, s0, s1
4563 */
4564 /* floatop vAA, vBB, vCC */
4565 FETCH w0, 1 // r0<- CCBB
4566 lsr w1, w0, #8 // r2<- CC
4567 and w0, w0, #255 // r1<- BB
4568 GET_VREG s1, w1
4569 GET_VREG s0, w0
4570 fmul s0, s0, s1 // s0<- op
4571 lsr w1, wINST, #8 // r1<- AA
4572 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4573 GET_INST_OPCODE ip // extract opcode from rINST
4574 SET_VREG s0, w1
4575 GOTO_OPCODE ip // jump to next instruction
4576
4577
4578/* ------------------------------ */
4579 .balign 128
4580.L_op_div_float: /* 0xa9 */
4581/* File: arm64/op_div_float.S */
4582/* File: arm64/fbinop.S */
4583 /*:
4584 * Generic 32-bit floating-point operation.
4585 *
4586 * For: add-float, sub-float, mul-float, div-float
4587 * form: <op> s0, s0, s1
4588 */
4589 /* floatop vAA, vBB, vCC */
4590 FETCH w0, 1 // r0<- CCBB
4591 lsr w1, w0, #8 // r2<- CC
4592 and w0, w0, #255 // r1<- BB
4593 GET_VREG s1, w1
4594 GET_VREG s0, w0
4595 fdiv s0, s0, s1 // s0<- op
4596 lsr w1, wINST, #8 // r1<- AA
4597 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4598 GET_INST_OPCODE ip // extract opcode from rINST
4599 SET_VREG s0, w1
4600 GOTO_OPCODE ip // jump to next instruction
4601
4602
4603/* ------------------------------ */
4604 .balign 128
4605.L_op_rem_float: /* 0xaa */
4606/* File: arm64/op_rem_float.S */
4607/* EABI doesn't define a float remainder function, but libm does */
4608/* File: arm64/fbinop.S */
4609 /*:
4610 * Generic 32-bit floating-point operation.
4611 *
4612 * For: add-float, sub-float, mul-float, div-float
4613 * form: <op> s0, s0, s1
4614 */
4615 /* floatop vAA, vBB, vCC */
4616 FETCH w0, 1 // r0<- CCBB
4617 lsr w1, w0, #8 // r2<- CC
4618 and w0, w0, #255 // r1<- BB
4619 GET_VREG s1, w1
4620 GET_VREG s0, w0
4621 bl fmodf // s0<- op
4622 lsr w1, wINST, #8 // r1<- AA
4623 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4624 GET_INST_OPCODE ip // extract opcode from rINST
4625 SET_VREG s0, w1
4626 GOTO_OPCODE ip // jump to next instruction
4627
4628
4629/* ------------------------------ */
4630 .balign 128
4631.L_op_add_double: /* 0xab */
4632/* File: arm64/op_add_double.S */
4633/* File: arm64/binopWide.S */
4634 /*
4635 * Generic 64-bit binary operation. Provide an "instr" line that
4636 * specifies an instruction that performs "result = x1 op x2".
4637 * This could be an ARM instruction or a function call. (If the result
4638 * comes back in a register other than x0, you can override "result".)
4639 *
4640 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4641 * vCC (w1). Useful for integer division and modulus.
4642 *
4643 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4644 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4645 */
4646 /* binop vAA, vBB, vCC */
4647 FETCH w0, 1 // w0<- CCBB
4648 lsr w4, wINST, #8 // w4<- AA
4649 lsr w2, w0, #8 // w2<- CC
4650 and w1, w0, #255 // w1<- BB
4651 GET_VREG_WIDE d2, w2 // w2<- vCC
4652 GET_VREG_WIDE d1, w1 // w1<- vBB
4653 .if 0
4654 cbz d2, common_errDivideByZero // is second operand zero?
4655 .endif
4656 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4657
4658 fadd d0, d1, d2 // d0<- op, w0-w4 changed
4659 GET_INST_OPCODE ip // extract opcode from rINST
4660 SET_VREG_WIDE d0, w4 // vAA<- d0
4661 GOTO_OPCODE ip // jump to next instruction
4662 /* 11-14 instructions */
4663
4664
4665/* ------------------------------ */
4666 .balign 128
4667.L_op_sub_double: /* 0xac */
4668/* File: arm64/op_sub_double.S */
4669/* File: arm64/binopWide.S */
4670 /*
4671 * Generic 64-bit binary operation. Provide an "instr" line that
4672 * specifies an instruction that performs "result = x1 op x2".
4673 * This could be an ARM instruction or a function call. (If the result
4674 * comes back in a register other than x0, you can override "result".)
4675 *
4676 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4677 * vCC (w1). Useful for integer division and modulus.
4678 *
4679 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4680 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4681 */
4682 /* binop vAA, vBB, vCC */
4683 FETCH w0, 1 // w0<- CCBB
4684 lsr w4, wINST, #8 // w4<- AA
4685 lsr w2, w0, #8 // w2<- CC
4686 and w1, w0, #255 // w1<- BB
4687 GET_VREG_WIDE d2, w2 // w2<- vCC
4688 GET_VREG_WIDE d1, w1 // w1<- vBB
4689 .if 0
4690 cbz d2, common_errDivideByZero // is second operand zero?
4691 .endif
4692 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4693
4694 fsub d0, d1, d2 // d0<- op, w0-w4 changed
4695 GET_INST_OPCODE ip // extract opcode from rINST
4696 SET_VREG_WIDE d0, w4 // vAA<- d0
4697 GOTO_OPCODE ip // jump to next instruction
4698 /* 11-14 instructions */
4699
4700
4701/* ------------------------------ */
4702 .balign 128
4703.L_op_mul_double: /* 0xad */
4704/* File: arm64/op_mul_double.S */
4705/* File: arm64/binopWide.S */
4706 /*
4707 * Generic 64-bit binary operation. Provide an "instr" line that
4708 * specifies an instruction that performs "result = x1 op x2".
4709 * This could be an ARM instruction or a function call. (If the result
4710 * comes back in a register other than x0, you can override "result".)
4711 *
4712 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4713 * vCC (w1). Useful for integer division and modulus.
4714 *
4715 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4716 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4717 */
4718 /* binop vAA, vBB, vCC */
4719 FETCH w0, 1 // w0<- CCBB
4720 lsr w4, wINST, #8 // w4<- AA
4721 lsr w2, w0, #8 // w2<- CC
4722 and w1, w0, #255 // w1<- BB
4723 GET_VREG_WIDE d2, w2 // w2<- vCC
4724 GET_VREG_WIDE d1, w1 // w1<- vBB
4725 .if 0
4726 cbz d2, common_errDivideByZero // is second operand zero?
4727 .endif
4728 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4729
4730 fmul d0, d1, d2 // d0<- op, w0-w4 changed
4731 GET_INST_OPCODE ip // extract opcode from rINST
4732 SET_VREG_WIDE d0, w4 // vAA<- d0
4733 GOTO_OPCODE ip // jump to next instruction
4734 /* 11-14 instructions */
4735
4736
4737/* ------------------------------ */
4738 .balign 128
4739.L_op_div_double: /* 0xae */
4740/* File: arm64/op_div_double.S */
4741/* File: arm64/binopWide.S */
4742 /*
4743 * Generic 64-bit binary operation. Provide an "instr" line that
4744 * specifies an instruction that performs "result = x1 op x2".
4745 * This could be an ARM instruction or a function call. (If the result
4746 * comes back in a register other than x0, you can override "result".)
4747 *
4748 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4749 * vCC (w1). Useful for integer division and modulus.
4750 *
4751 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4752 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4753 */
4754 /* binop vAA, vBB, vCC */
4755 FETCH w0, 1 // w0<- CCBB
4756 lsr w4, wINST, #8 // w4<- AA
4757 lsr w2, w0, #8 // w2<- CC
4758 and w1, w0, #255 // w1<- BB
4759 GET_VREG_WIDE d2, w2 // w2<- vCC
4760 GET_VREG_WIDE d1, w1 // w1<- vBB
4761 .if 0
4762 cbz d2, common_errDivideByZero // is second operand zero?
4763 .endif
4764 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4765
4766 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
4767 GET_INST_OPCODE ip // extract opcode from rINST
4768 SET_VREG_WIDE d0, w4 // vAA<- d0
4769 GOTO_OPCODE ip // jump to next instruction
4770 /* 11-14 instructions */
4771
4772
4773/* ------------------------------ */
4774 .balign 128
4775.L_op_rem_double: /* 0xaf */
4776/* File: arm64/op_rem_double.S */
4777 /* rem vAA, vBB, vCC */
4778 FETCH w0, 1 // w0<- CCBB
4779 lsr w2, w0, #8 // w2<- CC
4780 and w1, w0, #255 // w1<- BB
4781 GET_VREG_WIDE d1, w2 // d1<- vCC
4782 GET_VREG_WIDE d0, w1 // d0<- vBB
4783 bl fmod
4784 lsr w4, wINST, #8 // w4<- AA
4785 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4786 GET_INST_OPCODE ip // extract opcode from rINST
4787 SET_VREG_WIDE d0, w4 // vAA<- result
4788 GOTO_OPCODE ip // jump to next instruction
4789 /* 11-14 instructions */
4790
4791/* ------------------------------ */
4792 .balign 128
4793.L_op_add_int_2addr: /* 0xb0 */
4794/* File: arm64/op_add_int_2addr.S */
4795/* File: arm64/binop2addr.S */
4796 /*
4797 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4798 * that specifies an instruction that performs "result = w0 op w1".
4799 * This could be an ARM instruction or a function call. (If the result
4800 * comes back in a register other than w0, you can override "result".)
4801 *
4802 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4803 * vCC (w1). Useful for integer division and modulus.
4804 *
4805 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4806 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4807 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4808 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4809 */
4810 /* binop/2addr vA, vB */
4811 lsr w3, wINST, #12 // w3<- B
4812 ubfx w9, wINST, #8, #4 // w9<- A
4813 GET_VREG w1, w3 // w1<- vB
4814 GET_VREG w0, w9 // w0<- vA
4815 .if 0
4816 cbz w1, common_errDivideByZero
4817 .endif
4818 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4819 // optional op; may set condition codes
4820 add w0, w0, w1 // w0<- op, w0-w3 changed
4821 GET_INST_OPCODE ip // extract opcode from rINST
4822 SET_VREG w0, w9 // vAA<- w0
4823 GOTO_OPCODE ip // jump to next instruction
4824 /* 10-13 instructions */
4825
4826
4827/* ------------------------------ */
4828 .balign 128
4829.L_op_sub_int_2addr: /* 0xb1 */
4830/* File: arm64/op_sub_int_2addr.S */
4831/* File: arm64/binop2addr.S */
4832 /*
4833 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4834 * that specifies an instruction that performs "result = w0 op w1".
4835 * This could be an ARM instruction or a function call. (If the result
4836 * comes back in a register other than w0, you can override "result".)
4837 *
4838 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4839 * vCC (w1). Useful for integer division and modulus.
4840 *
4841 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4842 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4843 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4844 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4845 */
4846 /* binop/2addr vA, vB */
4847 lsr w3, wINST, #12 // w3<- B
4848 ubfx w9, wINST, #8, #4 // w9<- A
4849 GET_VREG w1, w3 // w1<- vB
4850 GET_VREG w0, w9 // w0<- vA
4851 .if 0
4852 cbz w1, common_errDivideByZero
4853 .endif
4854 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4855 // optional op; may set condition codes
4856 sub w0, w0, w1 // w0<- op, w0-w3 changed
4857 GET_INST_OPCODE ip // extract opcode from rINST
4858 SET_VREG w0, w9 // vAA<- w0
4859 GOTO_OPCODE ip // jump to next instruction
4860 /* 10-13 instructions */
4861
4862
4863/* ------------------------------ */
4864 .balign 128
4865.L_op_mul_int_2addr: /* 0xb2 */
4866/* File: arm64/op_mul_int_2addr.S */
4867/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
4868/* File: arm64/binop2addr.S */
4869 /*
4870 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4871 * that specifies an instruction that performs "result = w0 op w1".
4872 * This could be an ARM instruction or a function call. (If the result
4873 * comes back in a register other than w0, you can override "result".)
4874 *
4875 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4876 * vCC (w1). Useful for integer division and modulus.
4877 *
4878 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4879 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4880 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4881 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4882 */
4883 /* binop/2addr vA, vB */
4884 lsr w3, wINST, #12 // w3<- B
4885 ubfx w9, wINST, #8, #4 // w9<- A
4886 GET_VREG w1, w3 // w1<- vB
4887 GET_VREG w0, w9 // w0<- vA
4888 .if 0
4889 cbz w1, common_errDivideByZero
4890 .endif
4891 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4892 // optional op; may set condition codes
4893 mul w0, w1, w0 // w0<- op, w0-w3 changed
4894 GET_INST_OPCODE ip // extract opcode from rINST
4895 SET_VREG w0, w9 // vAA<- w0
4896 GOTO_OPCODE ip // jump to next instruction
4897 /* 10-13 instructions */
4898
4899
4900/* ------------------------------ */
4901 .balign 128
4902.L_op_div_int_2addr: /* 0xb3 */
4903/* File: arm64/op_div_int_2addr.S */
4904/* File: arm64/binop2addr.S */
4905 /*
4906 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4907 * that specifies an instruction that performs "result = w0 op w1".
4908 * This could be an ARM instruction or a function call. (If the result
4909 * comes back in a register other than w0, you can override "result".)
4910 *
4911 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4912 * vCC (w1). Useful for integer division and modulus.
4913 *
4914 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4915 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4916 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4917 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4918 */
4919 /* binop/2addr vA, vB */
4920 lsr w3, wINST, #12 // w3<- B
4921 ubfx w9, wINST, #8, #4 // w9<- A
4922 GET_VREG w1, w3 // w1<- vB
4923 GET_VREG w0, w9 // w0<- vA
4924 .if 1
4925 cbz w1, common_errDivideByZero
4926 .endif
4927 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4928 // optional op; may set condition codes
4929 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4930 GET_INST_OPCODE ip // extract opcode from rINST
4931 SET_VREG w0, w9 // vAA<- w0
4932 GOTO_OPCODE ip // jump to next instruction
4933 /* 10-13 instructions */
4934
4935
4936/* ------------------------------ */
4937 .balign 128
4938.L_op_rem_int_2addr: /* 0xb4 */
4939/* File: arm64/op_rem_int_2addr.S */
4940/* File: arm64/binop2addr.S */
4941 /*
4942 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4943 * that specifies an instruction that performs "result = w0 op w1".
4944 * This could be an ARM instruction or a function call. (If the result
4945 * comes back in a register other than w0, you can override "result".)
4946 *
4947 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4948 * vCC (w1). Useful for integer division and modulus.
4949 *
4950 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4951 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4952 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4953 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4954 */
4955 /* binop/2addr vA, vB */
4956 lsr w3, wINST, #12 // w3<- B
4957 ubfx w9, wINST, #8, #4 // w9<- A
4958 GET_VREG w1, w3 // w1<- vB
4959 GET_VREG w0, w9 // w0<- vA
4960 .if 1
4961 cbz w1, common_errDivideByZero
4962 .endif
4963 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4964 sdiv w2, w0, w1 // optional op; may set condition codes
4965 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4966 GET_INST_OPCODE ip // extract opcode from rINST
4967 SET_VREG w0, w9 // vAA<- w0
4968 GOTO_OPCODE ip // jump to next instruction
4969 /* 10-13 instructions */
4970
4971
4972/* ------------------------------ */
4973 .balign 128
4974.L_op_and_int_2addr: /* 0xb5 */
4975/* File: arm64/op_and_int_2addr.S */
4976/* File: arm64/binop2addr.S */
4977 /*
4978 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4979 * that specifies an instruction that performs "result = w0 op w1".
4980 * This could be an ARM instruction or a function call. (If the result
4981 * comes back in a register other than w0, you can override "result".)
4982 *
4983 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4984 * vCC (w1). Useful for integer division and modulus.
4985 *
4986 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4987 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4988 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4989 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4990 */
4991 /* binop/2addr vA, vB */
4992 lsr w3, wINST, #12 // w3<- B
4993 ubfx w9, wINST, #8, #4 // w9<- A
4994 GET_VREG w1, w3 // w1<- vB
4995 GET_VREG w0, w9 // w0<- vA
4996 .if 0
4997 cbz w1, common_errDivideByZero
4998 .endif
4999 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5000 // optional op; may set condition codes
5001 and w0, w0, w1 // w0<- op, w0-w3 changed
5002 GET_INST_OPCODE ip // extract opcode from rINST
5003 SET_VREG w0, w9 // vAA<- w0
5004 GOTO_OPCODE ip // jump to next instruction
5005 /* 10-13 instructions */
5006
5007
5008/* ------------------------------ */
5009 .balign 128
5010.L_op_or_int_2addr: /* 0xb6 */
5011/* File: arm64/op_or_int_2addr.S */
5012/* File: arm64/binop2addr.S */
5013 /*
5014 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5015 * that specifies an instruction that performs "result = w0 op w1".
5016 * This could be an ARM instruction or a function call. (If the result
5017 * comes back in a register other than w0, you can override "result".)
5018 *
5019 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5020 * vCC (w1). Useful for integer division and modulus.
5021 *
5022 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5023 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5024 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5025 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5026 */
5027 /* binop/2addr vA, vB */
5028 lsr w3, wINST, #12 // w3<- B
5029 ubfx w9, wINST, #8, #4 // w9<- A
5030 GET_VREG w1, w3 // w1<- vB
5031 GET_VREG w0, w9 // w0<- vA
5032 .if 0
5033 cbz w1, common_errDivideByZero
5034 .endif
5035 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5036 // optional op; may set condition codes
5037 orr w0, w0, w1 // w0<- op, w0-w3 changed
5038 GET_INST_OPCODE ip // extract opcode from rINST
5039 SET_VREG w0, w9 // vAA<- w0
5040 GOTO_OPCODE ip // jump to next instruction
5041 /* 10-13 instructions */
5042
5043
5044/* ------------------------------ */
5045 .balign 128
5046.L_op_xor_int_2addr: /* 0xb7 */
5047/* File: arm64/op_xor_int_2addr.S */
5048/* File: arm64/binop2addr.S */
5049 /*
5050 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5051 * that specifies an instruction that performs "result = w0 op w1".
5052 * This could be an ARM instruction or a function call. (If the result
5053 * comes back in a register other than w0, you can override "result".)
5054 *
5055 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5056 * vCC (w1). Useful for integer division and modulus.
5057 *
5058 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5059 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5060 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5061 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5062 */
5063 /* binop/2addr vA, vB */
5064 lsr w3, wINST, #12 // w3<- B
5065 ubfx w9, wINST, #8, #4 // w9<- A
5066 GET_VREG w1, w3 // w1<- vB
5067 GET_VREG w0, w9 // w0<- vA
5068 .if 0
5069 cbz w1, common_errDivideByZero
5070 .endif
5071 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5072 // optional op; may set condition codes
5073 eor w0, w0, w1 // w0<- op, w0-w3 changed
5074 GET_INST_OPCODE ip // extract opcode from rINST
5075 SET_VREG w0, w9 // vAA<- w0
5076 GOTO_OPCODE ip // jump to next instruction
5077 /* 10-13 instructions */
5078
5079
5080/* ------------------------------ */
5081 .balign 128
5082.L_op_shl_int_2addr: /* 0xb8 */
5083/* File: arm64/op_shl_int_2addr.S */
5084/* File: arm64/binop2addr.S */
5085 /*
5086 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5087 * that specifies an instruction that performs "result = w0 op w1".
5088 * This could be an ARM instruction or a function call. (If the result
5089 * comes back in a register other than w0, you can override "result".)
5090 *
5091 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5092 * vCC (w1). Useful for integer division and modulus.
5093 *
5094 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5095 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5096 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5097 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5098 */
5099 /* binop/2addr vA, vB */
5100 lsr w3, wINST, #12 // w3<- B
5101 ubfx w9, wINST, #8, #4 // w9<- A
5102 GET_VREG w1, w3 // w1<- vB
5103 GET_VREG w0, w9 // w0<- vA
5104 .if 0
5105 cbz w1, common_errDivideByZero
5106 .endif
5107 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005108 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005109 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5110 GET_INST_OPCODE ip // extract opcode from rINST
5111 SET_VREG w0, w9 // vAA<- w0
5112 GOTO_OPCODE ip // jump to next instruction
5113 /* 10-13 instructions */
5114
5115
5116/* ------------------------------ */
5117 .balign 128
5118.L_op_shr_int_2addr: /* 0xb9 */
5119/* File: arm64/op_shr_int_2addr.S */
5120/* File: arm64/binop2addr.S */
5121 /*
5122 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5123 * that specifies an instruction that performs "result = w0 op w1".
5124 * This could be an ARM instruction or a function call. (If the result
5125 * comes back in a register other than w0, you can override "result".)
5126 *
5127 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5128 * vCC (w1). Useful for integer division and modulus.
5129 *
5130 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5131 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5132 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5133 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5134 */
5135 /* binop/2addr vA, vB */
5136 lsr w3, wINST, #12 // w3<- B
5137 ubfx w9, wINST, #8, #4 // w9<- A
5138 GET_VREG w1, w3 // w1<- vB
5139 GET_VREG w0, w9 // w0<- vA
5140 .if 0
5141 cbz w1, common_errDivideByZero
5142 .endif
5143 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005144 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005145 asr w0, w0, w1 // w0<- op, w0-w3 changed
5146 GET_INST_OPCODE ip // extract opcode from rINST
5147 SET_VREG w0, w9 // vAA<- w0
5148 GOTO_OPCODE ip // jump to next instruction
5149 /* 10-13 instructions */
5150
5151
5152/* ------------------------------ */
5153 .balign 128
5154.L_op_ushr_int_2addr: /* 0xba */
5155/* File: arm64/op_ushr_int_2addr.S */
5156/* File: arm64/binop2addr.S */
5157 /*
5158 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5159 * that specifies an instruction that performs "result = w0 op w1".
5160 * This could be an ARM instruction or a function call. (If the result
5161 * comes back in a register other than w0, you can override "result".)
5162 *
5163 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5164 * vCC (w1). Useful for integer division and modulus.
5165 *
5166 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5167 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5168 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5169 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5170 */
5171 /* binop/2addr vA, vB */
5172 lsr w3, wINST, #12 // w3<- B
5173 ubfx w9, wINST, #8, #4 // w9<- A
5174 GET_VREG w1, w3 // w1<- vB
5175 GET_VREG w0, w9 // w0<- vA
5176 .if 0
5177 cbz w1, common_errDivideByZero
5178 .endif
5179 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005180 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005181 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5182 GET_INST_OPCODE ip // extract opcode from rINST
5183 SET_VREG w0, w9 // vAA<- w0
5184 GOTO_OPCODE ip // jump to next instruction
5185 /* 10-13 instructions */
5186
5187
5188/* ------------------------------ */
5189 .balign 128
5190.L_op_add_long_2addr: /* 0xbb */
5191/* File: arm64/op_add_long_2addr.S */
5192/* File: arm64/binopWide2addr.S */
5193 /*
5194 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5195 * that specifies an instruction that performs "x0 = x0 op x1".
5196 * This must not be a function call, as we keep w2 live across it.
5197 *
5198 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5199 * vCC (w1). Useful for integer division and modulus.
5200 *
5201 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5202 * and-long/2addr, or-long/2addr, xor-long/2addr,
5203 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5204 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5205 */
5206 /* binop/2addr vA, vB */
5207 lsr w1, wINST, #12 // w1<- B
5208 ubfx w2, wINST, #8, #4 // w2<- A
5209 GET_VREG_WIDE x1, w1 // x1<- vB
5210 GET_VREG_WIDE x0, w2 // x0<- vA
5211 .if 0
5212 cbz x1, common_errDivideByZero
5213 .endif
5214 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5215
5216 add x0, x0, x1 // result<- op
5217 GET_INST_OPCODE ip // extract opcode from rINST
5218 SET_VREG_WIDE x0, w2 // vAA<- result
5219 GOTO_OPCODE ip // jump to next instruction
5220 /* 10-13 instructions */
5221
5222
5223/* ------------------------------ */
5224 .balign 128
5225.L_op_sub_long_2addr: /* 0xbc */
5226/* File: arm64/op_sub_long_2addr.S */
5227/* File: arm64/binopWide2addr.S */
5228 /*
5229 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5230 * that specifies an instruction that performs "x0 = x0 op x1".
5231 * This must not be a function call, as we keep w2 live across it.
5232 *
5233 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5234 * vCC (w1). Useful for integer division and modulus.
5235 *
5236 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5237 * and-long/2addr, or-long/2addr, xor-long/2addr,
5238 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5239 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5240 */
5241 /* binop/2addr vA, vB */
5242 lsr w1, wINST, #12 // w1<- B
5243 ubfx w2, wINST, #8, #4 // w2<- A
5244 GET_VREG_WIDE x1, w1 // x1<- vB
5245 GET_VREG_WIDE x0, w2 // x0<- vA
5246 .if 0
5247 cbz x1, common_errDivideByZero
5248 .endif
5249 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5250
5251 sub x0, x0, x1 // result<- op
5252 GET_INST_OPCODE ip // extract opcode from rINST
5253 SET_VREG_WIDE x0, w2 // vAA<- result
5254 GOTO_OPCODE ip // jump to next instruction
5255 /* 10-13 instructions */
5256
5257
5258/* ------------------------------ */
5259 .balign 128
5260.L_op_mul_long_2addr: /* 0xbd */
5261/* File: arm64/op_mul_long_2addr.S */
5262/* File: arm64/binopWide2addr.S */
5263 /*
5264 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5265 * that specifies an instruction that performs "x0 = x0 op x1".
5266 * This must not be a function call, as we keep w2 live across it.
5267 *
5268 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5269 * vCC (w1). Useful for integer division and modulus.
5270 *
5271 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5272 * and-long/2addr, or-long/2addr, xor-long/2addr,
5273 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5274 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5275 */
5276 /* binop/2addr vA, vB */
5277 lsr w1, wINST, #12 // w1<- B
5278 ubfx w2, wINST, #8, #4 // w2<- A
5279 GET_VREG_WIDE x1, w1 // x1<- vB
5280 GET_VREG_WIDE x0, w2 // x0<- vA
5281 .if 0
5282 cbz x1, common_errDivideByZero
5283 .endif
5284 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5285
5286 mul x0, x0, x1 // result<- op
5287 GET_INST_OPCODE ip // extract opcode from rINST
5288 SET_VREG_WIDE x0, w2 // vAA<- result
5289 GOTO_OPCODE ip // jump to next instruction
5290 /* 10-13 instructions */
5291
5292
5293/* ------------------------------ */
5294 .balign 128
5295.L_op_div_long_2addr: /* 0xbe */
5296/* File: arm64/op_div_long_2addr.S */
5297/* File: arm64/binopWide2addr.S */
5298 /*
5299 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5300 * that specifies an instruction that performs "x0 = x0 op x1".
5301 * This must not be a function call, as we keep w2 live across it.
5302 *
5303 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5304 * vCC (w1). Useful for integer division and modulus.
5305 *
5306 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5307 * and-long/2addr, or-long/2addr, xor-long/2addr,
5308 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5309 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5310 */
5311 /* binop/2addr vA, vB */
5312 lsr w1, wINST, #12 // w1<- B
5313 ubfx w2, wINST, #8, #4 // w2<- A
5314 GET_VREG_WIDE x1, w1 // x1<- vB
5315 GET_VREG_WIDE x0, w2 // x0<- vA
5316 .if 1
5317 cbz x1, common_errDivideByZero
5318 .endif
5319 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5320
5321 sdiv x0, x0, x1 // result<- op
5322 GET_INST_OPCODE ip // extract opcode from rINST
5323 SET_VREG_WIDE x0, w2 // vAA<- result
5324 GOTO_OPCODE ip // jump to next instruction
5325 /* 10-13 instructions */
5326
5327
5328/* ------------------------------ */
5329 .balign 128
5330.L_op_rem_long_2addr: /* 0xbf */
5331/* File: arm64/op_rem_long_2addr.S */
5332/* File: arm64/binopWide2addr.S */
5333 /*
5334 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5335 * that specifies an instruction that performs "x0 = x0 op x1".
5336 * This must not be a function call, as we keep w2 live across it.
5337 *
5338 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5339 * vCC (w1). Useful for integer division and modulus.
5340 *
5341 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5342 * and-long/2addr, or-long/2addr, xor-long/2addr,
5343 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5344 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5345 */
5346 /* binop/2addr vA, vB */
5347 lsr w1, wINST, #12 // w1<- B
5348 ubfx w2, wINST, #8, #4 // w2<- A
5349 GET_VREG_WIDE x1, w1 // x1<- vB
5350 GET_VREG_WIDE x0, w2 // x0<- vA
5351 .if 1
5352 cbz x1, common_errDivideByZero
5353 .endif
5354 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5355 sdiv x3, x0, x1
5356 msub x0, x3, x1, x0 // result<- op
5357 GET_INST_OPCODE ip // extract opcode from rINST
5358 SET_VREG_WIDE x0, w2 // vAA<- result
5359 GOTO_OPCODE ip // jump to next instruction
5360 /* 10-13 instructions */
5361
5362
5363/* ------------------------------ */
5364 .balign 128
5365.L_op_and_long_2addr: /* 0xc0 */
5366/* File: arm64/op_and_long_2addr.S */
5367/* File: arm64/binopWide2addr.S */
5368 /*
5369 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5370 * that specifies an instruction that performs "x0 = x0 op x1".
5371 * This must not be a function call, as we keep w2 live across it.
5372 *
5373 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5374 * vCC (w1). Useful for integer division and modulus.
5375 *
5376 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5377 * and-long/2addr, or-long/2addr, xor-long/2addr,
5378 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5379 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5380 */
5381 /* binop/2addr vA, vB */
5382 lsr w1, wINST, #12 // w1<- B
5383 ubfx w2, wINST, #8, #4 // w2<- A
5384 GET_VREG_WIDE x1, w1 // x1<- vB
5385 GET_VREG_WIDE x0, w2 // x0<- vA
5386 .if 0
5387 cbz x1, common_errDivideByZero
5388 .endif
5389 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5390
5391 and x0, x0, x1 // result<- op
5392 GET_INST_OPCODE ip // extract opcode from rINST
5393 SET_VREG_WIDE x0, w2 // vAA<- result
5394 GOTO_OPCODE ip // jump to next instruction
5395 /* 10-13 instructions */
5396
5397
5398/* ------------------------------ */
5399 .balign 128
5400.L_op_or_long_2addr: /* 0xc1 */
5401/* File: arm64/op_or_long_2addr.S */
5402/* File: arm64/binopWide2addr.S */
5403 /*
5404 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5405 * that specifies an instruction that performs "x0 = x0 op x1".
5406 * This must not be a function call, as we keep w2 live across it.
5407 *
5408 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5409 * vCC (w1). Useful for integer division and modulus.
5410 *
5411 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5412 * and-long/2addr, or-long/2addr, xor-long/2addr,
5413 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5414 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5415 */
5416 /* binop/2addr vA, vB */
5417 lsr w1, wINST, #12 // w1<- B
5418 ubfx w2, wINST, #8, #4 // w2<- A
5419 GET_VREG_WIDE x1, w1 // x1<- vB
5420 GET_VREG_WIDE x0, w2 // x0<- vA
5421 .if 0
5422 cbz x1, common_errDivideByZero
5423 .endif
5424 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5425
5426 orr x0, x0, x1 // result<- op
5427 GET_INST_OPCODE ip // extract opcode from rINST
5428 SET_VREG_WIDE x0, w2 // vAA<- result
5429 GOTO_OPCODE ip // jump to next instruction
5430 /* 10-13 instructions */
5431
5432
5433/* ------------------------------ */
5434 .balign 128
5435.L_op_xor_long_2addr: /* 0xc2 */
5436/* File: arm64/op_xor_long_2addr.S */
5437/* File: arm64/binopWide2addr.S */
5438 /*
5439 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5440 * that specifies an instruction that performs "x0 = x0 op x1".
5441 * This must not be a function call, as we keep w2 live across it.
5442 *
5443 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5444 * vCC (w1). Useful for integer division and modulus.
5445 *
5446 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5447 * and-long/2addr, or-long/2addr, xor-long/2addr,
5448 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5449 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5450 */
5451 /* binop/2addr vA, vB */
5452 lsr w1, wINST, #12 // w1<- B
5453 ubfx w2, wINST, #8, #4 // w2<- A
5454 GET_VREG_WIDE x1, w1 // x1<- vB
5455 GET_VREG_WIDE x0, w2 // x0<- vA
5456 .if 0
5457 cbz x1, common_errDivideByZero
5458 .endif
5459 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5460
5461 eor x0, x0, x1 // result<- op
5462 GET_INST_OPCODE ip // extract opcode from rINST
5463 SET_VREG_WIDE x0, w2 // vAA<- result
5464 GOTO_OPCODE ip // jump to next instruction
5465 /* 10-13 instructions */
5466
5467
5468/* ------------------------------ */
5469 .balign 128
5470.L_op_shl_long_2addr: /* 0xc3 */
5471/* File: arm64/op_shl_long_2addr.S */
5472/* File: arm64/shiftWide2addr.S */
5473 /*
5474 * Generic 64-bit shift operation.
5475 */
5476 /* binop/2addr vA, vB */
5477 lsr w1, wINST, #12 // w1<- B
5478 ubfx w2, wINST, #8, #4 // w2<- A
5479 GET_VREG w1, w1 // x1<- vB
5480 GET_VREG_WIDE x0, w2 // x0<- vA
5481 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005482 lsl x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005483 GET_INST_OPCODE ip // extract opcode from rINST
5484 SET_VREG_WIDE x0, w2 // vAA<- result
5485 GOTO_OPCODE ip // jump to next instruction
5486 /* 10-13 instructions */
5487
5488
5489/* ------------------------------ */
5490 .balign 128
5491.L_op_shr_long_2addr: /* 0xc4 */
5492/* File: arm64/op_shr_long_2addr.S */
5493/* File: arm64/shiftWide2addr.S */
5494 /*
5495 * Generic 64-bit shift operation.
5496 */
5497 /* binop/2addr vA, vB */
5498 lsr w1, wINST, #12 // w1<- B
5499 ubfx w2, wINST, #8, #4 // w2<- A
5500 GET_VREG w1, w1 // x1<- vB
5501 GET_VREG_WIDE x0, w2 // x0<- vA
5502 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005503 asr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005504 GET_INST_OPCODE ip // extract opcode from rINST
5505 SET_VREG_WIDE x0, w2 // vAA<- result
5506 GOTO_OPCODE ip // jump to next instruction
5507 /* 10-13 instructions */
5508
5509
5510/* ------------------------------ */
5511 .balign 128
5512.L_op_ushr_long_2addr: /* 0xc5 */
5513/* File: arm64/op_ushr_long_2addr.S */
5514/* File: arm64/shiftWide2addr.S */
5515 /*
5516 * Generic 64-bit shift operation.
5517 */
5518 /* binop/2addr vA, vB */
5519 lsr w1, wINST, #12 // w1<- B
5520 ubfx w2, wINST, #8, #4 // w2<- A
5521 GET_VREG w1, w1 // x1<- vB
5522 GET_VREG_WIDE x0, w2 // x0<- vA
5523 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005524 lsr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005525 GET_INST_OPCODE ip // extract opcode from rINST
5526 SET_VREG_WIDE x0, w2 // vAA<- result
5527 GOTO_OPCODE ip // jump to next instruction
5528 /* 10-13 instructions */
5529
5530
5531/* ------------------------------ */
5532 .balign 128
5533.L_op_add_float_2addr: /* 0xc6 */
5534/* File: arm64/op_add_float_2addr.S */
5535/* File: arm64/fbinop2addr.S */
5536 /*
5537 * Generic 32-bit floating point "/2addr" binary operation. Provide
5538 * an "instr" line that specifies an instruction that performs
5539 * "s2 = s0 op s1".
5540 *
5541 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5542 */
5543 /* binop/2addr vA, vB */
5544 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005545 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005546 GET_VREG s1, w3
5547 GET_VREG s0, w9
5548 fadd s2, s0, s1 // s2<- op
5549 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5550 GET_INST_OPCODE ip // extract opcode from rINST
5551 SET_VREG s2, w9
5552 GOTO_OPCODE ip // jump to next instruction
5553
5554
5555/* ------------------------------ */
5556 .balign 128
5557.L_op_sub_float_2addr: /* 0xc7 */
5558/* File: arm64/op_sub_float_2addr.S */
5559/* File: arm64/fbinop2addr.S */
5560 /*
5561 * Generic 32-bit floating point "/2addr" binary operation. Provide
5562 * an "instr" line that specifies an instruction that performs
5563 * "s2 = s0 op s1".
5564 *
5565 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5566 */
5567 /* binop/2addr vA, vB */
5568 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005569 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005570 GET_VREG s1, w3
5571 GET_VREG s0, w9
5572 fsub s2, s0, s1 // s2<- op
5573 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5574 GET_INST_OPCODE ip // extract opcode from rINST
5575 SET_VREG s2, w9
5576 GOTO_OPCODE ip // jump to next instruction
5577
5578
5579/* ------------------------------ */
5580 .balign 128
5581.L_op_mul_float_2addr: /* 0xc8 */
5582/* File: arm64/op_mul_float_2addr.S */
5583/* File: arm64/fbinop2addr.S */
5584 /*
5585 * Generic 32-bit floating point "/2addr" binary operation. Provide
5586 * an "instr" line that specifies an instruction that performs
5587 * "s2 = s0 op s1".
5588 *
5589 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5590 */
5591 /* binop/2addr vA, vB */
5592 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005593 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005594 GET_VREG s1, w3
5595 GET_VREG s0, w9
5596 fmul s2, s0, s1 // s2<- op
5597 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5598 GET_INST_OPCODE ip // extract opcode from rINST
5599 SET_VREG s2, w9
5600 GOTO_OPCODE ip // jump to next instruction
5601
5602
5603/* ------------------------------ */
5604 .balign 128
5605.L_op_div_float_2addr: /* 0xc9 */
5606/* File: arm64/op_div_float_2addr.S */
5607/* File: arm64/fbinop2addr.S */
5608 /*
5609 * Generic 32-bit floating point "/2addr" binary operation. Provide
5610 * an "instr" line that specifies an instruction that performs
5611 * "s2 = s0 op s1".
5612 *
5613 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5614 */
5615 /* binop/2addr vA, vB */
5616 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005617 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005618 GET_VREG s1, w3
5619 GET_VREG s0, w9
5620 fdiv s2, s0, s1 // s2<- op
5621 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5622 GET_INST_OPCODE ip // extract opcode from rINST
5623 SET_VREG s2, w9
5624 GOTO_OPCODE ip // jump to next instruction
5625
5626
5627/* ------------------------------ */
5628 .balign 128
5629.L_op_rem_float_2addr: /* 0xca */
5630/* File: arm64/op_rem_float_2addr.S */
5631 /* rem vA, vB */
5632 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005633 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005634 GET_VREG s1, w3
5635 GET_VREG s0, w9
5636 bl fmodf
Vladimir Markoe6220222016-07-20 14:25:30 +01005637 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005638 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5639 GET_INST_OPCODE ip // extract opcode from rINST
5640 SET_VREG s0, w9
5641 GOTO_OPCODE ip // jump to next instruction
5642
5643/* ------------------------------ */
5644 .balign 128
5645.L_op_add_double_2addr: /* 0xcb */
5646/* File: arm64/op_add_double_2addr.S */
5647/* File: arm64/binopWide2addr.S */
5648 /*
5649 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5650 * that specifies an instruction that performs "x0 = x0 op x1".
5651 * This must not be a function call, as we keep w2 live across it.
5652 *
5653 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5654 * vCC (w1). Useful for integer division and modulus.
5655 *
5656 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5657 * and-long/2addr, or-long/2addr, xor-long/2addr,
5658 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5659 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5660 */
5661 /* binop/2addr vA, vB */
5662 lsr w1, wINST, #12 // w1<- B
5663 ubfx w2, wINST, #8, #4 // w2<- A
5664 GET_VREG_WIDE d1, w1 // x1<- vB
5665 GET_VREG_WIDE d0, w2 // x0<- vA
5666 .if 0
5667 cbz d1, common_errDivideByZero
5668 .endif
5669 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5670
5671 fadd d0, d0, d1 // result<- op
5672 GET_INST_OPCODE ip // extract opcode from rINST
5673 SET_VREG_WIDE d0, w2 // vAA<- result
5674 GOTO_OPCODE ip // jump to next instruction
5675 /* 10-13 instructions */
5676
5677
5678/* ------------------------------ */
5679 .balign 128
5680.L_op_sub_double_2addr: /* 0xcc */
5681/* File: arm64/op_sub_double_2addr.S */
5682/* File: arm64/binopWide2addr.S */
5683 /*
5684 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5685 * that specifies an instruction that performs "x0 = x0 op x1".
5686 * This must not be a function call, as we keep w2 live across it.
5687 *
5688 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5689 * vCC (w1). Useful for integer division and modulus.
5690 *
5691 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5692 * and-long/2addr, or-long/2addr, xor-long/2addr,
5693 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5694 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5695 */
5696 /* binop/2addr vA, vB */
5697 lsr w1, wINST, #12 // w1<- B
5698 ubfx w2, wINST, #8, #4 // w2<- A
5699 GET_VREG_WIDE d1, w1 // x1<- vB
5700 GET_VREG_WIDE d0, w2 // x0<- vA
5701 .if 0
5702 cbz d1, common_errDivideByZero
5703 .endif
5704 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5705
5706 fsub d0, d0, d1 // result<- op
5707 GET_INST_OPCODE ip // extract opcode from rINST
5708 SET_VREG_WIDE d0, w2 // vAA<- result
5709 GOTO_OPCODE ip // jump to next instruction
5710 /* 10-13 instructions */
5711
5712
5713/* ------------------------------ */
5714 .balign 128
5715.L_op_mul_double_2addr: /* 0xcd */
5716/* File: arm64/op_mul_double_2addr.S */
5717/* File: arm64/binopWide2addr.S */
5718 /*
5719 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5720 * that specifies an instruction that performs "x0 = x0 op x1".
5721 * This must not be a function call, as we keep w2 live across it.
5722 *
5723 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5724 * vCC (w1). Useful for integer division and modulus.
5725 *
5726 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5727 * and-long/2addr, or-long/2addr, xor-long/2addr,
5728 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5729 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5730 */
5731 /* binop/2addr vA, vB */
5732 lsr w1, wINST, #12 // w1<- B
5733 ubfx w2, wINST, #8, #4 // w2<- A
5734 GET_VREG_WIDE d1, w1 // x1<- vB
5735 GET_VREG_WIDE d0, w2 // x0<- vA
5736 .if 0
5737 cbz d1, common_errDivideByZero
5738 .endif
5739 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5740
5741 fmul d0, d0, d1 // result<- op
5742 GET_INST_OPCODE ip // extract opcode from rINST
5743 SET_VREG_WIDE d0, w2 // vAA<- result
5744 GOTO_OPCODE ip // jump to next instruction
5745 /* 10-13 instructions */
5746
5747
5748/* ------------------------------ */
5749 .balign 128
5750.L_op_div_double_2addr: /* 0xce */
5751/* File: arm64/op_div_double_2addr.S */
5752/* File: arm64/binopWide2addr.S */
5753 /*
5754 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5755 * that specifies an instruction that performs "x0 = x0 op x1".
5756 * This must not be a function call, as we keep w2 live across it.
5757 *
5758 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5759 * vCC (w1). Useful for integer division and modulus.
5760 *
5761 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5762 * and-long/2addr, or-long/2addr, xor-long/2addr,
5763 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5764 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5765 */
5766 /* binop/2addr vA, vB */
5767 lsr w1, wINST, #12 // w1<- B
5768 ubfx w2, wINST, #8, #4 // w2<- A
5769 GET_VREG_WIDE d1, w1 // x1<- vB
5770 GET_VREG_WIDE d0, w2 // x0<- vA
5771 .if 0
5772 cbz d1, common_errDivideByZero
5773 .endif
5774 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5775
5776 fdiv d0, d0, d1 // result<- op
5777 GET_INST_OPCODE ip // extract opcode from rINST
5778 SET_VREG_WIDE d0, w2 // vAA<- result
5779 GOTO_OPCODE ip // jump to next instruction
5780 /* 10-13 instructions */
5781
5782
5783/* ------------------------------ */
5784 .balign 128
5785.L_op_rem_double_2addr: /* 0xcf */
5786/* File: arm64/op_rem_double_2addr.S */
5787 /* rem vA, vB */
5788 lsr w1, wINST, #12 // w1<- B
5789 ubfx w2, wINST, #8, #4 // w2<- A
5790 GET_VREG_WIDE d1, w1 // d1<- vB
5791 GET_VREG_WIDE d0, w2 // d0<- vA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005792 bl fmod
5793 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
buzbee908c0b22016-03-16 14:39:50 -07005794 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005795 GET_INST_OPCODE ip // extract opcode from rINST
5796 SET_VREG_WIDE d0, w2 // vAA<- result
5797 GOTO_OPCODE ip // jump to next instruction
5798 /* 10-13 instructions */
5799
5800/* ------------------------------ */
5801 .balign 128
5802.L_op_add_int_lit16: /* 0xd0 */
5803/* File: arm64/op_add_int_lit16.S */
5804/* File: arm64/binopLit16.S */
5805 /*
5806 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5807 * that specifies an instruction that performs "result = w0 op w1".
5808 * This could be an ARM instruction or a function call. (If the result
5809 * comes back in a register other than w0, you can override "result".)
5810 *
5811 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5812 * vCC (w1). Useful for integer division and modulus.
5813 *
5814 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5815 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5816 */
5817 /* binop/lit16 vA, vB, #+CCCC */
5818 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5819 lsr w2, wINST, #12 // w2<- B
5820 ubfx w9, wINST, #8, #4 // w9<- A
5821 GET_VREG w0, w2 // w0<- vB
5822 .if 0
5823 cbz w1, common_errDivideByZero
5824 .endif
5825 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5826
5827 add w0, w0, w1 // w0<- op, w0-w3 changed
5828 GET_INST_OPCODE ip // extract opcode from rINST
5829 SET_VREG w0, w9 // vAA<- w0
5830 GOTO_OPCODE ip // jump to next instruction
5831 /* 10-13 instructions */
5832
5833
5834/* ------------------------------ */
5835 .balign 128
5836.L_op_rsub_int: /* 0xd1 */
5837/* File: arm64/op_rsub_int.S */
5838/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5839/* File: arm64/binopLit16.S */
5840 /*
5841 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5842 * that specifies an instruction that performs "result = w0 op w1".
5843 * This could be an ARM instruction or a function call. (If the result
5844 * comes back in a register other than w0, you can override "result".)
5845 *
5846 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5847 * vCC (w1). Useful for integer division and modulus.
5848 *
5849 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5850 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5851 */
5852 /* binop/lit16 vA, vB, #+CCCC */
5853 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5854 lsr w2, wINST, #12 // w2<- B
5855 ubfx w9, wINST, #8, #4 // w9<- A
5856 GET_VREG w0, w2 // w0<- vB
5857 .if 0
5858 cbz w1, common_errDivideByZero
5859 .endif
5860 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5861
5862 sub w0, w1, w0 // w0<- op, w0-w3 changed
5863 GET_INST_OPCODE ip // extract opcode from rINST
5864 SET_VREG w0, w9 // vAA<- w0
5865 GOTO_OPCODE ip // jump to next instruction
5866 /* 10-13 instructions */
5867
5868
5869/* ------------------------------ */
5870 .balign 128
5871.L_op_mul_int_lit16: /* 0xd2 */
5872/* File: arm64/op_mul_int_lit16.S */
5873/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5874/* File: arm64/binopLit16.S */
5875 /*
5876 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5877 * that specifies an instruction that performs "result = w0 op w1".
5878 * This could be an ARM instruction or a function call. (If the result
5879 * comes back in a register other than w0, you can override "result".)
5880 *
5881 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5882 * vCC (w1). Useful for integer division and modulus.
5883 *
5884 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5885 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5886 */
5887 /* binop/lit16 vA, vB, #+CCCC */
5888 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5889 lsr w2, wINST, #12 // w2<- B
5890 ubfx w9, wINST, #8, #4 // w9<- A
5891 GET_VREG w0, w2 // w0<- vB
5892 .if 0
5893 cbz w1, common_errDivideByZero
5894 .endif
5895 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5896
5897 mul w0, w1, w0 // w0<- op, w0-w3 changed
5898 GET_INST_OPCODE ip // extract opcode from rINST
5899 SET_VREG w0, w9 // vAA<- w0
5900 GOTO_OPCODE ip // jump to next instruction
5901 /* 10-13 instructions */
5902
5903
5904/* ------------------------------ */
5905 .balign 128
5906.L_op_div_int_lit16: /* 0xd3 */
5907/* File: arm64/op_div_int_lit16.S */
5908/* File: arm64/binopLit16.S */
5909 /*
5910 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5911 * that specifies an instruction that performs "result = w0 op w1".
5912 * This could be an ARM instruction or a function call. (If the result
5913 * comes back in a register other than w0, you can override "result".)
5914 *
5915 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5916 * vCC (w1). Useful for integer division and modulus.
5917 *
5918 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5919 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5920 */
5921 /* binop/lit16 vA, vB, #+CCCC */
5922 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5923 lsr w2, wINST, #12 // w2<- B
5924 ubfx w9, wINST, #8, #4 // w9<- A
5925 GET_VREG w0, w2 // w0<- vB
5926 .if 1
5927 cbz w1, common_errDivideByZero
5928 .endif
5929 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5930
5931 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5932 GET_INST_OPCODE ip // extract opcode from rINST
5933 SET_VREG w0, w9 // vAA<- w0
5934 GOTO_OPCODE ip // jump to next instruction
5935 /* 10-13 instructions */
5936
5937
5938/* ------------------------------ */
5939 .balign 128
5940.L_op_rem_int_lit16: /* 0xd4 */
5941/* File: arm64/op_rem_int_lit16.S */
5942/* File: arm64/binopLit16.S */
5943 /*
5944 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5945 * that specifies an instruction that performs "result = w0 op w1".
5946 * This could be an ARM instruction or a function call. (If the result
5947 * comes back in a register other than w0, you can override "result".)
5948 *
5949 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5950 * vCC (w1). Useful for integer division and modulus.
5951 *
5952 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5953 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5954 */
5955 /* binop/lit16 vA, vB, #+CCCC */
5956 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5957 lsr w2, wINST, #12 // w2<- B
5958 ubfx w9, wINST, #8, #4 // w9<- A
5959 GET_VREG w0, w2 // w0<- vB
5960 .if 1
5961 cbz w1, common_errDivideByZero
5962 .endif
5963 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5964 sdiv w3, w0, w1
5965 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
5966 GET_INST_OPCODE ip // extract opcode from rINST
5967 SET_VREG w0, w9 // vAA<- w0
5968 GOTO_OPCODE ip // jump to next instruction
5969 /* 10-13 instructions */
5970
5971
5972/* ------------------------------ */
5973 .balign 128
5974.L_op_and_int_lit16: /* 0xd5 */
5975/* File: arm64/op_and_int_lit16.S */
5976/* File: arm64/binopLit16.S */
5977 /*
5978 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5979 * that specifies an instruction that performs "result = w0 op w1".
5980 * This could be an ARM instruction or a function call. (If the result
5981 * comes back in a register other than w0, you can override "result".)
5982 *
5983 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5984 * vCC (w1). Useful for integer division and modulus.
5985 *
5986 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5987 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5988 */
5989 /* binop/lit16 vA, vB, #+CCCC */
5990 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5991 lsr w2, wINST, #12 // w2<- B
5992 ubfx w9, wINST, #8, #4 // w9<- A
5993 GET_VREG w0, w2 // w0<- vB
5994 .if 0
5995 cbz w1, common_errDivideByZero
5996 .endif
5997 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5998
5999 and w0, w0, w1 // w0<- op, w0-w3 changed
6000 GET_INST_OPCODE ip // extract opcode from rINST
6001 SET_VREG w0, w9 // vAA<- w0
6002 GOTO_OPCODE ip // jump to next instruction
6003 /* 10-13 instructions */
6004
6005
6006/* ------------------------------ */
6007 .balign 128
6008.L_op_or_int_lit16: /* 0xd6 */
6009/* File: arm64/op_or_int_lit16.S */
6010/* File: arm64/binopLit16.S */
6011 /*
6012 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6013 * that specifies an instruction that performs "result = w0 op w1".
6014 * This could be an ARM instruction or a function call. (If the result
6015 * comes back in a register other than w0, you can override "result".)
6016 *
6017 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6018 * vCC (w1). Useful for integer division and modulus.
6019 *
6020 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6021 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6022 */
6023 /* binop/lit16 vA, vB, #+CCCC */
6024 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6025 lsr w2, wINST, #12 // w2<- B
6026 ubfx w9, wINST, #8, #4 // w9<- A
6027 GET_VREG w0, w2 // w0<- vB
6028 .if 0
6029 cbz w1, common_errDivideByZero
6030 .endif
6031 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6032
6033 orr w0, w0, w1 // w0<- op, w0-w3 changed
6034 GET_INST_OPCODE ip // extract opcode from rINST
6035 SET_VREG w0, w9 // vAA<- w0
6036 GOTO_OPCODE ip // jump to next instruction
6037 /* 10-13 instructions */
6038
6039
6040/* ------------------------------ */
6041 .balign 128
6042.L_op_xor_int_lit16: /* 0xd7 */
6043/* File: arm64/op_xor_int_lit16.S */
6044/* File: arm64/binopLit16.S */
6045 /*
6046 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6047 * that specifies an instruction that performs "result = w0 op w1".
6048 * This could be an ARM instruction or a function call. (If the result
6049 * comes back in a register other than w0, you can override "result".)
6050 *
6051 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6052 * vCC (w1). Useful for integer division and modulus.
6053 *
6054 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6055 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6056 */
6057 /* binop/lit16 vA, vB, #+CCCC */
6058 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6059 lsr w2, wINST, #12 // w2<- B
6060 ubfx w9, wINST, #8, #4 // w9<- A
6061 GET_VREG w0, w2 // w0<- vB
6062 .if 0
6063 cbz w1, common_errDivideByZero
6064 .endif
6065 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6066
6067 eor w0, w0, w1 // w0<- op, w0-w3 changed
6068 GET_INST_OPCODE ip // extract opcode from rINST
6069 SET_VREG w0, w9 // vAA<- w0
6070 GOTO_OPCODE ip // jump to next instruction
6071 /* 10-13 instructions */
6072
6073
6074/* ------------------------------ */
6075 .balign 128
6076.L_op_add_int_lit8: /* 0xd8 */
6077/* File: arm64/op_add_int_lit8.S */
6078/* File: arm64/binopLit8.S */
6079 /*
6080 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6081 * that specifies an instruction that performs "result = w0 op w1".
6082 * This could be an ARM instruction or a function call. (If the result
6083 * comes back in a register other than w0, you can override "result".)
6084 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006085 * You can override "extract" if the extraction of the literal value
6086 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6087 * can be omitted completely if the shift is embedded in "instr".
6088 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006089 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6090 * vCC (w1). Useful for integer division and modulus.
6091 *
6092 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6093 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6094 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6095 */
6096 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006097 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006098 lsr w9, wINST, #8 // w9<- AA
6099 and w2, w3, #255 // w2<- BB
6100 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006101 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006102 .if 0
6103 cbz w1, common_errDivideByZero
6104 .endif
6105 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6106 // optional op; may set condition codes
Vladimir Markofbcc8302016-08-08 12:08:06 +01006107 add w0, w0, w3, asr #8 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006108 GET_INST_OPCODE ip // extract opcode from rINST
6109 SET_VREG w0, w9 // vAA<- w0
6110 GOTO_OPCODE ip // jump to next instruction
6111 /* 10-12 instructions */
6112
6113
6114/* ------------------------------ */
6115 .balign 128
6116.L_op_rsub_int_lit8: /* 0xd9 */
6117/* File: arm64/op_rsub_int_lit8.S */
6118/* File: arm64/binopLit8.S */
6119 /*
6120 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6121 * that specifies an instruction that performs "result = w0 op w1".
6122 * This could be an ARM instruction or a function call. (If the result
6123 * comes back in a register other than w0, you can override "result".)
6124 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006125 * You can override "extract" if the extraction of the literal value
6126 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6127 * can be omitted completely if the shift is embedded in "instr".
6128 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006129 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6130 * vCC (w1). Useful for integer division and modulus.
6131 *
6132 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6133 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6134 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6135 */
6136 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006137 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006138 lsr w9, wINST, #8 // w9<- AA
6139 and w2, w3, #255 // w2<- BB
6140 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006141 asr w1, w3, #8 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006142 .if 0
6143 cbz w1, common_errDivideByZero
6144 .endif
6145 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6146 // optional op; may set condition codes
6147 sub w0, w1, w0 // w0<- op, w0-w3 changed
6148 GET_INST_OPCODE ip // extract opcode from rINST
6149 SET_VREG w0, w9 // vAA<- w0
6150 GOTO_OPCODE ip // jump to next instruction
6151 /* 10-12 instructions */
6152
6153
6154/* ------------------------------ */
6155 .balign 128
6156.L_op_mul_int_lit8: /* 0xda */
6157/* File: arm64/op_mul_int_lit8.S */
6158/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6159/* File: arm64/binopLit8.S */
6160 /*
6161 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6162 * that specifies an instruction that performs "result = w0 op w1".
6163 * This could be an ARM instruction or a function call. (If the result
6164 * comes back in a register other than w0, you can override "result".)
6165 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006166 * You can override "extract" if the extraction of the literal value
6167 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6168 * can be omitted completely if the shift is embedded in "instr".
6169 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006170 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6171 * vCC (w1). Useful for integer division and modulus.
6172 *
6173 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6174 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6175 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6176 */
6177 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006178 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006179 lsr w9, wINST, #8 // w9<- AA
6180 and w2, w3, #255 // w2<- BB
6181 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006182 asr w1, w3, #8 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006183 .if 0
6184 cbz w1, common_errDivideByZero
6185 .endif
6186 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6187 // optional op; may set condition codes
6188 mul w0, w1, w0 // w0<- op, w0-w3 changed
6189 GET_INST_OPCODE ip // extract opcode from rINST
6190 SET_VREG w0, w9 // vAA<- w0
6191 GOTO_OPCODE ip // jump to next instruction
6192 /* 10-12 instructions */
6193
6194
6195/* ------------------------------ */
6196 .balign 128
6197.L_op_div_int_lit8: /* 0xdb */
6198/* File: arm64/op_div_int_lit8.S */
6199/* File: arm64/binopLit8.S */
6200 /*
6201 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6202 * that specifies an instruction that performs "result = w0 op w1".
6203 * This could be an ARM instruction or a function call. (If the result
6204 * comes back in a register other than w0, you can override "result".)
6205 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006206 * You can override "extract" if the extraction of the literal value
6207 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6208 * can be omitted completely if the shift is embedded in "instr".
6209 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006210 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6211 * vCC (w1). Useful for integer division and modulus.
6212 *
6213 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6214 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6215 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6216 */
6217 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006218 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006219 lsr w9, wINST, #8 // w9<- AA
6220 and w2, w3, #255 // w2<- BB
6221 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006222 asr w1, w3, #8 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006223 .if 1
6224 cbz w1, common_errDivideByZero
6225 .endif
6226 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6227 // optional op; may set condition codes
6228 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6229 GET_INST_OPCODE ip // extract opcode from rINST
6230 SET_VREG w0, w9 // vAA<- w0
6231 GOTO_OPCODE ip // jump to next instruction
6232 /* 10-12 instructions */
6233
6234
6235/* ------------------------------ */
6236 .balign 128
6237.L_op_rem_int_lit8: /* 0xdc */
6238/* File: arm64/op_rem_int_lit8.S */
6239/* File: arm64/binopLit8.S */
6240 /*
6241 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6242 * that specifies an instruction that performs "result = w0 op w1".
6243 * This could be an ARM instruction or a function call. (If the result
6244 * comes back in a register other than w0, you can override "result".)
6245 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006246 * You can override "extract" if the extraction of the literal value
6247 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6248 * can be omitted completely if the shift is embedded in "instr".
6249 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006250 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6251 * vCC (w1). Useful for integer division and modulus.
6252 *
6253 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6254 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6255 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6256 */
6257 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006258 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006259 lsr w9, wINST, #8 // w9<- AA
6260 and w2, w3, #255 // w2<- BB
6261 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006262 asr w1, w3, #8 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006263 .if 1
6264 cbz w1, common_errDivideByZero
6265 .endif
6266 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6267 sdiv w3, w0, w1 // optional op; may set condition codes
6268 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6269 GET_INST_OPCODE ip // extract opcode from rINST
6270 SET_VREG w0, w9 // vAA<- w0
6271 GOTO_OPCODE ip // jump to next instruction
6272 /* 10-12 instructions */
6273
6274
6275/* ------------------------------ */
6276 .balign 128
6277.L_op_and_int_lit8: /* 0xdd */
6278/* File: arm64/op_and_int_lit8.S */
6279/* File: arm64/binopLit8.S */
6280 /*
6281 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6282 * that specifies an instruction that performs "result = w0 op w1".
6283 * This could be an ARM instruction or a function call. (If the result
6284 * comes back in a register other than w0, you can override "result".)
6285 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006286 * You can override "extract" if the extraction of the literal value
6287 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6288 * can be omitted completely if the shift is embedded in "instr".
6289 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006290 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6291 * vCC (w1). Useful for integer division and modulus.
6292 *
6293 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6294 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6295 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6296 */
6297 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006298 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006299 lsr w9, wINST, #8 // w9<- AA
6300 and w2, w3, #255 // w2<- BB
6301 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006302 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006303 .if 0
6304 cbz w1, common_errDivideByZero
6305 .endif
6306 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6307 // optional op; may set condition codes
Vladimir Markofbcc8302016-08-08 12:08:06 +01006308 and w0, w0, w3, asr #8 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006309 GET_INST_OPCODE ip // extract opcode from rINST
6310 SET_VREG w0, w9 // vAA<- w0
6311 GOTO_OPCODE ip // jump to next instruction
6312 /* 10-12 instructions */
6313
6314
6315/* ------------------------------ */
6316 .balign 128
6317.L_op_or_int_lit8: /* 0xde */
6318/* File: arm64/op_or_int_lit8.S */
6319/* File: arm64/binopLit8.S */
6320 /*
6321 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6322 * that specifies an instruction that performs "result = w0 op w1".
6323 * This could be an ARM instruction or a function call. (If the result
6324 * comes back in a register other than w0, you can override "result".)
6325 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006326 * You can override "extract" if the extraction of the literal value
6327 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6328 * can be omitted completely if the shift is embedded in "instr".
6329 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006330 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6331 * vCC (w1). Useful for integer division and modulus.
6332 *
6333 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6334 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6335 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6336 */
6337 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006338 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006339 lsr w9, wINST, #8 // w9<- AA
6340 and w2, w3, #255 // w2<- BB
6341 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006342 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006343 .if 0
6344 cbz w1, common_errDivideByZero
6345 .endif
6346 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6347 // optional op; may set condition codes
Vladimir Markofbcc8302016-08-08 12:08:06 +01006348 orr w0, w0, w3, asr #8 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006349 GET_INST_OPCODE ip // extract opcode from rINST
6350 SET_VREG w0, w9 // vAA<- w0
6351 GOTO_OPCODE ip // jump to next instruction
6352 /* 10-12 instructions */
6353
6354
6355/* ------------------------------ */
6356 .balign 128
6357.L_op_xor_int_lit8: /* 0xdf */
6358/* File: arm64/op_xor_int_lit8.S */
6359/* File: arm64/binopLit8.S */
6360 /*
6361 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6362 * that specifies an instruction that performs "result = w0 op w1".
6363 * This could be an ARM instruction or a function call. (If the result
6364 * comes back in a register other than w0, you can override "result".)
6365 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006366 * You can override "extract" if the extraction of the literal value
6367 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6368 * can be omitted completely if the shift is embedded in "instr".
6369 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006370 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6371 * vCC (w1). Useful for integer division and modulus.
6372 *
6373 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6374 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6375 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6376 */
6377 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006378 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006379 lsr w9, wINST, #8 // w9<- AA
6380 and w2, w3, #255 // w2<- BB
6381 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006382 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006383 .if 0
6384 cbz w1, common_errDivideByZero
6385 .endif
6386 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6387 // optional op; may set condition codes
Vladimir Markofbcc8302016-08-08 12:08:06 +01006388 eor w0, w0, w3, asr #8 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006389 GET_INST_OPCODE ip // extract opcode from rINST
6390 SET_VREG w0, w9 // vAA<- w0
6391 GOTO_OPCODE ip // jump to next instruction
6392 /* 10-12 instructions */
6393
6394
6395/* ------------------------------ */
6396 .balign 128
6397.L_op_shl_int_lit8: /* 0xe0 */
6398/* File: arm64/op_shl_int_lit8.S */
6399/* File: arm64/binopLit8.S */
6400 /*
6401 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6402 * that specifies an instruction that performs "result = w0 op w1".
6403 * This could be an ARM instruction or a function call. (If the result
6404 * comes back in a register other than w0, you can override "result".)
6405 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006406 * You can override "extract" if the extraction of the literal value
6407 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6408 * can be omitted completely if the shift is embedded in "instr".
6409 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006410 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6411 * vCC (w1). Useful for integer division and modulus.
6412 *
6413 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6414 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6415 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6416 */
6417 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006418 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006419 lsr w9, wINST, #8 // w9<- AA
6420 and w2, w3, #255 // w2<- BB
6421 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006422 ubfx w1, w3, #8, #5 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006423 .if 0
6424 cbz w1, common_errDivideByZero
6425 .endif
6426 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006427 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006428 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6429 GET_INST_OPCODE ip // extract opcode from rINST
6430 SET_VREG w0, w9 // vAA<- w0
6431 GOTO_OPCODE ip // jump to next instruction
6432 /* 10-12 instructions */
6433
6434
6435/* ------------------------------ */
6436 .balign 128
6437.L_op_shr_int_lit8: /* 0xe1 */
6438/* File: arm64/op_shr_int_lit8.S */
6439/* File: arm64/binopLit8.S */
6440 /*
6441 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6442 * that specifies an instruction that performs "result = w0 op w1".
6443 * This could be an ARM instruction or a function call. (If the result
6444 * comes back in a register other than w0, you can override "result".)
6445 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006446 * You can override "extract" if the extraction of the literal value
6447 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6448 * can be omitted completely if the shift is embedded in "instr".
6449 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006450 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6451 * vCC (w1). Useful for integer division and modulus.
6452 *
6453 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6454 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6455 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6456 */
6457 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006458 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006459 lsr w9, wINST, #8 // w9<- AA
6460 and w2, w3, #255 // w2<- BB
6461 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006462 ubfx w1, w3, #8, #5 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006463 .if 0
6464 cbz w1, common_errDivideByZero
6465 .endif
6466 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006467 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006468 asr w0, w0, w1 // w0<- op, w0-w3 changed
6469 GET_INST_OPCODE ip // extract opcode from rINST
6470 SET_VREG w0, w9 // vAA<- w0
6471 GOTO_OPCODE ip // jump to next instruction
6472 /* 10-12 instructions */
6473
6474
6475/* ------------------------------ */
6476 .balign 128
6477.L_op_ushr_int_lit8: /* 0xe2 */
6478/* File: arm64/op_ushr_int_lit8.S */
6479/* File: arm64/binopLit8.S */
6480 /*
6481 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6482 * that specifies an instruction that performs "result = w0 op w1".
6483 * This could be an ARM instruction or a function call. (If the result
6484 * comes back in a register other than w0, you can override "result".)
6485 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006486 * You can override "extract" if the extraction of the literal value
6487 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6488 * can be omitted completely if the shift is embedded in "instr".
6489 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006490 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6491 * vCC (w1). Useful for integer division and modulus.
6492 *
6493 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6494 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6495 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6496 */
6497 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006498 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006499 lsr w9, wINST, #8 // w9<- AA
6500 and w2, w3, #255 // w2<- BB
6501 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006502 ubfx w1, w3, #8, #5 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006503 .if 0
6504 cbz w1, common_errDivideByZero
6505 .endif
6506 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006507 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006508 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6509 GET_INST_OPCODE ip // extract opcode from rINST
6510 SET_VREG w0, w9 // vAA<- w0
6511 GOTO_OPCODE ip // jump to next instruction
6512 /* 10-12 instructions */
6513
6514
6515/* ------------------------------ */
6516 .balign 128
6517.L_op_iget_quick: /* 0xe3 */
6518/* File: arm64/op_iget_quick.S */
6519 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6520 /* op vA, vB, offset//CCCC */
6521 lsr w2, wINST, #12 // w2<- B
6522 FETCH w1, 1 // w1<- field byte offset
6523 GET_VREG w3, w2 // w3<- object we're operating on
6524 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006525 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006526 ldr w0, [x3, x1] // w0<- obj.field
6527 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6528
6529 SET_VREG w0, w2 // fp[A]<- w0
6530 GET_INST_OPCODE ip // extract opcode from rINST
6531 GOTO_OPCODE ip // jump to next instruction
6532
6533/* ------------------------------ */
6534 .balign 128
6535.L_op_iget_wide_quick: /* 0xe4 */
6536/* File: arm64/op_iget_wide_quick.S */
6537 /* iget-wide-quick vA, vB, offset//CCCC */
6538 lsr w2, wINST, #12 // w2<- B
6539 FETCH w4, 1 // w4<- field byte offset
6540 GET_VREG w3, w2 // w3<- object we're operating on
6541 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006542 cbz w3, common_errNullObject // object was null
Vladimir Marko20421b92016-07-26 16:38:11 +01006543 ldr x0, [x3, x4] // x0<- obj.field
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006544 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6545 SET_VREG_WIDE x0, w2
6546 GET_INST_OPCODE ip // extract opcode from wINST
6547 GOTO_OPCODE ip // jump to next instruction
6548
6549/* ------------------------------ */
6550 .balign 128
6551.L_op_iget_object_quick: /* 0xe5 */
6552/* File: arm64/op_iget_object_quick.S */
6553 /* For: iget-object-quick */
6554 /* op vA, vB, offset//CCCC */
6555 lsr w2, wINST, #12 // w2<- B
6556 FETCH w1, 1 // w1<- field byte offset
6557 EXPORT_PC
6558 GET_VREG w0, w2 // w0<- object we're operating on
6559 bl artIGetObjectFromMterp // (obj, offset)
6560 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6561 ubfx w2, wINST, #8, #4 // w2<- A
6562 PREFETCH_INST 2
6563 cbnz w3, MterpPossibleException // bail out
6564 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6565 ADVANCE 2 // advance rPC
6566 GET_INST_OPCODE ip // extract opcode from wINST
6567 GOTO_OPCODE ip // jump to next instruction
6568
6569/* ------------------------------ */
6570 .balign 128
6571.L_op_iput_quick: /* 0xe6 */
6572/* File: arm64/op_iput_quick.S */
6573 /* For: iput-quick, iput-object-quick */
6574 /* op vA, vB, offset//CCCC */
6575 lsr w2, wINST, #12 // w2<- B
6576 FETCH w1, 1 // w1<- field byte offset
6577 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6578 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006579 cbz w3, common_errNullObject // object was null
6580 GET_VREG w0, w2 // w0<- fp[A]
6581 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6582 str w0, [x3, x1] // obj.field<- w0
6583 GET_INST_OPCODE ip // extract opcode from rINST
6584 GOTO_OPCODE ip // jump to next instruction
6585
6586/* ------------------------------ */
6587 .balign 128
6588.L_op_iput_wide_quick: /* 0xe7 */
6589/* File: arm64/op_iput_wide_quick.S */
6590 /* iput-wide-quick vA, vB, offset//CCCC */
6591 lsr w2, wINST, #12 // w2<- B
6592 FETCH w3, 1 // w3<- field byte offset
6593 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6594 ubfx w0, wINST, #8, #4 // w0<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006595 cbz w2, common_errNullObject // object was null
Roland Levillain5e8d5f02016-10-18 18:03:43 +01006596 GET_VREG_WIDE x0, w0 // x0<- fp[A]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006597 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01006598 str x0, [x2, x3] // obj.field<- x0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006599 GET_INST_OPCODE ip // extract opcode from wINST
6600 GOTO_OPCODE ip // jump to next instruction
6601
6602/* ------------------------------ */
6603 .balign 128
6604.L_op_iput_object_quick: /* 0xe8 */
6605/* File: arm64/op_iput_object_quick.S */
6606 EXPORT_PC
6607 add x0, xFP, #OFF_FP_SHADOWFRAME
6608 mov x1, xPC
6609 mov w2, wINST
6610 bl MterpIputObjectQuick
6611 cbz w0, MterpException
6612 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6613 GET_INST_OPCODE ip // extract opcode from rINST
6614 GOTO_OPCODE ip // jump to next instruction
6615
6616/* ------------------------------ */
6617 .balign 128
6618.L_op_invoke_virtual_quick: /* 0xe9 */
6619/* File: arm64/op_invoke_virtual_quick.S */
6620/* File: arm64/invoke.S */
6621 /*
6622 * Generic invoke handler wrapper.
6623 */
6624 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6625 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6626 .extern MterpInvokeVirtualQuick
6627 EXPORT_PC
6628 mov x0, xSELF
6629 add x1, xFP, #OFF_FP_SHADOWFRAME
6630 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006631 mov x3, xINST
6632 bl MterpInvokeVirtualQuick
6633 cbz w0, MterpException
6634 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006635 bl MterpShouldSwitchInterpreters
6636 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006637 GET_INST_OPCODE ip
6638 GOTO_OPCODE ip
6639
6640
6641
6642/* ------------------------------ */
6643 .balign 128
6644.L_op_invoke_virtual_range_quick: /* 0xea */
6645/* File: arm64/op_invoke_virtual_range_quick.S */
6646/* File: arm64/invoke.S */
6647 /*
6648 * Generic invoke handler wrapper.
6649 */
6650 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6651 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6652 .extern MterpInvokeVirtualQuickRange
6653 EXPORT_PC
6654 mov x0, xSELF
6655 add x1, xFP, #OFF_FP_SHADOWFRAME
6656 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006657 mov x3, xINST
6658 bl MterpInvokeVirtualQuickRange
6659 cbz w0, MterpException
6660 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006661 bl MterpShouldSwitchInterpreters
6662 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006663 GET_INST_OPCODE ip
6664 GOTO_OPCODE ip
6665
6666
6667
6668/* ------------------------------ */
6669 .balign 128
6670.L_op_iput_boolean_quick: /* 0xeb */
6671/* File: arm64/op_iput_boolean_quick.S */
6672/* File: arm64/op_iput_quick.S */
6673 /* For: iput-quick, iput-object-quick */
6674 /* op vA, vB, offset//CCCC */
6675 lsr w2, wINST, #12 // w2<- B
6676 FETCH w1, 1 // w1<- field byte offset
6677 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6678 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006679 cbz w3, common_errNullObject // object was null
6680 GET_VREG w0, w2 // w0<- fp[A]
6681 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6682 strb w0, [x3, x1] // obj.field<- w0
6683 GET_INST_OPCODE ip // extract opcode from rINST
6684 GOTO_OPCODE ip // jump to next instruction
6685
6686
6687/* ------------------------------ */
6688 .balign 128
6689.L_op_iput_byte_quick: /* 0xec */
6690/* File: arm64/op_iput_byte_quick.S */
6691/* File: arm64/op_iput_quick.S */
6692 /* For: iput-quick, iput-object-quick */
6693 /* op vA, vB, offset//CCCC */
6694 lsr w2, wINST, #12 // w2<- B
6695 FETCH w1, 1 // w1<- field byte offset
6696 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6697 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006698 cbz w3, common_errNullObject // object was null
6699 GET_VREG w0, w2 // w0<- fp[A]
6700 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6701 strb w0, [x3, x1] // obj.field<- w0
6702 GET_INST_OPCODE ip // extract opcode from rINST
6703 GOTO_OPCODE ip // jump to next instruction
6704
6705
6706/* ------------------------------ */
6707 .balign 128
6708.L_op_iput_char_quick: /* 0xed */
6709/* File: arm64/op_iput_char_quick.S */
6710/* File: arm64/op_iput_quick.S */
6711 /* For: iput-quick, iput-object-quick */
6712 /* op vA, vB, offset//CCCC */
6713 lsr w2, wINST, #12 // w2<- B
6714 FETCH w1, 1 // w1<- field byte offset
6715 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6716 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006717 cbz w3, common_errNullObject // object was null
6718 GET_VREG w0, w2 // w0<- fp[A]
6719 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6720 strh w0, [x3, x1] // obj.field<- w0
6721 GET_INST_OPCODE ip // extract opcode from rINST
6722 GOTO_OPCODE ip // jump to next instruction
6723
6724
6725/* ------------------------------ */
6726 .balign 128
6727.L_op_iput_short_quick: /* 0xee */
6728/* File: arm64/op_iput_short_quick.S */
6729/* File: arm64/op_iput_quick.S */
6730 /* For: iput-quick, iput-object-quick */
6731 /* op vA, vB, offset//CCCC */
6732 lsr w2, wINST, #12 // w2<- B
6733 FETCH w1, 1 // w1<- field byte offset
6734 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6735 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006736 cbz w3, common_errNullObject // object was null
6737 GET_VREG w0, w2 // w0<- fp[A]
6738 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6739 strh w0, [x3, x1] // obj.field<- w0
6740 GET_INST_OPCODE ip // extract opcode from rINST
6741 GOTO_OPCODE ip // jump to next instruction
6742
6743
6744/* ------------------------------ */
6745 .balign 128
6746.L_op_iget_boolean_quick: /* 0xef */
6747/* File: arm64/op_iget_boolean_quick.S */
6748/* File: arm64/op_iget_quick.S */
6749 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6750 /* op vA, vB, offset//CCCC */
6751 lsr w2, wINST, #12 // w2<- B
6752 FETCH w1, 1 // w1<- field byte offset
6753 GET_VREG w3, w2 // w3<- object we're operating on
6754 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006755 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006756 ldrb w0, [x3, x1] // w0<- obj.field
6757 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6758
6759 SET_VREG w0, w2 // fp[A]<- w0
6760 GET_INST_OPCODE ip // extract opcode from rINST
6761 GOTO_OPCODE ip // jump to next instruction
6762
6763
6764/* ------------------------------ */
6765 .balign 128
6766.L_op_iget_byte_quick: /* 0xf0 */
6767/* File: arm64/op_iget_byte_quick.S */
6768/* File: arm64/op_iget_quick.S */
6769 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6770 /* op vA, vB, offset//CCCC */
6771 lsr w2, wINST, #12 // w2<- B
6772 FETCH w1, 1 // w1<- field byte offset
6773 GET_VREG w3, w2 // w3<- object we're operating on
6774 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006775 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006776 ldrsb w0, [x3, x1] // w0<- obj.field
6777 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6778
6779 SET_VREG w0, w2 // fp[A]<- w0
6780 GET_INST_OPCODE ip // extract opcode from rINST
6781 GOTO_OPCODE ip // jump to next instruction
6782
6783
6784/* ------------------------------ */
6785 .balign 128
6786.L_op_iget_char_quick: /* 0xf1 */
6787/* File: arm64/op_iget_char_quick.S */
6788/* File: arm64/op_iget_quick.S */
6789 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6790 /* op vA, vB, offset//CCCC */
6791 lsr w2, wINST, #12 // w2<- B
6792 FETCH w1, 1 // w1<- field byte offset
6793 GET_VREG w3, w2 // w3<- object we're operating on
6794 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006795 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006796 ldrh w0, [x3, x1] // w0<- obj.field
6797 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6798
6799 SET_VREG w0, w2 // fp[A]<- w0
6800 GET_INST_OPCODE ip // extract opcode from rINST
6801 GOTO_OPCODE ip // jump to next instruction
6802
6803
6804/* ------------------------------ */
6805 .balign 128
6806.L_op_iget_short_quick: /* 0xf2 */
6807/* File: arm64/op_iget_short_quick.S */
6808/* File: arm64/op_iget_quick.S */
6809 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6810 /* op vA, vB, offset//CCCC */
6811 lsr w2, wINST, #12 // w2<- B
6812 FETCH w1, 1 // w1<- field byte offset
6813 GET_VREG w3, w2 // w3<- object we're operating on
6814 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006815 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006816 ldrsh w0, [x3, x1] // w0<- obj.field
6817 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6818
6819 SET_VREG w0, w2 // fp[A]<- w0
6820 GET_INST_OPCODE ip // extract opcode from rINST
6821 GOTO_OPCODE ip // jump to next instruction
6822
6823
6824/* ------------------------------ */
6825 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006826.L_op_unused_f3: /* 0xf3 */
6827/* File: arm64/op_unused_f3.S */
6828/* File: arm64/unused.S */
6829/*
6830 * Bail to reference interpreter to throw.
6831 */
6832 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006833
6834
6835/* ------------------------------ */
6836 .balign 128
6837.L_op_unused_f4: /* 0xf4 */
6838/* File: arm64/op_unused_f4.S */
6839/* File: arm64/unused.S */
6840/*
6841 * Bail to reference interpreter to throw.
6842 */
6843 b MterpFallback
6844
6845
6846/* ------------------------------ */
6847 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006848.L_op_unused_f5: /* 0xf5 */
6849/* File: arm64/op_unused_f5.S */
6850/* File: arm64/unused.S */
6851/*
6852 * Bail to reference interpreter to throw.
6853 */
6854 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006855
6856
6857/* ------------------------------ */
6858 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006859.L_op_unused_f6: /* 0xf6 */
6860/* File: arm64/op_unused_f6.S */
6861/* File: arm64/unused.S */
6862/*
6863 * Bail to reference interpreter to throw.
6864 */
6865 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006866
6867
6868/* ------------------------------ */
6869 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006870.L_op_unused_f7: /* 0xf7 */
6871/* File: arm64/op_unused_f7.S */
6872/* File: arm64/unused.S */
6873/*
6874 * Bail to reference interpreter to throw.
6875 */
6876 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006877
6878
6879/* ------------------------------ */
6880 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006881.L_op_unused_f8: /* 0xf8 */
6882/* File: arm64/op_unused_f8.S */
6883/* File: arm64/unused.S */
6884/*
6885 * Bail to reference interpreter to throw.
6886 */
6887 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006888
6889
6890/* ------------------------------ */
6891 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006892.L_op_unused_f9: /* 0xf9 */
6893/* File: arm64/op_unused_f9.S */
6894/* File: arm64/unused.S */
6895/*
6896 * Bail to reference interpreter to throw.
6897 */
6898 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006899
6900
6901/* ------------------------------ */
6902 .balign 128
buzbee8a287142016-10-07 12:56:32 -07006903.L_op_invoke_polymorphic: /* 0xfa */
6904/* Transfer stub to alternate interpreter */
6905 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006906
6907
6908/* ------------------------------ */
6909 .balign 128
buzbee8a287142016-10-07 12:56:32 -07006910.L_op_invoke_polymorphic_range: /* 0xfb */
6911/* Transfer stub to alternate interpreter */
6912 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006913
6914
6915/* ------------------------------ */
6916 .balign 128
6917.L_op_unused_fc: /* 0xfc */
6918/* File: arm64/op_unused_fc.S */
6919/* File: arm64/unused.S */
6920/*
6921 * Bail to reference interpreter to throw.
6922 */
6923 b MterpFallback
6924
6925
6926/* ------------------------------ */
6927 .balign 128
6928.L_op_unused_fd: /* 0xfd */
6929/* File: arm64/op_unused_fd.S */
6930/* File: arm64/unused.S */
6931/*
6932 * Bail to reference interpreter to throw.
6933 */
6934 b MterpFallback
6935
6936
6937/* ------------------------------ */
6938 .balign 128
6939.L_op_unused_fe: /* 0xfe */
6940/* File: arm64/op_unused_fe.S */
6941/* File: arm64/unused.S */
6942/*
6943 * Bail to reference interpreter to throw.
6944 */
6945 b MterpFallback
6946
6947
6948/* ------------------------------ */
6949 .balign 128
6950.L_op_unused_ff: /* 0xff */
6951/* File: arm64/op_unused_ff.S */
6952/* File: arm64/unused.S */
6953/*
6954 * Bail to reference interpreter to throw.
6955 */
6956 b MterpFallback
6957
6958
6959 .balign 128
6960 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
6961 .global artMterpAsmInstructionEnd
6962artMterpAsmInstructionEnd:
6963
6964/*
6965 * ===========================================================================
6966 * Sister implementations
6967 * ===========================================================================
6968 */
6969 .global artMterpAsmSisterStart
6970 .type artMterpAsmSisterStart, %function
6971 .text
6972 .balign 4
6973artMterpAsmSisterStart:
6974
6975 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
6976 .global artMterpAsmSisterEnd
6977artMterpAsmSisterEnd:
6978
Vladimir Marko20421b92016-07-26 16:38:11 +01006979/* File: arm64/footer.S */
6980/*
6981 * ===========================================================================
6982 * Common subroutines and data
6983 * ===========================================================================
6984 */
6985
6986
6987/*
6988 * We've detected a condition that will result in an exception, but the exception
6989 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
6990 * TUNING: for consistency, we may want to just go ahead and handle these here.
6991 */
6992common_errDivideByZero:
6993 EXPORT_PC
6994#if MTERP_LOGGING
6995 mov x0, xSELF
6996 add x1, xFP, #OFF_FP_SHADOWFRAME
6997 bl MterpLogDivideByZeroException
6998#endif
6999 b MterpCommonFallback
7000
7001common_errArrayIndex:
7002 EXPORT_PC
7003#if MTERP_LOGGING
7004 mov x0, xSELF
7005 add x1, xFP, #OFF_FP_SHADOWFRAME
7006 bl MterpLogArrayIndexException
7007#endif
7008 b MterpCommonFallback
7009
7010common_errNegativeArraySize:
7011 EXPORT_PC
7012#if MTERP_LOGGING
7013 mov x0, xSELF
7014 add x1, xFP, #OFF_FP_SHADOWFRAME
7015 bl MterpLogNegativeArraySizeException
7016#endif
7017 b MterpCommonFallback
7018
7019common_errNoSuchMethod:
7020 EXPORT_PC
7021#if MTERP_LOGGING
7022 mov x0, xSELF
7023 add x1, xFP, #OFF_FP_SHADOWFRAME
7024 bl MterpLogNoSuchMethodException
7025#endif
7026 b MterpCommonFallback
7027
7028common_errNullObject:
7029 EXPORT_PC
7030#if MTERP_LOGGING
7031 mov x0, xSELF
7032 add x1, xFP, #OFF_FP_SHADOWFRAME
7033 bl MterpLogNullObjectException
7034#endif
7035 b MterpCommonFallback
7036
7037common_exceptionThrown:
7038 EXPORT_PC
7039#if MTERP_LOGGING
7040 mov x0, xSELF
7041 add x1, xFP, #OFF_FP_SHADOWFRAME
7042 bl MterpLogExceptionThrownException
7043#endif
7044 b MterpCommonFallback
7045
7046MterpSuspendFallback:
7047 EXPORT_PC
7048#if MTERP_LOGGING
7049 mov x0, xSELF
7050 add x1, xFP, #OFF_FP_SHADOWFRAME
7051 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
7052 bl MterpLogSuspendFallback
7053#endif
7054 b MterpCommonFallback
7055
7056/*
7057 * If we're here, something is out of the ordinary. If there is a pending
7058 * exception, handle it. Otherwise, roll back and retry with the reference
7059 * interpreter.
7060 */
7061MterpPossibleException:
7062 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
7063 cbz x0, MterpFallback // If not, fall back to reference interpreter.
7064 /* intentional fallthrough - handle pending exception. */
7065/*
7066 * On return from a runtime helper routine, we've found a pending exception.
7067 * Can we handle it here - or need to bail out to caller?
7068 *
7069 */
7070MterpException:
7071 mov x0, xSELF
7072 add x1, xFP, #OFF_FP_SHADOWFRAME
7073 bl MterpHandleException // (self, shadow_frame)
7074 cbz w0, MterpExceptionReturn // no local catch, back to caller.
7075 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
7076 ldr w1, [xFP, #OFF_FP_DEX_PC]
7077 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
7078 add xPC, x0, #CODEITEM_INSNS_OFFSET
7079 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
7080 /* Do we need to switch interpreters? */
7081 bl MterpShouldSwitchInterpreters
7082 cbnz w0, MterpFallback
7083 /* resume execution at catch block */
7084 EXPORT_PC
7085 FETCH_INST
7086 GET_INST_OPCODE ip
7087 GOTO_OPCODE ip
7088 /* NOTE: no fallthrough */
7089/*
7090 * Common handling for branches with support for Jit profiling.
7091 * On entry:
7092 * wINST <= signed offset
7093 * wPROFILE <= signed hotness countdown (expanded to 32 bits)
7094 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
7095 *
7096 * We have quite a few different cases for branch profiling, OSR detection and
7097 * suspend check support here.
7098 *
7099 * Taken backward branches:
7100 * If profiling active, do hotness countdown and report if we hit zero.
7101 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
7102 * Is there a pending suspend request? If so, suspend.
7103 *
7104 * Taken forward branches and not-taken backward branches:
7105 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
7106 *
7107 * Our most common case is expected to be a taken backward branch with active jit profiling,
7108 * but no full OSR check and no pending suspend request.
7109 * Next most common case is not-taken branch with no full OSR check.
7110 *
7111 */
7112MterpCommonTakenBranchNoFlags:
7113 cmp wINST, #0
7114 b.gt .L_forward_branch // don't add forward branches to hotness
7115 tbnz wPROFILE, #31, .L_no_count_backwards // go if negative
7116 subs wPROFILE, wPROFILE, #1 // countdown
7117 b.eq .L_add_batch // counted down to zero - report
7118.L_resume_backward_branch:
7119 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
7120 add w2, wINST, wINST // w2<- byte offset
7121 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
7122 REFRESH_IBASE
Hiroshi Yamauchi30493242016-11-03 13:06:52 -07007123 ands lr, lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Vladimir Marko20421b92016-07-26 16:38:11 +01007124 b.ne .L_suspend_request_pending
7125 GET_INST_OPCODE ip // extract opcode from wINST
7126 GOTO_OPCODE ip // jump to next instruction
7127
7128.L_suspend_request_pending:
7129 EXPORT_PC
7130 mov x0, xSELF
7131 bl MterpSuspendCheck // (self)
7132 cbnz x0, MterpFallback
7133 REFRESH_IBASE // might have changed during suspend
7134 GET_INST_OPCODE ip // extract opcode from wINST
7135 GOTO_OPCODE ip // jump to next instruction
7136
7137.L_no_count_backwards:
7138 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
7139 b.ne .L_resume_backward_branch
7140 mov x0, xSELF
7141 add x1, xFP, #OFF_FP_SHADOWFRAME
7142 mov x2, xINST
7143 EXPORT_PC
7144 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7145 cbnz x0, MterpOnStackReplacement
7146 b .L_resume_backward_branch
7147
7148.L_forward_branch:
7149 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
7150 b.eq .L_check_osr_forward
7151.L_resume_forward_branch:
7152 add w2, wINST, wINST // w2<- byte offset
7153 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
7154 GET_INST_OPCODE ip // extract opcode from wINST
7155 GOTO_OPCODE ip // jump to next instruction
7156
7157.L_check_osr_forward:
7158 mov x0, xSELF
7159 add x1, xFP, #OFF_FP_SHADOWFRAME
7160 mov x2, xINST
7161 EXPORT_PC
7162 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7163 cbnz x0, MterpOnStackReplacement
7164 b .L_resume_forward_branch
7165
7166.L_add_batch:
7167 add x1, xFP, #OFF_FP_SHADOWFRAME
7168 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
7169 ldr x0, [xFP, #OFF_FP_METHOD]
7170 mov x2, xSELF
7171 bl MterpAddHotnessBatch // (method, shadow_frame, self)
7172 mov wPROFILE, w0 // restore new hotness countdown to wPROFILE
7173 b .L_no_count_backwards
7174
7175/*
7176 * Entered from the conditional branch handlers when OSR check request active on
7177 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
7178 */
7179.L_check_not_taken_osr:
7180 mov x0, xSELF
7181 add x1, xFP, #OFF_FP_SHADOWFRAME
7182 mov x2, #2
7183 EXPORT_PC
7184 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7185 cbnz x0, MterpOnStackReplacement
7186 FETCH_ADVANCE_INST 2
7187 GET_INST_OPCODE ip // extract opcode from wINST
7188 GOTO_OPCODE ip // jump to next instruction
7189
7190
7191/*
7192 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
7193 * still needs to get the opcode and branch to it, and flags are in lr.
7194 */
7195MterpCheckSuspendAndContinue:
7196 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
Hiroshi Yamauchi30493242016-11-03 13:06:52 -07007197 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Vladimir Marko20421b92016-07-26 16:38:11 +01007198 b.ne check1
7199 GET_INST_OPCODE ip // extract opcode from wINST
7200 GOTO_OPCODE ip // jump to next instruction
7201check1:
7202 EXPORT_PC
7203 mov x0, xSELF
7204 bl MterpSuspendCheck // (self)
7205 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
7206 GET_INST_OPCODE ip // extract opcode from wINST
7207 GOTO_OPCODE ip // jump to next instruction
7208
7209/*
7210 * On-stack replacement has happened, and now we've returned from the compiled method.
7211 */
7212MterpOnStackReplacement:
7213#if MTERP_LOGGING
7214 mov x0, xSELF
7215 add x1, xFP, #OFF_FP_SHADOWFRAME
7216 sxtw x2, wINST
7217 bl MterpLogOSR
7218#endif
7219 mov x0, #1 // Signal normal return
7220 b MterpDone
7221
7222/*
7223 * Bail out to reference interpreter.
7224 */
7225MterpFallback:
7226 EXPORT_PC
7227#if MTERP_LOGGING
7228 mov x0, xSELF
7229 add x1, xFP, #OFF_FP_SHADOWFRAME
7230 bl MterpLogFallback
7231#endif
7232MterpCommonFallback:
7233 mov x0, #0 // signal retry with reference interpreter.
7234 b MterpDone
7235
7236/*
7237 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
7238 * SP and LR. Here we restore SP, restore the registers, and then restore
7239 * LR to PC.
7240 *
7241 * On entry:
7242 * uint32_t* xFP (should still be live, pointer to base of vregs)
7243 */
7244MterpExceptionReturn:
7245 mov x0, #1 // signal return to caller.
7246 b MterpDone
7247MterpReturn:
7248 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
Vladimir Marko20421b92016-07-26 16:38:11 +01007249 str x0, [x2]
Vladimir Marko20421b92016-07-26 16:38:11 +01007250 mov x0, #1 // signal return to caller.
7251MterpDone:
7252/*
7253 * At this point, we expect wPROFILE to be non-zero. If negative, hotness is disabled or we're
7254 * checking for OSR. If greater than zero, we might have unreported hotness to register
7255 * (the difference between the ending wPROFILE and the cached hotness counter). wPROFILE
7256 * should only reach zero immediately after a hotness decrement, and is then reset to either
7257 * a negative special state or the new non-zero countdown value.
7258 */
7259 cmp wPROFILE, #0
7260 bgt MterpProfileActive // if > 0, we may have some counts to report.
Vladimir Marko112aa102016-12-01 11:53:54 +00007261 .cfi_remember_state
7262 RESTORE_TWO_REGS fp, lr, 64
7263 RESTORE_TWO_REGS xPC, xFP, 48
7264 RESTORE_TWO_REGS xSELF, xINST, 32
7265 RESTORE_TWO_REGS xIBASE, xREFS, 16
7266 RESTORE_TWO_REGS_DECREASE_FRAME xPROFILE, x27, 80
Vladimir Marko20421b92016-07-26 16:38:11 +01007267 ret
Vladimir Marko112aa102016-12-01 11:53:54 +00007268 .cfi_restore_state // Reset unwind info so following code unwinds.
7269 .cfi_def_cfa_offset 80 // workaround for clang bug: 31975598
Vladimir Marko20421b92016-07-26 16:38:11 +01007270
7271MterpProfileActive:
7272 mov xINST, x0 // stash return value
7273 /* Report cached hotness counts */
7274 ldr x0, [xFP, #OFF_FP_METHOD]
7275 add x1, xFP, #OFF_FP_SHADOWFRAME
7276 mov x2, xSELF
7277 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
7278 bl MterpAddHotnessBatch // (method, shadow_frame, self)
7279 mov x0, xINST // restore return value
Vladimir Marko112aa102016-12-01 11:53:54 +00007280 RESTORE_TWO_REGS fp, lr, 64
7281 RESTORE_TWO_REGS xPC, xFP, 48
7282 RESTORE_TWO_REGS xSELF, xINST, 32
7283 RESTORE_TWO_REGS xIBASE, xREFS, 16
7284 RESTORE_TWO_REGS_DECREASE_FRAME xPROFILE, x27, 80
Vladimir Marko20421b92016-07-26 16:38:11 +01007285 ret
7286
7287 .cfi_endproc
7288 .size ExecuteMterpImpl, .-ExecuteMterpImpl
7289
7290
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007291
7292 .global artMterpAsmAltInstructionStart
7293 .type artMterpAsmAltInstructionStart, %function
7294 .text
7295
7296artMterpAsmAltInstructionStart = .L_ALT_op_nop
7297/* ------------------------------ */
7298 .balign 128
7299.L_ALT_op_nop: /* 0x00 */
7300/* File: arm64/alt_stub.S */
7301/*
7302 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7303 * any interesting requests and then jump to the real instruction
7304 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7305 */
7306 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007307 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7308 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
7309 mov x0, xSELF
7310 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007311 mov x2, xPC
7312 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007313
7314/* ------------------------------ */
7315 .balign 128
7316.L_ALT_op_move: /* 0x01 */
7317/* File: arm64/alt_stub.S */
7318/*
7319 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7320 * any interesting requests and then jump to the real instruction
7321 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7322 */
7323 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007324 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7325 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
7326 mov x0, xSELF
7327 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007328 mov x2, xPC
7329 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007330
7331/* ------------------------------ */
7332 .balign 128
7333.L_ALT_op_move_from16: /* 0x02 */
7334/* File: arm64/alt_stub.S */
7335/*
7336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7337 * any interesting requests and then jump to the real instruction
7338 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7339 */
7340 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007341 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7342 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
7343 mov x0, xSELF
7344 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007345 mov x2, xPC
7346 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007347
7348/* ------------------------------ */
7349 .balign 128
7350.L_ALT_op_move_16: /* 0x03 */
7351/* File: arm64/alt_stub.S */
7352/*
7353 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7354 * any interesting requests and then jump to the real instruction
7355 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7356 */
7357 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007358 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7359 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
7360 mov x0, xSELF
7361 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007362 mov x2, xPC
7363 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007364
7365/* ------------------------------ */
7366 .balign 128
7367.L_ALT_op_move_wide: /* 0x04 */
7368/* File: arm64/alt_stub.S */
7369/*
7370 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7371 * any interesting requests and then jump to the real instruction
7372 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7373 */
7374 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007375 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7376 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
7377 mov x0, xSELF
7378 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007379 mov x2, xPC
7380 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007381
7382/* ------------------------------ */
7383 .balign 128
7384.L_ALT_op_move_wide_from16: /* 0x05 */
7385/* File: arm64/alt_stub.S */
7386/*
7387 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7388 * any interesting requests and then jump to the real instruction
7389 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7390 */
7391 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007392 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7393 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
7394 mov x0, xSELF
7395 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007396 mov x2, xPC
7397 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007398
7399/* ------------------------------ */
7400 .balign 128
7401.L_ALT_op_move_wide_16: /* 0x06 */
7402/* File: arm64/alt_stub.S */
7403/*
7404 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7405 * any interesting requests and then jump to the real instruction
7406 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7407 */
7408 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007409 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7410 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7411 mov x0, xSELF
7412 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007413 mov x2, xPC
7414 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007415
7416/* ------------------------------ */
7417 .balign 128
7418.L_ALT_op_move_object: /* 0x07 */
7419/* File: arm64/alt_stub.S */
7420/*
7421 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7422 * any interesting requests and then jump to the real instruction
7423 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7424 */
7425 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007426 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7427 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7428 mov x0, xSELF
7429 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007430 mov x2, xPC
7431 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007432
7433/* ------------------------------ */
7434 .balign 128
7435.L_ALT_op_move_object_from16: /* 0x08 */
7436/* File: arm64/alt_stub.S */
7437/*
7438 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7439 * any interesting requests and then jump to the real instruction
7440 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7441 */
7442 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007443 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7444 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7445 mov x0, xSELF
7446 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007447 mov x2, xPC
7448 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007449
7450/* ------------------------------ */
7451 .balign 128
7452.L_ALT_op_move_object_16: /* 0x09 */
7453/* File: arm64/alt_stub.S */
7454/*
7455 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7456 * any interesting requests and then jump to the real instruction
7457 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7458 */
7459 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007460 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7461 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7462 mov x0, xSELF
7463 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007464 mov x2, xPC
7465 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007466
7467/* ------------------------------ */
7468 .balign 128
7469.L_ALT_op_move_result: /* 0x0a */
7470/* File: arm64/alt_stub.S */
7471/*
7472 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7473 * any interesting requests and then jump to the real instruction
7474 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7475 */
7476 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007477 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7478 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7479 mov x0, xSELF
7480 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007481 mov x2, xPC
7482 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007483
7484/* ------------------------------ */
7485 .balign 128
7486.L_ALT_op_move_result_wide: /* 0x0b */
7487/* File: arm64/alt_stub.S */
7488/*
7489 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7490 * any interesting requests and then jump to the real instruction
7491 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7492 */
7493 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007494 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7495 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7496 mov x0, xSELF
7497 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007498 mov x2, xPC
7499 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007500
7501/* ------------------------------ */
7502 .balign 128
7503.L_ALT_op_move_result_object: /* 0x0c */
7504/* File: arm64/alt_stub.S */
7505/*
7506 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7507 * any interesting requests and then jump to the real instruction
7508 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7509 */
7510 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007511 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7512 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7513 mov x0, xSELF
7514 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007515 mov x2, xPC
7516 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007517
7518/* ------------------------------ */
7519 .balign 128
7520.L_ALT_op_move_exception: /* 0x0d */
7521/* File: arm64/alt_stub.S */
7522/*
7523 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7524 * any interesting requests and then jump to the real instruction
7525 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7526 */
7527 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007528 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7529 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7530 mov x0, xSELF
7531 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007532 mov x2, xPC
7533 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007534
7535/* ------------------------------ */
7536 .balign 128
7537.L_ALT_op_return_void: /* 0x0e */
7538/* File: arm64/alt_stub.S */
7539/*
7540 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7541 * any interesting requests and then jump to the real instruction
7542 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7543 */
7544 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007545 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7546 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7547 mov x0, xSELF
7548 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007549 mov x2, xPC
7550 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007551
7552/* ------------------------------ */
7553 .balign 128
7554.L_ALT_op_return: /* 0x0f */
7555/* File: arm64/alt_stub.S */
7556/*
7557 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7558 * any interesting requests and then jump to the real instruction
7559 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7560 */
7561 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007562 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7563 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7564 mov x0, xSELF
7565 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007566 mov x2, xPC
7567 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007568
7569/* ------------------------------ */
7570 .balign 128
7571.L_ALT_op_return_wide: /* 0x10 */
7572/* File: arm64/alt_stub.S */
7573/*
7574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7575 * any interesting requests and then jump to the real instruction
7576 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7577 */
7578 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007579 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7580 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7581 mov x0, xSELF
7582 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007583 mov x2, xPC
7584 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007585
7586/* ------------------------------ */
7587 .balign 128
7588.L_ALT_op_return_object: /* 0x11 */
7589/* File: arm64/alt_stub.S */
7590/*
7591 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7592 * any interesting requests and then jump to the real instruction
7593 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7594 */
7595 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007596 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7597 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7598 mov x0, xSELF
7599 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007600 mov x2, xPC
7601 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007602
7603/* ------------------------------ */
7604 .balign 128
7605.L_ALT_op_const_4: /* 0x12 */
7606/* File: arm64/alt_stub.S */
7607/*
7608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7609 * any interesting requests and then jump to the real instruction
7610 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7611 */
7612 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007613 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7614 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7615 mov x0, xSELF
7616 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007617 mov x2, xPC
7618 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007619
7620/* ------------------------------ */
7621 .balign 128
7622.L_ALT_op_const_16: /* 0x13 */
7623/* File: arm64/alt_stub.S */
7624/*
7625 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7626 * any interesting requests and then jump to the real instruction
7627 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7628 */
7629 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007630 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7631 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7632 mov x0, xSELF
7633 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007634 mov x2, xPC
7635 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007636
7637/* ------------------------------ */
7638 .balign 128
7639.L_ALT_op_const: /* 0x14 */
7640/* File: arm64/alt_stub.S */
7641/*
7642 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7643 * any interesting requests and then jump to the real instruction
7644 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7645 */
7646 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007647 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7648 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7649 mov x0, xSELF
7650 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007651 mov x2, xPC
7652 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007653
7654/* ------------------------------ */
7655 .balign 128
7656.L_ALT_op_const_high16: /* 0x15 */
7657/* File: arm64/alt_stub.S */
7658/*
7659 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7660 * any interesting requests and then jump to the real instruction
7661 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7662 */
7663 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007664 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7665 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7666 mov x0, xSELF
7667 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007668 mov x2, xPC
7669 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007670
7671/* ------------------------------ */
7672 .balign 128
7673.L_ALT_op_const_wide_16: /* 0x16 */
7674/* File: arm64/alt_stub.S */
7675/*
7676 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7677 * any interesting requests and then jump to the real instruction
7678 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7679 */
7680 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007681 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7682 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7683 mov x0, xSELF
7684 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007685 mov x2, xPC
7686 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007687
7688/* ------------------------------ */
7689 .balign 128
7690.L_ALT_op_const_wide_32: /* 0x17 */
7691/* File: arm64/alt_stub.S */
7692/*
7693 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7694 * any interesting requests and then jump to the real instruction
7695 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7696 */
7697 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007698 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7699 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7700 mov x0, xSELF
7701 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007702 mov x2, xPC
7703 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007704
7705/* ------------------------------ */
7706 .balign 128
7707.L_ALT_op_const_wide: /* 0x18 */
7708/* File: arm64/alt_stub.S */
7709/*
7710 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7711 * any interesting requests and then jump to the real instruction
7712 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7713 */
7714 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007715 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7716 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7717 mov x0, xSELF
7718 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007719 mov x2, xPC
7720 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007721
7722/* ------------------------------ */
7723 .balign 128
7724.L_ALT_op_const_wide_high16: /* 0x19 */
7725/* File: arm64/alt_stub.S */
7726/*
7727 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7728 * any interesting requests and then jump to the real instruction
7729 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7730 */
7731 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007732 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7733 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7734 mov x0, xSELF
7735 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007736 mov x2, xPC
7737 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007738
7739/* ------------------------------ */
7740 .balign 128
7741.L_ALT_op_const_string: /* 0x1a */
7742/* File: arm64/alt_stub.S */
7743/*
7744 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7745 * any interesting requests and then jump to the real instruction
7746 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7747 */
7748 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007749 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7750 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7751 mov x0, xSELF
7752 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007753 mov x2, xPC
7754 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007755
7756/* ------------------------------ */
7757 .balign 128
7758.L_ALT_op_const_string_jumbo: /* 0x1b */
7759/* File: arm64/alt_stub.S */
7760/*
7761 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7762 * any interesting requests and then jump to the real instruction
7763 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7764 */
7765 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007766 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7767 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7768 mov x0, xSELF
7769 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007770 mov x2, xPC
7771 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007772
7773/* ------------------------------ */
7774 .balign 128
7775.L_ALT_op_const_class: /* 0x1c */
7776/* File: arm64/alt_stub.S */
7777/*
7778 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7779 * any interesting requests and then jump to the real instruction
7780 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7781 */
7782 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007783 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7784 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7785 mov x0, xSELF
7786 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007787 mov x2, xPC
7788 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007789
7790/* ------------------------------ */
7791 .balign 128
7792.L_ALT_op_monitor_enter: /* 0x1d */
7793/* File: arm64/alt_stub.S */
7794/*
7795 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7796 * any interesting requests and then jump to the real instruction
7797 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7798 */
7799 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007800 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7801 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7802 mov x0, xSELF
7803 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007804 mov x2, xPC
7805 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007806
7807/* ------------------------------ */
7808 .balign 128
7809.L_ALT_op_monitor_exit: /* 0x1e */
7810/* File: arm64/alt_stub.S */
7811/*
7812 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7813 * any interesting requests and then jump to the real instruction
7814 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7815 */
7816 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007817 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7818 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7819 mov x0, xSELF
7820 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007821 mov x2, xPC
7822 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007823
7824/* ------------------------------ */
7825 .balign 128
7826.L_ALT_op_check_cast: /* 0x1f */
7827/* File: arm64/alt_stub.S */
7828/*
7829 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7830 * any interesting requests and then jump to the real instruction
7831 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7832 */
7833 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007834 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7835 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7836 mov x0, xSELF
7837 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007838 mov x2, xPC
7839 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007840
7841/* ------------------------------ */
7842 .balign 128
7843.L_ALT_op_instance_of: /* 0x20 */
7844/* File: arm64/alt_stub.S */
7845/*
7846 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7847 * any interesting requests and then jump to the real instruction
7848 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7849 */
7850 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007851 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7852 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7853 mov x0, xSELF
7854 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007855 mov x2, xPC
7856 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007857
7858/* ------------------------------ */
7859 .balign 128
7860.L_ALT_op_array_length: /* 0x21 */
7861/* File: arm64/alt_stub.S */
7862/*
7863 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7864 * any interesting requests and then jump to the real instruction
7865 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7866 */
7867 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007868 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7869 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7870 mov x0, xSELF
7871 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007872 mov x2, xPC
7873 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007874
7875/* ------------------------------ */
7876 .balign 128
7877.L_ALT_op_new_instance: /* 0x22 */
7878/* File: arm64/alt_stub.S */
7879/*
7880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7881 * any interesting requests and then jump to the real instruction
7882 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7883 */
7884 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007885 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7886 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7887 mov x0, xSELF
7888 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007889 mov x2, xPC
7890 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007891
7892/* ------------------------------ */
7893 .balign 128
7894.L_ALT_op_new_array: /* 0x23 */
7895/* File: arm64/alt_stub.S */
7896/*
7897 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7898 * any interesting requests and then jump to the real instruction
7899 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7900 */
7901 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007902 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7903 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7904 mov x0, xSELF
7905 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007906 mov x2, xPC
7907 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007908
7909/* ------------------------------ */
7910 .balign 128
7911.L_ALT_op_filled_new_array: /* 0x24 */
7912/* File: arm64/alt_stub.S */
7913/*
7914 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7915 * any interesting requests and then jump to the real instruction
7916 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7917 */
7918 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007919 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7920 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7921 mov x0, xSELF
7922 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007923 mov x2, xPC
7924 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007925
7926/* ------------------------------ */
7927 .balign 128
7928.L_ALT_op_filled_new_array_range: /* 0x25 */
7929/* File: arm64/alt_stub.S */
7930/*
7931 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7932 * any interesting requests and then jump to the real instruction
7933 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7934 */
7935 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007936 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7937 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7938 mov x0, xSELF
7939 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007940 mov x2, xPC
7941 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007942
7943/* ------------------------------ */
7944 .balign 128
7945.L_ALT_op_fill_array_data: /* 0x26 */
7946/* File: arm64/alt_stub.S */
7947/*
7948 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7949 * any interesting requests and then jump to the real instruction
7950 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7951 */
7952 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007953 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7954 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7955 mov x0, xSELF
7956 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007957 mov x2, xPC
7958 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007959
7960/* ------------------------------ */
7961 .balign 128
7962.L_ALT_op_throw: /* 0x27 */
7963/* File: arm64/alt_stub.S */
7964/*
7965 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7966 * any interesting requests and then jump to the real instruction
7967 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7968 */
7969 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007970 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7971 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
7972 mov x0, xSELF
7973 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007974 mov x2, xPC
7975 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007976
7977/* ------------------------------ */
7978 .balign 128
7979.L_ALT_op_goto: /* 0x28 */
7980/* File: arm64/alt_stub.S */
7981/*
7982 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7983 * any interesting requests and then jump to the real instruction
7984 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7985 */
7986 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007987 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7988 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
7989 mov x0, xSELF
7990 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007991 mov x2, xPC
7992 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007993
7994/* ------------------------------ */
7995 .balign 128
7996.L_ALT_op_goto_16: /* 0x29 */
7997/* File: arm64/alt_stub.S */
7998/*
7999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8000 * any interesting requests and then jump to the real instruction
8001 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8002 */
8003 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008004 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8005 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
8006 mov x0, xSELF
8007 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008008 mov x2, xPC
8009 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008010
8011/* ------------------------------ */
8012 .balign 128
8013.L_ALT_op_goto_32: /* 0x2a */
8014/* File: arm64/alt_stub.S */
8015/*
8016 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8017 * any interesting requests and then jump to the real instruction
8018 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8019 */
8020 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008021 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8022 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
8023 mov x0, xSELF
8024 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008025 mov x2, xPC
8026 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008027
8028/* ------------------------------ */
8029 .balign 128
8030.L_ALT_op_packed_switch: /* 0x2b */
8031/* File: arm64/alt_stub.S */
8032/*
8033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8034 * any interesting requests and then jump to the real instruction
8035 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8036 */
8037 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008038 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8039 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
8040 mov x0, xSELF
8041 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008042 mov x2, xPC
8043 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008044
8045/* ------------------------------ */
8046 .balign 128
8047.L_ALT_op_sparse_switch: /* 0x2c */
8048/* File: arm64/alt_stub.S */
8049/*
8050 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8051 * any interesting requests and then jump to the real instruction
8052 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8053 */
8054 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008055 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8056 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
8057 mov x0, xSELF
8058 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008059 mov x2, xPC
8060 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008061
8062/* ------------------------------ */
8063 .balign 128
8064.L_ALT_op_cmpl_float: /* 0x2d */
8065/* File: arm64/alt_stub.S */
8066/*
8067 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8068 * any interesting requests and then jump to the real instruction
8069 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8070 */
8071 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008072 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8073 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
8074 mov x0, xSELF
8075 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008076 mov x2, xPC
8077 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008078
8079/* ------------------------------ */
8080 .balign 128
8081.L_ALT_op_cmpg_float: /* 0x2e */
8082/* File: arm64/alt_stub.S */
8083/*
8084 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8085 * any interesting requests and then jump to the real instruction
8086 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8087 */
8088 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008089 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8090 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
8091 mov x0, xSELF
8092 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008093 mov x2, xPC
8094 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008095
8096/* ------------------------------ */
8097 .balign 128
8098.L_ALT_op_cmpl_double: /* 0x2f */
8099/* File: arm64/alt_stub.S */
8100/*
8101 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8102 * any interesting requests and then jump to the real instruction
8103 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8104 */
8105 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008106 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8107 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
8108 mov x0, xSELF
8109 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008110 mov x2, xPC
8111 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008112
8113/* ------------------------------ */
8114 .balign 128
8115.L_ALT_op_cmpg_double: /* 0x30 */
8116/* File: arm64/alt_stub.S */
8117/*
8118 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8119 * any interesting requests and then jump to the real instruction
8120 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8121 */
8122 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008123 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8124 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
8125 mov x0, xSELF
8126 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008127 mov x2, xPC
8128 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008129
8130/* ------------------------------ */
8131 .balign 128
8132.L_ALT_op_cmp_long: /* 0x31 */
8133/* File: arm64/alt_stub.S */
8134/*
8135 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8136 * any interesting requests and then jump to the real instruction
8137 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8138 */
8139 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008140 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8141 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
8142 mov x0, xSELF
8143 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008144 mov x2, xPC
8145 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008146
8147/* ------------------------------ */
8148 .balign 128
8149.L_ALT_op_if_eq: /* 0x32 */
8150/* File: arm64/alt_stub.S */
8151/*
8152 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8153 * any interesting requests and then jump to the real instruction
8154 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8155 */
8156 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008157 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8158 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
8159 mov x0, xSELF
8160 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008161 mov x2, xPC
8162 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008163
8164/* ------------------------------ */
8165 .balign 128
8166.L_ALT_op_if_ne: /* 0x33 */
8167/* File: arm64/alt_stub.S */
8168/*
8169 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8170 * any interesting requests and then jump to the real instruction
8171 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8172 */
8173 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008174 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8175 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
8176 mov x0, xSELF
8177 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008178 mov x2, xPC
8179 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008180
8181/* ------------------------------ */
8182 .balign 128
8183.L_ALT_op_if_lt: /* 0x34 */
8184/* File: arm64/alt_stub.S */
8185/*
8186 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8187 * any interesting requests and then jump to the real instruction
8188 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8189 */
8190 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008191 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8192 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
8193 mov x0, xSELF
8194 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008195 mov x2, xPC
8196 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008197
8198/* ------------------------------ */
8199 .balign 128
8200.L_ALT_op_if_ge: /* 0x35 */
8201/* File: arm64/alt_stub.S */
8202/*
8203 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8204 * any interesting requests and then jump to the real instruction
8205 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8206 */
8207 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008208 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8209 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
8210 mov x0, xSELF
8211 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008212 mov x2, xPC
8213 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008214
8215/* ------------------------------ */
8216 .balign 128
8217.L_ALT_op_if_gt: /* 0x36 */
8218/* File: arm64/alt_stub.S */
8219/*
8220 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8221 * any interesting requests and then jump to the real instruction
8222 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8223 */
8224 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008225 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8226 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
8227 mov x0, xSELF
8228 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008229 mov x2, xPC
8230 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008231
8232/* ------------------------------ */
8233 .balign 128
8234.L_ALT_op_if_le: /* 0x37 */
8235/* File: arm64/alt_stub.S */
8236/*
8237 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8238 * any interesting requests and then jump to the real instruction
8239 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8240 */
8241 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008242 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8243 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
8244 mov x0, xSELF
8245 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008246 mov x2, xPC
8247 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008248
8249/* ------------------------------ */
8250 .balign 128
8251.L_ALT_op_if_eqz: /* 0x38 */
8252/* File: arm64/alt_stub.S */
8253/*
8254 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8255 * any interesting requests and then jump to the real instruction
8256 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8257 */
8258 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008259 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8260 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
8261 mov x0, xSELF
8262 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008263 mov x2, xPC
8264 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008265
8266/* ------------------------------ */
8267 .balign 128
8268.L_ALT_op_if_nez: /* 0x39 */
8269/* File: arm64/alt_stub.S */
8270/*
8271 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8272 * any interesting requests and then jump to the real instruction
8273 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8274 */
8275 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008276 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8277 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
8278 mov x0, xSELF
8279 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008280 mov x2, xPC
8281 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008282
8283/* ------------------------------ */
8284 .balign 128
8285.L_ALT_op_if_ltz: /* 0x3a */
8286/* File: arm64/alt_stub.S */
8287/*
8288 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8289 * any interesting requests and then jump to the real instruction
8290 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8291 */
8292 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008293 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8294 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
8295 mov x0, xSELF
8296 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008297 mov x2, xPC
8298 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008299
8300/* ------------------------------ */
8301 .balign 128
8302.L_ALT_op_if_gez: /* 0x3b */
8303/* File: arm64/alt_stub.S */
8304/*
8305 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8306 * any interesting requests and then jump to the real instruction
8307 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8308 */
8309 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008310 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8311 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
8312 mov x0, xSELF
8313 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008314 mov x2, xPC
8315 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008316
8317/* ------------------------------ */
8318 .balign 128
8319.L_ALT_op_if_gtz: /* 0x3c */
8320/* File: arm64/alt_stub.S */
8321/*
8322 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8323 * any interesting requests and then jump to the real instruction
8324 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8325 */
8326 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008327 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8328 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
8329 mov x0, xSELF
8330 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008331 mov x2, xPC
8332 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008333
8334/* ------------------------------ */
8335 .balign 128
8336.L_ALT_op_if_lez: /* 0x3d */
8337/* File: arm64/alt_stub.S */
8338/*
8339 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8340 * any interesting requests and then jump to the real instruction
8341 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8342 */
8343 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008344 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8345 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
8346 mov x0, xSELF
8347 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008348 mov x2, xPC
8349 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008350
8351/* ------------------------------ */
8352 .balign 128
8353.L_ALT_op_unused_3e: /* 0x3e */
8354/* File: arm64/alt_stub.S */
8355/*
8356 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8357 * any interesting requests and then jump to the real instruction
8358 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8359 */
8360 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008361 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8362 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
8363 mov x0, xSELF
8364 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008365 mov x2, xPC
8366 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008367
8368/* ------------------------------ */
8369 .balign 128
8370.L_ALT_op_unused_3f: /* 0x3f */
8371/* File: arm64/alt_stub.S */
8372/*
8373 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8374 * any interesting requests and then jump to the real instruction
8375 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8376 */
8377 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008378 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8379 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
8380 mov x0, xSELF
8381 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008382 mov x2, xPC
8383 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008384
8385/* ------------------------------ */
8386 .balign 128
8387.L_ALT_op_unused_40: /* 0x40 */
8388/* File: arm64/alt_stub.S */
8389/*
8390 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8391 * any interesting requests and then jump to the real instruction
8392 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8393 */
8394 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008395 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8396 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
8397 mov x0, xSELF
8398 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008399 mov x2, xPC
8400 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008401
8402/* ------------------------------ */
8403 .balign 128
8404.L_ALT_op_unused_41: /* 0x41 */
8405/* File: arm64/alt_stub.S */
8406/*
8407 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8408 * any interesting requests and then jump to the real instruction
8409 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8410 */
8411 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008412 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8413 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8414 mov x0, xSELF
8415 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008416 mov x2, xPC
8417 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008418
8419/* ------------------------------ */
8420 .balign 128
8421.L_ALT_op_unused_42: /* 0x42 */
8422/* File: arm64/alt_stub.S */
8423/*
8424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8425 * any interesting requests and then jump to the real instruction
8426 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8427 */
8428 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008429 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8430 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8431 mov x0, xSELF
8432 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008433 mov x2, xPC
8434 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008435
8436/* ------------------------------ */
8437 .balign 128
8438.L_ALT_op_unused_43: /* 0x43 */
8439/* File: arm64/alt_stub.S */
8440/*
8441 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8442 * any interesting requests and then jump to the real instruction
8443 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8444 */
8445 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008446 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8447 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8448 mov x0, xSELF
8449 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008450 mov x2, xPC
8451 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008452
8453/* ------------------------------ */
8454 .balign 128
8455.L_ALT_op_aget: /* 0x44 */
8456/* File: arm64/alt_stub.S */
8457/*
8458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8459 * any interesting requests and then jump to the real instruction
8460 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8461 */
8462 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008463 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8464 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8465 mov x0, xSELF
8466 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008467 mov x2, xPC
8468 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008469
8470/* ------------------------------ */
8471 .balign 128
8472.L_ALT_op_aget_wide: /* 0x45 */
8473/* File: arm64/alt_stub.S */
8474/*
8475 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8476 * any interesting requests and then jump to the real instruction
8477 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8478 */
8479 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008480 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8481 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8482 mov x0, xSELF
8483 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008484 mov x2, xPC
8485 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008486
8487/* ------------------------------ */
8488 .balign 128
8489.L_ALT_op_aget_object: /* 0x46 */
8490/* File: arm64/alt_stub.S */
8491/*
8492 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8493 * any interesting requests and then jump to the real instruction
8494 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8495 */
8496 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008497 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8498 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8499 mov x0, xSELF
8500 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008501 mov x2, xPC
8502 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008503
8504/* ------------------------------ */
8505 .balign 128
8506.L_ALT_op_aget_boolean: /* 0x47 */
8507/* File: arm64/alt_stub.S */
8508/*
8509 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8510 * any interesting requests and then jump to the real instruction
8511 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8512 */
8513 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008514 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8515 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8516 mov x0, xSELF
8517 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008518 mov x2, xPC
8519 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008520
8521/* ------------------------------ */
8522 .balign 128
8523.L_ALT_op_aget_byte: /* 0x48 */
8524/* File: arm64/alt_stub.S */
8525/*
8526 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8527 * any interesting requests and then jump to the real instruction
8528 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8529 */
8530 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008531 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8532 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8533 mov x0, xSELF
8534 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008535 mov x2, xPC
8536 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008537
8538/* ------------------------------ */
8539 .balign 128
8540.L_ALT_op_aget_char: /* 0x49 */
8541/* File: arm64/alt_stub.S */
8542/*
8543 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8544 * any interesting requests and then jump to the real instruction
8545 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8546 */
8547 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008548 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8549 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8550 mov x0, xSELF
8551 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008552 mov x2, xPC
8553 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008554
8555/* ------------------------------ */
8556 .balign 128
8557.L_ALT_op_aget_short: /* 0x4a */
8558/* File: arm64/alt_stub.S */
8559/*
8560 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8561 * any interesting requests and then jump to the real instruction
8562 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8563 */
8564 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008565 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8566 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8567 mov x0, xSELF
8568 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008569 mov x2, xPC
8570 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008571
8572/* ------------------------------ */
8573 .balign 128
8574.L_ALT_op_aput: /* 0x4b */
8575/* File: arm64/alt_stub.S */
8576/*
8577 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8578 * any interesting requests and then jump to the real instruction
8579 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8580 */
8581 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008582 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8583 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8584 mov x0, xSELF
8585 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008586 mov x2, xPC
8587 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008588
8589/* ------------------------------ */
8590 .balign 128
8591.L_ALT_op_aput_wide: /* 0x4c */
8592/* File: arm64/alt_stub.S */
8593/*
8594 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8595 * any interesting requests and then jump to the real instruction
8596 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8597 */
8598 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008599 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8600 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8601 mov x0, xSELF
8602 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008603 mov x2, xPC
8604 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008605
8606/* ------------------------------ */
8607 .balign 128
8608.L_ALT_op_aput_object: /* 0x4d */
8609/* File: arm64/alt_stub.S */
8610/*
8611 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8612 * any interesting requests and then jump to the real instruction
8613 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8614 */
8615 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008616 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8617 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8618 mov x0, xSELF
8619 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008620 mov x2, xPC
8621 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008622
8623/* ------------------------------ */
8624 .balign 128
8625.L_ALT_op_aput_boolean: /* 0x4e */
8626/* File: arm64/alt_stub.S */
8627/*
8628 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8629 * any interesting requests and then jump to the real instruction
8630 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8631 */
8632 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008633 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8634 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8635 mov x0, xSELF
8636 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008637 mov x2, xPC
8638 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008639
8640/* ------------------------------ */
8641 .balign 128
8642.L_ALT_op_aput_byte: /* 0x4f */
8643/* File: arm64/alt_stub.S */
8644/*
8645 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8646 * any interesting requests and then jump to the real instruction
8647 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8648 */
8649 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008650 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8651 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8652 mov x0, xSELF
8653 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008654 mov x2, xPC
8655 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008656
8657/* ------------------------------ */
8658 .balign 128
8659.L_ALT_op_aput_char: /* 0x50 */
8660/* File: arm64/alt_stub.S */
8661/*
8662 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8663 * any interesting requests and then jump to the real instruction
8664 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8665 */
8666 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008667 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8668 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8669 mov x0, xSELF
8670 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008671 mov x2, xPC
8672 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008673
8674/* ------------------------------ */
8675 .balign 128
8676.L_ALT_op_aput_short: /* 0x51 */
8677/* File: arm64/alt_stub.S */
8678/*
8679 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8680 * any interesting requests and then jump to the real instruction
8681 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8682 */
8683 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008684 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8685 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8686 mov x0, xSELF
8687 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008688 mov x2, xPC
8689 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008690
8691/* ------------------------------ */
8692 .balign 128
8693.L_ALT_op_iget: /* 0x52 */
8694/* File: arm64/alt_stub.S */
8695/*
8696 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8697 * any interesting requests and then jump to the real instruction
8698 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8699 */
8700 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008701 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8702 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8703 mov x0, xSELF
8704 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008705 mov x2, xPC
8706 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008707
8708/* ------------------------------ */
8709 .balign 128
8710.L_ALT_op_iget_wide: /* 0x53 */
8711/* File: arm64/alt_stub.S */
8712/*
8713 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8714 * any interesting requests and then jump to the real instruction
8715 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8716 */
8717 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008718 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8719 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8720 mov x0, xSELF
8721 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008722 mov x2, xPC
8723 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008724
8725/* ------------------------------ */
8726 .balign 128
8727.L_ALT_op_iget_object: /* 0x54 */
8728/* File: arm64/alt_stub.S */
8729/*
8730 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8731 * any interesting requests and then jump to the real instruction
8732 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8733 */
8734 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008735 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8736 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8737 mov x0, xSELF
8738 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008739 mov x2, xPC
8740 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008741
8742/* ------------------------------ */
8743 .balign 128
8744.L_ALT_op_iget_boolean: /* 0x55 */
8745/* File: arm64/alt_stub.S */
8746/*
8747 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8748 * any interesting requests and then jump to the real instruction
8749 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8750 */
8751 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008752 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8753 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8754 mov x0, xSELF
8755 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008756 mov x2, xPC
8757 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008758
8759/* ------------------------------ */
8760 .balign 128
8761.L_ALT_op_iget_byte: /* 0x56 */
8762/* File: arm64/alt_stub.S */
8763/*
8764 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8765 * any interesting requests and then jump to the real instruction
8766 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8767 */
8768 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008769 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8770 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8771 mov x0, xSELF
8772 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008773 mov x2, xPC
8774 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008775
8776/* ------------------------------ */
8777 .balign 128
8778.L_ALT_op_iget_char: /* 0x57 */
8779/* File: arm64/alt_stub.S */
8780/*
8781 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8782 * any interesting requests and then jump to the real instruction
8783 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8784 */
8785 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008786 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8787 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8788 mov x0, xSELF
8789 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008790 mov x2, xPC
8791 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008792
8793/* ------------------------------ */
8794 .balign 128
8795.L_ALT_op_iget_short: /* 0x58 */
8796/* File: arm64/alt_stub.S */
8797/*
8798 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8799 * any interesting requests and then jump to the real instruction
8800 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8801 */
8802 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008803 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8804 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8805 mov x0, xSELF
8806 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008807 mov x2, xPC
8808 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008809
8810/* ------------------------------ */
8811 .balign 128
8812.L_ALT_op_iput: /* 0x59 */
8813/* File: arm64/alt_stub.S */
8814/*
8815 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8816 * any interesting requests and then jump to the real instruction
8817 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8818 */
8819 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008820 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8821 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8822 mov x0, xSELF
8823 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008824 mov x2, xPC
8825 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008826
8827/* ------------------------------ */
8828 .balign 128
8829.L_ALT_op_iput_wide: /* 0x5a */
8830/* File: arm64/alt_stub.S */
8831/*
8832 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8833 * any interesting requests and then jump to the real instruction
8834 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8835 */
8836 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008837 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8838 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8839 mov x0, xSELF
8840 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008841 mov x2, xPC
8842 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008843
8844/* ------------------------------ */
8845 .balign 128
8846.L_ALT_op_iput_object: /* 0x5b */
8847/* File: arm64/alt_stub.S */
8848/*
8849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8850 * any interesting requests and then jump to the real instruction
8851 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8852 */
8853 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008854 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8855 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8856 mov x0, xSELF
8857 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008858 mov x2, xPC
8859 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008860
8861/* ------------------------------ */
8862 .balign 128
8863.L_ALT_op_iput_boolean: /* 0x5c */
8864/* File: arm64/alt_stub.S */
8865/*
8866 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8867 * any interesting requests and then jump to the real instruction
8868 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8869 */
8870 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008871 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8872 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8873 mov x0, xSELF
8874 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008875 mov x2, xPC
8876 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008877
8878/* ------------------------------ */
8879 .balign 128
8880.L_ALT_op_iput_byte: /* 0x5d */
8881/* File: arm64/alt_stub.S */
8882/*
8883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8884 * any interesting requests and then jump to the real instruction
8885 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8886 */
8887 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008888 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8889 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8890 mov x0, xSELF
8891 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008892 mov x2, xPC
8893 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008894
8895/* ------------------------------ */
8896 .balign 128
8897.L_ALT_op_iput_char: /* 0x5e */
8898/* File: arm64/alt_stub.S */
8899/*
8900 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8901 * any interesting requests and then jump to the real instruction
8902 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8903 */
8904 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008905 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8906 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8907 mov x0, xSELF
8908 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008909 mov x2, xPC
8910 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008911
8912/* ------------------------------ */
8913 .balign 128
8914.L_ALT_op_iput_short: /* 0x5f */
8915/* File: arm64/alt_stub.S */
8916/*
8917 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8918 * any interesting requests and then jump to the real instruction
8919 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8920 */
8921 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008922 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8923 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8924 mov x0, xSELF
8925 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008926 mov x2, xPC
8927 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008928
8929/* ------------------------------ */
8930 .balign 128
8931.L_ALT_op_sget: /* 0x60 */
8932/* File: arm64/alt_stub.S */
8933/*
8934 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8935 * any interesting requests and then jump to the real instruction
8936 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8937 */
8938 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008939 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8940 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8941 mov x0, xSELF
8942 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008943 mov x2, xPC
8944 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008945
8946/* ------------------------------ */
8947 .balign 128
8948.L_ALT_op_sget_wide: /* 0x61 */
8949/* File: arm64/alt_stub.S */
8950/*
8951 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8952 * any interesting requests and then jump to the real instruction
8953 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8954 */
8955 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008956 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8957 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8958 mov x0, xSELF
8959 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008960 mov x2, xPC
8961 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008962
8963/* ------------------------------ */
8964 .balign 128
8965.L_ALT_op_sget_object: /* 0x62 */
8966/* File: arm64/alt_stub.S */
8967/*
8968 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8969 * any interesting requests and then jump to the real instruction
8970 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8971 */
8972 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008973 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8974 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
8975 mov x0, xSELF
8976 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008977 mov x2, xPC
8978 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008979
8980/* ------------------------------ */
8981 .balign 128
8982.L_ALT_op_sget_boolean: /* 0x63 */
8983/* File: arm64/alt_stub.S */
8984/*
8985 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8986 * any interesting requests and then jump to the real instruction
8987 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8988 */
8989 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008990 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8991 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
8992 mov x0, xSELF
8993 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008994 mov x2, xPC
8995 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008996
8997/* ------------------------------ */
8998 .balign 128
8999.L_ALT_op_sget_byte: /* 0x64 */
9000/* File: arm64/alt_stub.S */
9001/*
9002 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9003 * any interesting requests and then jump to the real instruction
9004 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9005 */
9006 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009007 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9008 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
9009 mov x0, xSELF
9010 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009011 mov x2, xPC
9012 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009013
9014/* ------------------------------ */
9015 .balign 128
9016.L_ALT_op_sget_char: /* 0x65 */
9017/* File: arm64/alt_stub.S */
9018/*
9019 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9020 * any interesting requests and then jump to the real instruction
9021 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9022 */
9023 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009024 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9025 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
9026 mov x0, xSELF
9027 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009028 mov x2, xPC
9029 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009030
9031/* ------------------------------ */
9032 .balign 128
9033.L_ALT_op_sget_short: /* 0x66 */
9034/* File: arm64/alt_stub.S */
9035/*
9036 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9037 * any interesting requests and then jump to the real instruction
9038 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9039 */
9040 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009041 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9042 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
9043 mov x0, xSELF
9044 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009045 mov x2, xPC
9046 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009047
9048/* ------------------------------ */
9049 .balign 128
9050.L_ALT_op_sput: /* 0x67 */
9051/* File: arm64/alt_stub.S */
9052/*
9053 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9054 * any interesting requests and then jump to the real instruction
9055 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9056 */
9057 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009058 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9059 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
9060 mov x0, xSELF
9061 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009062 mov x2, xPC
9063 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009064
9065/* ------------------------------ */
9066 .balign 128
9067.L_ALT_op_sput_wide: /* 0x68 */
9068/* File: arm64/alt_stub.S */
9069/*
9070 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9071 * any interesting requests and then jump to the real instruction
9072 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9073 */
9074 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009075 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9076 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
9077 mov x0, xSELF
9078 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009079 mov x2, xPC
9080 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009081
9082/* ------------------------------ */
9083 .balign 128
9084.L_ALT_op_sput_object: /* 0x69 */
9085/* File: arm64/alt_stub.S */
9086/*
9087 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9088 * any interesting requests and then jump to the real instruction
9089 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9090 */
9091 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009092 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9093 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
9094 mov x0, xSELF
9095 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009096 mov x2, xPC
9097 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009098
9099/* ------------------------------ */
9100 .balign 128
9101.L_ALT_op_sput_boolean: /* 0x6a */
9102/* File: arm64/alt_stub.S */
9103/*
9104 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9105 * any interesting requests and then jump to the real instruction
9106 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9107 */
9108 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009109 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9110 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
9111 mov x0, xSELF
9112 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009113 mov x2, xPC
9114 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009115
9116/* ------------------------------ */
9117 .balign 128
9118.L_ALT_op_sput_byte: /* 0x6b */
9119/* File: arm64/alt_stub.S */
9120/*
9121 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9122 * any interesting requests and then jump to the real instruction
9123 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9124 */
9125 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009126 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9127 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
9128 mov x0, xSELF
9129 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009130 mov x2, xPC
9131 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009132
9133/* ------------------------------ */
9134 .balign 128
9135.L_ALT_op_sput_char: /* 0x6c */
9136/* File: arm64/alt_stub.S */
9137/*
9138 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9139 * any interesting requests and then jump to the real instruction
9140 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9141 */
9142 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009143 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9144 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
9145 mov x0, xSELF
9146 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009147 mov x2, xPC
9148 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009149
9150/* ------------------------------ */
9151 .balign 128
9152.L_ALT_op_sput_short: /* 0x6d */
9153/* File: arm64/alt_stub.S */
9154/*
9155 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9156 * any interesting requests and then jump to the real instruction
9157 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9158 */
9159 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009160 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9161 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
9162 mov x0, xSELF
9163 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009164 mov x2, xPC
9165 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009166
9167/* ------------------------------ */
9168 .balign 128
9169.L_ALT_op_invoke_virtual: /* 0x6e */
9170/* File: arm64/alt_stub.S */
9171/*
9172 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9173 * any interesting requests and then jump to the real instruction
9174 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9175 */
9176 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009177 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9178 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
9179 mov x0, xSELF
9180 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009181 mov x2, xPC
9182 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009183
9184/* ------------------------------ */
9185 .balign 128
9186.L_ALT_op_invoke_super: /* 0x6f */
9187/* File: arm64/alt_stub.S */
9188/*
9189 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9190 * any interesting requests and then jump to the real instruction
9191 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9192 */
9193 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009194 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9195 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
9196 mov x0, xSELF
9197 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009198 mov x2, xPC
9199 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009200
9201/* ------------------------------ */
9202 .balign 128
9203.L_ALT_op_invoke_direct: /* 0x70 */
9204/* File: arm64/alt_stub.S */
9205/*
9206 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9207 * any interesting requests and then jump to the real instruction
9208 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9209 */
9210 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009211 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9212 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
9213 mov x0, xSELF
9214 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009215 mov x2, xPC
9216 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009217
9218/* ------------------------------ */
9219 .balign 128
9220.L_ALT_op_invoke_static: /* 0x71 */
9221/* File: arm64/alt_stub.S */
9222/*
9223 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9224 * any interesting requests and then jump to the real instruction
9225 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9226 */
9227 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009228 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9229 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
9230 mov x0, xSELF
9231 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009232 mov x2, xPC
9233 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009234
9235/* ------------------------------ */
9236 .balign 128
9237.L_ALT_op_invoke_interface: /* 0x72 */
9238/* File: arm64/alt_stub.S */
9239/*
9240 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9241 * any interesting requests and then jump to the real instruction
9242 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9243 */
9244 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009245 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9246 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
9247 mov x0, xSELF
9248 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009249 mov x2, xPC
9250 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009251
9252/* ------------------------------ */
9253 .balign 128
9254.L_ALT_op_return_void_no_barrier: /* 0x73 */
9255/* File: arm64/alt_stub.S */
9256/*
9257 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9258 * any interesting requests and then jump to the real instruction
9259 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9260 */
9261 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009262 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9263 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
9264 mov x0, xSELF
9265 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009266 mov x2, xPC
9267 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009268
9269/* ------------------------------ */
9270 .balign 128
9271.L_ALT_op_invoke_virtual_range: /* 0x74 */
9272/* File: arm64/alt_stub.S */
9273/*
9274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9275 * any interesting requests and then jump to the real instruction
9276 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9277 */
9278 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009279 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9280 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
9281 mov x0, xSELF
9282 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009283 mov x2, xPC
9284 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009285
9286/* ------------------------------ */
9287 .balign 128
9288.L_ALT_op_invoke_super_range: /* 0x75 */
9289/* File: arm64/alt_stub.S */
9290/*
9291 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9292 * any interesting requests and then jump to the real instruction
9293 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9294 */
9295 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009296 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9297 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
9298 mov x0, xSELF
9299 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009300 mov x2, xPC
9301 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009302
9303/* ------------------------------ */
9304 .balign 128
9305.L_ALT_op_invoke_direct_range: /* 0x76 */
9306/* File: arm64/alt_stub.S */
9307/*
9308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9309 * any interesting requests and then jump to the real instruction
9310 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9311 */
9312 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009313 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9314 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
9315 mov x0, xSELF
9316 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009317 mov x2, xPC
9318 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009319
9320/* ------------------------------ */
9321 .balign 128
9322.L_ALT_op_invoke_static_range: /* 0x77 */
9323/* File: arm64/alt_stub.S */
9324/*
9325 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9326 * any interesting requests and then jump to the real instruction
9327 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9328 */
9329 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009330 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9331 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
9332 mov x0, xSELF
9333 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009334 mov x2, xPC
9335 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009336
9337/* ------------------------------ */
9338 .balign 128
9339.L_ALT_op_invoke_interface_range: /* 0x78 */
9340/* File: arm64/alt_stub.S */
9341/*
9342 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9343 * any interesting requests and then jump to the real instruction
9344 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9345 */
9346 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009347 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9348 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
9349 mov x0, xSELF
9350 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009351 mov x2, xPC
9352 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009353
9354/* ------------------------------ */
9355 .balign 128
9356.L_ALT_op_unused_79: /* 0x79 */
9357/* File: arm64/alt_stub.S */
9358/*
9359 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9360 * any interesting requests and then jump to the real instruction
9361 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9362 */
9363 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009364 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9365 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
9366 mov x0, xSELF
9367 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009368 mov x2, xPC
9369 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009370
9371/* ------------------------------ */
9372 .balign 128
9373.L_ALT_op_unused_7a: /* 0x7a */
9374/* File: arm64/alt_stub.S */
9375/*
9376 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9377 * any interesting requests and then jump to the real instruction
9378 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9379 */
9380 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009381 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9382 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
9383 mov x0, xSELF
9384 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009385 mov x2, xPC
9386 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009387
9388/* ------------------------------ */
9389 .balign 128
9390.L_ALT_op_neg_int: /* 0x7b */
9391/* File: arm64/alt_stub.S */
9392/*
9393 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9394 * any interesting requests and then jump to the real instruction
9395 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9396 */
9397 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009398 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9399 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
9400 mov x0, xSELF
9401 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009402 mov x2, xPC
9403 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009404
9405/* ------------------------------ */
9406 .balign 128
9407.L_ALT_op_not_int: /* 0x7c */
9408/* File: arm64/alt_stub.S */
9409/*
9410 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9411 * any interesting requests and then jump to the real instruction
9412 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9413 */
9414 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009415 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9416 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9417 mov x0, xSELF
9418 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009419 mov x2, xPC
9420 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009421
9422/* ------------------------------ */
9423 .balign 128
9424.L_ALT_op_neg_long: /* 0x7d */
9425/* File: arm64/alt_stub.S */
9426/*
9427 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9428 * any interesting requests and then jump to the real instruction
9429 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9430 */
9431 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009432 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9433 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9434 mov x0, xSELF
9435 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009436 mov x2, xPC
9437 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009438
9439/* ------------------------------ */
9440 .balign 128
9441.L_ALT_op_not_long: /* 0x7e */
9442/* File: arm64/alt_stub.S */
9443/*
9444 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9445 * any interesting requests and then jump to the real instruction
9446 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9447 */
9448 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009449 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9450 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9451 mov x0, xSELF
9452 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009453 mov x2, xPC
9454 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009455
9456/* ------------------------------ */
9457 .balign 128
9458.L_ALT_op_neg_float: /* 0x7f */
9459/* File: arm64/alt_stub.S */
9460/*
9461 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9462 * any interesting requests and then jump to the real instruction
9463 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9464 */
9465 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009466 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9467 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9468 mov x0, xSELF
9469 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009470 mov x2, xPC
9471 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009472
9473/* ------------------------------ */
9474 .balign 128
9475.L_ALT_op_neg_double: /* 0x80 */
9476/* File: arm64/alt_stub.S */
9477/*
9478 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9479 * any interesting requests and then jump to the real instruction
9480 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9481 */
9482 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009483 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9484 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9485 mov x0, xSELF
9486 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009487 mov x2, xPC
9488 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009489
9490/* ------------------------------ */
9491 .balign 128
9492.L_ALT_op_int_to_long: /* 0x81 */
9493/* File: arm64/alt_stub.S */
9494/*
9495 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9496 * any interesting requests and then jump to the real instruction
9497 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9498 */
9499 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009500 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9501 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9502 mov x0, xSELF
9503 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009504 mov x2, xPC
9505 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009506
9507/* ------------------------------ */
9508 .balign 128
9509.L_ALT_op_int_to_float: /* 0x82 */
9510/* File: arm64/alt_stub.S */
9511/*
9512 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9513 * any interesting requests and then jump to the real instruction
9514 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9515 */
9516 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009517 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9518 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9519 mov x0, xSELF
9520 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009521 mov x2, xPC
9522 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009523
9524/* ------------------------------ */
9525 .balign 128
9526.L_ALT_op_int_to_double: /* 0x83 */
9527/* File: arm64/alt_stub.S */
9528/*
9529 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9530 * any interesting requests and then jump to the real instruction
9531 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9532 */
9533 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009534 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9535 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9536 mov x0, xSELF
9537 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009538 mov x2, xPC
9539 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009540
9541/* ------------------------------ */
9542 .balign 128
9543.L_ALT_op_long_to_int: /* 0x84 */
9544/* File: arm64/alt_stub.S */
9545/*
9546 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9547 * any interesting requests and then jump to the real instruction
9548 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9549 */
9550 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009551 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9552 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9553 mov x0, xSELF
9554 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009555 mov x2, xPC
9556 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009557
9558/* ------------------------------ */
9559 .balign 128
9560.L_ALT_op_long_to_float: /* 0x85 */
9561/* File: arm64/alt_stub.S */
9562/*
9563 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9564 * any interesting requests and then jump to the real instruction
9565 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9566 */
9567 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009568 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9569 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9570 mov x0, xSELF
9571 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009572 mov x2, xPC
9573 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009574
9575/* ------------------------------ */
9576 .balign 128
9577.L_ALT_op_long_to_double: /* 0x86 */
9578/* File: arm64/alt_stub.S */
9579/*
9580 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9581 * any interesting requests and then jump to the real instruction
9582 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9583 */
9584 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009585 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9586 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9587 mov x0, xSELF
9588 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009589 mov x2, xPC
9590 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009591
9592/* ------------------------------ */
9593 .balign 128
9594.L_ALT_op_float_to_int: /* 0x87 */
9595/* File: arm64/alt_stub.S */
9596/*
9597 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9598 * any interesting requests and then jump to the real instruction
9599 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9600 */
9601 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009602 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9603 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9604 mov x0, xSELF
9605 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009606 mov x2, xPC
9607 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009608
9609/* ------------------------------ */
9610 .balign 128
9611.L_ALT_op_float_to_long: /* 0x88 */
9612/* File: arm64/alt_stub.S */
9613/*
9614 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9615 * any interesting requests and then jump to the real instruction
9616 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9617 */
9618 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009619 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9620 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9621 mov x0, xSELF
9622 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009623 mov x2, xPC
9624 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009625
9626/* ------------------------------ */
9627 .balign 128
9628.L_ALT_op_float_to_double: /* 0x89 */
9629/* File: arm64/alt_stub.S */
9630/*
9631 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9632 * any interesting requests and then jump to the real instruction
9633 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9634 */
9635 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009636 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9637 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9638 mov x0, xSELF
9639 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009640 mov x2, xPC
9641 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009642
9643/* ------------------------------ */
9644 .balign 128
9645.L_ALT_op_double_to_int: /* 0x8a */
9646/* File: arm64/alt_stub.S */
9647/*
9648 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9649 * any interesting requests and then jump to the real instruction
9650 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9651 */
9652 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009653 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9654 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9655 mov x0, xSELF
9656 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009657 mov x2, xPC
9658 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009659
9660/* ------------------------------ */
9661 .balign 128
9662.L_ALT_op_double_to_long: /* 0x8b */
9663/* File: arm64/alt_stub.S */
9664/*
9665 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9666 * any interesting requests and then jump to the real instruction
9667 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9668 */
9669 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009670 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9671 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9672 mov x0, xSELF
9673 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009674 mov x2, xPC
9675 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009676
9677/* ------------------------------ */
9678 .balign 128
9679.L_ALT_op_double_to_float: /* 0x8c */
9680/* File: arm64/alt_stub.S */
9681/*
9682 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9683 * any interesting requests and then jump to the real instruction
9684 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9685 */
9686 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009687 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9688 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9689 mov x0, xSELF
9690 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009691 mov x2, xPC
9692 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009693
9694/* ------------------------------ */
9695 .balign 128
9696.L_ALT_op_int_to_byte: /* 0x8d */
9697/* File: arm64/alt_stub.S */
9698/*
9699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9700 * any interesting requests and then jump to the real instruction
9701 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9702 */
9703 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009704 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9705 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9706 mov x0, xSELF
9707 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009708 mov x2, xPC
9709 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009710
9711/* ------------------------------ */
9712 .balign 128
9713.L_ALT_op_int_to_char: /* 0x8e */
9714/* File: arm64/alt_stub.S */
9715/*
9716 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9717 * any interesting requests and then jump to the real instruction
9718 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9719 */
9720 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009721 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9722 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9723 mov x0, xSELF
9724 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009725 mov x2, xPC
9726 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009727
9728/* ------------------------------ */
9729 .balign 128
9730.L_ALT_op_int_to_short: /* 0x8f */
9731/* File: arm64/alt_stub.S */
9732/*
9733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9734 * any interesting requests and then jump to the real instruction
9735 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9736 */
9737 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009738 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9739 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9740 mov x0, xSELF
9741 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009742 mov x2, xPC
9743 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009744
9745/* ------------------------------ */
9746 .balign 128
9747.L_ALT_op_add_int: /* 0x90 */
9748/* File: arm64/alt_stub.S */
9749/*
9750 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9751 * any interesting requests and then jump to the real instruction
9752 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9753 */
9754 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009755 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9756 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9757 mov x0, xSELF
9758 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009759 mov x2, xPC
9760 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009761
9762/* ------------------------------ */
9763 .balign 128
9764.L_ALT_op_sub_int: /* 0x91 */
9765/* File: arm64/alt_stub.S */
9766/*
9767 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9768 * any interesting requests and then jump to the real instruction
9769 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9770 */
9771 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009772 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9773 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9774 mov x0, xSELF
9775 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009776 mov x2, xPC
9777 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009778
9779/* ------------------------------ */
9780 .balign 128
9781.L_ALT_op_mul_int: /* 0x92 */
9782/* File: arm64/alt_stub.S */
9783/*
9784 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9785 * any interesting requests and then jump to the real instruction
9786 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9787 */
9788 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009789 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9790 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9791 mov x0, xSELF
9792 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009793 mov x2, xPC
9794 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009795
9796/* ------------------------------ */
9797 .balign 128
9798.L_ALT_op_div_int: /* 0x93 */
9799/* File: arm64/alt_stub.S */
9800/*
9801 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9802 * any interesting requests and then jump to the real instruction
9803 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9804 */
9805 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009806 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9807 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9808 mov x0, xSELF
9809 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009810 mov x2, xPC
9811 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009812
9813/* ------------------------------ */
9814 .balign 128
9815.L_ALT_op_rem_int: /* 0x94 */
9816/* File: arm64/alt_stub.S */
9817/*
9818 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9819 * any interesting requests and then jump to the real instruction
9820 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9821 */
9822 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009823 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9824 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9825 mov x0, xSELF
9826 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009827 mov x2, xPC
9828 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009829
9830/* ------------------------------ */
9831 .balign 128
9832.L_ALT_op_and_int: /* 0x95 */
9833/* File: arm64/alt_stub.S */
9834/*
9835 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9836 * any interesting requests and then jump to the real instruction
9837 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9838 */
9839 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009840 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9841 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9842 mov x0, xSELF
9843 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009844 mov x2, xPC
9845 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009846
9847/* ------------------------------ */
9848 .balign 128
9849.L_ALT_op_or_int: /* 0x96 */
9850/* File: arm64/alt_stub.S */
9851/*
9852 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9853 * any interesting requests and then jump to the real instruction
9854 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9855 */
9856 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009857 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9858 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9859 mov x0, xSELF
9860 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009861 mov x2, xPC
9862 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009863
9864/* ------------------------------ */
9865 .balign 128
9866.L_ALT_op_xor_int: /* 0x97 */
9867/* File: arm64/alt_stub.S */
9868/*
9869 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9870 * any interesting requests and then jump to the real instruction
9871 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9872 */
9873 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009874 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9875 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9876 mov x0, xSELF
9877 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009878 mov x2, xPC
9879 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009880
9881/* ------------------------------ */
9882 .balign 128
9883.L_ALT_op_shl_int: /* 0x98 */
9884/* File: arm64/alt_stub.S */
9885/*
9886 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9887 * any interesting requests and then jump to the real instruction
9888 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9889 */
9890 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009891 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9892 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9893 mov x0, xSELF
9894 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009895 mov x2, xPC
9896 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009897
9898/* ------------------------------ */
9899 .balign 128
9900.L_ALT_op_shr_int: /* 0x99 */
9901/* File: arm64/alt_stub.S */
9902/*
9903 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9904 * any interesting requests and then jump to the real instruction
9905 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9906 */
9907 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009908 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9909 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9910 mov x0, xSELF
9911 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009912 mov x2, xPC
9913 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009914
9915/* ------------------------------ */
9916 .balign 128
9917.L_ALT_op_ushr_int: /* 0x9a */
9918/* File: arm64/alt_stub.S */
9919/*
9920 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9921 * any interesting requests and then jump to the real instruction
9922 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9923 */
9924 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009925 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9926 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9927 mov x0, xSELF
9928 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009929 mov x2, xPC
9930 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009931
9932/* ------------------------------ */
9933 .balign 128
9934.L_ALT_op_add_long: /* 0x9b */
9935/* File: arm64/alt_stub.S */
9936/*
9937 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9938 * any interesting requests and then jump to the real instruction
9939 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9940 */
9941 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009942 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9943 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9944 mov x0, xSELF
9945 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009946 mov x2, xPC
9947 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009948
9949/* ------------------------------ */
9950 .balign 128
9951.L_ALT_op_sub_long: /* 0x9c */
9952/* File: arm64/alt_stub.S */
9953/*
9954 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9955 * any interesting requests and then jump to the real instruction
9956 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9957 */
9958 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009959 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9960 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9961 mov x0, xSELF
9962 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009963 mov x2, xPC
9964 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009965
9966/* ------------------------------ */
9967 .balign 128
9968.L_ALT_op_mul_long: /* 0x9d */
9969/* File: arm64/alt_stub.S */
9970/*
9971 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9972 * any interesting requests and then jump to the real instruction
9973 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9974 */
9975 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009976 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9977 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
9978 mov x0, xSELF
9979 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009980 mov x2, xPC
9981 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009982
9983/* ------------------------------ */
9984 .balign 128
9985.L_ALT_op_div_long: /* 0x9e */
9986/* File: arm64/alt_stub.S */
9987/*
9988 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9989 * any interesting requests and then jump to the real instruction
9990 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9991 */
9992 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009993 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9994 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
9995 mov x0, xSELF
9996 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009997 mov x2, xPC
9998 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009999
10000/* ------------------------------ */
10001 .balign 128
10002.L_ALT_op_rem_long: /* 0x9f */
10003/* File: arm64/alt_stub.S */
10004/*
10005 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10006 * any interesting requests and then jump to the real instruction
10007 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10008 */
10009 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010010 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10011 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
10012 mov x0, xSELF
10013 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010014 mov x2, xPC
10015 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010016
10017/* ------------------------------ */
10018 .balign 128
10019.L_ALT_op_and_long: /* 0xa0 */
10020/* File: arm64/alt_stub.S */
10021/*
10022 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10023 * any interesting requests and then jump to the real instruction
10024 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10025 */
10026 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010027 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10028 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
10029 mov x0, xSELF
10030 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010031 mov x2, xPC
10032 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010033
10034/* ------------------------------ */
10035 .balign 128
10036.L_ALT_op_or_long: /* 0xa1 */
10037/* File: arm64/alt_stub.S */
10038/*
10039 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10040 * any interesting requests and then jump to the real instruction
10041 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10042 */
10043 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010044 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10045 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
10046 mov x0, xSELF
10047 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010048 mov x2, xPC
10049 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010050
10051/* ------------------------------ */
10052 .balign 128
10053.L_ALT_op_xor_long: /* 0xa2 */
10054/* File: arm64/alt_stub.S */
10055/*
10056 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10057 * any interesting requests and then jump to the real instruction
10058 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10059 */
10060 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010061 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10062 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
10063 mov x0, xSELF
10064 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010065 mov x2, xPC
10066 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010067
10068/* ------------------------------ */
10069 .balign 128
10070.L_ALT_op_shl_long: /* 0xa3 */
10071/* File: arm64/alt_stub.S */
10072/*
10073 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10074 * any interesting requests and then jump to the real instruction
10075 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10076 */
10077 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010078 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10079 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
10080 mov x0, xSELF
10081 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010082 mov x2, xPC
10083 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010084
10085/* ------------------------------ */
10086 .balign 128
10087.L_ALT_op_shr_long: /* 0xa4 */
10088/* File: arm64/alt_stub.S */
10089/*
10090 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10091 * any interesting requests and then jump to the real instruction
10092 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10093 */
10094 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010095 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10096 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
10097 mov x0, xSELF
10098 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010099 mov x2, xPC
10100 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010101
10102/* ------------------------------ */
10103 .balign 128
10104.L_ALT_op_ushr_long: /* 0xa5 */
10105/* File: arm64/alt_stub.S */
10106/*
10107 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10108 * any interesting requests and then jump to the real instruction
10109 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10110 */
10111 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010112 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10113 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
10114 mov x0, xSELF
10115 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010116 mov x2, xPC
10117 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010118
10119/* ------------------------------ */
10120 .balign 128
10121.L_ALT_op_add_float: /* 0xa6 */
10122/* File: arm64/alt_stub.S */
10123/*
10124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10125 * any interesting requests and then jump to the real instruction
10126 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10127 */
10128 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010129 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10130 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
10131 mov x0, xSELF
10132 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010133 mov x2, xPC
10134 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010135
10136/* ------------------------------ */
10137 .balign 128
10138.L_ALT_op_sub_float: /* 0xa7 */
10139/* File: arm64/alt_stub.S */
10140/*
10141 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10142 * any interesting requests and then jump to the real instruction
10143 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10144 */
10145 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010146 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10147 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
10148 mov x0, xSELF
10149 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010150 mov x2, xPC
10151 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010152
10153/* ------------------------------ */
10154 .balign 128
10155.L_ALT_op_mul_float: /* 0xa8 */
10156/* File: arm64/alt_stub.S */
10157/*
10158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10159 * any interesting requests and then jump to the real instruction
10160 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10161 */
10162 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010163 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10164 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
10165 mov x0, xSELF
10166 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010167 mov x2, xPC
10168 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010169
10170/* ------------------------------ */
10171 .balign 128
10172.L_ALT_op_div_float: /* 0xa9 */
10173/* File: arm64/alt_stub.S */
10174/*
10175 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10176 * any interesting requests and then jump to the real instruction
10177 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10178 */
10179 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010180 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10181 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
10182 mov x0, xSELF
10183 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010184 mov x2, xPC
10185 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010186
10187/* ------------------------------ */
10188 .balign 128
10189.L_ALT_op_rem_float: /* 0xaa */
10190/* File: arm64/alt_stub.S */
10191/*
10192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10193 * any interesting requests and then jump to the real instruction
10194 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10195 */
10196 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010197 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10198 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
10199 mov x0, xSELF
10200 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010201 mov x2, xPC
10202 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010203
10204/* ------------------------------ */
10205 .balign 128
10206.L_ALT_op_add_double: /* 0xab */
10207/* File: arm64/alt_stub.S */
10208/*
10209 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10210 * any interesting requests and then jump to the real instruction
10211 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10212 */
10213 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010214 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10215 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
10216 mov x0, xSELF
10217 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010218 mov x2, xPC
10219 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010220
10221/* ------------------------------ */
10222 .balign 128
10223.L_ALT_op_sub_double: /* 0xac */
10224/* File: arm64/alt_stub.S */
10225/*
10226 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10227 * any interesting requests and then jump to the real instruction
10228 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10229 */
10230 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010231 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10232 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
10233 mov x0, xSELF
10234 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010235 mov x2, xPC
10236 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010237
10238/* ------------------------------ */
10239 .balign 128
10240.L_ALT_op_mul_double: /* 0xad */
10241/* File: arm64/alt_stub.S */
10242/*
10243 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10244 * any interesting requests and then jump to the real instruction
10245 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10246 */
10247 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010248 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10249 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
10250 mov x0, xSELF
10251 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010252 mov x2, xPC
10253 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010254
10255/* ------------------------------ */
10256 .balign 128
10257.L_ALT_op_div_double: /* 0xae */
10258/* File: arm64/alt_stub.S */
10259/*
10260 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10261 * any interesting requests and then jump to the real instruction
10262 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10263 */
10264 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010265 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10266 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
10267 mov x0, xSELF
10268 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010269 mov x2, xPC
10270 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010271
10272/* ------------------------------ */
10273 .balign 128
10274.L_ALT_op_rem_double: /* 0xaf */
10275/* File: arm64/alt_stub.S */
10276/*
10277 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10278 * any interesting requests and then jump to the real instruction
10279 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10280 */
10281 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010282 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10283 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
10284 mov x0, xSELF
10285 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010286 mov x2, xPC
10287 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010288
10289/* ------------------------------ */
10290 .balign 128
10291.L_ALT_op_add_int_2addr: /* 0xb0 */
10292/* File: arm64/alt_stub.S */
10293/*
10294 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10295 * any interesting requests and then jump to the real instruction
10296 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10297 */
10298 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010299 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10300 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
10301 mov x0, xSELF
10302 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010303 mov x2, xPC
10304 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010305
10306/* ------------------------------ */
10307 .balign 128
10308.L_ALT_op_sub_int_2addr: /* 0xb1 */
10309/* File: arm64/alt_stub.S */
10310/*
10311 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10312 * any interesting requests and then jump to the real instruction
10313 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10314 */
10315 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010316 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10317 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
10318 mov x0, xSELF
10319 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010320 mov x2, xPC
10321 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010322
10323/* ------------------------------ */
10324 .balign 128
10325.L_ALT_op_mul_int_2addr: /* 0xb2 */
10326/* File: arm64/alt_stub.S */
10327/*
10328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10329 * any interesting requests and then jump to the real instruction
10330 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10331 */
10332 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010333 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10334 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
10335 mov x0, xSELF
10336 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010337 mov x2, xPC
10338 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010339
10340/* ------------------------------ */
10341 .balign 128
10342.L_ALT_op_div_int_2addr: /* 0xb3 */
10343/* File: arm64/alt_stub.S */
10344/*
10345 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10346 * any interesting requests and then jump to the real instruction
10347 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10348 */
10349 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010350 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10351 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
10352 mov x0, xSELF
10353 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010354 mov x2, xPC
10355 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010356
10357/* ------------------------------ */
10358 .balign 128
10359.L_ALT_op_rem_int_2addr: /* 0xb4 */
10360/* File: arm64/alt_stub.S */
10361/*
10362 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10363 * any interesting requests and then jump to the real instruction
10364 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10365 */
10366 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010367 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10368 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
10369 mov x0, xSELF
10370 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010371 mov x2, xPC
10372 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010373
10374/* ------------------------------ */
10375 .balign 128
10376.L_ALT_op_and_int_2addr: /* 0xb5 */
10377/* File: arm64/alt_stub.S */
10378/*
10379 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10380 * any interesting requests and then jump to the real instruction
10381 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10382 */
10383 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010384 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10385 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
10386 mov x0, xSELF
10387 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010388 mov x2, xPC
10389 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010390
10391/* ------------------------------ */
10392 .balign 128
10393.L_ALT_op_or_int_2addr: /* 0xb6 */
10394/* File: arm64/alt_stub.S */
10395/*
10396 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10397 * any interesting requests and then jump to the real instruction
10398 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10399 */
10400 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010401 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10402 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10403 mov x0, xSELF
10404 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010405 mov x2, xPC
10406 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010407
10408/* ------------------------------ */
10409 .balign 128
10410.L_ALT_op_xor_int_2addr: /* 0xb7 */
10411/* File: arm64/alt_stub.S */
10412/*
10413 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10414 * any interesting requests and then jump to the real instruction
10415 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10416 */
10417 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010418 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10419 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10420 mov x0, xSELF
10421 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010422 mov x2, xPC
10423 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010424
10425/* ------------------------------ */
10426 .balign 128
10427.L_ALT_op_shl_int_2addr: /* 0xb8 */
10428/* File: arm64/alt_stub.S */
10429/*
10430 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10431 * any interesting requests and then jump to the real instruction
10432 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10433 */
10434 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010435 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10436 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10437 mov x0, xSELF
10438 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010439 mov x2, xPC
10440 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010441
10442/* ------------------------------ */
10443 .balign 128
10444.L_ALT_op_shr_int_2addr: /* 0xb9 */
10445/* File: arm64/alt_stub.S */
10446/*
10447 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10448 * any interesting requests and then jump to the real instruction
10449 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10450 */
10451 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010452 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10453 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10454 mov x0, xSELF
10455 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010456 mov x2, xPC
10457 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010458
10459/* ------------------------------ */
10460 .balign 128
10461.L_ALT_op_ushr_int_2addr: /* 0xba */
10462/* File: arm64/alt_stub.S */
10463/*
10464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10465 * any interesting requests and then jump to the real instruction
10466 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10467 */
10468 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010469 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10470 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10471 mov x0, xSELF
10472 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010473 mov x2, xPC
10474 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010475
10476/* ------------------------------ */
10477 .balign 128
10478.L_ALT_op_add_long_2addr: /* 0xbb */
10479/* File: arm64/alt_stub.S */
10480/*
10481 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10482 * any interesting requests and then jump to the real instruction
10483 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10484 */
10485 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010486 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10487 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10488 mov x0, xSELF
10489 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010490 mov x2, xPC
10491 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010492
10493/* ------------------------------ */
10494 .balign 128
10495.L_ALT_op_sub_long_2addr: /* 0xbc */
10496/* File: arm64/alt_stub.S */
10497/*
10498 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10499 * any interesting requests and then jump to the real instruction
10500 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10501 */
10502 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010503 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10504 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10505 mov x0, xSELF
10506 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010507 mov x2, xPC
10508 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010509
10510/* ------------------------------ */
10511 .balign 128
10512.L_ALT_op_mul_long_2addr: /* 0xbd */
10513/* File: arm64/alt_stub.S */
10514/*
10515 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10516 * any interesting requests and then jump to the real instruction
10517 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10518 */
10519 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010520 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10521 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10522 mov x0, xSELF
10523 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010524 mov x2, xPC
10525 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010526
10527/* ------------------------------ */
10528 .balign 128
10529.L_ALT_op_div_long_2addr: /* 0xbe */
10530/* File: arm64/alt_stub.S */
10531/*
10532 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10533 * any interesting requests and then jump to the real instruction
10534 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10535 */
10536 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010537 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10538 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10539 mov x0, xSELF
10540 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010541 mov x2, xPC
10542 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010543
10544/* ------------------------------ */
10545 .balign 128
10546.L_ALT_op_rem_long_2addr: /* 0xbf */
10547/* File: arm64/alt_stub.S */
10548/*
10549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10550 * any interesting requests and then jump to the real instruction
10551 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10552 */
10553 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010554 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10555 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10556 mov x0, xSELF
10557 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010558 mov x2, xPC
10559 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010560
10561/* ------------------------------ */
10562 .balign 128
10563.L_ALT_op_and_long_2addr: /* 0xc0 */
10564/* File: arm64/alt_stub.S */
10565/*
10566 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10567 * any interesting requests and then jump to the real instruction
10568 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10569 */
10570 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010571 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10572 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10573 mov x0, xSELF
10574 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010575 mov x2, xPC
10576 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010577
10578/* ------------------------------ */
10579 .balign 128
10580.L_ALT_op_or_long_2addr: /* 0xc1 */
10581/* File: arm64/alt_stub.S */
10582/*
10583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10584 * any interesting requests and then jump to the real instruction
10585 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10586 */
10587 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010588 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10589 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10590 mov x0, xSELF
10591 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010592 mov x2, xPC
10593 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010594
10595/* ------------------------------ */
10596 .balign 128
10597.L_ALT_op_xor_long_2addr: /* 0xc2 */
10598/* File: arm64/alt_stub.S */
10599/*
10600 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10601 * any interesting requests and then jump to the real instruction
10602 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10603 */
10604 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010605 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10606 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10607 mov x0, xSELF
10608 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010609 mov x2, xPC
10610 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010611
10612/* ------------------------------ */
10613 .balign 128
10614.L_ALT_op_shl_long_2addr: /* 0xc3 */
10615/* File: arm64/alt_stub.S */
10616/*
10617 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10618 * any interesting requests and then jump to the real instruction
10619 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10620 */
10621 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010622 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10623 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10624 mov x0, xSELF
10625 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010626 mov x2, xPC
10627 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010628
10629/* ------------------------------ */
10630 .balign 128
10631.L_ALT_op_shr_long_2addr: /* 0xc4 */
10632/* File: arm64/alt_stub.S */
10633/*
10634 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10635 * any interesting requests and then jump to the real instruction
10636 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10637 */
10638 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010639 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10640 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10641 mov x0, xSELF
10642 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010643 mov x2, xPC
10644 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010645
10646/* ------------------------------ */
10647 .balign 128
10648.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10649/* File: arm64/alt_stub.S */
10650/*
10651 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10652 * any interesting requests and then jump to the real instruction
10653 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10654 */
10655 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010656 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10657 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10658 mov x0, xSELF
10659 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010660 mov x2, xPC
10661 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010662
10663/* ------------------------------ */
10664 .balign 128
10665.L_ALT_op_add_float_2addr: /* 0xc6 */
10666/* File: arm64/alt_stub.S */
10667/*
10668 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10669 * any interesting requests and then jump to the real instruction
10670 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10671 */
10672 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010673 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10674 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10675 mov x0, xSELF
10676 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010677 mov x2, xPC
10678 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010679
10680/* ------------------------------ */
10681 .balign 128
10682.L_ALT_op_sub_float_2addr: /* 0xc7 */
10683/* File: arm64/alt_stub.S */
10684/*
10685 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10686 * any interesting requests and then jump to the real instruction
10687 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10688 */
10689 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010690 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10691 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10692 mov x0, xSELF
10693 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010694 mov x2, xPC
10695 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010696
10697/* ------------------------------ */
10698 .balign 128
10699.L_ALT_op_mul_float_2addr: /* 0xc8 */
10700/* File: arm64/alt_stub.S */
10701/*
10702 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10703 * any interesting requests and then jump to the real instruction
10704 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10705 */
10706 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010707 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10708 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10709 mov x0, xSELF
10710 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010711 mov x2, xPC
10712 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010713
10714/* ------------------------------ */
10715 .balign 128
10716.L_ALT_op_div_float_2addr: /* 0xc9 */
10717/* File: arm64/alt_stub.S */
10718/*
10719 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10720 * any interesting requests and then jump to the real instruction
10721 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10722 */
10723 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010724 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10725 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10726 mov x0, xSELF
10727 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010728 mov x2, xPC
10729 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010730
10731/* ------------------------------ */
10732 .balign 128
10733.L_ALT_op_rem_float_2addr: /* 0xca */
10734/* File: arm64/alt_stub.S */
10735/*
10736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10737 * any interesting requests and then jump to the real instruction
10738 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10739 */
10740 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010741 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10742 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10743 mov x0, xSELF
10744 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010745 mov x2, xPC
10746 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010747
10748/* ------------------------------ */
10749 .balign 128
10750.L_ALT_op_add_double_2addr: /* 0xcb */
10751/* File: arm64/alt_stub.S */
10752/*
10753 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10754 * any interesting requests and then jump to the real instruction
10755 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10756 */
10757 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010758 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10759 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10760 mov x0, xSELF
10761 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010762 mov x2, xPC
10763 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010764
10765/* ------------------------------ */
10766 .balign 128
10767.L_ALT_op_sub_double_2addr: /* 0xcc */
10768/* File: arm64/alt_stub.S */
10769/*
10770 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10771 * any interesting requests and then jump to the real instruction
10772 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10773 */
10774 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010775 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10776 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10777 mov x0, xSELF
10778 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010779 mov x2, xPC
10780 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010781
10782/* ------------------------------ */
10783 .balign 128
10784.L_ALT_op_mul_double_2addr: /* 0xcd */
10785/* File: arm64/alt_stub.S */
10786/*
10787 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10788 * any interesting requests and then jump to the real instruction
10789 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10790 */
10791 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010792 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10793 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10794 mov x0, xSELF
10795 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010796 mov x2, xPC
10797 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010798
10799/* ------------------------------ */
10800 .balign 128
10801.L_ALT_op_div_double_2addr: /* 0xce */
10802/* File: arm64/alt_stub.S */
10803/*
10804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10805 * any interesting requests and then jump to the real instruction
10806 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10807 */
10808 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010809 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10810 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10811 mov x0, xSELF
10812 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010813 mov x2, xPC
10814 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010815
10816/* ------------------------------ */
10817 .balign 128
10818.L_ALT_op_rem_double_2addr: /* 0xcf */
10819/* File: arm64/alt_stub.S */
10820/*
10821 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10822 * any interesting requests and then jump to the real instruction
10823 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10824 */
10825 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010826 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10827 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10828 mov x0, xSELF
10829 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010830 mov x2, xPC
10831 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010832
10833/* ------------------------------ */
10834 .balign 128
10835.L_ALT_op_add_int_lit16: /* 0xd0 */
10836/* File: arm64/alt_stub.S */
10837/*
10838 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10839 * any interesting requests and then jump to the real instruction
10840 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10841 */
10842 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010843 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10844 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10845 mov x0, xSELF
10846 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010847 mov x2, xPC
10848 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010849
10850/* ------------------------------ */
10851 .balign 128
10852.L_ALT_op_rsub_int: /* 0xd1 */
10853/* File: arm64/alt_stub.S */
10854/*
10855 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10856 * any interesting requests and then jump to the real instruction
10857 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10858 */
10859 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010860 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10861 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10862 mov x0, xSELF
10863 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010864 mov x2, xPC
10865 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010866
10867/* ------------------------------ */
10868 .balign 128
10869.L_ALT_op_mul_int_lit16: /* 0xd2 */
10870/* File: arm64/alt_stub.S */
10871/*
10872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10873 * any interesting requests and then jump to the real instruction
10874 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10875 */
10876 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010877 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10878 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10879 mov x0, xSELF
10880 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010881 mov x2, xPC
10882 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010883
10884/* ------------------------------ */
10885 .balign 128
10886.L_ALT_op_div_int_lit16: /* 0xd3 */
10887/* File: arm64/alt_stub.S */
10888/*
10889 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10890 * any interesting requests and then jump to the real instruction
10891 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10892 */
10893 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010894 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10895 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10896 mov x0, xSELF
10897 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010898 mov x2, xPC
10899 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010900
10901/* ------------------------------ */
10902 .balign 128
10903.L_ALT_op_rem_int_lit16: /* 0xd4 */
10904/* File: arm64/alt_stub.S */
10905/*
10906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10907 * any interesting requests and then jump to the real instruction
10908 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10909 */
10910 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010911 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10912 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10913 mov x0, xSELF
10914 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010915 mov x2, xPC
10916 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010917
10918/* ------------------------------ */
10919 .balign 128
10920.L_ALT_op_and_int_lit16: /* 0xd5 */
10921/* File: arm64/alt_stub.S */
10922/*
10923 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10924 * any interesting requests and then jump to the real instruction
10925 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10926 */
10927 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010928 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10929 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10930 mov x0, xSELF
10931 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010932 mov x2, xPC
10933 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010934
10935/* ------------------------------ */
10936 .balign 128
10937.L_ALT_op_or_int_lit16: /* 0xd6 */
10938/* File: arm64/alt_stub.S */
10939/*
10940 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10941 * any interesting requests and then jump to the real instruction
10942 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10943 */
10944 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010945 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10946 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10947 mov x0, xSELF
10948 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010949 mov x2, xPC
10950 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010951
10952/* ------------------------------ */
10953 .balign 128
10954.L_ALT_op_xor_int_lit16: /* 0xd7 */
10955/* File: arm64/alt_stub.S */
10956/*
10957 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10958 * any interesting requests and then jump to the real instruction
10959 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10960 */
10961 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010962 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10963 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10964 mov x0, xSELF
10965 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010966 mov x2, xPC
10967 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010968
10969/* ------------------------------ */
10970 .balign 128
10971.L_ALT_op_add_int_lit8: /* 0xd8 */
10972/* File: arm64/alt_stub.S */
10973/*
10974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10975 * any interesting requests and then jump to the real instruction
10976 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10977 */
10978 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010979 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10980 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
10981 mov x0, xSELF
10982 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010983 mov x2, xPC
10984 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010985
10986/* ------------------------------ */
10987 .balign 128
10988.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10989/* File: arm64/alt_stub.S */
10990/*
10991 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10992 * any interesting requests and then jump to the real instruction
10993 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10994 */
10995 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010996 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10997 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
10998 mov x0, xSELF
10999 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011000 mov x2, xPC
11001 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011002
11003/* ------------------------------ */
11004 .balign 128
11005.L_ALT_op_mul_int_lit8: /* 0xda */
11006/* File: arm64/alt_stub.S */
11007/*
11008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11009 * any interesting requests and then jump to the real instruction
11010 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11011 */
11012 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011013 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11014 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
11015 mov x0, xSELF
11016 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011017 mov x2, xPC
11018 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011019
11020/* ------------------------------ */
11021 .balign 128
11022.L_ALT_op_div_int_lit8: /* 0xdb */
11023/* File: arm64/alt_stub.S */
11024/*
11025 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11026 * any interesting requests and then jump to the real instruction
11027 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11028 */
11029 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011030 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11031 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
11032 mov x0, xSELF
11033 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011034 mov x2, xPC
11035 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011036
11037/* ------------------------------ */
11038 .balign 128
11039.L_ALT_op_rem_int_lit8: /* 0xdc */
11040/* File: arm64/alt_stub.S */
11041/*
11042 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11043 * any interesting requests and then jump to the real instruction
11044 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11045 */
11046 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011047 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11048 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
11049 mov x0, xSELF
11050 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011051 mov x2, xPC
11052 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011053
11054/* ------------------------------ */
11055 .balign 128
11056.L_ALT_op_and_int_lit8: /* 0xdd */
11057/* File: arm64/alt_stub.S */
11058/*
11059 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11060 * any interesting requests and then jump to the real instruction
11061 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11062 */
11063 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011064 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11065 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
11066 mov x0, xSELF
11067 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011068 mov x2, xPC
11069 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011070
11071/* ------------------------------ */
11072 .balign 128
11073.L_ALT_op_or_int_lit8: /* 0xde */
11074/* File: arm64/alt_stub.S */
11075/*
11076 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11077 * any interesting requests and then jump to the real instruction
11078 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11079 */
11080 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011081 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11082 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
11083 mov x0, xSELF
11084 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011085 mov x2, xPC
11086 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011087
11088/* ------------------------------ */
11089 .balign 128
11090.L_ALT_op_xor_int_lit8: /* 0xdf */
11091/* File: arm64/alt_stub.S */
11092/*
11093 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11094 * any interesting requests and then jump to the real instruction
11095 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11096 */
11097 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011098 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11099 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
11100 mov x0, xSELF
11101 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011102 mov x2, xPC
11103 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011104
11105/* ------------------------------ */
11106 .balign 128
11107.L_ALT_op_shl_int_lit8: /* 0xe0 */
11108/* File: arm64/alt_stub.S */
11109/*
11110 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11111 * any interesting requests and then jump to the real instruction
11112 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11113 */
11114 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011115 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11116 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
11117 mov x0, xSELF
11118 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011119 mov x2, xPC
11120 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011121
11122/* ------------------------------ */
11123 .balign 128
11124.L_ALT_op_shr_int_lit8: /* 0xe1 */
11125/* File: arm64/alt_stub.S */
11126/*
11127 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11128 * any interesting requests and then jump to the real instruction
11129 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11130 */
11131 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011132 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11133 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
11134 mov x0, xSELF
11135 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011136 mov x2, xPC
11137 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011138
11139/* ------------------------------ */
11140 .balign 128
11141.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11142/* File: arm64/alt_stub.S */
11143/*
11144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11145 * any interesting requests and then jump to the real instruction
11146 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11147 */
11148 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011149 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11150 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
11151 mov x0, xSELF
11152 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011153 mov x2, xPC
11154 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011155
11156/* ------------------------------ */
11157 .balign 128
11158.L_ALT_op_iget_quick: /* 0xe3 */
11159/* File: arm64/alt_stub.S */
11160/*
11161 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11162 * any interesting requests and then jump to the real instruction
11163 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11164 */
11165 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011166 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11167 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
11168 mov x0, xSELF
11169 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011170 mov x2, xPC
11171 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011172
11173/* ------------------------------ */
11174 .balign 128
11175.L_ALT_op_iget_wide_quick: /* 0xe4 */
11176/* File: arm64/alt_stub.S */
11177/*
11178 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11179 * any interesting requests and then jump to the real instruction
11180 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11181 */
11182 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011183 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11184 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
11185 mov x0, xSELF
11186 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011187 mov x2, xPC
11188 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011189
11190/* ------------------------------ */
11191 .balign 128
11192.L_ALT_op_iget_object_quick: /* 0xe5 */
11193/* File: arm64/alt_stub.S */
11194/*
11195 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11196 * any interesting requests and then jump to the real instruction
11197 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11198 */
11199 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011200 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11201 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
11202 mov x0, xSELF
11203 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011204 mov x2, xPC
11205 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011206
11207/* ------------------------------ */
11208 .balign 128
11209.L_ALT_op_iput_quick: /* 0xe6 */
11210/* File: arm64/alt_stub.S */
11211/*
11212 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11213 * any interesting requests and then jump to the real instruction
11214 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11215 */
11216 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011217 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11218 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
11219 mov x0, xSELF
11220 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011221 mov x2, xPC
11222 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011223
11224/* ------------------------------ */
11225 .balign 128
11226.L_ALT_op_iput_wide_quick: /* 0xe7 */
11227/* File: arm64/alt_stub.S */
11228/*
11229 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11230 * any interesting requests and then jump to the real instruction
11231 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11232 */
11233 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011234 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11235 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
11236 mov x0, xSELF
11237 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011238 mov x2, xPC
11239 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011240
11241/* ------------------------------ */
11242 .balign 128
11243.L_ALT_op_iput_object_quick: /* 0xe8 */
11244/* File: arm64/alt_stub.S */
11245/*
11246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11247 * any interesting requests and then jump to the real instruction
11248 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11249 */
11250 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011251 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11252 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
11253 mov x0, xSELF
11254 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011255 mov x2, xPC
11256 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011257
11258/* ------------------------------ */
11259 .balign 128
11260.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11261/* File: arm64/alt_stub.S */
11262/*
11263 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11264 * any interesting requests and then jump to the real instruction
11265 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11266 */
11267 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011268 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11269 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
11270 mov x0, xSELF
11271 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011272 mov x2, xPC
11273 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011274
11275/* ------------------------------ */
11276 .balign 128
11277.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11278/* File: arm64/alt_stub.S */
11279/*
11280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11281 * any interesting requests and then jump to the real instruction
11282 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11283 */
11284 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011285 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11286 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
11287 mov x0, xSELF
11288 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011289 mov x2, xPC
11290 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011291
11292/* ------------------------------ */
11293 .balign 128
11294.L_ALT_op_iput_boolean_quick: /* 0xeb */
11295/* File: arm64/alt_stub.S */
11296/*
11297 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11298 * any interesting requests and then jump to the real instruction
11299 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11300 */
11301 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011302 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11303 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
11304 mov x0, xSELF
11305 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011306 mov x2, xPC
11307 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011308
11309/* ------------------------------ */
11310 .balign 128
11311.L_ALT_op_iput_byte_quick: /* 0xec */
11312/* File: arm64/alt_stub.S */
11313/*
11314 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11315 * any interesting requests and then jump to the real instruction
11316 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11317 */
11318 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011319 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11320 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
11321 mov x0, xSELF
11322 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011323 mov x2, xPC
11324 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011325
11326/* ------------------------------ */
11327 .balign 128
11328.L_ALT_op_iput_char_quick: /* 0xed */
11329/* File: arm64/alt_stub.S */
11330/*
11331 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11332 * any interesting requests and then jump to the real instruction
11333 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11334 */
11335 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011336 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11337 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
11338 mov x0, xSELF
11339 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011340 mov x2, xPC
11341 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011342
11343/* ------------------------------ */
11344 .balign 128
11345.L_ALT_op_iput_short_quick: /* 0xee */
11346/* File: arm64/alt_stub.S */
11347/*
11348 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11349 * any interesting requests and then jump to the real instruction
11350 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11351 */
11352 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011353 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11354 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
11355 mov x0, xSELF
11356 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011357 mov x2, xPC
11358 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011359
11360/* ------------------------------ */
11361 .balign 128
11362.L_ALT_op_iget_boolean_quick: /* 0xef */
11363/* File: arm64/alt_stub.S */
11364/*
11365 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11366 * any interesting requests and then jump to the real instruction
11367 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11368 */
11369 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011370 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11371 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
11372 mov x0, xSELF
11373 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011374 mov x2, xPC
11375 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011376
11377/* ------------------------------ */
11378 .balign 128
11379.L_ALT_op_iget_byte_quick: /* 0xf0 */
11380/* File: arm64/alt_stub.S */
11381/*
11382 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11383 * any interesting requests and then jump to the real instruction
11384 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11385 */
11386 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011387 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11388 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
11389 mov x0, xSELF
11390 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011391 mov x2, xPC
11392 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011393
11394/* ------------------------------ */
11395 .balign 128
11396.L_ALT_op_iget_char_quick: /* 0xf1 */
11397/* File: arm64/alt_stub.S */
11398/*
11399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11400 * any interesting requests and then jump to the real instruction
11401 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11402 */
11403 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011404 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11405 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11406 mov x0, xSELF
11407 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011408 mov x2, xPC
11409 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011410
11411/* ------------------------------ */
11412 .balign 128
11413.L_ALT_op_iget_short_quick: /* 0xf2 */
11414/* File: arm64/alt_stub.S */
11415/*
11416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11417 * any interesting requests and then jump to the real instruction
11418 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11419 */
11420 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011421 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11422 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11423 mov x0, xSELF
11424 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011425 mov x2, xPC
11426 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011427
11428/* ------------------------------ */
11429 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011430.L_ALT_op_unused_f3: /* 0xf3 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011431/* File: arm64/alt_stub.S */
11432/*
11433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11434 * any interesting requests and then jump to the real instruction
11435 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11436 */
11437 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011438 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11439 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11440 mov x0, xSELF
11441 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011442 mov x2, xPC
11443 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011444
11445/* ------------------------------ */
11446 .balign 128
11447.L_ALT_op_unused_f4: /* 0xf4 */
11448/* File: arm64/alt_stub.S */
11449/*
11450 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11451 * any interesting requests and then jump to the real instruction
11452 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11453 */
11454 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011455 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11456 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11457 mov x0, xSELF
11458 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011459 mov x2, xPC
11460 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011461
11462/* ------------------------------ */
11463 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011464.L_ALT_op_unused_f5: /* 0xf5 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011465/* File: arm64/alt_stub.S */
11466/*
11467 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11468 * any interesting requests and then jump to the real instruction
11469 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11470 */
11471 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011472 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11473 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11474 mov x0, xSELF
11475 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011476 mov x2, xPC
11477 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011478
11479/* ------------------------------ */
11480 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011481.L_ALT_op_unused_f6: /* 0xf6 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011482/* File: arm64/alt_stub.S */
11483/*
11484 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11485 * any interesting requests and then jump to the real instruction
11486 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11487 */
11488 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011489 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11490 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11491 mov x0, xSELF
11492 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011493 mov x2, xPC
11494 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011495
11496/* ------------------------------ */
11497 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011498.L_ALT_op_unused_f7: /* 0xf7 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011499/* File: arm64/alt_stub.S */
11500/*
11501 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11502 * any interesting requests and then jump to the real instruction
11503 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11504 */
11505 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011506 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11507 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11508 mov x0, xSELF
11509 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011510 mov x2, xPC
11511 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011512
11513/* ------------------------------ */
11514 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011515.L_ALT_op_unused_f8: /* 0xf8 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011516/* File: arm64/alt_stub.S */
11517/*
11518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11519 * any interesting requests and then jump to the real instruction
11520 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11521 */
11522 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011523 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11524 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11525 mov x0, xSELF
11526 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011527 mov x2, xPC
11528 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011529
11530/* ------------------------------ */
11531 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011532.L_ALT_op_unused_f9: /* 0xf9 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011533/* File: arm64/alt_stub.S */
11534/*
11535 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11536 * any interesting requests and then jump to the real instruction
11537 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11538 */
11539 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011540 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11541 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11542 mov x0, xSELF
11543 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011544 mov x2, xPC
11545 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011546
11547/* ------------------------------ */
11548 .balign 128
buzbee8a287142016-10-07 12:56:32 -070011549.L_ALT_op_invoke_polymorphic: /* 0xfa */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011550/* File: arm64/alt_stub.S */
11551/*
11552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11553 * any interesting requests and then jump to the real instruction
11554 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11555 */
11556 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011557 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11558 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11559 mov x0, xSELF
11560 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011561 mov x2, xPC
11562 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011563
11564/* ------------------------------ */
11565 .balign 128
buzbee8a287142016-10-07 12:56:32 -070011566.L_ALT_op_invoke_polymorphic_range: /* 0xfb */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011567/* File: arm64/alt_stub.S */
11568/*
11569 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11570 * any interesting requests and then jump to the real instruction
11571 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11572 */
11573 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011574 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11575 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11576 mov x0, xSELF
11577 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011578 mov x2, xPC
11579 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011580
11581/* ------------------------------ */
11582 .balign 128
11583.L_ALT_op_unused_fc: /* 0xfc */
11584/* File: arm64/alt_stub.S */
11585/*
11586 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11587 * any interesting requests and then jump to the real instruction
11588 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11589 */
11590 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011591 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11592 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11593 mov x0, xSELF
11594 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011595 mov x2, xPC
11596 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011597
11598/* ------------------------------ */
11599 .balign 128
11600.L_ALT_op_unused_fd: /* 0xfd */
11601/* File: arm64/alt_stub.S */
11602/*
11603 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11604 * any interesting requests and then jump to the real instruction
11605 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11606 */
11607 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011608 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11609 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11610 mov x0, xSELF
11611 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011612 mov x2, xPC
11613 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011614
11615/* ------------------------------ */
11616 .balign 128
11617.L_ALT_op_unused_fe: /* 0xfe */
11618/* File: arm64/alt_stub.S */
11619/*
11620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11621 * any interesting requests and then jump to the real instruction
11622 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11623 */
11624 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011625 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11626 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11627 mov x0, xSELF
11628 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011629 mov x2, xPC
11630 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011631
11632/* ------------------------------ */
11633 .balign 128
11634.L_ALT_op_unused_ff: /* 0xff */
11635/* File: arm64/alt_stub.S */
11636/*
11637 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11638 * any interesting requests and then jump to the real instruction
11639 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11640 */
11641 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011642 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11643 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11644 mov x0, xSELF
11645 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011646 mov x2, xPC
11647 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011648
11649 .balign 128
11650 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11651 .global artMterpAsmAltInstructionEnd
11652artMterpAsmAltInstructionEnd: