blob: 79d3c9a6f730325d2c352c6f809e82b8c015bd1b [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/*
282 * Convert a virtual register index into an address.
283 */
284.macro VREG_INDEX_TO_ADDR reg, vreg
buzbeeace690f2016-03-11 09:51:11 -0800285 add \reg, xFP, \vreg, lsl #2 /* WARNING: handle shadow frame vreg zero if store */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000286.endm
287
288/*
289 * Refresh handler table.
290 */
291.macro REFRESH_IBASE
292 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
293.endm
294
295/* File: arm64/entry.S */
296/*
297 * Copyright (C) 2016 The Android Open Source Project
298 *
299 * Licensed under the Apache License, Version 2.0 (the "License");
300 * you may not use this file except in compliance with the License.
301 * You may obtain a copy of the License at
302 *
303 * http://www.apache.org/licenses/LICENSE-2.0
304 *
305 * Unless required by applicable law or agreed to in writing, software
306 * distributed under the License is distributed on an "AS IS" BASIS,
307 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
308 * See the License for the specific language governing permissions and
309 * limitations under the License.
310 */
311
312 .text
313
314/*
315 * Interpreter entry point.
316 * On entry:
317 * x0 Thread* self/
318 * x1 code_item
319 * x2 ShadowFrame
320 * x3 JValue* result_register
321 *
322 */
323 .global ExecuteMterpImpl
324 .type ExecuteMterpImpl, %function
325 .balign 16
326
327ExecuteMterpImpl:
328 .cfi_startproc
Bill Buzbee1d011d92016-04-04 16:59:29 +0000329 stp xPROFILE, x27, [sp, #-80]!
330 stp xIBASE, xREFS, [sp, #16]
331 stp xSELF, xINST, [sp, #32]
332 stp xPC, xFP, [sp, #48]
333 stp fp, lr, [sp, #64]
334 add fp, sp, #64
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000335
336 /* Remember the return register */
337 str x3, [x2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
338
339 /* Remember the code_item */
340 str x1, [x2, #SHADOWFRAME_CODE_ITEM_OFFSET]
341
342 /* set up "named" registers */
343 mov xSELF, x0
344 ldr w0, [x2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
buzbeeace690f2016-03-11 09:51:11 -0800345 add xFP, x2, #SHADOWFRAME_VREGS_OFFSET // point to vregs.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000346 add xREFS, xFP, w0, lsl #2 // point to reference array in shadow frame
347 ldr w0, [x2, #SHADOWFRAME_DEX_PC_OFFSET] // Get starting dex_pc.
348 add xPC, x1, #CODEITEM_INSNS_OFFSET // Point to base of insns[]
349 add xPC, xPC, w0, lsl #1 // Create direct pointer to 1st dex opcode
350 EXPORT_PC
351
352 /* Starting ibase */
353 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
354
Bill Buzbee1d011d92016-04-04 16:59:29 +0000355 /* Set up for backwards branches & osr profiling */
356 ldr x0, [xFP, #OFF_FP_METHOD]
357 add x1, xFP, #OFF_FP_SHADOWFRAME
358 bl MterpSetUpHotnessCountdown
359 mov wPROFILE, w0 // Starting hotness countdown to xPROFILE
360
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000361 /* start executing the instruction at rPC */
362 FETCH_INST // load wINST from rPC
363 GET_INST_OPCODE ip // extract opcode from wINST
364 GOTO_OPCODE ip // jump to next instruction
365 /* NOTE: no fallthrough */
366
367
368 .global artMterpAsmInstructionStart
369 .type artMterpAsmInstructionStart, %function
370artMterpAsmInstructionStart = .L_op_nop
371 .text
372
373/* ------------------------------ */
374 .balign 128
375.L_op_nop: /* 0x00 */
376/* File: arm64/op_nop.S */
377 FETCH_ADVANCE_INST 1 // advance to next instr, load rINST
378 GET_INST_OPCODE ip // ip<- opcode from rINST
379 GOTO_OPCODE ip // execute it
380
381/* ------------------------------ */
382 .balign 128
383.L_op_move: /* 0x01 */
384/* File: arm64/op_move.S */
385 /* for move, move-object, long-to-int */
386 /* op vA, vB */
387 lsr w1, wINST, #12 // x1<- B from 15:12
388 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
389 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
390 GET_VREG w2, w1 // x2<- fp[B]
391 GET_INST_OPCODE ip // ip<- opcode from wINST
392 .if 0
393 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
394 .else
395 SET_VREG w2, w0 // fp[A]<- x2
396 .endif
397 GOTO_OPCODE ip // execute next instruction
398
399/* ------------------------------ */
400 .balign 128
401.L_op_move_from16: /* 0x02 */
402/* File: arm64/op_move_from16.S */
403 /* for: move/from16, move-object/from16 */
404 /* op vAA, vBBBB */
405 FETCH w1, 1 // r1<- BBBB
406 lsr w0, wINST, #8 // r0<- AA
407 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
408 GET_VREG w2, w1 // r2<- fp[BBBB]
409 GET_INST_OPCODE ip // extract opcode from wINST
410 .if 0
411 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
412 .else
413 SET_VREG w2, w0 // fp[AA]<- r2
414 .endif
415 GOTO_OPCODE ip // jump to next instruction
416
417/* ------------------------------ */
418 .balign 128
419.L_op_move_16: /* 0x03 */
420/* File: arm64/op_move_16.S */
421 /* for: move/16, move-object/16 */
422 /* op vAAAA, vBBBB */
423 FETCH w1, 2 // w1<- BBBB
424 FETCH w0, 1 // w0<- AAAA
425 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
426 GET_VREG w2, w1 // w2<- fp[BBBB]
427 GET_INST_OPCODE ip // extract opcode from xINST
428 .if 0
429 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
430 .else
431 SET_VREG w2, w0 // fp[AAAA]<- w2
432 .endif
433 GOTO_OPCODE ip // jump to next instruction
434
435/* ------------------------------ */
436 .balign 128
437.L_op_move_wide: /* 0x04 */
438/* File: arm64/op_move_wide.S */
439 /* move-wide vA, vB */
440 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
441 lsr w3, wINST, #12 // w3<- B
442 ubfx w2, wINST, #8, #4 // w2<- A
443 GET_VREG_WIDE x3, w3
444 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
445 GET_INST_OPCODE ip // extract opcode from wINST
446 SET_VREG_WIDE x3, w2
447 GOTO_OPCODE ip // jump to next instruction
448
449/* ------------------------------ */
450 .balign 128
451.L_op_move_wide_from16: /* 0x05 */
452/* File: arm64/op_move_wide_from16.S */
453 /* move-wide/from16 vAA, vBBBB */
454 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
455 FETCH w3, 1 // w3<- BBBB
456 lsr w2, wINST, #8 // w2<- AA
457 GET_VREG_WIDE x3, w3
458 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
459 GET_INST_OPCODE ip // extract opcode from wINST
460 SET_VREG_WIDE x3, w2
461 GOTO_OPCODE ip // jump to next instruction
462
463/* ------------------------------ */
464 .balign 128
465.L_op_move_wide_16: /* 0x06 */
466/* File: arm64/op_move_wide_16.S */
467 /* move-wide/16 vAAAA, vBBBB */
468 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
469 FETCH w3, 2 // w3<- BBBB
470 FETCH w2, 1 // w2<- AAAA
471 GET_VREG_WIDE x3, w3
472 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
473 SET_VREG_WIDE x3, w2
474 GET_INST_OPCODE ip // extract opcode from rINST
475 GOTO_OPCODE ip // jump to next instruction
476
477/* ------------------------------ */
478 .balign 128
479.L_op_move_object: /* 0x07 */
480/* File: arm64/op_move_object.S */
481/* File: arm64/op_move.S */
482 /* for move, move-object, long-to-int */
483 /* op vA, vB */
484 lsr w1, wINST, #12 // x1<- B from 15:12
485 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
486 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
487 GET_VREG w2, w1 // x2<- fp[B]
488 GET_INST_OPCODE ip // ip<- opcode from wINST
489 .if 1
490 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
491 .else
492 SET_VREG w2, w0 // fp[A]<- x2
493 .endif
494 GOTO_OPCODE ip // execute next instruction
495
496
497/* ------------------------------ */
498 .balign 128
499.L_op_move_object_from16: /* 0x08 */
500/* File: arm64/op_move_object_from16.S */
501/* File: arm64/op_move_from16.S */
502 /* for: move/from16, move-object/from16 */
503 /* op vAA, vBBBB */
504 FETCH w1, 1 // r1<- BBBB
505 lsr w0, wINST, #8 // r0<- AA
506 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
507 GET_VREG w2, w1 // r2<- fp[BBBB]
508 GET_INST_OPCODE ip // extract opcode from wINST
509 .if 1
510 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
511 .else
512 SET_VREG w2, w0 // fp[AA]<- r2
513 .endif
514 GOTO_OPCODE ip // jump to next instruction
515
516
517/* ------------------------------ */
518 .balign 128
519.L_op_move_object_16: /* 0x09 */
520/* File: arm64/op_move_object_16.S */
521/* File: arm64/op_move_16.S */
522 /* for: move/16, move-object/16 */
523 /* op vAAAA, vBBBB */
524 FETCH w1, 2 // w1<- BBBB
525 FETCH w0, 1 // w0<- AAAA
526 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
527 GET_VREG w2, w1 // w2<- fp[BBBB]
528 GET_INST_OPCODE ip // extract opcode from xINST
529 .if 1
530 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
531 .else
532 SET_VREG w2, w0 // fp[AAAA]<- w2
533 .endif
534 GOTO_OPCODE ip // jump to next instruction
535
536
537/* ------------------------------ */
538 .balign 128
539.L_op_move_result: /* 0x0a */
540/* File: arm64/op_move_result.S */
541 /* for: move-result, move-result-object */
542 /* op vAA */
543 lsr w2, wINST, #8 // r2<- AA
544 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
545 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
546 ldr w0, [x0] // r0 <- result.i.
547 GET_INST_OPCODE ip // extract opcode from wINST
548 .if 0
549 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
550 .else
551 SET_VREG w0, w2 // fp[AA]<- r0
552 .endif
553 GOTO_OPCODE ip // jump to next instruction
554
555/* ------------------------------ */
556 .balign 128
557.L_op_move_result_wide: /* 0x0b */
558/* File: arm64/op_move_result_wide.S */
559 /* for: move-result-wide */
560 /* op vAA */
561 lsr w2, wINST, #8 // r2<- AA
562 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
563 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
564 ldr x0, [x0] // r0 <- result.i.
565 GET_INST_OPCODE ip // extract opcode from wINST
566 SET_VREG_WIDE x0, x2 // fp[AA]<- r0
567 GOTO_OPCODE ip // jump to next instruction
568
569/* ------------------------------ */
570 .balign 128
571.L_op_move_result_object: /* 0x0c */
572/* File: arm64/op_move_result_object.S */
573/* File: arm64/op_move_result.S */
574 /* for: move-result, move-result-object */
575 /* op vAA */
576 lsr w2, wINST, #8 // r2<- AA
577 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
578 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
579 ldr w0, [x0] // r0 <- result.i.
580 GET_INST_OPCODE ip // extract opcode from wINST
581 .if 1
582 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
583 .else
584 SET_VREG w0, w2 // fp[AA]<- r0
585 .endif
586 GOTO_OPCODE ip // jump to next instruction
587
588
589/* ------------------------------ */
590 .balign 128
591.L_op_move_exception: /* 0x0d */
592/* File: arm64/op_move_exception.S */
593 /* move-exception vAA */
594 lsr w2, wINST, #8 // w2<- AA
595 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
596 mov x1, #0 // w1<- 0
597 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
598 SET_VREG_OBJECT w3, w2 // fp[AA]<- exception obj
599 GET_INST_OPCODE ip // extract opcode from rINST
600 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // clear exception
601 GOTO_OPCODE ip // jump to next instruction
602
603/* ------------------------------ */
604 .balign 128
605.L_op_return_void: /* 0x0e */
606/* File: arm64/op_return_void.S */
607 .extern MterpThreadFenceForConstructor
608 bl MterpThreadFenceForConstructor
609 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
610 mov x0, xSELF
611 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
612 b.ne .Lop_return_void_check
613.Lop_return_void_return:
614 mov x0, #0
615 b MterpReturn
616.Lop_return_void_check:
617 bl MterpSuspendCheck // (self)
618 b .Lop_return_void_return
619
620/* ------------------------------ */
621 .balign 128
622.L_op_return: /* 0x0f */
623/* File: arm64/op_return.S */
624 /*
625 * Return a 32-bit value.
626 *
627 * for: return, return-object
628 */
629 /* op vAA */
630 .extern MterpThreadFenceForConstructor
631 bl MterpThreadFenceForConstructor
632 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
633 mov x0, xSELF
634 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
635 b.ne .Lop_return_check
636.Lop_return_return:
637 lsr w2, wINST, #8 // r2<- AA
638 GET_VREG w0, w2 // r0<- vAA
639 b MterpReturn
640.Lop_return_check:
641 bl MterpSuspendCheck // (self)
642 b .Lop_return_return
643
644/* ------------------------------ */
645 .balign 128
646.L_op_return_wide: /* 0x10 */
647/* File: arm64/op_return_wide.S */
648 /*
649 * Return a 64-bit value.
650 */
651 /* return-wide vAA */
652 /* op vAA */
653 .extern MterpThreadFenceForConstructor
654 bl MterpThreadFenceForConstructor
655 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
656 mov x0, xSELF
657 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
658 b.ne .Lop_return_wide_check
659.Lop_return_wide_return:
660 lsr w2, wINST, #8 // w2<- AA
661 GET_VREG_WIDE x0, w2 // x0<- vAA
662 b MterpReturn
663.Lop_return_wide_check:
664 bl MterpSuspendCheck // (self)
665 b .Lop_return_wide_return
666
667/* ------------------------------ */
668 .balign 128
669.L_op_return_object: /* 0x11 */
670/* File: arm64/op_return_object.S */
671/* File: arm64/op_return.S */
672 /*
673 * Return a 32-bit value.
674 *
675 * for: return, return-object
676 */
677 /* op vAA */
678 .extern MterpThreadFenceForConstructor
679 bl MterpThreadFenceForConstructor
680 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
681 mov x0, xSELF
682 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
683 b.ne .Lop_return_object_check
684.Lop_return_object_return:
685 lsr w2, wINST, #8 // r2<- AA
686 GET_VREG w0, w2 // r0<- vAA
687 b MterpReturn
688.Lop_return_object_check:
689 bl MterpSuspendCheck // (self)
690 b .Lop_return_object_return
691
692
693/* ------------------------------ */
694 .balign 128
695.L_op_const_4: /* 0x12 */
696/* File: arm64/op_const_4.S */
697 /* const/4 vA, #+B */
698 lsl w1, wINST, #16 // w1<- Bxxx0000
699 ubfx w0, wINST, #8, #4 // w0<- A
700 FETCH_ADVANCE_INST 1 // advance xPC, load wINST
701 asr w1, w1, #28 // w1<- sssssssB (sign-extended)
702 GET_INST_OPCODE ip // ip<- opcode from xINST
703 SET_VREG w1, w0 // fp[A]<- w1
704 GOTO_OPCODE ip // execute next instruction
705
706/* ------------------------------ */
707 .balign 128
708.L_op_const_16: /* 0x13 */
709/* File: arm64/op_const_16.S */
710 /* const/16 vAA, #+BBBB */
711 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended
712 lsr w3, wINST, #8 // w3<- AA
713 FETCH_ADVANCE_INST 2 // advance xPC, load wINST
714 SET_VREG w0, w3 // vAA<- w0
715 GET_INST_OPCODE ip // extract opcode from wINST
716 GOTO_OPCODE ip // jump to next instruction
717
718/* ------------------------------ */
719 .balign 128
720.L_op_const: /* 0x14 */
721/* File: arm64/op_const.S */
722 /* const vAA, #+BBBBbbbb */
723 lsr w3, wINST, #8 // w3<- AA
724 FETCH w0, 1 // w0<- bbbb (low
725 FETCH w1, 2 // w1<- BBBB (high
726 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
727 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
728 GET_INST_OPCODE ip // extract opcode from wINST
729 SET_VREG w0, w3 // vAA<- w0
730 GOTO_OPCODE ip // jump to next instruction
731
732/* ------------------------------ */
733 .balign 128
734.L_op_const_high16: /* 0x15 */
735/* File: arm64/op_const_high16.S */
736 /* const/high16 vAA, #+BBBB0000 */
737 FETCH w0, 1 // r0<- 0000BBBB (zero-extended
738 lsr w3, wINST, #8 // r3<- AA
739 lsl w0, w0, #16 // r0<- BBBB0000
740 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
741 SET_VREG w0, w3 // vAA<- r0
742 GET_INST_OPCODE ip // extract opcode from rINST
743 GOTO_OPCODE ip // jump to next instruction
744
745/* ------------------------------ */
746 .balign 128
747.L_op_const_wide_16: /* 0x16 */
748/* File: arm64/op_const_wide_16.S */
749 /* const-wide/16 vAA, #+BBBB */
Vladimir Markoe6220222016-07-20 14:25:30 +0100750 FETCH_S x0, 1 // x0<- ssssssssssssBBBB (sign-extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000751 lsr w3, wINST, #8 // w3<- AA
752 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000753 GET_INST_OPCODE ip // extract opcode from rINST
754 SET_VREG_WIDE x0, w3
755 GOTO_OPCODE ip // jump to next instruction
756
757/* ------------------------------ */
758 .balign 128
759.L_op_const_wide_32: /* 0x17 */
760/* File: arm64/op_const_wide_32.S */
761 /* const-wide/32 vAA, #+BBBBbbbb */
Vladimir Markoe6220222016-07-20 14:25:30 +0100762 FETCH w0, 1 // x0<- 000000000000bbbb (low)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000763 lsr w3, wINST, #8 // w3<- AA
Vladimir Markoe6220222016-07-20 14:25:30 +0100764 FETCH_S x2, 2 // x2<- ssssssssssssBBBB (high)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000765 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
766 GET_INST_OPCODE ip // extract opcode from wINST
Vladimir Markoe6220222016-07-20 14:25:30 +0100767 orr x0, x0, x2, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000768 SET_VREG_WIDE x0, w3
769 GOTO_OPCODE ip // jump to next instruction
770
771/* ------------------------------ */
772 .balign 128
773.L_op_const_wide: /* 0x18 */
774/* File: arm64/op_const_wide.S */
775 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
776 FETCH w0, 1 // w0<- bbbb (low)
777 FETCH w1, 2 // w1<- BBBB (low middle)
778 FETCH w2, 3 // w2<- hhhh (high middle)
779 FETCH w3, 4 // w3<- HHHH (high)
780 lsr w4, wINST, #8 // r4<- AA
781 FETCH_ADVANCE_INST 5 // advance rPC, load wINST
782 GET_INST_OPCODE ip // extract opcode from wINST
783 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
784 orr x0, x0, x2, lsl #32 // w0<- hhhhBBBBbbbb
785 orr x0, x0, x3, lsl #48 // w0<- HHHHhhhhBBBBbbbb
786 SET_VREG_WIDE x0, w4
787 GOTO_OPCODE ip // jump to next instruction
788
789/* ------------------------------ */
790 .balign 128
791.L_op_const_wide_high16: /* 0x19 */
792/* File: arm64/op_const_wide_high16.S */
793 /* const-wide/high16 vAA, #+BBBB000000000000 */
794 FETCH w0, 1 // w0<- 0000BBBB (zero-extended)
795 lsr w1, wINST, #8 // w1<- AA
796 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
797 lsl x0, x0, #48
798 SET_VREG_WIDE x0, w1
799 GET_INST_OPCODE ip // extract opcode from wINST
800 GOTO_OPCODE ip // jump to next instruction
801
802/* ------------------------------ */
803 .balign 128
804.L_op_const_string: /* 0x1a */
805/* File: arm64/op_const_string.S */
806 /* const/string vAA, String//BBBB */
807 EXPORT_PC
808 FETCH w0, 1 // w0<- BBBB
809 lsr w1, wINST, #8 // w1<- AA
810 add x2, xFP, #OFF_FP_SHADOWFRAME
811 mov x3, xSELF
812 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
813 PREFETCH_INST 2 // load rINST
814 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
815 ADVANCE 2 // advance rPC
816 GET_INST_OPCODE ip // extract opcode from rINST
817 GOTO_OPCODE ip // jump to next instruction
818
819/* ------------------------------ */
820 .balign 128
821.L_op_const_string_jumbo: /* 0x1b */
822/* File: arm64/op_const_string_jumbo.S */
823 /* const/string vAA, String//BBBBBBBB */
824 EXPORT_PC
825 FETCH w0, 1 // w0<- bbbb (low
826 FETCH w2, 2 // w2<- BBBB (high
827 lsr w1, wINST, #8 // w1<- AA
828 orr w0, w0, w2, lsl #16 // w1<- BBBBbbbb
829 add x2, xFP, #OFF_FP_SHADOWFRAME
830 mov x3, xSELF
831 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
832 PREFETCH_INST 3 // advance rPC
833 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
834 ADVANCE 3 // advance rPC
835 GET_INST_OPCODE ip // extract opcode from rINST
836 GOTO_OPCODE ip // jump to next instruction
837
838/* ------------------------------ */
839 .balign 128
840.L_op_const_class: /* 0x1c */
841/* File: arm64/op_const_class.S */
842 /* const/class vAA, Class//BBBB */
843 EXPORT_PC
844 FETCH w0, 1 // w0<- BBBB
845 lsr w1, wINST, #8 // w1<- AA
846 add x2, xFP, #OFF_FP_SHADOWFRAME
847 mov x3, xSELF
848 bl MterpConstClass // (index, tgt_reg, shadow_frame, self)
849 PREFETCH_INST 2
850 cbnz w0, MterpPossibleException
851 ADVANCE 2
852 GET_INST_OPCODE ip // extract opcode from rINST
853 GOTO_OPCODE ip // jump to next instruction
854
855/* ------------------------------ */
856 .balign 128
857.L_op_monitor_enter: /* 0x1d */
858/* File: arm64/op_monitor_enter.S */
859 /*
860 * Synchronize on an object.
861 */
862 /* monitor-enter vAA */
863 EXPORT_PC
864 lsr w2, wINST, #8 // w2<- AA
865 GET_VREG w0, w2 // w0<- vAA (object)
866 mov x1, xSELF // w1<- self
867 bl artLockObjectFromCode
868 cbnz w0, MterpException
869 FETCH_ADVANCE_INST 1
870 GET_INST_OPCODE ip // extract opcode from rINST
871 GOTO_OPCODE ip // jump to next instruction
872
873/* ------------------------------ */
874 .balign 128
875.L_op_monitor_exit: /* 0x1e */
876/* File: arm64/op_monitor_exit.S */
877 /*
878 * Unlock an object.
879 *
880 * Exceptions that occur when unlocking a monitor need to appear as
881 * if they happened at the following instruction. See the Dalvik
882 * instruction spec.
883 */
884 /* monitor-exit vAA */
885 EXPORT_PC
886 lsr w2, wINST, #8 // w2<- AA
887 GET_VREG w0, w2 // w0<- vAA (object)
888 mov x1, xSELF // w0<- self
889 bl artUnlockObjectFromCode // w0<- success for unlock(self, obj)
890 cbnz w0, MterpException
891 FETCH_ADVANCE_INST 1 // before throw: advance rPC, load rINST
892 GET_INST_OPCODE ip // extract opcode from rINST
893 GOTO_OPCODE ip // jump to next instruction
894
895/* ------------------------------ */
896 .balign 128
897.L_op_check_cast: /* 0x1f */
898/* File: arm64/op_check_cast.S */
899 /*
900 * Check to see if a cast from one class to another is allowed.
901 */
902 /* check-cast vAA, class//BBBB */
903 EXPORT_PC
904 FETCH w0, 1 // w0<- BBBB
905 lsr w1, wINST, #8 // w1<- AA
906 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
907 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
908 mov x3, xSELF // w3<- self
909 bl MterpCheckCast // (index, &obj, method, self)
910 PREFETCH_INST 2
911 cbnz w0, MterpPossibleException
912 ADVANCE 2
913 GET_INST_OPCODE ip // extract opcode from rINST
914 GOTO_OPCODE ip // jump to next instruction
915
916/* ------------------------------ */
917 .balign 128
918.L_op_instance_of: /* 0x20 */
919/* File: arm64/op_instance_of.S */
920 /*
921 * Check to see if an object reference is an instance of a class.
922 *
923 * Most common situation is a non-null object, being compared against
924 * an already-resolved class.
925 */
926 /* instance-of vA, vB, class//CCCC */
927 EXPORT_PC
928 FETCH w0, 1 // w0<- CCCC
929 lsr w1, wINST, #12 // w1<- B
930 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
931 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
932 mov x3, xSELF // w3<- self
933 bl MterpInstanceOf // (index, &obj, method, self)
934 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
Vladimir Markoe6220222016-07-20 14:25:30 +0100935 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000936 PREFETCH_INST 2
937 cbnz x1, MterpException
938 ADVANCE 2 // advance rPC
939 SET_VREG w0, w2 // vA<- w0
940 GET_INST_OPCODE ip // extract opcode from rINST
941 GOTO_OPCODE ip // jump to next instruction
942
943/* ------------------------------ */
944 .balign 128
945.L_op_array_length: /* 0x21 */
946/* File: arm64/op_array_length.S */
947 /*
948 * Return the length of an array.
949 */
950 lsr w1, wINST, #12 // w1<- B
951 ubfx w2, wINST, #8, #4 // w2<- A
952 GET_VREG w0, w1 // w0<- vB (object ref)
953 cbz w0, common_errNullObject // yup, fail
954 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
955 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- array length
956 GET_INST_OPCODE ip // extract opcode from rINST
957 SET_VREG w3, w2 // vB<- length
958 GOTO_OPCODE ip // jump to next instruction
959
960/* ------------------------------ */
961 .balign 128
962.L_op_new_instance: /* 0x22 */
963/* File: arm64/op_new_instance.S */
964 /*
965 * Create a new instance of a class.
966 */
967 /* new-instance vAA, class//BBBB */
968 EXPORT_PC
969 add x0, xFP, #OFF_FP_SHADOWFRAME
970 mov x1, xSELF
971 mov w2, wINST
972 bl MterpNewInstance // (shadow_frame, self, inst_data)
973 cbz w0, MterpPossibleException
974 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
975 GET_INST_OPCODE ip // extract opcode from rINST
976 GOTO_OPCODE ip // jump to next instruction
977
978/* ------------------------------ */
979 .balign 128
980.L_op_new_array: /* 0x23 */
981/* File: arm64/op_new_array.S */
982 /*
983 * Allocate an array of objects, specified with the array class
984 * and a count.
985 *
986 * The verifier guarantees that this is an array class, so we don't
987 * check for it here.
988 */
989 /* new-array vA, vB, class//CCCC */
990 EXPORT_PC
991 add x0, xFP, #OFF_FP_SHADOWFRAME
992 mov x1, xPC
993 mov w2, wINST
994 mov x3, xSELF
995 bl MterpNewArray
996 cbz w0, MterpPossibleException
997 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
998 GET_INST_OPCODE ip // extract opcode from rINST
999 GOTO_OPCODE ip // jump to next instruction
1000
1001/* ------------------------------ */
1002 .balign 128
1003.L_op_filled_new_array: /* 0x24 */
1004/* File: arm64/op_filled_new_array.S */
1005 /*
1006 * Create a new array with elements filled from registers.
1007 *
1008 * for: filled-new-array, filled-new-array/range
1009 */
1010 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1011 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1012 .extern MterpFilledNewArray
1013 EXPORT_PC
1014 add x0, xFP, #OFF_FP_SHADOWFRAME
1015 mov x1, xPC
1016 mov x2, xSELF
1017 bl MterpFilledNewArray
1018 cbz w0, MterpPossibleException
1019 FETCH_ADVANCE_INST 3 // 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_filled_new_array_range: /* 0x25 */
1026/* File: arm64/op_filled_new_array_range.S */
1027/* File: arm64/op_filled_new_array.S */
1028 /*
1029 * Create a new array with elements filled from registers.
1030 *
1031 * for: filled-new-array, filled-new-array/range
1032 */
1033 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1034 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1035 .extern MterpFilledNewArrayRange
1036 EXPORT_PC
1037 add x0, xFP, #OFF_FP_SHADOWFRAME
1038 mov x1, xPC
1039 mov x2, xSELF
1040 bl MterpFilledNewArrayRange
1041 cbz w0, MterpPossibleException
1042 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1043 GET_INST_OPCODE ip // extract opcode from rINST
1044 GOTO_OPCODE ip // jump to next instruction
1045
1046
1047/* ------------------------------ */
1048 .balign 128
1049.L_op_fill_array_data: /* 0x26 */
1050/* File: arm64/op_fill_array_data.S */
1051 /* fill-array-data vAA, +BBBBBBBB */
1052 EXPORT_PC
1053 FETCH w0, 1 // w0<- bbbb (lo)
1054 FETCH w1, 2 // w1<- BBBB (hi)
1055 lsr w3, wINST, #8 // w3<- AA
1056 orr w1, w0, w1, lsl #16 // w1<- BBBBbbbb
1057 GET_VREG w0, w3 // w0<- vAA (array object)
1058 add x1, xPC, w1, lsl #1 // w1<- PC + BBBBbbbb*2 (array data off.)
1059 bl MterpFillArrayData // (obj, payload)
1060 cbz w0, MterpPossibleException // exception?
1061 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1062 GET_INST_OPCODE ip // extract opcode from rINST
1063 GOTO_OPCODE ip // jump to next instruction
1064
1065/* ------------------------------ */
1066 .balign 128
1067.L_op_throw: /* 0x27 */
1068/* File: arm64/op_throw.S */
1069 /*
1070 * Throw an exception object in the current thread.
1071 */
1072 /* throw vAA */
1073 EXPORT_PC
1074 lsr w2, wINST, #8 // r2<- AA
1075 GET_VREG w1, w2 // r1<- vAA (exception object)
1076 cbz w1, common_errNullObject
1077 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // thread->exception<- obj
1078 b MterpException
1079
1080/* ------------------------------ */
1081 .balign 128
1082.L_op_goto: /* 0x28 */
1083/* File: arm64/op_goto.S */
1084 /*
1085 * Unconditional branch, 8-bit offset.
1086 *
1087 * The branch distance is a signed code-unit offset, which we need to
1088 * double to get a byte offset.
1089 */
1090 /* goto +AA */
Bill Buzbee1d011d92016-04-04 16:59:29 +00001091 sbfx wINST, wINST, #8, #8 // wINST<- ssssssAA (sign-extended)
1092 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001093
1094/* ------------------------------ */
1095 .balign 128
1096.L_op_goto_16: /* 0x29 */
1097/* File: arm64/op_goto_16.S */
1098 /*
1099 * Unconditional branch, 16-bit offset.
1100 *
1101 * The branch distance is a signed code-unit offset, which we need to
1102 * double to get a byte offset.
1103 */
1104 /* goto/16 +AAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001105 FETCH_S wINST, 1 // wINST<- ssssAAAA (sign-extended)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001106 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001107
1108/* ------------------------------ */
1109 .balign 128
1110.L_op_goto_32: /* 0x2a */
1111/* File: arm64/op_goto_32.S */
1112 /*
1113 * Unconditional branch, 32-bit offset.
1114 *
1115 * The branch distance is a signed code-unit offset, which we need to
1116 * double to get a byte offset.
1117 *
1118 * Unlike most opcodes, this one is allowed to branch to itself, so
1119 * our "backward branch" test must be "<=0" instead of "<0". Because
1120 * we need the V bit set, we'll use an adds to convert from Dalvik
1121 * offset to byte offset.
1122 */
1123 /* goto/32 +AAAAAAAA */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001124 FETCH w0, 1 // w0<- aaaa (lo)
1125 FETCH w1, 2 // w1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001126 orr wINST, w0, w1, lsl #16 // wINST<- AAAAaaaa
Bill Buzbee1d011d92016-04-04 16:59:29 +00001127 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001128
1129/* ------------------------------ */
1130 .balign 128
1131.L_op_packed_switch: /* 0x2b */
1132/* File: arm64/op_packed_switch.S */
1133 /*
1134 * Handle a packed-switch or sparse-switch instruction. In both cases
1135 * we decode it and hand it off to a helper function.
1136 *
1137 * We don't really expect backward branches in a switch statement, but
1138 * they're perfectly legal, so we check for them here.
1139 *
1140 * for: packed-switch, sparse-switch
1141 */
1142 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001143 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1144 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001145 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001146 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001147 GET_VREG w1, w3 // w1<- vAA
Vladimir Marko5733e982016-07-20 17:52:51 +01001148 add x0, xPC, x0, lsl #1 // x0<- PC + BBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001149 bl MterpDoPackedSwitch // w0<- code-unit branch offset
Vladimir Markoe6220222016-07-20 14:25:30 +01001150 sxtw xINST, w0
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_sparse_switch: /* 0x2c */
1156/* File: arm64/op_sparse_switch.S */
1157/* File: arm64/op_packed_switch.S */
1158 /*
1159 * Handle a packed-switch or sparse-switch instruction. In both cases
1160 * we decode it and hand it off to a helper function.
1161 *
1162 * We don't really expect backward branches in a switch statement, but
1163 * they're perfectly legal, so we check for them here.
1164 *
1165 * for: packed-switch, sparse-switch
1166 */
1167 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001168 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1169 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001170 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001171 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001172 GET_VREG w1, w3 // w1<- vAA
Vladimir Marko5733e982016-07-20 17:52:51 +01001173 add x0, xPC, x0, lsl #1 // x0<- PC + BBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001174 bl MterpDoSparseSwitch // w0<- code-unit branch offset
Vladimir Markoe6220222016-07-20 14:25:30 +01001175 sxtw xINST, w0
Bill Buzbee1d011d92016-04-04 16:59:29 +00001176 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001177
1178
1179/* ------------------------------ */
1180 .balign 128
1181.L_op_cmpl_float: /* 0x2d */
1182/* File: arm64/op_cmpl_float.S */
1183/* File: arm64/fcmp.S */
1184 /*
1185 * Compare two floating-point values. Puts 0, 1, or -1 into the
1186 * destination register based on the results of the comparison.
1187 */
1188 /* op vAA, vBB, vCC */
1189 FETCH w0, 1 // w0<- CCBB
1190 lsr w4, wINST, #8 // w4<- AA
1191 and w2, w0, #255 // w2<- BB
1192 lsr w3, w0, #8 // w3<- CC
1193 GET_VREG s1, w2
1194 GET_VREG s2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001195 fcmp s1, s2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001196 cset w0, ne
1197 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001198 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1199 GET_INST_OPCODE ip // extract opcode from rINST
1200 SET_VREG w0, w4 // vAA<- w0
1201 GOTO_OPCODE ip // jump to next instruction
1202
1203
1204/* ------------------------------ */
1205 .balign 128
1206.L_op_cmpg_float: /* 0x2e */
1207/* File: arm64/op_cmpg_float.S */
1208/* File: arm64/fcmp.S */
1209 /*
1210 * Compare two floating-point values. Puts 0, 1, or -1 into the
1211 * destination register based on the results of the comparison.
1212 */
1213 /* op vAA, vBB, vCC */
1214 FETCH w0, 1 // w0<- CCBB
1215 lsr w4, wINST, #8 // w4<- AA
1216 and w2, w0, #255 // w2<- BB
1217 lsr w3, w0, #8 // w3<- CC
1218 GET_VREG s1, w2
1219 GET_VREG s2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001220 fcmp s1, s2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001221 cset w0, ne
1222 cneg w0, w0, cc
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001223 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1224 GET_INST_OPCODE ip // extract opcode from rINST
1225 SET_VREG w0, w4 // vAA<- w0
1226 GOTO_OPCODE ip // jump to next instruction
1227
1228
1229/* ------------------------------ */
1230 .balign 128
1231.L_op_cmpl_double: /* 0x2f */
1232/* File: arm64/op_cmpl_double.S */
1233/* File: arm64/fcmp.S */
1234 /*
1235 * Compare two floating-point values. Puts 0, 1, or -1 into the
1236 * destination register based on the results of the comparison.
1237 */
1238 /* op vAA, vBB, vCC */
1239 FETCH w0, 1 // w0<- CCBB
1240 lsr w4, wINST, #8 // w4<- AA
1241 and w2, w0, #255 // w2<- BB
1242 lsr w3, w0, #8 // w3<- CC
1243 GET_VREG_WIDE d1, w2
1244 GET_VREG_WIDE d2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001245 fcmp d1, d2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001246 cset w0, ne
1247 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001248 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1249 GET_INST_OPCODE ip // extract opcode from rINST
1250 SET_VREG w0, w4 // vAA<- w0
1251 GOTO_OPCODE ip // jump to next instruction
1252
1253
1254/* ------------------------------ */
1255 .balign 128
1256.L_op_cmpg_double: /* 0x30 */
1257/* File: arm64/op_cmpg_double.S */
1258/* File: arm64/fcmp.S */
1259 /*
1260 * Compare two floating-point values. Puts 0, 1, or -1 into the
1261 * destination register based on the results of the comparison.
1262 */
1263 /* op vAA, vBB, vCC */
1264 FETCH w0, 1 // w0<- CCBB
1265 lsr w4, wINST, #8 // w4<- AA
1266 and w2, w0, #255 // w2<- BB
1267 lsr w3, w0, #8 // w3<- CC
1268 GET_VREG_WIDE d1, w2
1269 GET_VREG_WIDE d2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001270 fcmp d1, d2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001271 cset w0, ne
1272 cneg w0, w0, cc
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001273 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1274 GET_INST_OPCODE ip // extract opcode from rINST
1275 SET_VREG w0, w4 // vAA<- w0
1276 GOTO_OPCODE ip // jump to next instruction
1277
1278
1279/* ------------------------------ */
1280 .balign 128
1281.L_op_cmp_long: /* 0x31 */
1282/* File: arm64/op_cmp_long.S */
1283 FETCH w0, 1 // w0<- CCBB
1284 lsr w4, wINST, #8 // w4<- AA
1285 and w2, w0, #255 // w2<- BB
1286 lsr w3, w0, #8 // w3<- CC
1287 GET_VREG_WIDE x1, w2
1288 GET_VREG_WIDE x2, w3
1289 cmp x1, x2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001290 cset w0, ne
1291 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001292 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1293 SET_VREG w0, w4
1294 GET_INST_OPCODE ip // extract opcode from wINST
1295 GOTO_OPCODE ip // jump to next instruction
1296
1297/* ------------------------------ */
1298 .balign 128
1299.L_op_if_eq: /* 0x32 */
1300/* File: arm64/op_if_eq.S */
1301/* File: arm64/bincmp.S */
1302 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001303 * Generic two-operand compare-and-branch operation. Provide a "condition"
1304 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001305 *
1306 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1307 */
1308 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001309 lsr w1, wINST, #12 // w1<- B
1310 ubfx w0, wINST, #8, #4 // w0<- A
1311 GET_VREG w3, w1 // w3<- vB
1312 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001313 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001314 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001315 b.eq MterpCommonTakenBranchNoFlags
1316 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1317 b.eq .L_check_not_taken_osr
1318 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001319 GET_INST_OPCODE ip // extract opcode from wINST
1320 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001321
1322
1323/* ------------------------------ */
1324 .balign 128
1325.L_op_if_ne: /* 0x33 */
1326/* File: arm64/op_if_ne.S */
1327/* File: arm64/bincmp.S */
1328 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001329 * Generic two-operand compare-and-branch operation. Provide a "condition"
1330 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001331 *
1332 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1333 */
1334 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001335 lsr w1, wINST, #12 // w1<- B
1336 ubfx w0, wINST, #8, #4 // w0<- A
1337 GET_VREG w3, w1 // w3<- vB
1338 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001339 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001340 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001341 b.ne MterpCommonTakenBranchNoFlags
1342 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1343 b.eq .L_check_not_taken_osr
1344 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001345 GET_INST_OPCODE ip // extract opcode from wINST
1346 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001347
1348
1349/* ------------------------------ */
1350 .balign 128
1351.L_op_if_lt: /* 0x34 */
1352/* File: arm64/op_if_lt.S */
1353/* File: arm64/bincmp.S */
1354 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001355 * Generic two-operand compare-and-branch operation. Provide a "condition"
1356 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001357 *
1358 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1359 */
1360 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001361 lsr w1, wINST, #12 // w1<- B
1362 ubfx w0, wINST, #8, #4 // w0<- A
1363 GET_VREG w3, w1 // w3<- vB
1364 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001365 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001366 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001367 b.lt MterpCommonTakenBranchNoFlags
1368 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1369 b.eq .L_check_not_taken_osr
1370 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001371 GET_INST_OPCODE ip // extract opcode from wINST
1372 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001373
1374
1375/* ------------------------------ */
1376 .balign 128
1377.L_op_if_ge: /* 0x35 */
1378/* File: arm64/op_if_ge.S */
1379/* File: arm64/bincmp.S */
1380 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001381 * Generic two-operand compare-and-branch operation. Provide a "condition"
1382 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001383 *
1384 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1385 */
1386 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001387 lsr w1, wINST, #12 // w1<- B
1388 ubfx w0, wINST, #8, #4 // w0<- A
1389 GET_VREG w3, w1 // w3<- vB
1390 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001391 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001392 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001393 b.ge MterpCommonTakenBranchNoFlags
1394 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1395 b.eq .L_check_not_taken_osr
1396 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001397 GET_INST_OPCODE ip // extract opcode from wINST
1398 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001399
1400
1401/* ------------------------------ */
1402 .balign 128
1403.L_op_if_gt: /* 0x36 */
1404/* File: arm64/op_if_gt.S */
1405/* File: arm64/bincmp.S */
1406 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001407 * Generic two-operand compare-and-branch operation. Provide a "condition"
1408 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001409 *
1410 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1411 */
1412 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001413 lsr w1, wINST, #12 // w1<- B
1414 ubfx w0, wINST, #8, #4 // w0<- A
1415 GET_VREG w3, w1 // w3<- vB
1416 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001417 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001418 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001419 b.gt MterpCommonTakenBranchNoFlags
1420 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1421 b.eq .L_check_not_taken_osr
1422 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001423 GET_INST_OPCODE ip // extract opcode from wINST
1424 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001425
1426
1427/* ------------------------------ */
1428 .balign 128
1429.L_op_if_le: /* 0x37 */
1430/* File: arm64/op_if_le.S */
1431/* File: arm64/bincmp.S */
1432 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001433 * Generic two-operand compare-and-branch operation. Provide a "condition"
1434 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001435 *
1436 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1437 */
1438 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001439 lsr w1, wINST, #12 // w1<- B
1440 ubfx w0, wINST, #8, #4 // w0<- A
1441 GET_VREG w3, w1 // w3<- vB
1442 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001443 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001444 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001445 b.le MterpCommonTakenBranchNoFlags
1446 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1447 b.eq .L_check_not_taken_osr
1448 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001449 GET_INST_OPCODE ip // extract opcode from wINST
1450 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001451
1452
1453/* ------------------------------ */
1454 .balign 128
1455.L_op_if_eqz: /* 0x38 */
1456/* File: arm64/op_if_eqz.S */
1457/* File: arm64/zcmp.S */
1458 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001459 * Generic one-operand compare-and-branch operation. Provide a "condition"
1460 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001461 *
1462 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1463 */
1464 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001465 lsr w0, wINST, #8 // w0<- AA
1466 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001467 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001468 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001469 b.eq MterpCommonTakenBranchNoFlags
1470 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1471 b.eq .L_check_not_taken_osr
1472 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001473 GET_INST_OPCODE ip // extract opcode from wINST
1474 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001475
1476
1477/* ------------------------------ */
1478 .balign 128
1479.L_op_if_nez: /* 0x39 */
1480/* File: arm64/op_if_nez.S */
1481/* File: arm64/zcmp.S */
1482 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001483 * Generic one-operand compare-and-branch operation. Provide a "condition"
1484 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001485 *
1486 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1487 */
1488 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001489 lsr w0, wINST, #8 // w0<- AA
1490 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001491 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001492 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001493 b.ne MterpCommonTakenBranchNoFlags
1494 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1495 b.eq .L_check_not_taken_osr
1496 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001497 GET_INST_OPCODE ip // extract opcode from wINST
1498 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001499
1500
1501/* ------------------------------ */
1502 .balign 128
1503.L_op_if_ltz: /* 0x3a */
1504/* File: arm64/op_if_ltz.S */
1505/* File: arm64/zcmp.S */
1506 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001507 * Generic one-operand compare-and-branch operation. Provide a "condition"
1508 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001509 *
1510 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1511 */
1512 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001513 lsr w0, wINST, #8 // w0<- AA
1514 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001515 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001516 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001517 b.lt MterpCommonTakenBranchNoFlags
1518 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1519 b.eq .L_check_not_taken_osr
1520 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001521 GET_INST_OPCODE ip // extract opcode from wINST
1522 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001523
1524
1525/* ------------------------------ */
1526 .balign 128
1527.L_op_if_gez: /* 0x3b */
1528/* File: arm64/op_if_gez.S */
1529/* File: arm64/zcmp.S */
1530 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001531 * Generic one-operand compare-and-branch operation. Provide a "condition"
1532 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001533 *
1534 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1535 */
1536 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001537 lsr w0, wINST, #8 // w0<- AA
1538 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001539 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001540 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001541 b.ge MterpCommonTakenBranchNoFlags
1542 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1543 b.eq .L_check_not_taken_osr
1544 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001545 GET_INST_OPCODE ip // extract opcode from wINST
1546 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001547
1548
1549/* ------------------------------ */
1550 .balign 128
1551.L_op_if_gtz: /* 0x3c */
1552/* File: arm64/op_if_gtz.S */
1553/* File: arm64/zcmp.S */
1554 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001555 * Generic one-operand compare-and-branch operation. Provide a "condition"
1556 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001557 *
1558 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1559 */
1560 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001561 lsr w0, wINST, #8 // w0<- AA
1562 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001563 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001564 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001565 b.gt MterpCommonTakenBranchNoFlags
1566 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1567 b.eq .L_check_not_taken_osr
1568 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001569 GET_INST_OPCODE ip // extract opcode from wINST
1570 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001571
1572
1573/* ------------------------------ */
1574 .balign 128
1575.L_op_if_lez: /* 0x3d */
1576/* File: arm64/op_if_lez.S */
1577/* File: arm64/zcmp.S */
1578 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001579 * Generic one-operand compare-and-branch operation. Provide a "condition"
1580 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001581 *
1582 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1583 */
1584 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001585 lsr w0, wINST, #8 // w0<- AA
1586 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001587 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001588 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001589 b.le MterpCommonTakenBranchNoFlags
1590 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1591 b.eq .L_check_not_taken_osr
1592 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001593 GET_INST_OPCODE ip // extract opcode from wINST
1594 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001595
1596
1597/* ------------------------------ */
1598 .balign 128
1599.L_op_unused_3e: /* 0x3e */
1600/* File: arm64/op_unused_3e.S */
1601/* File: arm64/unused.S */
1602/*
1603 * Bail to reference interpreter to throw.
1604 */
1605 b MterpFallback
1606
1607
1608/* ------------------------------ */
1609 .balign 128
1610.L_op_unused_3f: /* 0x3f */
1611/* File: arm64/op_unused_3f.S */
1612/* File: arm64/unused.S */
1613/*
1614 * Bail to reference interpreter to throw.
1615 */
1616 b MterpFallback
1617
1618
1619/* ------------------------------ */
1620 .balign 128
1621.L_op_unused_40: /* 0x40 */
1622/* File: arm64/op_unused_40.S */
1623/* File: arm64/unused.S */
1624/*
1625 * Bail to reference interpreter to throw.
1626 */
1627 b MterpFallback
1628
1629
1630/* ------------------------------ */
1631 .balign 128
1632.L_op_unused_41: /* 0x41 */
1633/* File: arm64/op_unused_41.S */
1634/* File: arm64/unused.S */
1635/*
1636 * Bail to reference interpreter to throw.
1637 */
1638 b MterpFallback
1639
1640
1641/* ------------------------------ */
1642 .balign 128
1643.L_op_unused_42: /* 0x42 */
1644/* File: arm64/op_unused_42.S */
1645/* File: arm64/unused.S */
1646/*
1647 * Bail to reference interpreter to throw.
1648 */
1649 b MterpFallback
1650
1651
1652/* ------------------------------ */
1653 .balign 128
1654.L_op_unused_43: /* 0x43 */
1655/* File: arm64/op_unused_43.S */
1656/* File: arm64/unused.S */
1657/*
1658 * Bail to reference interpreter to throw.
1659 */
1660 b MterpFallback
1661
1662
1663/* ------------------------------ */
1664 .balign 128
1665.L_op_aget: /* 0x44 */
1666/* File: arm64/op_aget.S */
1667 /*
1668 * Array get, 32 bits or less. vAA <- vBB[vCC].
1669 *
1670 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1671 * instructions. We use a pair of FETCH_Bs instead.
1672 *
1673 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1674 *
1675 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1676 * If this changes, specialize.
1677 */
1678 /* op vAA, vBB, vCC */
1679 FETCH_B w2, 1, 0 // w2<- BB
1680 lsr w9, wINST, #8 // w9<- AA
1681 FETCH_B w3, 1, 1 // w3<- CC
1682 GET_VREG w0, w2 // w0<- vBB (array object)
1683 GET_VREG w1, w3 // w1<- vCC (requested index)
1684 cbz x0, common_errNullObject // bail if null array object.
1685 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1686 add x0, x0, w1, uxtw #2 // w0<- arrayObj + index*width
1687 cmp w1, w3 // compare unsigned index, length
1688 bcs common_errArrayIndex // index >= length, bail
1689 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1690 ldr w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1691 GET_INST_OPCODE ip // extract opcode from rINST
1692 SET_VREG w2, w9 // vAA<- w2
1693 GOTO_OPCODE ip // jump to next instruction
1694
1695/* ------------------------------ */
1696 .balign 128
1697.L_op_aget_wide: /* 0x45 */
1698/* File: arm64/op_aget_wide.S */
1699 /*
1700 * Array get, 64 bits. vAA <- vBB[vCC].
1701 *
1702 */
1703 /* aget-wide vAA, vBB, vCC */
1704 FETCH w0, 1 // w0<- CCBB
1705 lsr w4, wINST, #8 // w4<- AA
1706 and w2, w0, #255 // w2<- BB
1707 lsr w3, w0, #8 // w3<- CC
1708 GET_VREG w0, w2 // w0<- vBB (array object)
1709 GET_VREG w1, w3 // w1<- vCC (requested index)
1710 cbz w0, common_errNullObject // yes, bail
1711 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1712 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1713 cmp w1, w3 // compare unsigned index, length
1714 bcs common_errArrayIndex // index >= length, bail
1715 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1716 ldr x2, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] // x2<- vBB[vCC]
1717 GET_INST_OPCODE ip // extract opcode from wINST
1718 SET_VREG_WIDE x2, w4
1719 GOTO_OPCODE ip // jump to next instruction
1720
1721/* ------------------------------ */
1722 .balign 128
1723.L_op_aget_object: /* 0x46 */
1724/* File: arm64/op_aget_object.S */
1725 /*
1726 * Array object get. vAA <- vBB[vCC].
1727 *
1728 * for: aget-object
1729 */
1730 /* op vAA, vBB, vCC */
1731 FETCH_B w2, 1, 0 // w2<- BB
1732 FETCH_B w3, 1, 1 // w3<- CC
1733 EXPORT_PC
1734 GET_VREG w0, w2 // w0<- vBB (array object)
1735 GET_VREG w1, w3 // w1<- vCC (requested index)
1736 bl artAGetObjectFromMterp // (array, index)
1737 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
1738 lsr w2, wINST, #8 // w9<- AA
1739 PREFETCH_INST 2
1740 cbnz w1, MterpException
1741 SET_VREG_OBJECT w0, w2
1742 ADVANCE 2
1743 GET_INST_OPCODE ip
1744 GOTO_OPCODE ip // jump to next instruction
1745
1746/* ------------------------------ */
1747 .balign 128
1748.L_op_aget_boolean: /* 0x47 */
1749/* File: arm64/op_aget_boolean.S */
1750/* File: arm64/op_aget.S */
1751 /*
1752 * Array get, 32 bits or less. vAA <- vBB[vCC].
1753 *
1754 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1755 * instructions. We use a pair of FETCH_Bs instead.
1756 *
1757 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1758 *
1759 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1760 * If this changes, specialize.
1761 */
1762 /* op vAA, vBB, vCC */
1763 FETCH_B w2, 1, 0 // w2<- BB
1764 lsr w9, wINST, #8 // w9<- AA
1765 FETCH_B w3, 1, 1 // w3<- CC
1766 GET_VREG w0, w2 // w0<- vBB (array object)
1767 GET_VREG w1, w3 // w1<- vCC (requested index)
1768 cbz x0, common_errNullObject // bail if null array object.
1769 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1770 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1771 cmp w1, w3 // compare unsigned index, length
1772 bcs common_errArrayIndex // index >= length, bail
1773 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1774 ldrb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1775 GET_INST_OPCODE ip // extract opcode from rINST
1776 SET_VREG w2, w9 // vAA<- w2
1777 GOTO_OPCODE ip // jump to next instruction
1778
1779
1780/* ------------------------------ */
1781 .balign 128
1782.L_op_aget_byte: /* 0x48 */
1783/* File: arm64/op_aget_byte.S */
1784/* File: arm64/op_aget.S */
1785 /*
1786 * Array get, 32 bits or less. vAA <- vBB[vCC].
1787 *
1788 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1789 * instructions. We use a pair of FETCH_Bs instead.
1790 *
1791 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1792 *
1793 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1794 * If this changes, specialize.
1795 */
1796 /* op vAA, vBB, vCC */
1797 FETCH_B w2, 1, 0 // w2<- BB
1798 lsr w9, wINST, #8 // w9<- AA
1799 FETCH_B w3, 1, 1 // w3<- CC
1800 GET_VREG w0, w2 // w0<- vBB (array object)
1801 GET_VREG w1, w3 // w1<- vCC (requested index)
1802 cbz x0, common_errNullObject // bail if null array object.
1803 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1804 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1805 cmp w1, w3 // compare unsigned index, length
1806 bcs common_errArrayIndex // index >= length, bail
1807 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1808 ldrsb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1809 GET_INST_OPCODE ip // extract opcode from rINST
1810 SET_VREG w2, w9 // vAA<- w2
1811 GOTO_OPCODE ip // jump to next instruction
1812
1813
1814/* ------------------------------ */
1815 .balign 128
1816.L_op_aget_char: /* 0x49 */
1817/* File: arm64/op_aget_char.S */
1818/* File: arm64/op_aget.S */
1819 /*
1820 * Array get, 32 bits or less. vAA <- vBB[vCC].
1821 *
1822 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1823 * instructions. We use a pair of FETCH_Bs instead.
1824 *
1825 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1826 *
1827 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1828 * If this changes, specialize.
1829 */
1830 /* op vAA, vBB, vCC */
1831 FETCH_B w2, 1, 0 // w2<- BB
1832 lsr w9, wINST, #8 // w9<- AA
1833 FETCH_B w3, 1, 1 // w3<- CC
1834 GET_VREG w0, w2 // w0<- vBB (array object)
1835 GET_VREG w1, w3 // w1<- vCC (requested index)
1836 cbz x0, common_errNullObject // bail if null array object.
1837 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1838 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1839 cmp w1, w3 // compare unsigned index, length
1840 bcs common_errArrayIndex // index >= length, bail
1841 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1842 ldrh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1843 GET_INST_OPCODE ip // extract opcode from rINST
1844 SET_VREG w2, w9 // vAA<- w2
1845 GOTO_OPCODE ip // jump to next instruction
1846
1847
1848/* ------------------------------ */
1849 .balign 128
1850.L_op_aget_short: /* 0x4a */
1851/* File: arm64/op_aget_short.S */
1852/* File: arm64/op_aget.S */
1853 /*
1854 * Array get, 32 bits or less. vAA <- vBB[vCC].
1855 *
1856 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1857 * instructions. We use a pair of FETCH_Bs instead.
1858 *
1859 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1860 *
1861 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1862 * If this changes, specialize.
1863 */
1864 /* op vAA, vBB, vCC */
1865 FETCH_B w2, 1, 0 // w2<- BB
1866 lsr w9, wINST, #8 // w9<- AA
1867 FETCH_B w3, 1, 1 // w3<- CC
1868 GET_VREG w0, w2 // w0<- vBB (array object)
1869 GET_VREG w1, w3 // w1<- vCC (requested index)
1870 cbz x0, common_errNullObject // bail if null array object.
1871 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1872 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1873 cmp w1, w3 // compare unsigned index, length
1874 bcs common_errArrayIndex // index >= length, bail
1875 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1876 ldrsh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1877 GET_INST_OPCODE ip // extract opcode from rINST
1878 SET_VREG w2, w9 // vAA<- w2
1879 GOTO_OPCODE ip // jump to next instruction
1880
1881
1882/* ------------------------------ */
1883 .balign 128
1884.L_op_aput: /* 0x4b */
1885/* File: arm64/op_aput.S */
1886 /*
1887 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1888 *
1889 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1890 * instructions. We use a pair of FETCH_Bs instead.
1891 *
1892 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1893 *
1894 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1895 * If this changes, specialize.
1896 */
1897 /* op vAA, vBB, vCC */
1898 FETCH_B w2, 1, 0 // w2<- BB
1899 lsr w9, wINST, #8 // w9<- AA
1900 FETCH_B w3, 1, 1 // w3<- CC
1901 GET_VREG w0, w2 // w0<- vBB (array object)
1902 GET_VREG w1, w3 // w1<- vCC (requested index)
1903 cbz w0, common_errNullObject // bail if null
1904 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1905 add x0, x0, w1, lsl #2 // w0<- arrayObj + index*width
1906 cmp w1, w3 // compare unsigned index, length
1907 bcs common_errArrayIndex // index >= length, bail
1908 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1909 GET_VREG w2, w9 // w2<- vAA
1910 GET_INST_OPCODE ip // extract opcode from rINST
1911 str w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
1912 GOTO_OPCODE ip // jump to next instruction
1913
1914/* ------------------------------ */
1915 .balign 128
1916.L_op_aput_wide: /* 0x4c */
1917/* File: arm64/op_aput_wide.S */
1918 /*
1919 * Array put, 64 bits. vBB[vCC] <- vAA.
1920 *
1921 */
1922 /* aput-wide vAA, vBB, vCC */
1923 FETCH w0, 1 // w0<- CCBB
1924 lsr w4, wINST, #8 // w4<- AA
1925 and w2, w0, #255 // w2<- BB
1926 lsr w3, w0, #8 // w3<- CC
1927 GET_VREG w0, w2 // w0<- vBB (array object)
1928 GET_VREG w1, w3 // w1<- vCC (requested index)
1929 cbz w0, common_errNullObject // bail if null
1930 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1931 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1932 cmp w1, w3 // compare unsigned index, length
1933 bcs common_errArrayIndex // index >= length, bail
1934 GET_VREG_WIDE x1, w4
1935 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1936 GET_INST_OPCODE ip // extract opcode from wINST
1937 str x1, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]
1938 GOTO_OPCODE ip // jump to next instruction
1939
1940/* ------------------------------ */
1941 .balign 128
1942.L_op_aput_object: /* 0x4d */
1943/* File: arm64/op_aput_object.S */
1944 /*
1945 * Store an object into an array. vBB[vCC] <- vAA.
1946 */
1947 /* op vAA, vBB, vCC */
1948 EXPORT_PC
1949 add x0, xFP, #OFF_FP_SHADOWFRAME
1950 mov x1, xPC
1951 mov w2, wINST
1952 bl MterpAputObject
1953 cbz w0, MterpPossibleException
1954 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1955 GET_INST_OPCODE ip // extract opcode from rINST
1956 GOTO_OPCODE ip // jump to next instruction
1957
1958/* ------------------------------ */
1959 .balign 128
1960.L_op_aput_boolean: /* 0x4e */
1961/* File: arm64/op_aput_boolean.S */
1962/* File: arm64/op_aput.S */
1963 /*
1964 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1965 *
1966 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1967 * instructions. We use a pair of FETCH_Bs instead.
1968 *
1969 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1970 *
1971 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1972 * If this changes, specialize.
1973 */
1974 /* op vAA, vBB, vCC */
1975 FETCH_B w2, 1, 0 // w2<- BB
1976 lsr w9, wINST, #8 // w9<- AA
1977 FETCH_B w3, 1, 1 // w3<- CC
1978 GET_VREG w0, w2 // w0<- vBB (array object)
1979 GET_VREG w1, w3 // w1<- vCC (requested index)
1980 cbz w0, common_errNullObject // bail if null
1981 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1982 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
1983 cmp w1, w3 // compare unsigned index, length
1984 bcs common_errArrayIndex // index >= length, bail
1985 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1986 GET_VREG w2, w9 // w2<- vAA
1987 GET_INST_OPCODE ip // extract opcode from rINST
1988 strb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
1989 GOTO_OPCODE ip // jump to next instruction
1990
1991
1992/* ------------------------------ */
1993 .balign 128
1994.L_op_aput_byte: /* 0x4f */
1995/* File: arm64/op_aput_byte.S */
1996/* File: arm64/op_aput.S */
1997 /*
1998 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1999 *
2000 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2001 * instructions. We use a pair of FETCH_Bs instead.
2002 *
2003 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2004 *
2005 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2006 * If this changes, specialize.
2007 */
2008 /* op vAA, vBB, vCC */
2009 FETCH_B w2, 1, 0 // w2<- BB
2010 lsr w9, wINST, #8 // w9<- AA
2011 FETCH_B w3, 1, 1 // w3<- CC
2012 GET_VREG w0, w2 // w0<- vBB (array object)
2013 GET_VREG w1, w3 // w1<- vCC (requested index)
2014 cbz w0, common_errNullObject // bail if null
2015 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2016 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2017 cmp w1, w3 // compare unsigned index, length
2018 bcs common_errArrayIndex // index >= length, bail
2019 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2020 GET_VREG w2, w9 // w2<- vAA
2021 GET_INST_OPCODE ip // extract opcode from rINST
2022 strb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2023 GOTO_OPCODE ip // jump to next instruction
2024
2025
2026/* ------------------------------ */
2027 .balign 128
2028.L_op_aput_char: /* 0x50 */
2029/* File: arm64/op_aput_char.S */
2030/* File: arm64/op_aput.S */
2031 /*
2032 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2033 *
2034 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2035 * instructions. We use a pair of FETCH_Bs instead.
2036 *
2037 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2038 *
2039 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2040 * If this changes, specialize.
2041 */
2042 /* op vAA, vBB, vCC */
2043 FETCH_B w2, 1, 0 // w2<- BB
2044 lsr w9, wINST, #8 // w9<- AA
2045 FETCH_B w3, 1, 1 // w3<- CC
2046 GET_VREG w0, w2 // w0<- vBB (array object)
2047 GET_VREG w1, w3 // w1<- vCC (requested index)
2048 cbz w0, common_errNullObject // bail if null
2049 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2050 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2051 cmp w1, w3 // compare unsigned index, length
2052 bcs common_errArrayIndex // index >= length, bail
2053 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2054 GET_VREG w2, w9 // w2<- vAA
2055 GET_INST_OPCODE ip // extract opcode from rINST
2056 strh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2057 GOTO_OPCODE ip // jump to next instruction
2058
2059
2060/* ------------------------------ */
2061 .balign 128
2062.L_op_aput_short: /* 0x51 */
2063/* File: arm64/op_aput_short.S */
2064/* File: arm64/op_aput.S */
2065 /*
2066 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2067 *
2068 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2069 * instructions. We use a pair of FETCH_Bs instead.
2070 *
2071 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2072 *
2073 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2074 * If this changes, specialize.
2075 */
2076 /* op vAA, vBB, vCC */
2077 FETCH_B w2, 1, 0 // w2<- BB
2078 lsr w9, wINST, #8 // w9<- AA
2079 FETCH_B w3, 1, 1 // w3<- CC
2080 GET_VREG w0, w2 // w0<- vBB (array object)
2081 GET_VREG w1, w3 // w1<- vCC (requested index)
2082 cbz w0, common_errNullObject // bail if null
2083 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2084 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2085 cmp w1, w3 // compare unsigned index, length
2086 bcs common_errArrayIndex // index >= length, bail
2087 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2088 GET_VREG w2, w9 // w2<- vAA
2089 GET_INST_OPCODE ip // extract opcode from rINST
2090 strh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2091 GOTO_OPCODE ip // jump to next instruction
2092
2093
2094/* ------------------------------ */
2095 .balign 128
2096.L_op_iget: /* 0x52 */
2097/* File: arm64/op_iget.S */
2098 /*
2099 * General instance field get.
2100 *
2101 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2102 */
2103 EXPORT_PC
2104 FETCH w0, 1 // w0<- field ref CCCC
2105 lsr w1, wINST, #12 // w1<- B
2106 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2107 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2108 mov x3, xSELF // w3<- self
2109 bl artGet32InstanceFromCode
2110 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002111
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002112 ubfx w2, wINST, #8, #4 // w2<- A
2113 PREFETCH_INST 2
2114 cbnz x3, MterpPossibleException // bail out
2115 .if 0
2116 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2117 .else
2118 SET_VREG w0, w2 // fp[A]<- w0
2119 .endif
2120 ADVANCE 2
2121 GET_INST_OPCODE ip // extract opcode from rINST
2122 GOTO_OPCODE ip // jump to next instruction
2123
2124/* ------------------------------ */
2125 .balign 128
2126.L_op_iget_wide: /* 0x53 */
2127/* File: arm64/op_iget_wide.S */
2128 /*
2129 * 64-bit instance field get.
2130 *
2131 * for: iget-wide
2132 */
2133 EXPORT_PC
2134 FETCH w0, 1 // w0<- field ref CCCC
2135 lsr w1, wINST, #12 // w1<- B
2136 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2137 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2138 mov x3, xSELF // w3<- self
2139 bl artGet64InstanceFromCode
2140 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2141 ubfx w2, wINST, #8, #4 // w2<- A
2142 PREFETCH_INST 2
2143 cmp w3, #0
2144 cbnz w3, MterpException // bail out
2145 SET_VREG_WIDE x0, w2
2146 ADVANCE 2
2147 GET_INST_OPCODE ip // extract opcode from wINST
2148 GOTO_OPCODE ip // jump to next instruction
2149
2150/* ------------------------------ */
2151 .balign 128
2152.L_op_iget_object: /* 0x54 */
2153/* File: arm64/op_iget_object.S */
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 artGetObjInstanceFromCode
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 1
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/* ------------------------------ */
2183 .balign 128
2184.L_op_iget_boolean: /* 0x55 */
2185/* File: arm64/op_iget_boolean.S */
2186/* File: arm64/op_iget.S */
2187 /*
2188 * General instance field get.
2189 *
2190 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2191 */
2192 EXPORT_PC
2193 FETCH w0, 1 // w0<- field ref CCCC
2194 lsr w1, wINST, #12 // w1<- B
2195 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2196 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2197 mov x3, xSELF // w3<- self
2198 bl artGetBooleanInstanceFromCode
2199 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002200 uxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002201 ubfx w2, wINST, #8, #4 // w2<- A
2202 PREFETCH_INST 2
2203 cbnz x3, MterpPossibleException // bail out
2204 .if 0
2205 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2206 .else
2207 SET_VREG w0, w2 // fp[A]<- w0
2208 .endif
2209 ADVANCE 2
2210 GET_INST_OPCODE ip // extract opcode from rINST
2211 GOTO_OPCODE ip // jump to next instruction
2212
2213
2214/* ------------------------------ */
2215 .balign 128
2216.L_op_iget_byte: /* 0x56 */
2217/* File: arm64/op_iget_byte.S */
2218/* File: arm64/op_iget.S */
2219 /*
2220 * General instance field get.
2221 *
2222 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2223 */
2224 EXPORT_PC
2225 FETCH w0, 1 // w0<- field ref CCCC
2226 lsr w1, wINST, #12 // w1<- B
2227 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2228 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2229 mov x3, xSELF // w3<- self
2230 bl artGetByteInstanceFromCode
2231 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002232 sxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002233 ubfx w2, wINST, #8, #4 // w2<- A
2234 PREFETCH_INST 2
2235 cbnz x3, MterpPossibleException // bail out
2236 .if 0
2237 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2238 .else
2239 SET_VREG w0, w2 // fp[A]<- w0
2240 .endif
2241 ADVANCE 2
2242 GET_INST_OPCODE ip // extract opcode from rINST
2243 GOTO_OPCODE ip // jump to next instruction
2244
2245
2246/* ------------------------------ */
2247 .balign 128
2248.L_op_iget_char: /* 0x57 */
2249/* File: arm64/op_iget_char.S */
2250/* File: arm64/op_iget.S */
2251 /*
2252 * General instance field get.
2253 *
2254 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2255 */
2256 EXPORT_PC
2257 FETCH w0, 1 // w0<- field ref CCCC
2258 lsr w1, wINST, #12 // w1<- B
2259 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2260 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2261 mov x3, xSELF // w3<- self
2262 bl artGetCharInstanceFromCode
2263 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002264 uxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002265 ubfx w2, wINST, #8, #4 // w2<- A
2266 PREFETCH_INST 2
2267 cbnz x3, MterpPossibleException // bail out
2268 .if 0
2269 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2270 .else
2271 SET_VREG w0, w2 // fp[A]<- w0
2272 .endif
2273 ADVANCE 2
2274 GET_INST_OPCODE ip // extract opcode from rINST
2275 GOTO_OPCODE ip // jump to next instruction
2276
2277
2278/* ------------------------------ */
2279 .balign 128
2280.L_op_iget_short: /* 0x58 */
2281/* File: arm64/op_iget_short.S */
2282/* File: arm64/op_iget.S */
2283 /*
2284 * General instance field get.
2285 *
2286 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2287 */
2288 EXPORT_PC
2289 FETCH w0, 1 // w0<- field ref CCCC
2290 lsr w1, wINST, #12 // w1<- B
2291 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2292 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2293 mov x3, xSELF // w3<- self
2294 bl artGetShortInstanceFromCode
2295 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002296 sxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002297 ubfx w2, wINST, #8, #4 // w2<- A
2298 PREFETCH_INST 2
2299 cbnz x3, MterpPossibleException // bail out
2300 .if 0
2301 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2302 .else
2303 SET_VREG w0, w2 // fp[A]<- w0
2304 .endif
2305 ADVANCE 2
2306 GET_INST_OPCODE ip // extract opcode from rINST
2307 GOTO_OPCODE ip // jump to next instruction
2308
2309
2310/* ------------------------------ */
2311 .balign 128
2312.L_op_iput: /* 0x59 */
2313/* File: arm64/op_iput.S */
2314 /*
2315 * General 32-bit instance field put.
2316 *
2317 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2318 */
2319 /* op vA, vB, field//CCCC */
2320 .extern artSet32InstanceFromMterp
2321 EXPORT_PC
2322 FETCH w0, 1 // w0<- field ref CCCC
2323 lsr w1, wINST, #12 // w1<- B
2324 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2325 ubfx w2, wINST, #8, #4 // w2<- A
2326 GET_VREG w2, w2 // w2<- fp[A]
2327 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2328 PREFETCH_INST 2
2329 bl artSet32InstanceFromMterp
2330 cbnz w0, MterpPossibleException
2331 ADVANCE 2 // advance rPC
2332 GET_INST_OPCODE ip // extract opcode from rINST
2333 GOTO_OPCODE ip // jump to next instruction
2334
2335/* ------------------------------ */
2336 .balign 128
2337.L_op_iput_wide: /* 0x5a */
2338/* File: arm64/op_iput_wide.S */
2339 /* iput-wide vA, vB, field//CCCC */
2340 .extern artSet64InstanceFromMterp
2341 EXPORT_PC
2342 FETCH w0, 1 // w0<- field ref CCCC
2343 lsr w1, wINST, #12 // w1<- B
2344 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2345 ubfx w2, wINST, #8, #4 // w2<- A
buzbeeace690f2016-03-11 09:51:11 -08002346 VREG_INDEX_TO_ADDR x2, x2 // w2<- &fp[A]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002347 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2348 PREFETCH_INST 2
2349 bl artSet64InstanceFromMterp
2350 cbnz w0, MterpPossibleException
2351 ADVANCE 2 // advance rPC
2352 GET_INST_OPCODE ip // extract opcode from wINST
2353 GOTO_OPCODE ip // jump to next instruction
2354
2355/* ------------------------------ */
2356 .balign 128
2357.L_op_iput_object: /* 0x5b */
2358/* File: arm64/op_iput_object.S */
2359 EXPORT_PC
2360 add x0, xFP, #OFF_FP_SHADOWFRAME
2361 mov x1, xPC
2362 mov w2, wINST
2363 mov x3, xSELF
2364 bl MterpIputObject
2365 cbz w0, MterpException
2366 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2367 GET_INST_OPCODE ip // extract opcode from rINST
2368 GOTO_OPCODE ip // jump to next instruction
2369
2370/* ------------------------------ */
2371 .balign 128
2372.L_op_iput_boolean: /* 0x5c */
2373/* File: arm64/op_iput_boolean.S */
2374/* File: arm64/op_iput.S */
2375 /*
2376 * General 32-bit instance field put.
2377 *
2378 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2379 */
2380 /* op vA, vB, field//CCCC */
2381 .extern artSet8InstanceFromMterp
2382 EXPORT_PC
2383 FETCH w0, 1 // w0<- field ref CCCC
2384 lsr w1, wINST, #12 // w1<- B
2385 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2386 ubfx w2, wINST, #8, #4 // w2<- A
2387 GET_VREG w2, w2 // w2<- fp[A]
2388 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2389 PREFETCH_INST 2
2390 bl artSet8InstanceFromMterp
2391 cbnz w0, MterpPossibleException
2392 ADVANCE 2 // advance rPC
2393 GET_INST_OPCODE ip // extract opcode from rINST
2394 GOTO_OPCODE ip // jump to next instruction
2395
2396
2397/* ------------------------------ */
2398 .balign 128
2399.L_op_iput_byte: /* 0x5d */
2400/* File: arm64/op_iput_byte.S */
2401/* File: arm64/op_iput.S */
2402 /*
2403 * General 32-bit instance field put.
2404 *
2405 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2406 */
2407 /* op vA, vB, field//CCCC */
2408 .extern artSet8InstanceFromMterp
2409 EXPORT_PC
2410 FETCH w0, 1 // w0<- field ref CCCC
2411 lsr w1, wINST, #12 // w1<- B
2412 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2413 ubfx w2, wINST, #8, #4 // w2<- A
2414 GET_VREG w2, w2 // w2<- fp[A]
2415 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2416 PREFETCH_INST 2
2417 bl artSet8InstanceFromMterp
2418 cbnz w0, MterpPossibleException
2419 ADVANCE 2 // advance rPC
2420 GET_INST_OPCODE ip // extract opcode from rINST
2421 GOTO_OPCODE ip // jump to next instruction
2422
2423
2424/* ------------------------------ */
2425 .balign 128
2426.L_op_iput_char: /* 0x5e */
2427/* File: arm64/op_iput_char.S */
2428/* File: arm64/op_iput.S */
2429 /*
2430 * General 32-bit instance field put.
2431 *
2432 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2433 */
2434 /* op vA, vB, field//CCCC */
2435 .extern artSet16InstanceFromMterp
2436 EXPORT_PC
2437 FETCH w0, 1 // w0<- field ref CCCC
2438 lsr w1, wINST, #12 // w1<- B
2439 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2440 ubfx w2, wINST, #8, #4 // w2<- A
2441 GET_VREG w2, w2 // w2<- fp[A]
2442 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2443 PREFETCH_INST 2
2444 bl artSet16InstanceFromMterp
2445 cbnz w0, MterpPossibleException
2446 ADVANCE 2 // advance rPC
2447 GET_INST_OPCODE ip // extract opcode from rINST
2448 GOTO_OPCODE ip // jump to next instruction
2449
2450
2451/* ------------------------------ */
2452 .balign 128
2453.L_op_iput_short: /* 0x5f */
2454/* File: arm64/op_iput_short.S */
2455/* File: arm64/op_iput.S */
2456 /*
2457 * General 32-bit instance field put.
2458 *
2459 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2460 */
2461 /* op vA, vB, field//CCCC */
2462 .extern artSet16InstanceFromMterp
2463 EXPORT_PC
2464 FETCH w0, 1 // w0<- field ref CCCC
2465 lsr w1, wINST, #12 // w1<- B
2466 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2467 ubfx w2, wINST, #8, #4 // w2<- A
2468 GET_VREG w2, w2 // w2<- fp[A]
2469 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2470 PREFETCH_INST 2
2471 bl artSet16InstanceFromMterp
2472 cbnz w0, MterpPossibleException
2473 ADVANCE 2 // advance rPC
2474 GET_INST_OPCODE ip // extract opcode from rINST
2475 GOTO_OPCODE ip // jump to next instruction
2476
2477
2478/* ------------------------------ */
2479 .balign 128
2480.L_op_sget: /* 0x60 */
2481/* File: arm64/op_sget.S */
2482 /*
2483 * General SGET handler wrapper.
2484 *
2485 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2486 */
2487 /* op vAA, field//BBBB */
2488
2489 .extern artGet32StaticFromCode
2490 EXPORT_PC
2491 FETCH w0, 1 // w0<- field ref BBBB
2492 ldr x1, [xFP, #OFF_FP_METHOD]
2493 mov x2, xSELF
2494 bl artGet32StaticFromCode
2495 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2496 lsr w2, wINST, #8 // w2<- AA
2497
2498 PREFETCH_INST 2
2499 cbnz x3, MterpException // bail out
2500.if 0
2501 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2502.else
2503 SET_VREG w0, w2 // fp[AA]<- w0
2504.endif
2505 ADVANCE 2
2506 GET_INST_OPCODE ip // extract opcode from rINST
2507 GOTO_OPCODE ip
2508
2509/* ------------------------------ */
2510 .balign 128
2511.L_op_sget_wide: /* 0x61 */
2512/* File: arm64/op_sget_wide.S */
2513 /*
2514 * SGET_WIDE handler wrapper.
2515 *
2516 */
2517 /* sget-wide vAA, field//BBBB */
2518
2519 .extern artGet64StaticFromCode
2520 EXPORT_PC
2521 FETCH w0, 1 // w0<- field ref BBBB
2522 ldr x1, [xFP, #OFF_FP_METHOD]
2523 mov x2, xSELF
2524 bl artGet64StaticFromCode
2525 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2526 lsr w4, wINST, #8 // w4<- AA
2527 cbnz x3, MterpException // bail out
2528 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2529 SET_VREG_WIDE x0, w4
2530 GET_INST_OPCODE ip // extract opcode from wINST
2531 GOTO_OPCODE ip // jump to next instruction
2532
2533/* ------------------------------ */
2534 .balign 128
2535.L_op_sget_object: /* 0x62 */
2536/* File: arm64/op_sget_object.S */
2537/* File: arm64/op_sget.S */
2538 /*
2539 * General SGET handler wrapper.
2540 *
2541 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2542 */
2543 /* op vAA, field//BBBB */
2544
2545 .extern artGetObjStaticFromCode
2546 EXPORT_PC
2547 FETCH w0, 1 // w0<- field ref BBBB
2548 ldr x1, [xFP, #OFF_FP_METHOD]
2549 mov x2, xSELF
2550 bl artGetObjStaticFromCode
2551 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2552 lsr w2, wINST, #8 // w2<- AA
2553
2554 PREFETCH_INST 2
2555 cbnz x3, MterpException // bail out
2556.if 1
2557 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2558.else
2559 SET_VREG w0, w2 // fp[AA]<- w0
2560.endif
2561 ADVANCE 2
2562 GET_INST_OPCODE ip // extract opcode from rINST
2563 GOTO_OPCODE ip
2564
2565
2566/* ------------------------------ */
2567 .balign 128
2568.L_op_sget_boolean: /* 0x63 */
2569/* File: arm64/op_sget_boolean.S */
2570/* File: arm64/op_sget.S */
2571 /*
2572 * General SGET handler wrapper.
2573 *
2574 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2575 */
2576 /* op vAA, field//BBBB */
2577
2578 .extern artGetBooleanStaticFromCode
2579 EXPORT_PC
2580 FETCH w0, 1 // w0<- field ref BBBB
2581 ldr x1, [xFP, #OFF_FP_METHOD]
2582 mov x2, xSELF
2583 bl artGetBooleanStaticFromCode
2584 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2585 lsr w2, wINST, #8 // w2<- AA
2586 uxtb w0, w0
2587 PREFETCH_INST 2
2588 cbnz x3, MterpException // bail out
2589.if 0
2590 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2591.else
2592 SET_VREG w0, w2 // fp[AA]<- w0
2593.endif
2594 ADVANCE 2
2595 GET_INST_OPCODE ip // extract opcode from rINST
2596 GOTO_OPCODE ip
2597
2598
2599/* ------------------------------ */
2600 .balign 128
2601.L_op_sget_byte: /* 0x64 */
2602/* File: arm64/op_sget_byte.S */
2603/* File: arm64/op_sget.S */
2604 /*
2605 * General SGET handler wrapper.
2606 *
2607 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2608 */
2609 /* op vAA, field//BBBB */
2610
2611 .extern artGetByteStaticFromCode
2612 EXPORT_PC
2613 FETCH w0, 1 // w0<- field ref BBBB
2614 ldr x1, [xFP, #OFF_FP_METHOD]
2615 mov x2, xSELF
2616 bl artGetByteStaticFromCode
2617 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2618 lsr w2, wINST, #8 // w2<- AA
2619 sxtb w0, w0
2620 PREFETCH_INST 2
2621 cbnz x3, MterpException // bail out
2622.if 0
2623 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2624.else
2625 SET_VREG w0, w2 // fp[AA]<- w0
2626.endif
2627 ADVANCE 2
2628 GET_INST_OPCODE ip // extract opcode from rINST
2629 GOTO_OPCODE ip
2630
2631
2632/* ------------------------------ */
2633 .balign 128
2634.L_op_sget_char: /* 0x65 */
2635/* File: arm64/op_sget_char.S */
2636/* File: arm64/op_sget.S */
2637 /*
2638 * General SGET handler wrapper.
2639 *
2640 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2641 */
2642 /* op vAA, field//BBBB */
2643
2644 .extern artGetCharStaticFromCode
2645 EXPORT_PC
2646 FETCH w0, 1 // w0<- field ref BBBB
2647 ldr x1, [xFP, #OFF_FP_METHOD]
2648 mov x2, xSELF
2649 bl artGetCharStaticFromCode
2650 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2651 lsr w2, wINST, #8 // w2<- AA
2652 uxth w0, w0
2653 PREFETCH_INST 2
2654 cbnz x3, MterpException // bail out
2655.if 0
2656 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2657.else
2658 SET_VREG w0, w2 // fp[AA]<- w0
2659.endif
2660 ADVANCE 2
2661 GET_INST_OPCODE ip // extract opcode from rINST
2662 GOTO_OPCODE ip
2663
2664
2665/* ------------------------------ */
2666 .balign 128
2667.L_op_sget_short: /* 0x66 */
2668/* File: arm64/op_sget_short.S */
2669/* File: arm64/op_sget.S */
2670 /*
2671 * General SGET handler wrapper.
2672 *
2673 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2674 */
2675 /* op vAA, field//BBBB */
2676
2677 .extern artGetShortStaticFromCode
2678 EXPORT_PC
2679 FETCH w0, 1 // w0<- field ref BBBB
2680 ldr x1, [xFP, #OFF_FP_METHOD]
2681 mov x2, xSELF
2682 bl artGetShortStaticFromCode
2683 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2684 lsr w2, wINST, #8 // w2<- AA
2685 sxth w0, w0
2686 PREFETCH_INST 2
2687 cbnz x3, MterpException // bail out
2688.if 0
2689 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2690.else
2691 SET_VREG w0, w2 // fp[AA]<- w0
2692.endif
2693 ADVANCE 2
2694 GET_INST_OPCODE ip // extract opcode from rINST
2695 GOTO_OPCODE ip
2696
2697
2698/* ------------------------------ */
2699 .balign 128
2700.L_op_sput: /* 0x67 */
2701/* File: arm64/op_sput.S */
2702 /*
2703 * General SPUT handler wrapper.
2704 *
2705 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2706 */
2707 /* op vAA, field//BBBB */
2708 EXPORT_PC
2709 FETCH w0, 1 // r0<- field ref BBBB
2710 lsr w3, wINST, #8 // r3<- AA
2711 GET_VREG w1, w3 // r1<= fp[AA]
2712 ldr x2, [xFP, #OFF_FP_METHOD]
2713 mov x3, xSELF
2714 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2715 bl artSet32StaticFromCode
2716 cbnz w0, MterpException // 0 on success
2717 ADVANCE 2 // Past exception point - now advance rPC
2718 GET_INST_OPCODE ip // extract opcode from rINST
2719 GOTO_OPCODE ip // jump to next instruction
2720
2721/* ------------------------------ */
2722 .balign 128
2723.L_op_sput_wide: /* 0x68 */
2724/* File: arm64/op_sput_wide.S */
2725 /*
2726 * SPUT_WIDE handler wrapper.
2727 *
2728 */
2729 /* sput-wide vAA, field//BBBB */
2730 .extern artSet64IndirectStaticFromMterp
2731 EXPORT_PC
2732 FETCH w0, 1 // w0<- field ref BBBB
2733 ldr x1, [xFP, #OFF_FP_METHOD]
2734 lsr w2, wINST, #8 // w3<- AA
buzbeeace690f2016-03-11 09:51:11 -08002735 VREG_INDEX_TO_ADDR x2, w2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002736 mov x3, xSELF
2737 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2738 bl artSet64IndirectStaticFromMterp
2739 cbnz w0, MterpException // 0 on success, -1 on failure
2740 ADVANCE 2 // Past exception point - now advance rPC
2741 GET_INST_OPCODE ip // extract opcode from wINST
2742 GOTO_OPCODE ip // jump to next instruction
2743
2744/* ------------------------------ */
2745 .balign 128
2746.L_op_sput_object: /* 0x69 */
2747/* File: arm64/op_sput_object.S */
2748 EXPORT_PC
2749 add x0, xFP, #OFF_FP_SHADOWFRAME
2750 mov x1, xPC
2751 mov x2, xINST
2752 mov x3, xSELF
2753 bl MterpSputObject
2754 cbz w0, MterpException
2755 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2756 GET_INST_OPCODE ip // extract opcode from rINST
2757 GOTO_OPCODE ip // jump to next instruction
2758
2759/* ------------------------------ */
2760 .balign 128
2761.L_op_sput_boolean: /* 0x6a */
2762/* File: arm64/op_sput_boolean.S */
2763/* File: arm64/op_sput.S */
2764 /*
2765 * General SPUT handler wrapper.
2766 *
2767 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2768 */
2769 /* op vAA, field//BBBB */
2770 EXPORT_PC
2771 FETCH w0, 1 // r0<- field ref BBBB
2772 lsr w3, wINST, #8 // r3<- AA
2773 GET_VREG w1, w3 // r1<= fp[AA]
2774 ldr x2, [xFP, #OFF_FP_METHOD]
2775 mov x3, xSELF
2776 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2777 bl artSet8StaticFromCode
2778 cbnz w0, MterpException // 0 on success
2779 ADVANCE 2 // Past exception point - now advance rPC
2780 GET_INST_OPCODE ip // extract opcode from rINST
2781 GOTO_OPCODE ip // jump to next instruction
2782
2783
2784/* ------------------------------ */
2785 .balign 128
2786.L_op_sput_byte: /* 0x6b */
2787/* File: arm64/op_sput_byte.S */
2788/* File: arm64/op_sput.S */
2789 /*
2790 * General SPUT handler wrapper.
2791 *
2792 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2793 */
2794 /* op vAA, field//BBBB */
2795 EXPORT_PC
2796 FETCH w0, 1 // r0<- field ref BBBB
2797 lsr w3, wINST, #8 // r3<- AA
2798 GET_VREG w1, w3 // r1<= fp[AA]
2799 ldr x2, [xFP, #OFF_FP_METHOD]
2800 mov x3, xSELF
2801 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2802 bl artSet8StaticFromCode
2803 cbnz w0, MterpException // 0 on success
2804 ADVANCE 2 // Past exception point - now advance rPC
2805 GET_INST_OPCODE ip // extract opcode from rINST
2806 GOTO_OPCODE ip // jump to next instruction
2807
2808
2809/* ------------------------------ */
2810 .balign 128
2811.L_op_sput_char: /* 0x6c */
2812/* File: arm64/op_sput_char.S */
2813/* File: arm64/op_sput.S */
2814 /*
2815 * General SPUT handler wrapper.
2816 *
2817 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2818 */
2819 /* op vAA, field//BBBB */
2820 EXPORT_PC
2821 FETCH w0, 1 // r0<- field ref BBBB
2822 lsr w3, wINST, #8 // r3<- AA
2823 GET_VREG w1, w3 // r1<= fp[AA]
2824 ldr x2, [xFP, #OFF_FP_METHOD]
2825 mov x3, xSELF
2826 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2827 bl artSet16StaticFromCode
2828 cbnz w0, MterpException // 0 on success
2829 ADVANCE 2 // Past exception point - now advance rPC
2830 GET_INST_OPCODE ip // extract opcode from rINST
2831 GOTO_OPCODE ip // jump to next instruction
2832
2833
2834/* ------------------------------ */
2835 .balign 128
2836.L_op_sput_short: /* 0x6d */
2837/* File: arm64/op_sput_short.S */
2838/* File: arm64/op_sput.S */
2839 /*
2840 * General SPUT handler wrapper.
2841 *
2842 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2843 */
2844 /* op vAA, field//BBBB */
2845 EXPORT_PC
2846 FETCH w0, 1 // r0<- field ref BBBB
2847 lsr w3, wINST, #8 // r3<- AA
2848 GET_VREG w1, w3 // r1<= fp[AA]
2849 ldr x2, [xFP, #OFF_FP_METHOD]
2850 mov x3, xSELF
2851 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2852 bl artSet16StaticFromCode
2853 cbnz w0, MterpException // 0 on success
2854 ADVANCE 2 // Past exception point - now advance rPC
2855 GET_INST_OPCODE ip // extract opcode from rINST
2856 GOTO_OPCODE ip // jump to next instruction
2857
2858
2859/* ------------------------------ */
2860 .balign 128
2861.L_op_invoke_virtual: /* 0x6e */
2862/* File: arm64/op_invoke_virtual.S */
2863/* File: arm64/invoke.S */
2864 /*
2865 * Generic invoke handler wrapper.
2866 */
2867 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2868 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2869 .extern MterpInvokeVirtual
2870 EXPORT_PC
2871 mov x0, xSELF
2872 add x1, xFP, #OFF_FP_SHADOWFRAME
2873 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002874 mov x3, xINST
2875 bl MterpInvokeVirtual
2876 cbz w0, MterpException
2877 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002878 bl MterpShouldSwitchInterpreters
2879 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002880 GET_INST_OPCODE ip
2881 GOTO_OPCODE ip
2882
2883
2884 /*
2885 * Handle a virtual method call.
2886 *
2887 * for: invoke-virtual, invoke-virtual/range
2888 */
2889 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2890 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2891
2892/* ------------------------------ */
2893 .balign 128
2894.L_op_invoke_super: /* 0x6f */
2895/* File: arm64/op_invoke_super.S */
2896/* File: arm64/invoke.S */
2897 /*
2898 * Generic invoke handler wrapper.
2899 */
2900 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2901 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2902 .extern MterpInvokeSuper
2903 EXPORT_PC
2904 mov x0, xSELF
2905 add x1, xFP, #OFF_FP_SHADOWFRAME
2906 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002907 mov x3, xINST
2908 bl MterpInvokeSuper
2909 cbz w0, MterpException
2910 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002911 bl MterpShouldSwitchInterpreters
2912 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002913 GET_INST_OPCODE ip
2914 GOTO_OPCODE ip
2915
2916
2917 /*
2918 * Handle a "super" method call.
2919 *
2920 * for: invoke-super, invoke-super/range
2921 */
2922 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2923 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2924
2925/* ------------------------------ */
2926 .balign 128
2927.L_op_invoke_direct: /* 0x70 */
2928/* File: arm64/op_invoke_direct.S */
2929/* File: arm64/invoke.S */
2930 /*
2931 * Generic invoke handler wrapper.
2932 */
2933 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2934 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2935 .extern MterpInvokeDirect
2936 EXPORT_PC
2937 mov x0, xSELF
2938 add x1, xFP, #OFF_FP_SHADOWFRAME
2939 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002940 mov x3, xINST
2941 bl MterpInvokeDirect
2942 cbz w0, MterpException
2943 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002944 bl MterpShouldSwitchInterpreters
2945 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002946 GET_INST_OPCODE ip
2947 GOTO_OPCODE ip
2948
2949
2950
2951/* ------------------------------ */
2952 .balign 128
2953.L_op_invoke_static: /* 0x71 */
2954/* File: arm64/op_invoke_static.S */
2955/* File: arm64/invoke.S */
2956 /*
2957 * Generic invoke handler wrapper.
2958 */
2959 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2960 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2961 .extern MterpInvokeStatic
2962 EXPORT_PC
2963 mov x0, xSELF
2964 add x1, xFP, #OFF_FP_SHADOWFRAME
2965 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002966 mov x3, xINST
2967 bl MterpInvokeStatic
2968 cbz w0, MterpException
2969 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002970 bl MterpShouldSwitchInterpreters
2971 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002972 GET_INST_OPCODE ip
2973 GOTO_OPCODE ip
2974
2975
2976
2977
2978/* ------------------------------ */
2979 .balign 128
2980.L_op_invoke_interface: /* 0x72 */
2981/* File: arm64/op_invoke_interface.S */
2982/* File: arm64/invoke.S */
2983 /*
2984 * Generic invoke handler wrapper.
2985 */
2986 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2987 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2988 .extern MterpInvokeInterface
2989 EXPORT_PC
2990 mov x0, xSELF
2991 add x1, xFP, #OFF_FP_SHADOWFRAME
2992 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002993 mov x3, xINST
2994 bl MterpInvokeInterface
2995 cbz w0, MterpException
2996 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002997 bl MterpShouldSwitchInterpreters
2998 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002999 GET_INST_OPCODE ip
3000 GOTO_OPCODE ip
3001
3002
3003 /*
3004 * Handle an interface method call.
3005 *
3006 * for: invoke-interface, invoke-interface/range
3007 */
3008 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3009 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3010
3011/* ------------------------------ */
3012 .balign 128
3013.L_op_return_void_no_barrier: /* 0x73 */
3014/* File: arm64/op_return_void_no_barrier.S */
3015 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
3016 mov x0, xSELF
3017 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3018 b.ne .Lop_return_void_no_barrier_check
3019.Lop_return_void_no_barrier_return:
3020 mov x0, #0
3021 b MterpReturn
3022.Lop_return_void_no_barrier_check:
3023 bl MterpSuspendCheck // (self)
3024 b .Lop_return_void_no_barrier_return
3025
3026/* ------------------------------ */
3027 .balign 128
3028.L_op_invoke_virtual_range: /* 0x74 */
3029/* File: arm64/op_invoke_virtual_range.S */
3030/* File: arm64/invoke.S */
3031 /*
3032 * Generic invoke handler wrapper.
3033 */
3034 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3035 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3036 .extern MterpInvokeVirtualRange
3037 EXPORT_PC
3038 mov x0, xSELF
3039 add x1, xFP, #OFF_FP_SHADOWFRAME
3040 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003041 mov x3, xINST
3042 bl MterpInvokeVirtualRange
3043 cbz w0, MterpException
3044 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003045 bl MterpShouldSwitchInterpreters
3046 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003047 GET_INST_OPCODE ip
3048 GOTO_OPCODE ip
3049
3050
3051
3052/* ------------------------------ */
3053 .balign 128
3054.L_op_invoke_super_range: /* 0x75 */
3055/* File: arm64/op_invoke_super_range.S */
3056/* File: arm64/invoke.S */
3057 /*
3058 * Generic invoke handler wrapper.
3059 */
3060 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3061 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3062 .extern MterpInvokeSuperRange
3063 EXPORT_PC
3064 mov x0, xSELF
3065 add x1, xFP, #OFF_FP_SHADOWFRAME
3066 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003067 mov x3, xINST
3068 bl MterpInvokeSuperRange
3069 cbz w0, MterpException
3070 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003071 bl MterpShouldSwitchInterpreters
3072 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003073 GET_INST_OPCODE ip
3074 GOTO_OPCODE ip
3075
3076
3077
3078/* ------------------------------ */
3079 .balign 128
3080.L_op_invoke_direct_range: /* 0x76 */
3081/* File: arm64/op_invoke_direct_range.S */
3082/* File: arm64/invoke.S */
3083 /*
3084 * Generic invoke handler wrapper.
3085 */
3086 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3087 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3088 .extern MterpInvokeDirectRange
3089 EXPORT_PC
3090 mov x0, xSELF
3091 add x1, xFP, #OFF_FP_SHADOWFRAME
3092 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003093 mov x3, xINST
3094 bl MterpInvokeDirectRange
3095 cbz w0, MterpException
3096 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003097 bl MterpShouldSwitchInterpreters
3098 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003099 GET_INST_OPCODE ip
3100 GOTO_OPCODE ip
3101
3102
3103
3104/* ------------------------------ */
3105 .balign 128
3106.L_op_invoke_static_range: /* 0x77 */
3107/* File: arm64/op_invoke_static_range.S */
3108/* File: arm64/invoke.S */
3109 /*
3110 * Generic invoke handler wrapper.
3111 */
3112 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3113 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3114 .extern MterpInvokeStaticRange
3115 EXPORT_PC
3116 mov x0, xSELF
3117 add x1, xFP, #OFF_FP_SHADOWFRAME
3118 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003119 mov x3, xINST
3120 bl MterpInvokeStaticRange
3121 cbz w0, MterpException
3122 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003123 bl MterpShouldSwitchInterpreters
3124 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003125 GET_INST_OPCODE ip
3126 GOTO_OPCODE ip
3127
3128
3129
3130/* ------------------------------ */
3131 .balign 128
3132.L_op_invoke_interface_range: /* 0x78 */
3133/* File: arm64/op_invoke_interface_range.S */
3134/* File: arm64/invoke.S */
3135 /*
3136 * Generic invoke handler wrapper.
3137 */
3138 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3139 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3140 .extern MterpInvokeInterfaceRange
3141 EXPORT_PC
3142 mov x0, xSELF
3143 add x1, xFP, #OFF_FP_SHADOWFRAME
3144 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003145 mov x3, xINST
3146 bl MterpInvokeInterfaceRange
3147 cbz w0, MterpException
3148 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003149 bl MterpShouldSwitchInterpreters
3150 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003151 GET_INST_OPCODE ip
3152 GOTO_OPCODE ip
3153
3154
3155
3156/* ------------------------------ */
3157 .balign 128
3158.L_op_unused_79: /* 0x79 */
3159/* File: arm64/op_unused_79.S */
3160/* File: arm64/unused.S */
3161/*
3162 * Bail to reference interpreter to throw.
3163 */
3164 b MterpFallback
3165
3166
3167/* ------------------------------ */
3168 .balign 128
3169.L_op_unused_7a: /* 0x7a */
3170/* File: arm64/op_unused_7a.S */
3171/* File: arm64/unused.S */
3172/*
3173 * Bail to reference interpreter to throw.
3174 */
3175 b MterpFallback
3176
3177
3178/* ------------------------------ */
3179 .balign 128
3180.L_op_neg_int: /* 0x7b */
3181/* File: arm64/op_neg_int.S */
3182/* File: arm64/unop.S */
3183 /*
3184 * Generic 32-bit unary operation. Provide an "instr" line that
3185 * specifies an instruction that performs "result = op w0".
3186 * This could be an ARM instruction or a function call.
3187 *
3188 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3189 * int-to-byte, int-to-char, int-to-short
3190 */
3191 /* unop vA, vB */
3192 lsr w3, wINST, #12 // w3<- B
3193 GET_VREG w0, w3 // w0<- vB
3194 ubfx w9, wINST, #8, #4 // w9<- A
3195 // optional op; may set condition codes
3196 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3197 sub w0, wzr, w0 // w0<- op, w0-w3 changed
3198 GET_INST_OPCODE ip // extract opcode from rINST
3199 SET_VREG w0, w9 // vAA<- w0
3200 GOTO_OPCODE ip // jump to next instruction
3201 /* 8-9 instructions */
3202
3203
3204/* ------------------------------ */
3205 .balign 128
3206.L_op_not_int: /* 0x7c */
3207/* File: arm64/op_not_int.S */
3208/* File: arm64/unop.S */
3209 /*
3210 * Generic 32-bit unary operation. Provide an "instr" line that
3211 * specifies an instruction that performs "result = op w0".
3212 * This could be an ARM instruction or a function call.
3213 *
3214 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3215 * int-to-byte, int-to-char, int-to-short
3216 */
3217 /* unop vA, vB */
3218 lsr w3, wINST, #12 // w3<- B
3219 GET_VREG w0, w3 // w0<- vB
3220 ubfx w9, wINST, #8, #4 // w9<- A
3221 // optional op; may set condition codes
3222 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3223 mvn w0, w0 // w0<- op, w0-w3 changed
3224 GET_INST_OPCODE ip // extract opcode from rINST
3225 SET_VREG w0, w9 // vAA<- w0
3226 GOTO_OPCODE ip // jump to next instruction
3227 /* 8-9 instructions */
3228
3229
3230/* ------------------------------ */
3231 .balign 128
3232.L_op_neg_long: /* 0x7d */
3233/* File: arm64/op_neg_long.S */
3234/* File: arm64/unopWide.S */
3235 /*
3236 * Generic 64-bit unary operation. Provide an "instr" line that
3237 * specifies an instruction that performs "result = op x0".
3238 *
3239 * For: neg-long, not-long
3240 */
3241 /* unop vA, vB */
3242 lsr w3, wINST, #12 // w3<- B
3243 ubfx w4, wINST, #8, #4 // w4<- A
3244 GET_VREG_WIDE x0, w3
3245 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3246
3247 sub x0, xzr, x0
3248 GET_INST_OPCODE ip // extract opcode from wINST
3249 SET_VREG_WIDE x0, w4
3250 GOTO_OPCODE ip // jump to next instruction
3251 /* 10-11 instructions */
3252
3253
3254/* ------------------------------ */
3255 .balign 128
3256.L_op_not_long: /* 0x7e */
3257/* File: arm64/op_not_long.S */
3258/* File: arm64/unopWide.S */
3259 /*
3260 * Generic 64-bit unary operation. Provide an "instr" line that
3261 * specifies an instruction that performs "result = op x0".
3262 *
3263 * For: neg-long, not-long
3264 */
3265 /* unop vA, vB */
3266 lsr w3, wINST, #12 // w3<- B
3267 ubfx w4, wINST, #8, #4 // w4<- A
3268 GET_VREG_WIDE x0, w3
3269 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3270
3271 mvn x0, x0
3272 GET_INST_OPCODE ip // extract opcode from wINST
3273 SET_VREG_WIDE x0, w4
3274 GOTO_OPCODE ip // jump to next instruction
3275 /* 10-11 instructions */
3276
3277
3278/* ------------------------------ */
3279 .balign 128
3280.L_op_neg_float: /* 0x7f */
3281/* File: arm64/op_neg_float.S */
3282/* File: arm64/unop.S */
3283 /*
3284 * Generic 32-bit unary operation. Provide an "instr" line that
3285 * specifies an instruction that performs "result = op w0".
3286 * This could be an ARM instruction or a function call.
3287 *
3288 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3289 * int-to-byte, int-to-char, int-to-short
3290 */
3291 /* unop vA, vB */
3292 lsr w3, wINST, #12 // w3<- B
3293 GET_VREG w0, w3 // w0<- vB
3294 ubfx w9, wINST, #8, #4 // w9<- A
3295 mov w4, #0x80000000 // optional op; may set condition codes
3296 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3297 add w0, w0, w4 // w0<- op, w0-w3 changed
3298 GET_INST_OPCODE ip // extract opcode from rINST
3299 SET_VREG w0, w9 // vAA<- w0
3300 GOTO_OPCODE ip // jump to next instruction
3301 /* 8-9 instructions */
3302
3303
3304/* ------------------------------ */
3305 .balign 128
3306.L_op_neg_double: /* 0x80 */
3307/* File: arm64/op_neg_double.S */
3308/* File: arm64/unopWide.S */
3309 /*
3310 * Generic 64-bit unary operation. Provide an "instr" line that
3311 * specifies an instruction that performs "result = op x0".
3312 *
3313 * For: neg-long, not-long
3314 */
3315 /* unop vA, vB */
3316 lsr w3, wINST, #12 // w3<- B
3317 ubfx w4, wINST, #8, #4 // w4<- A
3318 GET_VREG_WIDE x0, w3
3319 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3320 mov x1, #0x8000000000000000
3321 add x0, x0, x1
3322 GET_INST_OPCODE ip // extract opcode from wINST
3323 SET_VREG_WIDE x0, w4
3324 GOTO_OPCODE ip // jump to next instruction
3325 /* 10-11 instructions */
3326
3327
3328/* ------------------------------ */
3329 .balign 128
3330.L_op_int_to_long: /* 0x81 */
3331/* File: arm64/op_int_to_long.S */
3332/* File: arm64/funopWider.S */
3333 /*
3334 * Generic 32bit-to-64bit floating point unary operation. Provide an
3335 * "instr" line that specifies an instruction that performs "x0 = op w0".
3336 *
3337 * For: int-to-double, float-to-double, float-to-long
3338 */
3339 /* unop vA, vB */
3340 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003341 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003342 GET_VREG w0, w3
3343 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Markoe6220222016-07-20 14:25:30 +01003344 sxtw x0, w0 // d0<- op
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003345 GET_INST_OPCODE ip // extract opcode from wINST
3346 SET_VREG_WIDE x0, w4 // vA<- d0
3347 GOTO_OPCODE ip // jump to next instruction
3348
3349
3350/* ------------------------------ */
3351 .balign 128
3352.L_op_int_to_float: /* 0x82 */
3353/* File: arm64/op_int_to_float.S */
3354/* File: arm64/funopNarrow.S */
3355 /*
3356 * Generic 32bit-to-32bit floating point unary operation. Provide an
3357 * "instr" line that specifies an instruction that performs "s0 = op w0".
3358 *
3359 * For: int-to-float, float-to-int
3360 * TODO: refactor all of the conversions - parameterize width and use same template.
3361 */
3362 /* unop vA, vB */
3363 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003364 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003365 GET_VREG w0, w3
3366 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003367 scvtf s0, w0 // d0<- op
3368 GET_INST_OPCODE ip // extract opcode from wINST
3369 SET_VREG s0, w4 // vA<- d0
3370 GOTO_OPCODE ip // jump to next instruction
3371
3372
3373/* ------------------------------ */
3374 .balign 128
3375.L_op_int_to_double: /* 0x83 */
3376/* File: arm64/op_int_to_double.S */
3377/* File: arm64/funopWider.S */
3378 /*
3379 * Generic 32bit-to-64bit floating point unary operation. Provide an
3380 * "instr" line that specifies an instruction that performs "d0 = op w0".
3381 *
3382 * For: int-to-double, float-to-double, float-to-long
3383 */
3384 /* unop vA, vB */
3385 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003386 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003387 GET_VREG w0, w3
3388 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003389 scvtf d0, w0 // d0<- op
3390 GET_INST_OPCODE ip // extract opcode from wINST
3391 SET_VREG_WIDE d0, w4 // vA<- d0
3392 GOTO_OPCODE ip // jump to next instruction
3393
3394
3395/* ------------------------------ */
3396 .balign 128
3397.L_op_long_to_int: /* 0x84 */
3398/* File: arm64/op_long_to_int.S */
3399/* File: arm64/funopNarrower.S */
3400 /*
3401 * Generic 64bit-to-32bit floating point unary operation. Provide an
3402 * "instr" line that specifies an instruction that performs "w0 = op x0".
3403 *
3404 * For: int-to-double, float-to-double, float-to-long
3405 */
3406 /* unop vA, vB */
3407 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003408 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003409 GET_VREG_WIDE x0, w3
3410 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003411 // d0<- op
3412 GET_INST_OPCODE ip // extract opcode from wINST
3413 SET_VREG w0, w4 // vA<- d0
3414 GOTO_OPCODE ip // jump to next instruction
3415
3416
3417/* ------------------------------ */
3418 .balign 128
3419.L_op_long_to_float: /* 0x85 */
3420/* File: arm64/op_long_to_float.S */
3421/* File: arm64/funopNarrower.S */
3422 /*
3423 * Generic 64bit-to-32bit floating point unary operation. Provide an
3424 * "instr" line that specifies an instruction that performs "s0 = op x0".
3425 *
3426 * For: int-to-double, float-to-double, float-to-long
3427 */
3428 /* unop vA, vB */
3429 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003430 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003431 GET_VREG_WIDE x0, w3
3432 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003433 scvtf s0, x0 // d0<- op
3434 GET_INST_OPCODE ip // extract opcode from wINST
3435 SET_VREG s0, w4 // vA<- d0
3436 GOTO_OPCODE ip // jump to next instruction
3437
3438
3439/* ------------------------------ */
3440 .balign 128
3441.L_op_long_to_double: /* 0x86 */
3442/* File: arm64/op_long_to_double.S */
3443/* File: arm64/funopWide.S */
3444 /*
3445 * Generic 64bit-to-64bit floating point unary operation. Provide an
3446 * "instr" line that specifies an instruction that performs "d0 = op x0".
3447 *
3448 * For: long-to-double, double-to-long
3449 */
3450 /* unop vA, vB */
3451 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003452 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003453 GET_VREG_WIDE x0, w3
3454 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003455 scvtf d0, x0 // d0<- op
3456 GET_INST_OPCODE ip // extract opcode from wINST
3457 SET_VREG_WIDE d0, w4 // vA<- d0
3458 GOTO_OPCODE ip // jump to next instruction
3459
3460
3461/* ------------------------------ */
3462 .balign 128
3463.L_op_float_to_int: /* 0x87 */
3464/* File: arm64/op_float_to_int.S */
3465/* File: arm64/funopNarrow.S */
3466 /*
3467 * Generic 32bit-to-32bit floating point unary operation. Provide an
3468 * "instr" line that specifies an instruction that performs "w0 = op s0".
3469 *
3470 * For: int-to-float, float-to-int
3471 * TODO: refactor all of the conversions - parameterize width and use same template.
3472 */
3473 /* unop vA, vB */
3474 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003475 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003476 GET_VREG s0, w3
3477 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003478 fcvtzs w0, s0 // d0<- op
3479 GET_INST_OPCODE ip // extract opcode from wINST
3480 SET_VREG w0, w4 // vA<- d0
3481 GOTO_OPCODE ip // jump to next instruction
3482
3483
3484/* ------------------------------ */
3485 .balign 128
3486.L_op_float_to_long: /* 0x88 */
3487/* File: arm64/op_float_to_long.S */
3488/* File: arm64/funopWider.S */
3489 /*
3490 * Generic 32bit-to-64bit floating point unary operation. Provide an
3491 * "instr" line that specifies an instruction that performs "x0 = op s0".
3492 *
3493 * For: int-to-double, float-to-double, float-to-long
3494 */
3495 /* unop vA, vB */
3496 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003497 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003498 GET_VREG s0, w3
3499 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003500 fcvtzs x0, s0 // d0<- op
3501 GET_INST_OPCODE ip // extract opcode from wINST
3502 SET_VREG_WIDE x0, w4 // vA<- d0
3503 GOTO_OPCODE ip // jump to next instruction
3504
3505
3506/* ------------------------------ */
3507 .balign 128
3508.L_op_float_to_double: /* 0x89 */
3509/* File: arm64/op_float_to_double.S */
3510/* File: arm64/funopWider.S */
3511 /*
3512 * Generic 32bit-to-64bit floating point unary operation. Provide an
3513 * "instr" line that specifies an instruction that performs "d0 = op s0".
3514 *
3515 * For: int-to-double, float-to-double, float-to-long
3516 */
3517 /* unop vA, vB */
3518 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003519 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003520 GET_VREG s0, w3
3521 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003522 fcvt d0, s0 // d0<- op
3523 GET_INST_OPCODE ip // extract opcode from wINST
3524 SET_VREG_WIDE d0, w4 // vA<- d0
3525 GOTO_OPCODE ip // jump to next instruction
3526
3527
3528/* ------------------------------ */
3529 .balign 128
3530.L_op_double_to_int: /* 0x8a */
3531/* File: arm64/op_double_to_int.S */
3532/* File: arm64/funopNarrower.S */
3533 /*
3534 * Generic 64bit-to-32bit floating point unary operation. Provide an
3535 * "instr" line that specifies an instruction that performs "w0 = op d0".
3536 *
3537 * For: int-to-double, float-to-double, float-to-long
3538 */
3539 /* unop vA, vB */
3540 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003541 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003542 GET_VREG_WIDE d0, w3
3543 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003544 fcvtzs w0, d0 // d0<- op
3545 GET_INST_OPCODE ip // extract opcode from wINST
3546 SET_VREG w0, w4 // vA<- d0
3547 GOTO_OPCODE ip // jump to next instruction
3548
3549
3550/* ------------------------------ */
3551 .balign 128
3552.L_op_double_to_long: /* 0x8b */
3553/* File: arm64/op_double_to_long.S */
3554/* File: arm64/funopWide.S */
3555 /*
3556 * Generic 64bit-to-64bit floating point unary operation. Provide an
3557 * "instr" line that specifies an instruction that performs "x0 = op d0".
3558 *
3559 * For: long-to-double, double-to-long
3560 */
3561 /* unop vA, vB */
3562 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003563 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003564 GET_VREG_WIDE d0, w3
3565 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003566 fcvtzs x0, d0 // d0<- op
3567 GET_INST_OPCODE ip // extract opcode from wINST
3568 SET_VREG_WIDE x0, w4 // vA<- d0
3569 GOTO_OPCODE ip // jump to next instruction
3570
3571
3572/* ------------------------------ */
3573 .balign 128
3574.L_op_double_to_float: /* 0x8c */
3575/* File: arm64/op_double_to_float.S */
3576/* File: arm64/funopNarrower.S */
3577 /*
3578 * Generic 64bit-to-32bit floating point unary operation. Provide an
3579 * "instr" line that specifies an instruction that performs "s0 = op d0".
3580 *
3581 * For: int-to-double, float-to-double, float-to-long
3582 */
3583 /* unop vA, vB */
3584 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003585 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003586 GET_VREG_WIDE d0, w3
3587 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003588 fcvt s0, d0 // d0<- op
3589 GET_INST_OPCODE ip // extract opcode from wINST
3590 SET_VREG s0, w4 // vA<- d0
3591 GOTO_OPCODE ip // jump to next instruction
3592
3593
3594/* ------------------------------ */
3595 .balign 128
3596.L_op_int_to_byte: /* 0x8d */
3597/* File: arm64/op_int_to_byte.S */
3598/* File: arm64/unop.S */
3599 /*
3600 * Generic 32-bit unary operation. Provide an "instr" line that
3601 * specifies an instruction that performs "result = op w0".
3602 * This could be an ARM instruction or a function call.
3603 *
3604 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3605 * int-to-byte, int-to-char, int-to-short
3606 */
3607 /* unop vA, vB */
3608 lsr w3, wINST, #12 // w3<- B
3609 GET_VREG w0, w3 // w0<- vB
3610 ubfx w9, wINST, #8, #4 // w9<- A
3611 // optional op; may set condition codes
3612 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3613 sxtb w0, w0 // w0<- op, w0-w3 changed
3614 GET_INST_OPCODE ip // extract opcode from rINST
3615 SET_VREG w0, w9 // vAA<- w0
3616 GOTO_OPCODE ip // jump to next instruction
3617 /* 8-9 instructions */
3618
3619
3620/* ------------------------------ */
3621 .balign 128
3622.L_op_int_to_char: /* 0x8e */
3623/* File: arm64/op_int_to_char.S */
3624/* File: arm64/unop.S */
3625 /*
3626 * Generic 32-bit unary operation. Provide an "instr" line that
3627 * specifies an instruction that performs "result = op w0".
3628 * This could be an ARM instruction or a function call.
3629 *
3630 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3631 * int-to-byte, int-to-char, int-to-short
3632 */
3633 /* unop vA, vB */
3634 lsr w3, wINST, #12 // w3<- B
3635 GET_VREG w0, w3 // w0<- vB
3636 ubfx w9, wINST, #8, #4 // w9<- A
3637 // optional op; may set condition codes
3638 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3639 uxth w0, w0 // w0<- op, w0-w3 changed
3640 GET_INST_OPCODE ip // extract opcode from rINST
3641 SET_VREG w0, w9 // vAA<- w0
3642 GOTO_OPCODE ip // jump to next instruction
3643 /* 8-9 instructions */
3644
3645
3646/* ------------------------------ */
3647 .balign 128
3648.L_op_int_to_short: /* 0x8f */
3649/* File: arm64/op_int_to_short.S */
3650/* File: arm64/unop.S */
3651 /*
3652 * Generic 32-bit unary operation. Provide an "instr" line that
3653 * specifies an instruction that performs "result = op w0".
3654 * This could be an ARM instruction or a function call.
3655 *
3656 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3657 * int-to-byte, int-to-char, int-to-short
3658 */
3659 /* unop vA, vB */
3660 lsr w3, wINST, #12 // w3<- B
3661 GET_VREG w0, w3 // w0<- vB
3662 ubfx w9, wINST, #8, #4 // w9<- A
3663 // optional op; may set condition codes
3664 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3665 sxth w0, w0 // w0<- op, w0-w3 changed
3666 GET_INST_OPCODE ip // extract opcode from rINST
3667 SET_VREG w0, w9 // vAA<- w0
3668 GOTO_OPCODE ip // jump to next instruction
3669 /* 8-9 instructions */
3670
3671
3672/* ------------------------------ */
3673 .balign 128
3674.L_op_add_int: /* 0x90 */
3675/* File: arm64/op_add_int.S */
3676/* File: arm64/binop.S */
3677 /*
3678 * Generic 32-bit binary operation. Provide an "instr" line that
3679 * specifies an instruction that performs "result = w0 op w1".
3680 * This could be an ARM instruction or a function call. (If the result
3681 * comes back in a register other than w0, you can override "result".)
3682 *
3683 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3684 * vCC (w1). Useful for integer division and modulus. Note that we
3685 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3686 * handles it correctly.
3687 *
3688 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3689 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3690 * mul-float, div-float, rem-float
3691 */
3692 /* binop vAA, vBB, vCC */
3693 FETCH w0, 1 // w0<- CCBB
3694 lsr w9, wINST, #8 // w9<- AA
3695 lsr w3, w0, #8 // w3<- CC
3696 and w2, w0, #255 // w2<- BB
3697 GET_VREG w1, w3 // w1<- vCC
3698 GET_VREG w0, w2 // w0<- vBB
3699 .if 0
3700 cbz w1, common_errDivideByZero // is second operand zero?
3701 .endif
3702 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3703 // optional op; may set condition codes
3704 add w0, w0, w1 // w0<- op, w0-w3 changed
3705 GET_INST_OPCODE ip // extract opcode from rINST
3706 SET_VREG w0, w9 // vAA<- w0
3707 GOTO_OPCODE ip // jump to next instruction
3708 /* 11-14 instructions */
3709
3710
3711/* ------------------------------ */
3712 .balign 128
3713.L_op_sub_int: /* 0x91 */
3714/* File: arm64/op_sub_int.S */
3715/* File: arm64/binop.S */
3716 /*
3717 * Generic 32-bit binary operation. Provide an "instr" line that
3718 * specifies an instruction that performs "result = w0 op w1".
3719 * This could be an ARM instruction or a function call. (If the result
3720 * comes back in a register other than w0, you can override "result".)
3721 *
3722 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3723 * vCC (w1). Useful for integer division and modulus. Note that we
3724 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3725 * handles it correctly.
3726 *
3727 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3728 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3729 * mul-float, div-float, rem-float
3730 */
3731 /* binop vAA, vBB, vCC */
3732 FETCH w0, 1 // w0<- CCBB
3733 lsr w9, wINST, #8 // w9<- AA
3734 lsr w3, w0, #8 // w3<- CC
3735 and w2, w0, #255 // w2<- BB
3736 GET_VREG w1, w3 // w1<- vCC
3737 GET_VREG w0, w2 // w0<- vBB
3738 .if 0
3739 cbz w1, common_errDivideByZero // is second operand zero?
3740 .endif
3741 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3742 // optional op; may set condition codes
3743 sub w0, w0, w1 // w0<- op, w0-w3 changed
3744 GET_INST_OPCODE ip // extract opcode from rINST
3745 SET_VREG w0, w9 // vAA<- w0
3746 GOTO_OPCODE ip // jump to next instruction
3747 /* 11-14 instructions */
3748
3749
3750/* ------------------------------ */
3751 .balign 128
3752.L_op_mul_int: /* 0x92 */
3753/* File: arm64/op_mul_int.S */
3754/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
3755/* File: arm64/binop.S */
3756 /*
3757 * Generic 32-bit binary operation. Provide an "instr" line that
3758 * specifies an instruction that performs "result = w0 op w1".
3759 * This could be an ARM instruction or a function call. (If the result
3760 * comes back in a register other than w0, you can override "result".)
3761 *
3762 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3763 * vCC (w1). Useful for integer division and modulus. Note that we
3764 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3765 * handles it correctly.
3766 *
3767 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3768 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3769 * mul-float, div-float, rem-float
3770 */
3771 /* binop vAA, vBB, vCC */
3772 FETCH w0, 1 // w0<- CCBB
3773 lsr w9, wINST, #8 // w9<- AA
3774 lsr w3, w0, #8 // w3<- CC
3775 and w2, w0, #255 // w2<- BB
3776 GET_VREG w1, w3 // w1<- vCC
3777 GET_VREG w0, w2 // w0<- vBB
3778 .if 0
3779 cbz w1, common_errDivideByZero // is second operand zero?
3780 .endif
3781 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3782 // optional op; may set condition codes
3783 mul w0, w1, w0 // w0<- op, w0-w3 changed
3784 GET_INST_OPCODE ip // extract opcode from rINST
3785 SET_VREG w0, w9 // vAA<- w0
3786 GOTO_OPCODE ip // jump to next instruction
3787 /* 11-14 instructions */
3788
3789
3790/* ------------------------------ */
3791 .balign 128
3792.L_op_div_int: /* 0x93 */
3793/* File: arm64/op_div_int.S */
3794/* File: arm64/binop.S */
3795 /*
3796 * Generic 32-bit binary operation. Provide an "instr" line that
3797 * specifies an instruction that performs "result = w0 op w1".
3798 * This could be an ARM instruction or a function call. (If the result
3799 * comes back in a register other than w0, you can override "result".)
3800 *
3801 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3802 * vCC (w1). Useful for integer division and modulus. Note that we
3803 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3804 * handles it correctly.
3805 *
3806 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3807 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3808 * mul-float, div-float, rem-float
3809 */
3810 /* binop vAA, vBB, vCC */
3811 FETCH w0, 1 // w0<- CCBB
3812 lsr w9, wINST, #8 // w9<- AA
3813 lsr w3, w0, #8 // w3<- CC
3814 and w2, w0, #255 // w2<- BB
3815 GET_VREG w1, w3 // w1<- vCC
3816 GET_VREG w0, w2 // w0<- vBB
3817 .if 1
3818 cbz w1, common_errDivideByZero // is second operand zero?
3819 .endif
3820 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3821 // optional op; may set condition codes
3822 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
3823 GET_INST_OPCODE ip // extract opcode from rINST
3824 SET_VREG w0, w9 // vAA<- w0
3825 GOTO_OPCODE ip // jump to next instruction
3826 /* 11-14 instructions */
3827
3828
3829/* ------------------------------ */
3830 .balign 128
3831.L_op_rem_int: /* 0x94 */
3832/* File: arm64/op_rem_int.S */
3833/* File: arm64/binop.S */
3834 /*
3835 * Generic 32-bit binary operation. Provide an "instr" line that
3836 * specifies an instruction that performs "result = w0 op w1".
3837 * This could be an ARM instruction or a function call. (If the result
3838 * comes back in a register other than w0, you can override "result".)
3839 *
3840 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3841 * vCC (w1). Useful for integer division and modulus. Note that we
3842 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3843 * handles it correctly.
3844 *
3845 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3846 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3847 * mul-float, div-float, rem-float
3848 */
3849 /* binop vAA, vBB, vCC */
3850 FETCH w0, 1 // w0<- CCBB
3851 lsr w9, wINST, #8 // w9<- AA
3852 lsr w3, w0, #8 // w3<- CC
3853 and w2, w0, #255 // w2<- BB
3854 GET_VREG w1, w3 // w1<- vCC
3855 GET_VREG w0, w2 // w0<- vBB
3856 .if 1
3857 cbz w1, common_errDivideByZero // is second operand zero?
3858 .endif
3859 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3860 sdiv w2, w0, w1 // optional op; may set condition codes
3861 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
3862 GET_INST_OPCODE ip // extract opcode from rINST
3863 SET_VREG w0, w9 // vAA<- w0
3864 GOTO_OPCODE ip // jump to next instruction
3865 /* 11-14 instructions */
3866
3867
3868/* ------------------------------ */
3869 .balign 128
3870.L_op_and_int: /* 0x95 */
3871/* File: arm64/op_and_int.S */
3872/* File: arm64/binop.S */
3873 /*
3874 * Generic 32-bit binary operation. Provide an "instr" line that
3875 * specifies an instruction that performs "result = w0 op w1".
3876 * This could be an ARM instruction or a function call. (If the result
3877 * comes back in a register other than w0, you can override "result".)
3878 *
3879 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3880 * vCC (w1). Useful for integer division and modulus. Note that we
3881 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3882 * handles it correctly.
3883 *
3884 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3885 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3886 * mul-float, div-float, rem-float
3887 */
3888 /* binop vAA, vBB, vCC */
3889 FETCH w0, 1 // w0<- CCBB
3890 lsr w9, wINST, #8 // w9<- AA
3891 lsr w3, w0, #8 // w3<- CC
3892 and w2, w0, #255 // w2<- BB
3893 GET_VREG w1, w3 // w1<- vCC
3894 GET_VREG w0, w2 // w0<- vBB
3895 .if 0
3896 cbz w1, common_errDivideByZero // is second operand zero?
3897 .endif
3898 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3899 // optional op; may set condition codes
3900 and w0, w0, w1 // w0<- op, w0-w3 changed
3901 GET_INST_OPCODE ip // extract opcode from rINST
3902 SET_VREG w0, w9 // vAA<- w0
3903 GOTO_OPCODE ip // jump to next instruction
3904 /* 11-14 instructions */
3905
3906
3907/* ------------------------------ */
3908 .balign 128
3909.L_op_or_int: /* 0x96 */
3910/* File: arm64/op_or_int.S */
3911/* File: arm64/binop.S */
3912 /*
3913 * Generic 32-bit binary operation. Provide an "instr" line that
3914 * specifies an instruction that performs "result = w0 op w1".
3915 * This could be an ARM instruction or a function call. (If the result
3916 * comes back in a register other than w0, you can override "result".)
3917 *
3918 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3919 * vCC (w1). Useful for integer division and modulus. Note that we
3920 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3921 * handles it correctly.
3922 *
3923 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3924 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3925 * mul-float, div-float, rem-float
3926 */
3927 /* binop vAA, vBB, vCC */
3928 FETCH w0, 1 // w0<- CCBB
3929 lsr w9, wINST, #8 // w9<- AA
3930 lsr w3, w0, #8 // w3<- CC
3931 and w2, w0, #255 // w2<- BB
3932 GET_VREG w1, w3 // w1<- vCC
3933 GET_VREG w0, w2 // w0<- vBB
3934 .if 0
3935 cbz w1, common_errDivideByZero // is second operand zero?
3936 .endif
3937 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3938 // optional op; may set condition codes
3939 orr w0, w0, w1 // w0<- op, w0-w3 changed
3940 GET_INST_OPCODE ip // extract opcode from rINST
3941 SET_VREG w0, w9 // vAA<- w0
3942 GOTO_OPCODE ip // jump to next instruction
3943 /* 11-14 instructions */
3944
3945
3946/* ------------------------------ */
3947 .balign 128
3948.L_op_xor_int: /* 0x97 */
3949/* File: arm64/op_xor_int.S */
3950/* File: arm64/binop.S */
3951 /*
3952 * Generic 32-bit binary operation. Provide an "instr" line that
3953 * specifies an instruction that performs "result = w0 op w1".
3954 * This could be an ARM instruction or a function call. (If the result
3955 * comes back in a register other than w0, you can override "result".)
3956 *
3957 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3958 * vCC (w1). Useful for integer division and modulus. Note that we
3959 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3960 * handles it correctly.
3961 *
3962 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3963 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3964 * mul-float, div-float, rem-float
3965 */
3966 /* binop vAA, vBB, vCC */
3967 FETCH w0, 1 // w0<- CCBB
3968 lsr w9, wINST, #8 // w9<- AA
3969 lsr w3, w0, #8 // w3<- CC
3970 and w2, w0, #255 // w2<- BB
3971 GET_VREG w1, w3 // w1<- vCC
3972 GET_VREG w0, w2 // w0<- vBB
3973 .if 0
3974 cbz w1, common_errDivideByZero // is second operand zero?
3975 .endif
3976 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3977 // optional op; may set condition codes
3978 eor w0, w0, w1 // w0<- op, w0-w3 changed
3979 GET_INST_OPCODE ip // extract opcode from rINST
3980 SET_VREG w0, w9 // vAA<- w0
3981 GOTO_OPCODE ip // jump to next instruction
3982 /* 11-14 instructions */
3983
3984
3985/* ------------------------------ */
3986 .balign 128
3987.L_op_shl_int: /* 0x98 */
3988/* File: arm64/op_shl_int.S */
3989/* File: arm64/binop.S */
3990 /*
3991 * Generic 32-bit binary operation. Provide an "instr" line that
3992 * specifies an instruction that performs "result = w0 op w1".
3993 * This could be an ARM instruction or a function call. (If the result
3994 * comes back in a register other than w0, you can override "result".)
3995 *
3996 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3997 * vCC (w1). Useful for integer division and modulus. Note that we
3998 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3999 * handles it correctly.
4000 *
4001 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4002 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4003 * mul-float, div-float, rem-float
4004 */
4005 /* binop vAA, vBB, vCC */
4006 FETCH w0, 1 // w0<- CCBB
4007 lsr w9, wINST, #8 // w9<- AA
4008 lsr w3, w0, #8 // w3<- CC
4009 and w2, w0, #255 // w2<- BB
4010 GET_VREG w1, w3 // w1<- vCC
4011 GET_VREG w0, w2 // w0<- vBB
4012 .if 0
4013 cbz w1, common_errDivideByZero // is second operand zero?
4014 .endif
4015 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004016 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004017 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4018 GET_INST_OPCODE ip // extract opcode from rINST
4019 SET_VREG w0, w9 // vAA<- w0
4020 GOTO_OPCODE ip // jump to next instruction
4021 /* 11-14 instructions */
4022
4023
4024/* ------------------------------ */
4025 .balign 128
4026.L_op_shr_int: /* 0x99 */
4027/* File: arm64/op_shr_int.S */
4028/* File: arm64/binop.S */
4029 /*
4030 * Generic 32-bit binary operation. Provide an "instr" line that
4031 * specifies an instruction that performs "result = w0 op w1".
4032 * This could be an ARM instruction or a function call. (If the result
4033 * comes back in a register other than w0, you can override "result".)
4034 *
4035 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4036 * vCC (w1). Useful for integer division and modulus. Note that we
4037 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4038 * handles it correctly.
4039 *
4040 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4041 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4042 * mul-float, div-float, rem-float
4043 */
4044 /* binop vAA, vBB, vCC */
4045 FETCH w0, 1 // w0<- CCBB
4046 lsr w9, wINST, #8 // w9<- AA
4047 lsr w3, w0, #8 // w3<- CC
4048 and w2, w0, #255 // w2<- BB
4049 GET_VREG w1, w3 // w1<- vCC
4050 GET_VREG w0, w2 // w0<- vBB
4051 .if 0
4052 cbz w1, common_errDivideByZero // is second operand zero?
4053 .endif
4054 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004055 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004056 asr w0, w0, w1 // w0<- op, w0-w3 changed
4057 GET_INST_OPCODE ip // extract opcode from rINST
4058 SET_VREG w0, w9 // vAA<- w0
4059 GOTO_OPCODE ip // jump to next instruction
4060 /* 11-14 instructions */
4061
4062
4063/* ------------------------------ */
4064 .balign 128
4065.L_op_ushr_int: /* 0x9a */
4066/* File: arm64/op_ushr_int.S */
4067/* File: arm64/binop.S */
4068 /*
4069 * Generic 32-bit binary operation. Provide an "instr" line that
4070 * specifies an instruction that performs "result = w0 op w1".
4071 * This could be an ARM instruction or a function call. (If the result
4072 * comes back in a register other than w0, you can override "result".)
4073 *
4074 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4075 * vCC (w1). Useful for integer division and modulus. Note that we
4076 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4077 * handles it correctly.
4078 *
4079 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4080 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4081 * mul-float, div-float, rem-float
4082 */
4083 /* binop vAA, vBB, vCC */
4084 FETCH w0, 1 // w0<- CCBB
4085 lsr w9, wINST, #8 // w9<- AA
4086 lsr w3, w0, #8 // w3<- CC
4087 and w2, w0, #255 // w2<- BB
4088 GET_VREG w1, w3 // w1<- vCC
4089 GET_VREG w0, w2 // w0<- vBB
4090 .if 0
4091 cbz w1, common_errDivideByZero // is second operand zero?
4092 .endif
4093 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004094 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004095 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4096 GET_INST_OPCODE ip // extract opcode from rINST
4097 SET_VREG w0, w9 // vAA<- w0
4098 GOTO_OPCODE ip // jump to next instruction
4099 /* 11-14 instructions */
4100
4101
4102/* ------------------------------ */
4103 .balign 128
4104.L_op_add_long: /* 0x9b */
4105/* File: arm64/op_add_long.S */
4106/* File: arm64/binopWide.S */
4107 /*
4108 * Generic 64-bit binary operation. Provide an "instr" line that
4109 * specifies an instruction that performs "result = x1 op x2".
4110 * This could be an ARM instruction or a function call. (If the result
4111 * comes back in a register other than x0, you can override "result".)
4112 *
4113 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4114 * vCC (w1). Useful for integer division and modulus.
4115 *
4116 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4117 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4118 */
4119 /* binop vAA, vBB, vCC */
4120 FETCH w0, 1 // w0<- CCBB
4121 lsr w4, wINST, #8 // w4<- AA
4122 lsr w2, w0, #8 // w2<- CC
4123 and w1, w0, #255 // w1<- BB
4124 GET_VREG_WIDE x2, w2 // w2<- vCC
4125 GET_VREG_WIDE x1, w1 // w1<- vBB
4126 .if 0
4127 cbz x2, common_errDivideByZero // is second operand zero?
4128 .endif
4129 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4130
4131 add x0, x1, x2 // x0<- op, w0-w4 changed
4132 GET_INST_OPCODE ip // extract opcode from rINST
4133 SET_VREG_WIDE x0, w4 // vAA<- x0
4134 GOTO_OPCODE ip // jump to next instruction
4135 /* 11-14 instructions */
4136
4137
4138/* ------------------------------ */
4139 .balign 128
4140.L_op_sub_long: /* 0x9c */
4141/* File: arm64/op_sub_long.S */
4142/* File: arm64/binopWide.S */
4143 /*
4144 * Generic 64-bit binary operation. Provide an "instr" line that
4145 * specifies an instruction that performs "result = x1 op x2".
4146 * This could be an ARM instruction or a function call. (If the result
4147 * comes back in a register other than x0, you can override "result".)
4148 *
4149 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4150 * vCC (w1). Useful for integer division and modulus.
4151 *
4152 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4153 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4154 */
4155 /* binop vAA, vBB, vCC */
4156 FETCH w0, 1 // w0<- CCBB
4157 lsr w4, wINST, #8 // w4<- AA
4158 lsr w2, w0, #8 // w2<- CC
4159 and w1, w0, #255 // w1<- BB
4160 GET_VREG_WIDE x2, w2 // w2<- vCC
4161 GET_VREG_WIDE x1, w1 // w1<- vBB
4162 .if 0
4163 cbz x2, common_errDivideByZero // is second operand zero?
4164 .endif
4165 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4166
4167 sub x0, x1, x2 // x0<- op, w0-w4 changed
4168 GET_INST_OPCODE ip // extract opcode from rINST
4169 SET_VREG_WIDE x0, w4 // vAA<- x0
4170 GOTO_OPCODE ip // jump to next instruction
4171 /* 11-14 instructions */
4172
4173
4174/* ------------------------------ */
4175 .balign 128
4176.L_op_mul_long: /* 0x9d */
4177/* File: arm64/op_mul_long.S */
4178/* File: arm64/binopWide.S */
4179 /*
4180 * Generic 64-bit binary operation. Provide an "instr" line that
4181 * specifies an instruction that performs "result = x1 op x2".
4182 * This could be an ARM instruction or a function call. (If the result
4183 * comes back in a register other than x0, you can override "result".)
4184 *
4185 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4186 * vCC (w1). Useful for integer division and modulus.
4187 *
4188 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4189 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4190 */
4191 /* binop vAA, vBB, vCC */
4192 FETCH w0, 1 // w0<- CCBB
4193 lsr w4, wINST, #8 // w4<- AA
4194 lsr w2, w0, #8 // w2<- CC
4195 and w1, w0, #255 // w1<- BB
4196 GET_VREG_WIDE x2, w2 // w2<- vCC
4197 GET_VREG_WIDE x1, w1 // w1<- vBB
4198 .if 0
4199 cbz x2, common_errDivideByZero // is second operand zero?
4200 .endif
4201 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4202
4203 mul x0, x1, x2 // x0<- op, w0-w4 changed
4204 GET_INST_OPCODE ip // extract opcode from rINST
4205 SET_VREG_WIDE x0, w4 // vAA<- x0
4206 GOTO_OPCODE ip // jump to next instruction
4207 /* 11-14 instructions */
4208
4209
4210/* ------------------------------ */
4211 .balign 128
4212.L_op_div_long: /* 0x9e */
4213/* File: arm64/op_div_long.S */
4214/* File: arm64/binopWide.S */
4215 /*
4216 * Generic 64-bit binary operation. Provide an "instr" line that
4217 * specifies an instruction that performs "result = x1 op x2".
4218 * This could be an ARM instruction or a function call. (If the result
4219 * comes back in a register other than x0, you can override "result".)
4220 *
4221 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4222 * vCC (w1). Useful for integer division and modulus.
4223 *
4224 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4225 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4226 */
4227 /* binop vAA, vBB, vCC */
4228 FETCH w0, 1 // w0<- CCBB
4229 lsr w4, wINST, #8 // w4<- AA
4230 lsr w2, w0, #8 // w2<- CC
4231 and w1, w0, #255 // w1<- BB
4232 GET_VREG_WIDE x2, w2 // w2<- vCC
4233 GET_VREG_WIDE x1, w1 // w1<- vBB
4234 .if 1
4235 cbz x2, common_errDivideByZero // is second operand zero?
4236 .endif
4237 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4238
4239 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4240 GET_INST_OPCODE ip // extract opcode from rINST
4241 SET_VREG_WIDE x0, w4 // vAA<- x0
4242 GOTO_OPCODE ip // jump to next instruction
4243 /* 11-14 instructions */
4244
4245
4246/* ------------------------------ */
4247 .balign 128
4248.L_op_rem_long: /* 0x9f */
4249/* File: arm64/op_rem_long.S */
4250/* File: arm64/binopWide.S */
4251 /*
4252 * Generic 64-bit binary operation. Provide an "instr" line that
4253 * specifies an instruction that performs "result = x1 op x2".
4254 * This could be an ARM instruction or a function call. (If the result
4255 * comes back in a register other than x0, you can override "result".)
4256 *
4257 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4258 * vCC (w1). Useful for integer division and modulus.
4259 *
4260 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4261 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4262 */
4263 /* binop vAA, vBB, vCC */
4264 FETCH w0, 1 // w0<- CCBB
4265 lsr w4, wINST, #8 // w4<- AA
4266 lsr w2, w0, #8 // w2<- CC
4267 and w1, w0, #255 // w1<- BB
4268 GET_VREG_WIDE x2, w2 // w2<- vCC
4269 GET_VREG_WIDE x1, w1 // w1<- vBB
4270 .if 1
4271 cbz x2, common_errDivideByZero // is second operand zero?
4272 .endif
4273 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4274 sdiv x3, x1, x2
4275 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4276 GET_INST_OPCODE ip // extract opcode from rINST
4277 SET_VREG_WIDE x0, w4 // vAA<- x0
4278 GOTO_OPCODE ip // jump to next instruction
4279 /* 11-14 instructions */
4280
4281
4282/* ------------------------------ */
4283 .balign 128
4284.L_op_and_long: /* 0xa0 */
4285/* File: arm64/op_and_long.S */
4286/* File: arm64/binopWide.S */
4287 /*
4288 * Generic 64-bit binary operation. Provide an "instr" line that
4289 * specifies an instruction that performs "result = x1 op x2".
4290 * This could be an ARM instruction or a function call. (If the result
4291 * comes back in a register other than x0, you can override "result".)
4292 *
4293 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4294 * vCC (w1). Useful for integer division and modulus.
4295 *
4296 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4297 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4298 */
4299 /* binop vAA, vBB, vCC */
4300 FETCH w0, 1 // w0<- CCBB
4301 lsr w4, wINST, #8 // w4<- AA
4302 lsr w2, w0, #8 // w2<- CC
4303 and w1, w0, #255 // w1<- BB
4304 GET_VREG_WIDE x2, w2 // w2<- vCC
4305 GET_VREG_WIDE x1, w1 // w1<- vBB
4306 .if 0
4307 cbz x2, common_errDivideByZero // is second operand zero?
4308 .endif
4309 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4310
4311 and x0, x1, x2 // x0<- op, w0-w4 changed
4312 GET_INST_OPCODE ip // extract opcode from rINST
4313 SET_VREG_WIDE x0, w4 // vAA<- x0
4314 GOTO_OPCODE ip // jump to next instruction
4315 /* 11-14 instructions */
4316
4317
4318/* ------------------------------ */
4319 .balign 128
4320.L_op_or_long: /* 0xa1 */
4321/* File: arm64/op_or_long.S */
4322/* File: arm64/binopWide.S */
4323 /*
4324 * Generic 64-bit binary operation. Provide an "instr" line that
4325 * specifies an instruction that performs "result = x1 op x2".
4326 * This could be an ARM instruction or a function call. (If the result
4327 * comes back in a register other than x0, you can override "result".)
4328 *
4329 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4330 * vCC (w1). Useful for integer division and modulus.
4331 *
4332 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4333 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4334 */
4335 /* binop vAA, vBB, vCC */
4336 FETCH w0, 1 // w0<- CCBB
4337 lsr w4, wINST, #8 // w4<- AA
4338 lsr w2, w0, #8 // w2<- CC
4339 and w1, w0, #255 // w1<- BB
4340 GET_VREG_WIDE x2, w2 // w2<- vCC
4341 GET_VREG_WIDE x1, w1 // w1<- vBB
4342 .if 0
4343 cbz x2, common_errDivideByZero // is second operand zero?
4344 .endif
4345 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4346
4347 orr x0, x1, x2 // x0<- op, w0-w4 changed
4348 GET_INST_OPCODE ip // extract opcode from rINST
4349 SET_VREG_WIDE x0, w4 // vAA<- x0
4350 GOTO_OPCODE ip // jump to next instruction
4351 /* 11-14 instructions */
4352
4353
4354/* ------------------------------ */
4355 .balign 128
4356.L_op_xor_long: /* 0xa2 */
4357/* File: arm64/op_xor_long.S */
4358/* File: arm64/binopWide.S */
4359 /*
4360 * Generic 64-bit binary operation. Provide an "instr" line that
4361 * specifies an instruction that performs "result = x1 op x2".
4362 * This could be an ARM instruction or a function call. (If the result
4363 * comes back in a register other than x0, you can override "result".)
4364 *
4365 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4366 * vCC (w1). Useful for integer division and modulus.
4367 *
4368 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4369 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4370 */
4371 /* binop vAA, vBB, vCC */
4372 FETCH w0, 1 // w0<- CCBB
4373 lsr w4, wINST, #8 // w4<- AA
4374 lsr w2, w0, #8 // w2<- CC
4375 and w1, w0, #255 // w1<- BB
4376 GET_VREG_WIDE x2, w2 // w2<- vCC
4377 GET_VREG_WIDE x1, w1 // w1<- vBB
4378 .if 0
4379 cbz x2, common_errDivideByZero // is second operand zero?
4380 .endif
4381 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4382
4383 eor x0, x1, x2 // x0<- op, w0-w4 changed
4384 GET_INST_OPCODE ip // extract opcode from rINST
4385 SET_VREG_WIDE x0, w4 // vAA<- x0
4386 GOTO_OPCODE ip // jump to next instruction
4387 /* 11-14 instructions */
4388
4389
4390/* ------------------------------ */
4391 .balign 128
4392.L_op_shl_long: /* 0xa3 */
4393/* File: arm64/op_shl_long.S */
4394/* File: arm64/shiftWide.S */
4395 /*
4396 * 64-bit shift operation.
4397 *
4398 * For: shl-long, shr-long, ushr-long
4399 */
4400 /* binop vAA, vBB, vCC */
4401 FETCH w0, 1 // w0<- CCBB
4402 lsr w3, wINST, #8 // w3<- AA
4403 lsr w2, w0, #8 // w2<- CC
4404 GET_VREG w2, w2 // w2<- vCC (shift count)
4405 and w1, w0, #255 // w1<- BB
4406 GET_VREG_WIDE x1, w1 // x1<- vBB
4407 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004408 lsl x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004409 GET_INST_OPCODE ip // extract opcode from rINST
4410 SET_VREG_WIDE x0, w3 // vAA<- x0
4411 GOTO_OPCODE ip // jump to next instruction
4412 /* 11-14 instructions */
4413
4414
4415/* ------------------------------ */
4416 .balign 128
4417.L_op_shr_long: /* 0xa4 */
4418/* File: arm64/op_shr_long.S */
4419/* File: arm64/shiftWide.S */
4420 /*
4421 * 64-bit shift operation.
4422 *
4423 * For: shl-long, shr-long, ushr-long
4424 */
4425 /* binop vAA, vBB, vCC */
4426 FETCH w0, 1 // w0<- CCBB
4427 lsr w3, wINST, #8 // w3<- AA
4428 lsr w2, w0, #8 // w2<- CC
4429 GET_VREG w2, w2 // w2<- vCC (shift count)
4430 and w1, w0, #255 // w1<- BB
4431 GET_VREG_WIDE x1, w1 // x1<- vBB
4432 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004433 asr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004434 GET_INST_OPCODE ip // extract opcode from rINST
4435 SET_VREG_WIDE x0, w3 // vAA<- x0
4436 GOTO_OPCODE ip // jump to next instruction
4437 /* 11-14 instructions */
4438
4439
4440/* ------------------------------ */
4441 .balign 128
4442.L_op_ushr_long: /* 0xa5 */
4443/* File: arm64/op_ushr_long.S */
4444/* File: arm64/shiftWide.S */
4445 /*
4446 * 64-bit shift operation.
4447 *
4448 * For: shl-long, shr-long, ushr-long
4449 */
4450 /* binop vAA, vBB, vCC */
4451 FETCH w0, 1 // w0<- CCBB
4452 lsr w3, wINST, #8 // w3<- AA
4453 lsr w2, w0, #8 // w2<- CC
4454 GET_VREG w2, w2 // w2<- vCC (shift count)
4455 and w1, w0, #255 // w1<- BB
4456 GET_VREG_WIDE x1, w1 // x1<- vBB
4457 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004458 lsr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004459 GET_INST_OPCODE ip // extract opcode from rINST
4460 SET_VREG_WIDE x0, w3 // vAA<- x0
4461 GOTO_OPCODE ip // jump to next instruction
4462 /* 11-14 instructions */
4463
4464
4465/* ------------------------------ */
4466 .balign 128
4467.L_op_add_float: /* 0xa6 */
4468/* File: arm64/op_add_float.S */
4469/* File: arm64/fbinop.S */
4470 /*:
4471 * Generic 32-bit floating-point operation.
4472 *
4473 * For: add-float, sub-float, mul-float, div-float
4474 * form: <op> s0, s0, s1
4475 */
4476 /* floatop vAA, vBB, vCC */
4477 FETCH w0, 1 // r0<- CCBB
4478 lsr w1, w0, #8 // r2<- CC
4479 and w0, w0, #255 // r1<- BB
4480 GET_VREG s1, w1
4481 GET_VREG s0, w0
4482 fadd s0, s0, s1 // s0<- op
4483 lsr w1, wINST, #8 // r1<- AA
4484 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4485 GET_INST_OPCODE ip // extract opcode from rINST
4486 SET_VREG s0, w1
4487 GOTO_OPCODE ip // jump to next instruction
4488
4489
4490/* ------------------------------ */
4491 .balign 128
4492.L_op_sub_float: /* 0xa7 */
4493/* File: arm64/op_sub_float.S */
4494/* File: arm64/fbinop.S */
4495 /*:
4496 * Generic 32-bit floating-point operation.
4497 *
4498 * For: add-float, sub-float, mul-float, div-float
4499 * form: <op> s0, s0, s1
4500 */
4501 /* floatop vAA, vBB, vCC */
4502 FETCH w0, 1 // r0<- CCBB
4503 lsr w1, w0, #8 // r2<- CC
4504 and w0, w0, #255 // r1<- BB
4505 GET_VREG s1, w1
4506 GET_VREG s0, w0
4507 fsub s0, s0, s1 // s0<- op
4508 lsr w1, wINST, #8 // r1<- AA
4509 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4510 GET_INST_OPCODE ip // extract opcode from rINST
4511 SET_VREG s0, w1
4512 GOTO_OPCODE ip // jump to next instruction
4513
4514
4515/* ------------------------------ */
4516 .balign 128
4517.L_op_mul_float: /* 0xa8 */
4518/* File: arm64/op_mul_float.S */
4519/* File: arm64/fbinop.S */
4520 /*:
4521 * Generic 32-bit floating-point operation.
4522 *
4523 * For: add-float, sub-float, mul-float, div-float
4524 * form: <op> s0, s0, s1
4525 */
4526 /* floatop vAA, vBB, vCC */
4527 FETCH w0, 1 // r0<- CCBB
4528 lsr w1, w0, #8 // r2<- CC
4529 and w0, w0, #255 // r1<- BB
4530 GET_VREG s1, w1
4531 GET_VREG s0, w0
4532 fmul s0, s0, s1 // s0<- op
4533 lsr w1, wINST, #8 // r1<- AA
4534 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4535 GET_INST_OPCODE ip // extract opcode from rINST
4536 SET_VREG s0, w1
4537 GOTO_OPCODE ip // jump to next instruction
4538
4539
4540/* ------------------------------ */
4541 .balign 128
4542.L_op_div_float: /* 0xa9 */
4543/* File: arm64/op_div_float.S */
4544/* File: arm64/fbinop.S */
4545 /*:
4546 * Generic 32-bit floating-point operation.
4547 *
4548 * For: add-float, sub-float, mul-float, div-float
4549 * form: <op> s0, s0, s1
4550 */
4551 /* floatop vAA, vBB, vCC */
4552 FETCH w0, 1 // r0<- CCBB
4553 lsr w1, w0, #8 // r2<- CC
4554 and w0, w0, #255 // r1<- BB
4555 GET_VREG s1, w1
4556 GET_VREG s0, w0
4557 fdiv s0, s0, s1 // s0<- op
4558 lsr w1, wINST, #8 // r1<- AA
4559 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4560 GET_INST_OPCODE ip // extract opcode from rINST
4561 SET_VREG s0, w1
4562 GOTO_OPCODE ip // jump to next instruction
4563
4564
4565/* ------------------------------ */
4566 .balign 128
4567.L_op_rem_float: /* 0xaa */
4568/* File: arm64/op_rem_float.S */
4569/* EABI doesn't define a float remainder function, but libm does */
4570/* File: arm64/fbinop.S */
4571 /*:
4572 * Generic 32-bit floating-point operation.
4573 *
4574 * For: add-float, sub-float, mul-float, div-float
4575 * form: <op> s0, s0, s1
4576 */
4577 /* floatop vAA, vBB, vCC */
4578 FETCH w0, 1 // r0<- CCBB
4579 lsr w1, w0, #8 // r2<- CC
4580 and w0, w0, #255 // r1<- BB
4581 GET_VREG s1, w1
4582 GET_VREG s0, w0
4583 bl fmodf // s0<- op
4584 lsr w1, wINST, #8 // r1<- AA
4585 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4586 GET_INST_OPCODE ip // extract opcode from rINST
4587 SET_VREG s0, w1
4588 GOTO_OPCODE ip // jump to next instruction
4589
4590
4591/* ------------------------------ */
4592 .balign 128
4593.L_op_add_double: /* 0xab */
4594/* File: arm64/op_add_double.S */
4595/* File: arm64/binopWide.S */
4596 /*
4597 * Generic 64-bit binary operation. Provide an "instr" line that
4598 * specifies an instruction that performs "result = x1 op x2".
4599 * This could be an ARM instruction or a function call. (If the result
4600 * comes back in a register other than x0, you can override "result".)
4601 *
4602 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4603 * vCC (w1). Useful for integer division and modulus.
4604 *
4605 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4606 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4607 */
4608 /* binop vAA, vBB, vCC */
4609 FETCH w0, 1 // w0<- CCBB
4610 lsr w4, wINST, #8 // w4<- AA
4611 lsr w2, w0, #8 // w2<- CC
4612 and w1, w0, #255 // w1<- BB
4613 GET_VREG_WIDE d2, w2 // w2<- vCC
4614 GET_VREG_WIDE d1, w1 // w1<- vBB
4615 .if 0
4616 cbz d2, common_errDivideByZero // is second operand zero?
4617 .endif
4618 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4619
4620 fadd d0, d1, d2 // d0<- op, w0-w4 changed
4621 GET_INST_OPCODE ip // extract opcode from rINST
4622 SET_VREG_WIDE d0, w4 // vAA<- d0
4623 GOTO_OPCODE ip // jump to next instruction
4624 /* 11-14 instructions */
4625
4626
4627/* ------------------------------ */
4628 .balign 128
4629.L_op_sub_double: /* 0xac */
4630/* File: arm64/op_sub_double.S */
4631/* File: arm64/binopWide.S */
4632 /*
4633 * Generic 64-bit binary operation. Provide an "instr" line that
4634 * specifies an instruction that performs "result = x1 op x2".
4635 * This could be an ARM instruction or a function call. (If the result
4636 * comes back in a register other than x0, you can override "result".)
4637 *
4638 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4639 * vCC (w1). Useful for integer division and modulus.
4640 *
4641 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4642 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4643 */
4644 /* binop vAA, vBB, vCC */
4645 FETCH w0, 1 // w0<- CCBB
4646 lsr w4, wINST, #8 // w4<- AA
4647 lsr w2, w0, #8 // w2<- CC
4648 and w1, w0, #255 // w1<- BB
4649 GET_VREG_WIDE d2, w2 // w2<- vCC
4650 GET_VREG_WIDE d1, w1 // w1<- vBB
4651 .if 0
4652 cbz d2, common_errDivideByZero // is second operand zero?
4653 .endif
4654 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4655
4656 fsub d0, d1, d2 // d0<- op, w0-w4 changed
4657 GET_INST_OPCODE ip // extract opcode from rINST
4658 SET_VREG_WIDE d0, w4 // vAA<- d0
4659 GOTO_OPCODE ip // jump to next instruction
4660 /* 11-14 instructions */
4661
4662
4663/* ------------------------------ */
4664 .balign 128
4665.L_op_mul_double: /* 0xad */
4666/* File: arm64/op_mul_double.S */
4667/* File: arm64/binopWide.S */
4668 /*
4669 * Generic 64-bit binary operation. Provide an "instr" line that
4670 * specifies an instruction that performs "result = x1 op x2".
4671 * This could be an ARM instruction or a function call. (If the result
4672 * comes back in a register other than x0, you can override "result".)
4673 *
4674 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4675 * vCC (w1). Useful for integer division and modulus.
4676 *
4677 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4678 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4679 */
4680 /* binop vAA, vBB, vCC */
4681 FETCH w0, 1 // w0<- CCBB
4682 lsr w4, wINST, #8 // w4<- AA
4683 lsr w2, w0, #8 // w2<- CC
4684 and w1, w0, #255 // w1<- BB
4685 GET_VREG_WIDE d2, w2 // w2<- vCC
4686 GET_VREG_WIDE d1, w1 // w1<- vBB
4687 .if 0
4688 cbz d2, common_errDivideByZero // is second operand zero?
4689 .endif
4690 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4691
4692 fmul d0, d1, d2 // d0<- op, w0-w4 changed
4693 GET_INST_OPCODE ip // extract opcode from rINST
4694 SET_VREG_WIDE d0, w4 // vAA<- d0
4695 GOTO_OPCODE ip // jump to next instruction
4696 /* 11-14 instructions */
4697
4698
4699/* ------------------------------ */
4700 .balign 128
4701.L_op_div_double: /* 0xae */
4702/* File: arm64/op_div_double.S */
4703/* File: arm64/binopWide.S */
4704 /*
4705 * Generic 64-bit binary operation. Provide an "instr" line that
4706 * specifies an instruction that performs "result = x1 op x2".
4707 * This could be an ARM instruction or a function call. (If the result
4708 * comes back in a register other than x0, you can override "result".)
4709 *
4710 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4711 * vCC (w1). Useful for integer division and modulus.
4712 *
4713 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4714 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4715 */
4716 /* binop vAA, vBB, vCC */
4717 FETCH w0, 1 // w0<- CCBB
4718 lsr w4, wINST, #8 // w4<- AA
4719 lsr w2, w0, #8 // w2<- CC
4720 and w1, w0, #255 // w1<- BB
4721 GET_VREG_WIDE d2, w2 // w2<- vCC
4722 GET_VREG_WIDE d1, w1 // w1<- vBB
4723 .if 0
4724 cbz d2, common_errDivideByZero // is second operand zero?
4725 .endif
4726 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4727
4728 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
4729 GET_INST_OPCODE ip // extract opcode from rINST
4730 SET_VREG_WIDE d0, w4 // vAA<- d0
4731 GOTO_OPCODE ip // jump to next instruction
4732 /* 11-14 instructions */
4733
4734
4735/* ------------------------------ */
4736 .balign 128
4737.L_op_rem_double: /* 0xaf */
4738/* File: arm64/op_rem_double.S */
4739 /* rem vAA, vBB, vCC */
4740 FETCH w0, 1 // w0<- CCBB
4741 lsr w2, w0, #8 // w2<- CC
4742 and w1, w0, #255 // w1<- BB
4743 GET_VREG_WIDE d1, w2 // d1<- vCC
4744 GET_VREG_WIDE d0, w1 // d0<- vBB
4745 bl fmod
4746 lsr w4, wINST, #8 // w4<- AA
4747 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4748 GET_INST_OPCODE ip // extract opcode from rINST
4749 SET_VREG_WIDE d0, w4 // vAA<- result
4750 GOTO_OPCODE ip // jump to next instruction
4751 /* 11-14 instructions */
4752
4753/* ------------------------------ */
4754 .balign 128
4755.L_op_add_int_2addr: /* 0xb0 */
4756/* File: arm64/op_add_int_2addr.S */
4757/* File: arm64/binop2addr.S */
4758 /*
4759 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4760 * that specifies an instruction that performs "result = w0 op w1".
4761 * This could be an ARM instruction or a function call. (If the result
4762 * comes back in a register other than w0, you can override "result".)
4763 *
4764 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4765 * vCC (w1). Useful for integer division and modulus.
4766 *
4767 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4768 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4769 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4770 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4771 */
4772 /* binop/2addr vA, vB */
4773 lsr w3, wINST, #12 // w3<- B
4774 ubfx w9, wINST, #8, #4 // w9<- A
4775 GET_VREG w1, w3 // w1<- vB
4776 GET_VREG w0, w9 // w0<- vA
4777 .if 0
4778 cbz w1, common_errDivideByZero
4779 .endif
4780 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4781 // optional op; may set condition codes
4782 add w0, w0, w1 // w0<- op, w0-w3 changed
4783 GET_INST_OPCODE ip // extract opcode from rINST
4784 SET_VREG w0, w9 // vAA<- w0
4785 GOTO_OPCODE ip // jump to next instruction
4786 /* 10-13 instructions */
4787
4788
4789/* ------------------------------ */
4790 .balign 128
4791.L_op_sub_int_2addr: /* 0xb1 */
4792/* File: arm64/op_sub_int_2addr.S */
4793/* File: arm64/binop2addr.S */
4794 /*
4795 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4796 * that specifies an instruction that performs "result = w0 op w1".
4797 * This could be an ARM instruction or a function call. (If the result
4798 * comes back in a register other than w0, you can override "result".)
4799 *
4800 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4801 * vCC (w1). Useful for integer division and modulus.
4802 *
4803 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4804 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4805 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4806 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4807 */
4808 /* binop/2addr vA, vB */
4809 lsr w3, wINST, #12 // w3<- B
4810 ubfx w9, wINST, #8, #4 // w9<- A
4811 GET_VREG w1, w3 // w1<- vB
4812 GET_VREG w0, w9 // w0<- vA
4813 .if 0
4814 cbz w1, common_errDivideByZero
4815 .endif
4816 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4817 // optional op; may set condition codes
4818 sub w0, w0, w1 // w0<- op, w0-w3 changed
4819 GET_INST_OPCODE ip // extract opcode from rINST
4820 SET_VREG w0, w9 // vAA<- w0
4821 GOTO_OPCODE ip // jump to next instruction
4822 /* 10-13 instructions */
4823
4824
4825/* ------------------------------ */
4826 .balign 128
4827.L_op_mul_int_2addr: /* 0xb2 */
4828/* File: arm64/op_mul_int_2addr.S */
4829/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
4830/* File: arm64/binop2addr.S */
4831 /*
4832 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4833 * that specifies an instruction that performs "result = w0 op w1".
4834 * This could be an ARM instruction or a function call. (If the result
4835 * comes back in a register other than w0, you can override "result".)
4836 *
4837 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4838 * vCC (w1). Useful for integer division and modulus.
4839 *
4840 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4841 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4842 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4843 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4844 */
4845 /* binop/2addr vA, vB */
4846 lsr w3, wINST, #12 // w3<- B
4847 ubfx w9, wINST, #8, #4 // w9<- A
4848 GET_VREG w1, w3 // w1<- vB
4849 GET_VREG w0, w9 // w0<- vA
4850 .if 0
4851 cbz w1, common_errDivideByZero
4852 .endif
4853 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4854 // optional op; may set condition codes
4855 mul w0, w1, w0 // w0<- op, w0-w3 changed
4856 GET_INST_OPCODE ip // extract opcode from rINST
4857 SET_VREG w0, w9 // vAA<- w0
4858 GOTO_OPCODE ip // jump to next instruction
4859 /* 10-13 instructions */
4860
4861
4862/* ------------------------------ */
4863 .balign 128
4864.L_op_div_int_2addr: /* 0xb3 */
4865/* File: arm64/op_div_int_2addr.S */
4866/* File: arm64/binop2addr.S */
4867 /*
4868 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4869 * that specifies an instruction that performs "result = w0 op w1".
4870 * This could be an ARM instruction or a function call. (If the result
4871 * comes back in a register other than w0, you can override "result".)
4872 *
4873 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4874 * vCC (w1). Useful for integer division and modulus.
4875 *
4876 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4877 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4878 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4879 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4880 */
4881 /* binop/2addr vA, vB */
4882 lsr w3, wINST, #12 // w3<- B
4883 ubfx w9, wINST, #8, #4 // w9<- A
4884 GET_VREG w1, w3 // w1<- vB
4885 GET_VREG w0, w9 // w0<- vA
4886 .if 1
4887 cbz w1, common_errDivideByZero
4888 .endif
4889 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4890 // optional op; may set condition codes
4891 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4892 GET_INST_OPCODE ip // extract opcode from rINST
4893 SET_VREG w0, w9 // vAA<- w0
4894 GOTO_OPCODE ip // jump to next instruction
4895 /* 10-13 instructions */
4896
4897
4898/* ------------------------------ */
4899 .balign 128
4900.L_op_rem_int_2addr: /* 0xb4 */
4901/* File: arm64/op_rem_int_2addr.S */
4902/* File: arm64/binop2addr.S */
4903 /*
4904 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4905 * that specifies an instruction that performs "result = w0 op w1".
4906 * This could be an ARM instruction or a function call. (If the result
4907 * comes back in a register other than w0, you can override "result".)
4908 *
4909 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4910 * vCC (w1). Useful for integer division and modulus.
4911 *
4912 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4913 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4914 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4915 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4916 */
4917 /* binop/2addr vA, vB */
4918 lsr w3, wINST, #12 // w3<- B
4919 ubfx w9, wINST, #8, #4 // w9<- A
4920 GET_VREG w1, w3 // w1<- vB
4921 GET_VREG w0, w9 // w0<- vA
4922 .if 1
4923 cbz w1, common_errDivideByZero
4924 .endif
4925 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4926 sdiv w2, w0, w1 // optional op; may set condition codes
4927 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4928 GET_INST_OPCODE ip // extract opcode from rINST
4929 SET_VREG w0, w9 // vAA<- w0
4930 GOTO_OPCODE ip // jump to next instruction
4931 /* 10-13 instructions */
4932
4933
4934/* ------------------------------ */
4935 .balign 128
4936.L_op_and_int_2addr: /* 0xb5 */
4937/* File: arm64/op_and_int_2addr.S */
4938/* File: arm64/binop2addr.S */
4939 /*
4940 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4941 * that specifies an instruction that performs "result = w0 op w1".
4942 * This could be an ARM instruction or a function call. (If the result
4943 * comes back in a register other than w0, you can override "result".)
4944 *
4945 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4946 * vCC (w1). Useful for integer division and modulus.
4947 *
4948 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4949 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4950 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4951 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4952 */
4953 /* binop/2addr vA, vB */
4954 lsr w3, wINST, #12 // w3<- B
4955 ubfx w9, wINST, #8, #4 // w9<- A
4956 GET_VREG w1, w3 // w1<- vB
4957 GET_VREG w0, w9 // w0<- vA
4958 .if 0
4959 cbz w1, common_errDivideByZero
4960 .endif
4961 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4962 // optional op; may set condition codes
4963 and w0, w0, w1 // w0<- op, w0-w3 changed
4964 GET_INST_OPCODE ip // extract opcode from rINST
4965 SET_VREG w0, w9 // vAA<- w0
4966 GOTO_OPCODE ip // jump to next instruction
4967 /* 10-13 instructions */
4968
4969
4970/* ------------------------------ */
4971 .balign 128
4972.L_op_or_int_2addr: /* 0xb6 */
4973/* File: arm64/op_or_int_2addr.S */
4974/* File: arm64/binop2addr.S */
4975 /*
4976 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4977 * that specifies an instruction that performs "result = w0 op w1".
4978 * This could be an ARM instruction or a function call. (If the result
4979 * comes back in a register other than w0, you can override "result".)
4980 *
4981 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4982 * vCC (w1). Useful for integer division and modulus.
4983 *
4984 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4985 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4986 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4987 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4988 */
4989 /* binop/2addr vA, vB */
4990 lsr w3, wINST, #12 // w3<- B
4991 ubfx w9, wINST, #8, #4 // w9<- A
4992 GET_VREG w1, w3 // w1<- vB
4993 GET_VREG w0, w9 // w0<- vA
4994 .if 0
4995 cbz w1, common_errDivideByZero
4996 .endif
4997 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4998 // optional op; may set condition codes
4999 orr w0, w0, w1 // w0<- op, w0-w3 changed
5000 GET_INST_OPCODE ip // extract opcode from rINST
5001 SET_VREG w0, w9 // vAA<- w0
5002 GOTO_OPCODE ip // jump to next instruction
5003 /* 10-13 instructions */
5004
5005
5006/* ------------------------------ */
5007 .balign 128
5008.L_op_xor_int_2addr: /* 0xb7 */
5009/* File: arm64/op_xor_int_2addr.S */
5010/* File: arm64/binop2addr.S */
5011 /*
5012 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5013 * that specifies an instruction that performs "result = w0 op w1".
5014 * This could be an ARM instruction or a function call. (If the result
5015 * comes back in a register other than w0, you can override "result".)
5016 *
5017 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5018 * vCC (w1). Useful for integer division and modulus.
5019 *
5020 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5021 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5022 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5023 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5024 */
5025 /* binop/2addr vA, vB */
5026 lsr w3, wINST, #12 // w3<- B
5027 ubfx w9, wINST, #8, #4 // w9<- A
5028 GET_VREG w1, w3 // w1<- vB
5029 GET_VREG w0, w9 // w0<- vA
5030 .if 0
5031 cbz w1, common_errDivideByZero
5032 .endif
5033 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5034 // optional op; may set condition codes
5035 eor w0, w0, w1 // w0<- op, w0-w3 changed
5036 GET_INST_OPCODE ip // extract opcode from rINST
5037 SET_VREG w0, w9 // vAA<- w0
5038 GOTO_OPCODE ip // jump to next instruction
5039 /* 10-13 instructions */
5040
5041
5042/* ------------------------------ */
5043 .balign 128
5044.L_op_shl_int_2addr: /* 0xb8 */
5045/* File: arm64/op_shl_int_2addr.S */
5046/* File: arm64/binop2addr.S */
5047 /*
5048 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5049 * that specifies an instruction that performs "result = w0 op w1".
5050 * This could be an ARM instruction or a function call. (If the result
5051 * comes back in a register other than w0, you can override "result".)
5052 *
5053 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5054 * vCC (w1). Useful for integer division and modulus.
5055 *
5056 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5057 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5058 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5059 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5060 */
5061 /* binop/2addr vA, vB */
5062 lsr w3, wINST, #12 // w3<- B
5063 ubfx w9, wINST, #8, #4 // w9<- A
5064 GET_VREG w1, w3 // w1<- vB
5065 GET_VREG w0, w9 // w0<- vA
5066 .if 0
5067 cbz w1, common_errDivideByZero
5068 .endif
5069 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005070 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005071 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5072 GET_INST_OPCODE ip // extract opcode from rINST
5073 SET_VREG w0, w9 // vAA<- w0
5074 GOTO_OPCODE ip // jump to next instruction
5075 /* 10-13 instructions */
5076
5077
5078/* ------------------------------ */
5079 .balign 128
5080.L_op_shr_int_2addr: /* 0xb9 */
5081/* File: arm64/op_shr_int_2addr.S */
5082/* File: arm64/binop2addr.S */
5083 /*
5084 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5085 * that specifies an instruction that performs "result = w0 op w1".
5086 * This could be an ARM instruction or a function call. (If the result
5087 * comes back in a register other than w0, you can override "result".)
5088 *
5089 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5090 * vCC (w1). Useful for integer division and modulus.
5091 *
5092 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5093 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5094 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5095 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5096 */
5097 /* binop/2addr vA, vB */
5098 lsr w3, wINST, #12 // w3<- B
5099 ubfx w9, wINST, #8, #4 // w9<- A
5100 GET_VREG w1, w3 // w1<- vB
5101 GET_VREG w0, w9 // w0<- vA
5102 .if 0
5103 cbz w1, common_errDivideByZero
5104 .endif
5105 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005106 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005107 asr w0, w0, w1 // w0<- op, w0-w3 changed
5108 GET_INST_OPCODE ip // extract opcode from rINST
5109 SET_VREG w0, w9 // vAA<- w0
5110 GOTO_OPCODE ip // jump to next instruction
5111 /* 10-13 instructions */
5112
5113
5114/* ------------------------------ */
5115 .balign 128
5116.L_op_ushr_int_2addr: /* 0xba */
5117/* File: arm64/op_ushr_int_2addr.S */
5118/* File: arm64/binop2addr.S */
5119 /*
5120 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5121 * that specifies an instruction that performs "result = w0 op w1".
5122 * This could be an ARM instruction or a function call. (If the result
5123 * comes back in a register other than w0, you can override "result".)
5124 *
5125 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5126 * vCC (w1). Useful for integer division and modulus.
5127 *
5128 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5129 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5130 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5131 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5132 */
5133 /* binop/2addr vA, vB */
5134 lsr w3, wINST, #12 // w3<- B
5135 ubfx w9, wINST, #8, #4 // w9<- A
5136 GET_VREG w1, w3 // w1<- vB
5137 GET_VREG w0, w9 // w0<- vA
5138 .if 0
5139 cbz w1, common_errDivideByZero
5140 .endif
5141 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005142 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005143 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5144 GET_INST_OPCODE ip // extract opcode from rINST
5145 SET_VREG w0, w9 // vAA<- w0
5146 GOTO_OPCODE ip // jump to next instruction
5147 /* 10-13 instructions */
5148
5149
5150/* ------------------------------ */
5151 .balign 128
5152.L_op_add_long_2addr: /* 0xbb */
5153/* File: arm64/op_add_long_2addr.S */
5154/* File: arm64/binopWide2addr.S */
5155 /*
5156 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5157 * that specifies an instruction that performs "x0 = x0 op x1".
5158 * This must not be a function call, as we keep w2 live across it.
5159 *
5160 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5161 * vCC (w1). Useful for integer division and modulus.
5162 *
5163 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5164 * and-long/2addr, or-long/2addr, xor-long/2addr,
5165 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5166 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5167 */
5168 /* binop/2addr vA, vB */
5169 lsr w1, wINST, #12 // w1<- B
5170 ubfx w2, wINST, #8, #4 // w2<- A
5171 GET_VREG_WIDE x1, w1 // x1<- vB
5172 GET_VREG_WIDE x0, w2 // x0<- vA
5173 .if 0
5174 cbz x1, common_errDivideByZero
5175 .endif
5176 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5177
5178 add x0, x0, x1 // result<- op
5179 GET_INST_OPCODE ip // extract opcode from rINST
5180 SET_VREG_WIDE x0, w2 // vAA<- result
5181 GOTO_OPCODE ip // jump to next instruction
5182 /* 10-13 instructions */
5183
5184
5185/* ------------------------------ */
5186 .balign 128
5187.L_op_sub_long_2addr: /* 0xbc */
5188/* File: arm64/op_sub_long_2addr.S */
5189/* File: arm64/binopWide2addr.S */
5190 /*
5191 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5192 * that specifies an instruction that performs "x0 = x0 op x1".
5193 * This must not be a function call, as we keep w2 live across it.
5194 *
5195 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5196 * vCC (w1). Useful for integer division and modulus.
5197 *
5198 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5199 * and-long/2addr, or-long/2addr, xor-long/2addr,
5200 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5201 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5202 */
5203 /* binop/2addr vA, vB */
5204 lsr w1, wINST, #12 // w1<- B
5205 ubfx w2, wINST, #8, #4 // w2<- A
5206 GET_VREG_WIDE x1, w1 // x1<- vB
5207 GET_VREG_WIDE x0, w2 // x0<- vA
5208 .if 0
5209 cbz x1, common_errDivideByZero
5210 .endif
5211 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5212
5213 sub x0, x0, x1 // result<- op
5214 GET_INST_OPCODE ip // extract opcode from rINST
5215 SET_VREG_WIDE x0, w2 // vAA<- result
5216 GOTO_OPCODE ip // jump to next instruction
5217 /* 10-13 instructions */
5218
5219
5220/* ------------------------------ */
5221 .balign 128
5222.L_op_mul_long_2addr: /* 0xbd */
5223/* File: arm64/op_mul_long_2addr.S */
5224/* File: arm64/binopWide2addr.S */
5225 /*
5226 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5227 * that specifies an instruction that performs "x0 = x0 op x1".
5228 * This must not be a function call, as we keep w2 live across it.
5229 *
5230 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5231 * vCC (w1). Useful for integer division and modulus.
5232 *
5233 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5234 * and-long/2addr, or-long/2addr, xor-long/2addr,
5235 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5236 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5237 */
5238 /* binop/2addr vA, vB */
5239 lsr w1, wINST, #12 // w1<- B
5240 ubfx w2, wINST, #8, #4 // w2<- A
5241 GET_VREG_WIDE x1, w1 // x1<- vB
5242 GET_VREG_WIDE x0, w2 // x0<- vA
5243 .if 0
5244 cbz x1, common_errDivideByZero
5245 .endif
5246 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5247
5248 mul x0, x0, x1 // result<- op
5249 GET_INST_OPCODE ip // extract opcode from rINST
5250 SET_VREG_WIDE x0, w2 // vAA<- result
5251 GOTO_OPCODE ip // jump to next instruction
5252 /* 10-13 instructions */
5253
5254
5255/* ------------------------------ */
5256 .balign 128
5257.L_op_div_long_2addr: /* 0xbe */
5258/* File: arm64/op_div_long_2addr.S */
5259/* File: arm64/binopWide2addr.S */
5260 /*
5261 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5262 * that specifies an instruction that performs "x0 = x0 op x1".
5263 * This must not be a function call, as we keep w2 live across it.
5264 *
5265 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5266 * vCC (w1). Useful for integer division and modulus.
5267 *
5268 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5269 * and-long/2addr, or-long/2addr, xor-long/2addr,
5270 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5271 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5272 */
5273 /* binop/2addr vA, vB */
5274 lsr w1, wINST, #12 // w1<- B
5275 ubfx w2, wINST, #8, #4 // w2<- A
5276 GET_VREG_WIDE x1, w1 // x1<- vB
5277 GET_VREG_WIDE x0, w2 // x0<- vA
5278 .if 1
5279 cbz x1, common_errDivideByZero
5280 .endif
5281 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5282
5283 sdiv x0, x0, x1 // result<- op
5284 GET_INST_OPCODE ip // extract opcode from rINST
5285 SET_VREG_WIDE x0, w2 // vAA<- result
5286 GOTO_OPCODE ip // jump to next instruction
5287 /* 10-13 instructions */
5288
5289
5290/* ------------------------------ */
5291 .balign 128
5292.L_op_rem_long_2addr: /* 0xbf */
5293/* File: arm64/op_rem_long_2addr.S */
5294/* File: arm64/binopWide2addr.S */
5295 /*
5296 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5297 * that specifies an instruction that performs "x0 = x0 op x1".
5298 * This must not be a function call, as we keep w2 live across it.
5299 *
5300 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5301 * vCC (w1). Useful for integer division and modulus.
5302 *
5303 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5304 * and-long/2addr, or-long/2addr, xor-long/2addr,
5305 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5306 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5307 */
5308 /* binop/2addr vA, vB */
5309 lsr w1, wINST, #12 // w1<- B
5310 ubfx w2, wINST, #8, #4 // w2<- A
5311 GET_VREG_WIDE x1, w1 // x1<- vB
5312 GET_VREG_WIDE x0, w2 // x0<- vA
5313 .if 1
5314 cbz x1, common_errDivideByZero
5315 .endif
5316 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5317 sdiv x3, x0, x1
5318 msub x0, x3, x1, x0 // result<- op
5319 GET_INST_OPCODE ip // extract opcode from rINST
5320 SET_VREG_WIDE x0, w2 // vAA<- result
5321 GOTO_OPCODE ip // jump to next instruction
5322 /* 10-13 instructions */
5323
5324
5325/* ------------------------------ */
5326 .balign 128
5327.L_op_and_long_2addr: /* 0xc0 */
5328/* File: arm64/op_and_long_2addr.S */
5329/* File: arm64/binopWide2addr.S */
5330 /*
5331 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5332 * that specifies an instruction that performs "x0 = x0 op x1".
5333 * This must not be a function call, as we keep w2 live across it.
5334 *
5335 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5336 * vCC (w1). Useful for integer division and modulus.
5337 *
5338 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5339 * and-long/2addr, or-long/2addr, xor-long/2addr,
5340 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5341 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5342 */
5343 /* binop/2addr vA, vB */
5344 lsr w1, wINST, #12 // w1<- B
5345 ubfx w2, wINST, #8, #4 // w2<- A
5346 GET_VREG_WIDE x1, w1 // x1<- vB
5347 GET_VREG_WIDE x0, w2 // x0<- vA
5348 .if 0
5349 cbz x1, common_errDivideByZero
5350 .endif
5351 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5352
5353 and x0, x0, x1 // result<- op
5354 GET_INST_OPCODE ip // extract opcode from rINST
5355 SET_VREG_WIDE x0, w2 // vAA<- result
5356 GOTO_OPCODE ip // jump to next instruction
5357 /* 10-13 instructions */
5358
5359
5360/* ------------------------------ */
5361 .balign 128
5362.L_op_or_long_2addr: /* 0xc1 */
5363/* File: arm64/op_or_long_2addr.S */
5364/* File: arm64/binopWide2addr.S */
5365 /*
5366 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5367 * that specifies an instruction that performs "x0 = x0 op x1".
5368 * This must not be a function call, as we keep w2 live across it.
5369 *
5370 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5371 * vCC (w1). Useful for integer division and modulus.
5372 *
5373 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5374 * and-long/2addr, or-long/2addr, xor-long/2addr,
5375 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5376 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5377 */
5378 /* binop/2addr vA, vB */
5379 lsr w1, wINST, #12 // w1<- B
5380 ubfx w2, wINST, #8, #4 // w2<- A
5381 GET_VREG_WIDE x1, w1 // x1<- vB
5382 GET_VREG_WIDE x0, w2 // x0<- vA
5383 .if 0
5384 cbz x1, common_errDivideByZero
5385 .endif
5386 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5387
5388 orr x0, x0, x1 // result<- op
5389 GET_INST_OPCODE ip // extract opcode from rINST
5390 SET_VREG_WIDE x0, w2 // vAA<- result
5391 GOTO_OPCODE ip // jump to next instruction
5392 /* 10-13 instructions */
5393
5394
5395/* ------------------------------ */
5396 .balign 128
5397.L_op_xor_long_2addr: /* 0xc2 */
5398/* File: arm64/op_xor_long_2addr.S */
5399/* File: arm64/binopWide2addr.S */
5400 /*
5401 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5402 * that specifies an instruction that performs "x0 = x0 op x1".
5403 * This must not be a function call, as we keep w2 live across it.
5404 *
5405 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5406 * vCC (w1). Useful for integer division and modulus.
5407 *
5408 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5409 * and-long/2addr, or-long/2addr, xor-long/2addr,
5410 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5411 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5412 */
5413 /* binop/2addr vA, vB */
5414 lsr w1, wINST, #12 // w1<- B
5415 ubfx w2, wINST, #8, #4 // w2<- A
5416 GET_VREG_WIDE x1, w1 // x1<- vB
5417 GET_VREG_WIDE x0, w2 // x0<- vA
5418 .if 0
5419 cbz x1, common_errDivideByZero
5420 .endif
5421 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5422
5423 eor x0, x0, x1 // result<- op
5424 GET_INST_OPCODE ip // extract opcode from rINST
5425 SET_VREG_WIDE x0, w2 // vAA<- result
5426 GOTO_OPCODE ip // jump to next instruction
5427 /* 10-13 instructions */
5428
5429
5430/* ------------------------------ */
5431 .balign 128
5432.L_op_shl_long_2addr: /* 0xc3 */
5433/* File: arm64/op_shl_long_2addr.S */
5434/* File: arm64/shiftWide2addr.S */
5435 /*
5436 * Generic 64-bit shift operation.
5437 */
5438 /* binop/2addr vA, vB */
5439 lsr w1, wINST, #12 // w1<- B
5440 ubfx w2, wINST, #8, #4 // w2<- A
5441 GET_VREG w1, w1 // x1<- vB
5442 GET_VREG_WIDE x0, w2 // x0<- vA
5443 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005444 lsl x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005445 GET_INST_OPCODE ip // extract opcode from rINST
5446 SET_VREG_WIDE x0, w2 // vAA<- result
5447 GOTO_OPCODE ip // jump to next instruction
5448 /* 10-13 instructions */
5449
5450
5451/* ------------------------------ */
5452 .balign 128
5453.L_op_shr_long_2addr: /* 0xc4 */
5454/* File: arm64/op_shr_long_2addr.S */
5455/* File: arm64/shiftWide2addr.S */
5456 /*
5457 * Generic 64-bit shift operation.
5458 */
5459 /* binop/2addr vA, vB */
5460 lsr w1, wINST, #12 // w1<- B
5461 ubfx w2, wINST, #8, #4 // w2<- A
5462 GET_VREG w1, w1 // x1<- vB
5463 GET_VREG_WIDE x0, w2 // x0<- vA
5464 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005465 asr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005466 GET_INST_OPCODE ip // extract opcode from rINST
5467 SET_VREG_WIDE x0, w2 // vAA<- result
5468 GOTO_OPCODE ip // jump to next instruction
5469 /* 10-13 instructions */
5470
5471
5472/* ------------------------------ */
5473 .balign 128
5474.L_op_ushr_long_2addr: /* 0xc5 */
5475/* File: arm64/op_ushr_long_2addr.S */
5476/* File: arm64/shiftWide2addr.S */
5477 /*
5478 * Generic 64-bit shift operation.
5479 */
5480 /* binop/2addr vA, vB */
5481 lsr w1, wINST, #12 // w1<- B
5482 ubfx w2, wINST, #8, #4 // w2<- A
5483 GET_VREG w1, w1 // x1<- vB
5484 GET_VREG_WIDE x0, w2 // x0<- vA
5485 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005486 lsr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005487 GET_INST_OPCODE ip // extract opcode from rINST
5488 SET_VREG_WIDE x0, w2 // vAA<- result
5489 GOTO_OPCODE ip // jump to next instruction
5490 /* 10-13 instructions */
5491
5492
5493/* ------------------------------ */
5494 .balign 128
5495.L_op_add_float_2addr: /* 0xc6 */
5496/* File: arm64/op_add_float_2addr.S */
5497/* File: arm64/fbinop2addr.S */
5498 /*
5499 * Generic 32-bit floating point "/2addr" binary operation. Provide
5500 * an "instr" line that specifies an instruction that performs
5501 * "s2 = s0 op s1".
5502 *
5503 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5504 */
5505 /* binop/2addr vA, vB */
5506 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005507 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005508 GET_VREG s1, w3
5509 GET_VREG s0, w9
5510 fadd s2, s0, s1 // s2<- op
5511 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5512 GET_INST_OPCODE ip // extract opcode from rINST
5513 SET_VREG s2, w9
5514 GOTO_OPCODE ip // jump to next instruction
5515
5516
5517/* ------------------------------ */
5518 .balign 128
5519.L_op_sub_float_2addr: /* 0xc7 */
5520/* File: arm64/op_sub_float_2addr.S */
5521/* File: arm64/fbinop2addr.S */
5522 /*
5523 * Generic 32-bit floating point "/2addr" binary operation. Provide
5524 * an "instr" line that specifies an instruction that performs
5525 * "s2 = s0 op s1".
5526 *
5527 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5528 */
5529 /* binop/2addr vA, vB */
5530 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005531 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005532 GET_VREG s1, w3
5533 GET_VREG s0, w9
5534 fsub s2, s0, s1 // s2<- op
5535 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5536 GET_INST_OPCODE ip // extract opcode from rINST
5537 SET_VREG s2, w9
5538 GOTO_OPCODE ip // jump to next instruction
5539
5540
5541/* ------------------------------ */
5542 .balign 128
5543.L_op_mul_float_2addr: /* 0xc8 */
5544/* File: arm64/op_mul_float_2addr.S */
5545/* File: arm64/fbinop2addr.S */
5546 /*
5547 * Generic 32-bit floating point "/2addr" binary operation. Provide
5548 * an "instr" line that specifies an instruction that performs
5549 * "s2 = s0 op s1".
5550 *
5551 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5552 */
5553 /* binop/2addr vA, vB */
5554 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005555 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005556 GET_VREG s1, w3
5557 GET_VREG s0, w9
5558 fmul s2, s0, s1 // s2<- op
5559 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5560 GET_INST_OPCODE ip // extract opcode from rINST
5561 SET_VREG s2, w9
5562 GOTO_OPCODE ip // jump to next instruction
5563
5564
5565/* ------------------------------ */
5566 .balign 128
5567.L_op_div_float_2addr: /* 0xc9 */
5568/* File: arm64/op_div_float_2addr.S */
5569/* File: arm64/fbinop2addr.S */
5570 /*
5571 * Generic 32-bit floating point "/2addr" binary operation. Provide
5572 * an "instr" line that specifies an instruction that performs
5573 * "s2 = s0 op s1".
5574 *
5575 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5576 */
5577 /* binop/2addr vA, vB */
5578 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005579 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005580 GET_VREG s1, w3
5581 GET_VREG s0, w9
5582 fdiv s2, s0, s1 // s2<- op
5583 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5584 GET_INST_OPCODE ip // extract opcode from rINST
5585 SET_VREG s2, w9
5586 GOTO_OPCODE ip // jump to next instruction
5587
5588
5589/* ------------------------------ */
5590 .balign 128
5591.L_op_rem_float_2addr: /* 0xca */
5592/* File: arm64/op_rem_float_2addr.S */
5593 /* rem vA, vB */
5594 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005595 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005596 GET_VREG s1, w3
5597 GET_VREG s0, w9
5598 bl fmodf
Vladimir Markoe6220222016-07-20 14:25:30 +01005599 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005600 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5601 GET_INST_OPCODE ip // extract opcode from rINST
5602 SET_VREG s0, w9
5603 GOTO_OPCODE ip // jump to next instruction
5604
5605/* ------------------------------ */
5606 .balign 128
5607.L_op_add_double_2addr: /* 0xcb */
5608/* File: arm64/op_add_double_2addr.S */
5609/* File: arm64/binopWide2addr.S */
5610 /*
5611 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5612 * that specifies an instruction that performs "x0 = x0 op x1".
5613 * This must not be a function call, as we keep w2 live across it.
5614 *
5615 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5616 * vCC (w1). Useful for integer division and modulus.
5617 *
5618 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5619 * and-long/2addr, or-long/2addr, xor-long/2addr,
5620 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5621 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5622 */
5623 /* binop/2addr vA, vB */
5624 lsr w1, wINST, #12 // w1<- B
5625 ubfx w2, wINST, #8, #4 // w2<- A
5626 GET_VREG_WIDE d1, w1 // x1<- vB
5627 GET_VREG_WIDE d0, w2 // x0<- vA
5628 .if 0
5629 cbz d1, common_errDivideByZero
5630 .endif
5631 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5632
5633 fadd d0, d0, d1 // result<- op
5634 GET_INST_OPCODE ip // extract opcode from rINST
5635 SET_VREG_WIDE d0, w2 // vAA<- result
5636 GOTO_OPCODE ip // jump to next instruction
5637 /* 10-13 instructions */
5638
5639
5640/* ------------------------------ */
5641 .balign 128
5642.L_op_sub_double_2addr: /* 0xcc */
5643/* File: arm64/op_sub_double_2addr.S */
5644/* File: arm64/binopWide2addr.S */
5645 /*
5646 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5647 * that specifies an instruction that performs "x0 = x0 op x1".
5648 * This must not be a function call, as we keep w2 live across it.
5649 *
5650 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5651 * vCC (w1). Useful for integer division and modulus.
5652 *
5653 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5654 * and-long/2addr, or-long/2addr, xor-long/2addr,
5655 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5656 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5657 */
5658 /* binop/2addr vA, vB */
5659 lsr w1, wINST, #12 // w1<- B
5660 ubfx w2, wINST, #8, #4 // w2<- A
5661 GET_VREG_WIDE d1, w1 // x1<- vB
5662 GET_VREG_WIDE d0, w2 // x0<- vA
5663 .if 0
5664 cbz d1, common_errDivideByZero
5665 .endif
5666 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5667
5668 fsub d0, d0, d1 // result<- op
5669 GET_INST_OPCODE ip // extract opcode from rINST
5670 SET_VREG_WIDE d0, w2 // vAA<- result
5671 GOTO_OPCODE ip // jump to next instruction
5672 /* 10-13 instructions */
5673
5674
5675/* ------------------------------ */
5676 .balign 128
5677.L_op_mul_double_2addr: /* 0xcd */
5678/* File: arm64/op_mul_double_2addr.S */
5679/* File: arm64/binopWide2addr.S */
5680 /*
5681 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5682 * that specifies an instruction that performs "x0 = x0 op x1".
5683 * This must not be a function call, as we keep w2 live across it.
5684 *
5685 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5686 * vCC (w1). Useful for integer division and modulus.
5687 *
5688 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5689 * and-long/2addr, or-long/2addr, xor-long/2addr,
5690 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5691 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5692 */
5693 /* binop/2addr vA, vB */
5694 lsr w1, wINST, #12 // w1<- B
5695 ubfx w2, wINST, #8, #4 // w2<- A
5696 GET_VREG_WIDE d1, w1 // x1<- vB
5697 GET_VREG_WIDE d0, w2 // x0<- vA
5698 .if 0
5699 cbz d1, common_errDivideByZero
5700 .endif
5701 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5702
5703 fmul d0, d0, d1 // result<- op
5704 GET_INST_OPCODE ip // extract opcode from rINST
5705 SET_VREG_WIDE d0, w2 // vAA<- result
5706 GOTO_OPCODE ip // jump to next instruction
5707 /* 10-13 instructions */
5708
5709
5710/* ------------------------------ */
5711 .balign 128
5712.L_op_div_double_2addr: /* 0xce */
5713/* File: arm64/op_div_double_2addr.S */
5714/* File: arm64/binopWide2addr.S */
5715 /*
5716 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5717 * that specifies an instruction that performs "x0 = x0 op x1".
5718 * This must not be a function call, as we keep w2 live across it.
5719 *
5720 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5721 * vCC (w1). Useful for integer division and modulus.
5722 *
5723 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5724 * and-long/2addr, or-long/2addr, xor-long/2addr,
5725 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5726 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5727 */
5728 /* binop/2addr vA, vB */
5729 lsr w1, wINST, #12 // w1<- B
5730 ubfx w2, wINST, #8, #4 // w2<- A
5731 GET_VREG_WIDE d1, w1 // x1<- vB
5732 GET_VREG_WIDE d0, w2 // x0<- vA
5733 .if 0
5734 cbz d1, common_errDivideByZero
5735 .endif
5736 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5737
5738 fdiv d0, d0, d1 // result<- op
5739 GET_INST_OPCODE ip // extract opcode from rINST
5740 SET_VREG_WIDE d0, w2 // vAA<- result
5741 GOTO_OPCODE ip // jump to next instruction
5742 /* 10-13 instructions */
5743
5744
5745/* ------------------------------ */
5746 .balign 128
5747.L_op_rem_double_2addr: /* 0xcf */
5748/* File: arm64/op_rem_double_2addr.S */
5749 /* rem vA, vB */
5750 lsr w1, wINST, #12 // w1<- B
5751 ubfx w2, wINST, #8, #4 // w2<- A
5752 GET_VREG_WIDE d1, w1 // d1<- vB
5753 GET_VREG_WIDE d0, w2 // d0<- vA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005754 bl fmod
5755 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
buzbee908c0b22016-03-16 14:39:50 -07005756 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005757 GET_INST_OPCODE ip // extract opcode from rINST
5758 SET_VREG_WIDE d0, w2 // vAA<- result
5759 GOTO_OPCODE ip // jump to next instruction
5760 /* 10-13 instructions */
5761
5762/* ------------------------------ */
5763 .balign 128
5764.L_op_add_int_lit16: /* 0xd0 */
5765/* File: arm64/op_add_int_lit16.S */
5766/* File: arm64/binopLit16.S */
5767 /*
5768 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5769 * that specifies an instruction that performs "result = w0 op w1".
5770 * This could be an ARM instruction or a function call. (If the result
5771 * comes back in a register other than w0, you can override "result".)
5772 *
5773 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5774 * vCC (w1). Useful for integer division and modulus.
5775 *
5776 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5777 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5778 */
5779 /* binop/lit16 vA, vB, #+CCCC */
5780 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5781 lsr w2, wINST, #12 // w2<- B
5782 ubfx w9, wINST, #8, #4 // w9<- A
5783 GET_VREG w0, w2 // w0<- vB
5784 .if 0
5785 cbz w1, common_errDivideByZero
5786 .endif
5787 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5788
5789 add w0, w0, w1 // w0<- op, w0-w3 changed
5790 GET_INST_OPCODE ip // extract opcode from rINST
5791 SET_VREG w0, w9 // vAA<- w0
5792 GOTO_OPCODE ip // jump to next instruction
5793 /* 10-13 instructions */
5794
5795
5796/* ------------------------------ */
5797 .balign 128
5798.L_op_rsub_int: /* 0xd1 */
5799/* File: arm64/op_rsub_int.S */
5800/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5801/* File: arm64/binopLit16.S */
5802 /*
5803 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5804 * that specifies an instruction that performs "result = w0 op w1".
5805 * This could be an ARM instruction or a function call. (If the result
5806 * comes back in a register other than w0, you can override "result".)
5807 *
5808 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5809 * vCC (w1). Useful for integer division and modulus.
5810 *
5811 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5812 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5813 */
5814 /* binop/lit16 vA, vB, #+CCCC */
5815 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5816 lsr w2, wINST, #12 // w2<- B
5817 ubfx w9, wINST, #8, #4 // w9<- A
5818 GET_VREG w0, w2 // w0<- vB
5819 .if 0
5820 cbz w1, common_errDivideByZero
5821 .endif
5822 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5823
5824 sub w0, w1, w0 // w0<- op, w0-w3 changed
5825 GET_INST_OPCODE ip // extract opcode from rINST
5826 SET_VREG w0, w9 // vAA<- w0
5827 GOTO_OPCODE ip // jump to next instruction
5828 /* 10-13 instructions */
5829
5830
5831/* ------------------------------ */
5832 .balign 128
5833.L_op_mul_int_lit16: /* 0xd2 */
5834/* File: arm64/op_mul_int_lit16.S */
5835/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5836/* File: arm64/binopLit16.S */
5837 /*
5838 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5839 * that specifies an instruction that performs "result = w0 op w1".
5840 * This could be an ARM instruction or a function call. (If the result
5841 * comes back in a register other than w0, you can override "result".)
5842 *
5843 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5844 * vCC (w1). Useful for integer division and modulus.
5845 *
5846 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5847 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5848 */
5849 /* binop/lit16 vA, vB, #+CCCC */
5850 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5851 lsr w2, wINST, #12 // w2<- B
5852 ubfx w9, wINST, #8, #4 // w9<- A
5853 GET_VREG w0, w2 // w0<- vB
5854 .if 0
5855 cbz w1, common_errDivideByZero
5856 .endif
5857 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5858
5859 mul w0, w1, w0 // w0<- op, w0-w3 changed
5860 GET_INST_OPCODE ip // extract opcode from rINST
5861 SET_VREG w0, w9 // vAA<- w0
5862 GOTO_OPCODE ip // jump to next instruction
5863 /* 10-13 instructions */
5864
5865
5866/* ------------------------------ */
5867 .balign 128
5868.L_op_div_int_lit16: /* 0xd3 */
5869/* File: arm64/op_div_int_lit16.S */
5870/* File: arm64/binopLit16.S */
5871 /*
5872 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5873 * that specifies an instruction that performs "result = w0 op w1".
5874 * This could be an ARM instruction or a function call. (If the result
5875 * comes back in a register other than w0, you can override "result".)
5876 *
5877 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5878 * vCC (w1). Useful for integer division and modulus.
5879 *
5880 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5881 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5882 */
5883 /* binop/lit16 vA, vB, #+CCCC */
5884 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5885 lsr w2, wINST, #12 // w2<- B
5886 ubfx w9, wINST, #8, #4 // w9<- A
5887 GET_VREG w0, w2 // w0<- vB
5888 .if 1
5889 cbz w1, common_errDivideByZero
5890 .endif
5891 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5892
5893 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5894 GET_INST_OPCODE ip // extract opcode from rINST
5895 SET_VREG w0, w9 // vAA<- w0
5896 GOTO_OPCODE ip // jump to next instruction
5897 /* 10-13 instructions */
5898
5899
5900/* ------------------------------ */
5901 .balign 128
5902.L_op_rem_int_lit16: /* 0xd4 */
5903/* File: arm64/op_rem_int_lit16.S */
5904/* File: arm64/binopLit16.S */
5905 /*
5906 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5907 * that specifies an instruction that performs "result = w0 op w1".
5908 * This could be an ARM instruction or a function call. (If the result
5909 * comes back in a register other than w0, you can override "result".)
5910 *
5911 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5912 * vCC (w1). Useful for integer division and modulus.
5913 *
5914 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5915 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5916 */
5917 /* binop/lit16 vA, vB, #+CCCC */
5918 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5919 lsr w2, wINST, #12 // w2<- B
5920 ubfx w9, wINST, #8, #4 // w9<- A
5921 GET_VREG w0, w2 // w0<- vB
5922 .if 1
5923 cbz w1, common_errDivideByZero
5924 .endif
5925 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5926 sdiv w3, w0, w1
5927 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
5928 GET_INST_OPCODE ip // extract opcode from rINST
5929 SET_VREG w0, w9 // vAA<- w0
5930 GOTO_OPCODE ip // jump to next instruction
5931 /* 10-13 instructions */
5932
5933
5934/* ------------------------------ */
5935 .balign 128
5936.L_op_and_int_lit16: /* 0xd5 */
5937/* File: arm64/op_and_int_lit16.S */
5938/* File: arm64/binopLit16.S */
5939 /*
5940 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5941 * that specifies an instruction that performs "result = w0 op w1".
5942 * This could be an ARM instruction or a function call. (If the result
5943 * comes back in a register other than w0, you can override "result".)
5944 *
5945 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5946 * vCC (w1). Useful for integer division and modulus.
5947 *
5948 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5949 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5950 */
5951 /* binop/lit16 vA, vB, #+CCCC */
5952 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5953 lsr w2, wINST, #12 // w2<- B
5954 ubfx w9, wINST, #8, #4 // w9<- A
5955 GET_VREG w0, w2 // w0<- vB
5956 .if 0
5957 cbz w1, common_errDivideByZero
5958 .endif
5959 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5960
5961 and w0, w0, w1 // w0<- op, w0-w3 changed
5962 GET_INST_OPCODE ip // extract opcode from rINST
5963 SET_VREG w0, w9 // vAA<- w0
5964 GOTO_OPCODE ip // jump to next instruction
5965 /* 10-13 instructions */
5966
5967
5968/* ------------------------------ */
5969 .balign 128
5970.L_op_or_int_lit16: /* 0xd6 */
5971/* File: arm64/op_or_int_lit16.S */
5972/* File: arm64/binopLit16.S */
5973 /*
5974 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5975 * that specifies an instruction that performs "result = w0 op w1".
5976 * This could be an ARM instruction or a function call. (If the result
5977 * comes back in a register other than w0, you can override "result".)
5978 *
5979 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5980 * vCC (w1). Useful for integer division and modulus.
5981 *
5982 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5983 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5984 */
5985 /* binop/lit16 vA, vB, #+CCCC */
5986 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5987 lsr w2, wINST, #12 // w2<- B
5988 ubfx w9, wINST, #8, #4 // w9<- A
5989 GET_VREG w0, w2 // w0<- vB
5990 .if 0
5991 cbz w1, common_errDivideByZero
5992 .endif
5993 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5994
5995 orr w0, w0, w1 // w0<- op, w0-w3 changed
5996 GET_INST_OPCODE ip // extract opcode from rINST
5997 SET_VREG w0, w9 // vAA<- w0
5998 GOTO_OPCODE ip // jump to next instruction
5999 /* 10-13 instructions */
6000
6001
6002/* ------------------------------ */
6003 .balign 128
6004.L_op_xor_int_lit16: /* 0xd7 */
6005/* File: arm64/op_xor_int_lit16.S */
6006/* File: arm64/binopLit16.S */
6007 /*
6008 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6009 * that specifies an instruction that performs "result = w0 op w1".
6010 * This could be an ARM instruction or a function call. (If the result
6011 * comes back in a register other than w0, you can override "result".)
6012 *
6013 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6014 * vCC (w1). Useful for integer division and modulus.
6015 *
6016 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6017 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6018 */
6019 /* binop/lit16 vA, vB, #+CCCC */
6020 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6021 lsr w2, wINST, #12 // w2<- B
6022 ubfx w9, wINST, #8, #4 // w9<- A
6023 GET_VREG w0, w2 // w0<- vB
6024 .if 0
6025 cbz w1, common_errDivideByZero
6026 .endif
6027 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6028
6029 eor w0, w0, w1 // w0<- op, w0-w3 changed
6030 GET_INST_OPCODE ip // extract opcode from rINST
6031 SET_VREG w0, w9 // vAA<- w0
6032 GOTO_OPCODE ip // jump to next instruction
6033 /* 10-13 instructions */
6034
6035
6036/* ------------------------------ */
6037 .balign 128
6038.L_op_add_int_lit8: /* 0xd8 */
6039/* File: arm64/op_add_int_lit8.S */
6040/* File: arm64/binopLit8.S */
6041 /*
6042 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6043 * that specifies an instruction that performs "result = w0 op w1".
6044 * This could be an ARM instruction or a function call. (If the result
6045 * comes back in a register other than w0, you can override "result".)
6046 *
6047 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6048 * vCC (w1). Useful for integer division and modulus.
6049 *
6050 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6051 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6052 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6053 */
6054 /* binop/lit8 vAA, vBB, #+CC */
6055 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6056 lsr w9, wINST, #8 // w9<- AA
6057 and w2, w3, #255 // w2<- BB
6058 GET_VREG w0, w2 // w0<- vBB
6059 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6060 .if 0
6061 cbz w1, common_errDivideByZero
6062 .endif
6063 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6064 // optional op; may set condition codes
6065 add w0, w0, w1 // w0<- op, w0-w3 changed
6066 GET_INST_OPCODE ip // extract opcode from rINST
6067 SET_VREG w0, w9 // vAA<- w0
6068 GOTO_OPCODE ip // jump to next instruction
6069 /* 10-12 instructions */
6070
6071
6072/* ------------------------------ */
6073 .balign 128
6074.L_op_rsub_int_lit8: /* 0xd9 */
6075/* File: arm64/op_rsub_int_lit8.S */
6076/* File: arm64/binopLit8.S */
6077 /*
6078 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6079 * that specifies an instruction that performs "result = w0 op w1".
6080 * This could be an ARM instruction or a function call. (If the result
6081 * comes back in a register other than w0, you can override "result".)
6082 *
6083 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6084 * vCC (w1). Useful for integer division and modulus.
6085 *
6086 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6087 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6088 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6089 */
6090 /* binop/lit8 vAA, vBB, #+CC */
6091 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6092 lsr w9, wINST, #8 // w9<- AA
6093 and w2, w3, #255 // w2<- BB
6094 GET_VREG w0, w2 // w0<- vBB
6095 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6096 .if 0
6097 cbz w1, common_errDivideByZero
6098 .endif
6099 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6100 // optional op; may set condition codes
6101 sub w0, w1, w0 // w0<- op, w0-w3 changed
6102 GET_INST_OPCODE ip // extract opcode from rINST
6103 SET_VREG w0, w9 // vAA<- w0
6104 GOTO_OPCODE ip // jump to next instruction
6105 /* 10-12 instructions */
6106
6107
6108/* ------------------------------ */
6109 .balign 128
6110.L_op_mul_int_lit8: /* 0xda */
6111/* File: arm64/op_mul_int_lit8.S */
6112/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6113/* File: arm64/binopLit8.S */
6114 /*
6115 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6116 * that specifies an instruction that performs "result = w0 op w1".
6117 * This could be an ARM instruction or a function call. (If the result
6118 * comes back in a register other than w0, you can override "result".)
6119 *
6120 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6121 * vCC (w1). Useful for integer division and modulus.
6122 *
6123 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6124 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6125 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6126 */
6127 /* binop/lit8 vAA, vBB, #+CC */
6128 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6129 lsr w9, wINST, #8 // w9<- AA
6130 and w2, w3, #255 // w2<- BB
6131 GET_VREG w0, w2 // w0<- vBB
6132 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6133 .if 0
6134 cbz w1, common_errDivideByZero
6135 .endif
6136 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6137 // optional op; may set condition codes
6138 mul w0, w1, w0 // w0<- op, w0-w3 changed
6139 GET_INST_OPCODE ip // extract opcode from rINST
6140 SET_VREG w0, w9 // vAA<- w0
6141 GOTO_OPCODE ip // jump to next instruction
6142 /* 10-12 instructions */
6143
6144
6145/* ------------------------------ */
6146 .balign 128
6147.L_op_div_int_lit8: /* 0xdb */
6148/* File: arm64/op_div_int_lit8.S */
6149/* File: arm64/binopLit8.S */
6150 /*
6151 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6152 * that specifies an instruction that performs "result = w0 op w1".
6153 * This could be an ARM instruction or a function call. (If the result
6154 * comes back in a register other than w0, you can override "result".)
6155 *
6156 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6157 * vCC (w1). Useful for integer division and modulus.
6158 *
6159 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6160 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6161 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6162 */
6163 /* binop/lit8 vAA, vBB, #+CC */
6164 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6165 lsr w9, wINST, #8 // w9<- AA
6166 and w2, w3, #255 // w2<- BB
6167 GET_VREG w0, w2 // w0<- vBB
6168 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6169 .if 1
6170 cbz w1, common_errDivideByZero
6171 .endif
6172 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6173 // optional op; may set condition codes
6174 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6175 GET_INST_OPCODE ip // extract opcode from rINST
6176 SET_VREG w0, w9 // vAA<- w0
6177 GOTO_OPCODE ip // jump to next instruction
6178 /* 10-12 instructions */
6179
6180
6181/* ------------------------------ */
6182 .balign 128
6183.L_op_rem_int_lit8: /* 0xdc */
6184/* File: arm64/op_rem_int_lit8.S */
6185/* File: arm64/binopLit8.S */
6186 /*
6187 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6188 * that specifies an instruction that performs "result = w0 op w1".
6189 * This could be an ARM instruction or a function call. (If the result
6190 * comes back in a register other than w0, you can override "result".)
6191 *
6192 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6193 * vCC (w1). Useful for integer division and modulus.
6194 *
6195 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6196 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6197 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6198 */
6199 /* binop/lit8 vAA, vBB, #+CC */
6200 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6201 lsr w9, wINST, #8 // w9<- AA
6202 and w2, w3, #255 // w2<- BB
6203 GET_VREG w0, w2 // w0<- vBB
6204 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6205 .if 1
6206 cbz w1, common_errDivideByZero
6207 .endif
6208 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6209 sdiv w3, w0, w1 // optional op; may set condition codes
6210 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6211 GET_INST_OPCODE ip // extract opcode from rINST
6212 SET_VREG w0, w9 // vAA<- w0
6213 GOTO_OPCODE ip // jump to next instruction
6214 /* 10-12 instructions */
6215
6216
6217/* ------------------------------ */
6218 .balign 128
6219.L_op_and_int_lit8: /* 0xdd */
6220/* File: arm64/op_and_int_lit8.S */
6221/* File: arm64/binopLit8.S */
6222 /*
6223 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6224 * that specifies an instruction that performs "result = w0 op w1".
6225 * This could be an ARM instruction or a function call. (If the result
6226 * comes back in a register other than w0, you can override "result".)
6227 *
6228 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6229 * vCC (w1). Useful for integer division and modulus.
6230 *
6231 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6232 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6233 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6234 */
6235 /* binop/lit8 vAA, vBB, #+CC */
6236 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6237 lsr w9, wINST, #8 // w9<- AA
6238 and w2, w3, #255 // w2<- BB
6239 GET_VREG w0, w2 // w0<- vBB
6240 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6241 .if 0
6242 cbz w1, common_errDivideByZero
6243 .endif
6244 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6245 // optional op; may set condition codes
6246 and w0, w0, w1 // w0<- op, w0-w3 changed
6247 GET_INST_OPCODE ip // extract opcode from rINST
6248 SET_VREG w0, w9 // vAA<- w0
6249 GOTO_OPCODE ip // jump to next instruction
6250 /* 10-12 instructions */
6251
6252
6253/* ------------------------------ */
6254 .balign 128
6255.L_op_or_int_lit8: /* 0xde */
6256/* File: arm64/op_or_int_lit8.S */
6257/* File: arm64/binopLit8.S */
6258 /*
6259 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6260 * that specifies an instruction that performs "result = w0 op w1".
6261 * This could be an ARM instruction or a function call. (If the result
6262 * comes back in a register other than w0, you can override "result".)
6263 *
6264 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6265 * vCC (w1). Useful for integer division and modulus.
6266 *
6267 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6268 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6269 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6270 */
6271 /* binop/lit8 vAA, vBB, #+CC */
6272 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6273 lsr w9, wINST, #8 // w9<- AA
6274 and w2, w3, #255 // w2<- BB
6275 GET_VREG w0, w2 // w0<- vBB
6276 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6277 .if 0
6278 cbz w1, common_errDivideByZero
6279 .endif
6280 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6281 // optional op; may set condition codes
6282 orr w0, w0, w1 // w0<- op, w0-w3 changed
6283 GET_INST_OPCODE ip // extract opcode from rINST
6284 SET_VREG w0, w9 // vAA<- w0
6285 GOTO_OPCODE ip // jump to next instruction
6286 /* 10-12 instructions */
6287
6288
6289/* ------------------------------ */
6290 .balign 128
6291.L_op_xor_int_lit8: /* 0xdf */
6292/* File: arm64/op_xor_int_lit8.S */
6293/* File: arm64/binopLit8.S */
6294 /*
6295 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6296 * that specifies an instruction that performs "result = w0 op w1".
6297 * This could be an ARM instruction or a function call. (If the result
6298 * comes back in a register other than w0, you can override "result".)
6299 *
6300 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6301 * vCC (w1). Useful for integer division and modulus.
6302 *
6303 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6304 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6305 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6306 */
6307 /* binop/lit8 vAA, vBB, #+CC */
6308 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6309 lsr w9, wINST, #8 // w9<- AA
6310 and w2, w3, #255 // w2<- BB
6311 GET_VREG w0, w2 // w0<- vBB
6312 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6313 .if 0
6314 cbz w1, common_errDivideByZero
6315 .endif
6316 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6317 // optional op; may set condition codes
6318 eor w0, w0, w1 // w0<- op, w0-w3 changed
6319 GET_INST_OPCODE ip // extract opcode from rINST
6320 SET_VREG w0, w9 // vAA<- w0
6321 GOTO_OPCODE ip // jump to next instruction
6322 /* 10-12 instructions */
6323
6324
6325/* ------------------------------ */
6326 .balign 128
6327.L_op_shl_int_lit8: /* 0xe0 */
6328/* File: arm64/op_shl_int_lit8.S */
6329/* File: arm64/binopLit8.S */
6330 /*
6331 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6332 * that specifies an instruction that performs "result = w0 op w1".
6333 * This could be an ARM instruction or a function call. (If the result
6334 * comes back in a register other than w0, you can override "result".)
6335 *
6336 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6337 * vCC (w1). Useful for integer division and modulus.
6338 *
6339 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6340 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6341 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6342 */
6343 /* binop/lit8 vAA, vBB, #+CC */
6344 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6345 lsr w9, wINST, #8 // w9<- AA
6346 and w2, w3, #255 // w2<- BB
6347 GET_VREG w0, w2 // w0<- vBB
6348 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6349 .if 0
6350 cbz w1, common_errDivideByZero
6351 .endif
6352 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006353 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006354 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6355 GET_INST_OPCODE ip // extract opcode from rINST
6356 SET_VREG w0, w9 // vAA<- w0
6357 GOTO_OPCODE ip // jump to next instruction
6358 /* 10-12 instructions */
6359
6360
6361/* ------------------------------ */
6362 .balign 128
6363.L_op_shr_int_lit8: /* 0xe1 */
6364/* File: arm64/op_shr_int_lit8.S */
6365/* File: arm64/binopLit8.S */
6366 /*
6367 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6368 * that specifies an instruction that performs "result = w0 op w1".
6369 * This could be an ARM instruction or a function call. (If the result
6370 * comes back in a register other than w0, you can override "result".)
6371 *
6372 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6373 * vCC (w1). Useful for integer division and modulus.
6374 *
6375 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6376 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6377 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6378 */
6379 /* binop/lit8 vAA, vBB, #+CC */
6380 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6381 lsr w9, wINST, #8 // w9<- AA
6382 and w2, w3, #255 // w2<- BB
6383 GET_VREG w0, w2 // w0<- vBB
6384 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6385 .if 0
6386 cbz w1, common_errDivideByZero
6387 .endif
6388 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006389 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006390 asr w0, w0, w1 // w0<- op, w0-w3 changed
6391 GET_INST_OPCODE ip // extract opcode from rINST
6392 SET_VREG w0, w9 // vAA<- w0
6393 GOTO_OPCODE ip // jump to next instruction
6394 /* 10-12 instructions */
6395
6396
6397/* ------------------------------ */
6398 .balign 128
6399.L_op_ushr_int_lit8: /* 0xe2 */
6400/* File: arm64/op_ushr_int_lit8.S */
6401/* File: arm64/binopLit8.S */
6402 /*
6403 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6404 * that specifies an instruction that performs "result = w0 op w1".
6405 * This could be an ARM instruction or a function call. (If the result
6406 * comes back in a register other than w0, you can override "result".)
6407 *
6408 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6409 * vCC (w1). Useful for integer division and modulus.
6410 *
6411 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6412 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6413 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6414 */
6415 /* binop/lit8 vAA, vBB, #+CC */
6416 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6417 lsr w9, wINST, #8 // w9<- AA
6418 and w2, w3, #255 // w2<- BB
6419 GET_VREG w0, w2 // w0<- vBB
6420 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6421 .if 0
6422 cbz w1, common_errDivideByZero
6423 .endif
6424 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006425 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006426 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6427 GET_INST_OPCODE ip // extract opcode from rINST
6428 SET_VREG w0, w9 // vAA<- w0
6429 GOTO_OPCODE ip // jump to next instruction
6430 /* 10-12 instructions */
6431
6432
6433/* ------------------------------ */
6434 .balign 128
6435.L_op_iget_quick: /* 0xe3 */
6436/* File: arm64/op_iget_quick.S */
6437 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6438 /* op vA, vB, offset//CCCC */
6439 lsr w2, wINST, #12 // w2<- B
6440 FETCH w1, 1 // w1<- field byte offset
6441 GET_VREG w3, w2 // w3<- object we're operating on
6442 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006443 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006444 ldr w0, [x3, x1] // w0<- obj.field
6445 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6446
6447 SET_VREG w0, w2 // fp[A]<- w0
6448 GET_INST_OPCODE ip // extract opcode from rINST
6449 GOTO_OPCODE ip // jump to next instruction
6450
6451/* ------------------------------ */
6452 .balign 128
6453.L_op_iget_wide_quick: /* 0xe4 */
6454/* File: arm64/op_iget_wide_quick.S */
6455 /* iget-wide-quick vA, vB, offset//CCCC */
6456 lsr w2, wINST, #12 // w2<- B
6457 FETCH w4, 1 // w4<- field byte offset
6458 GET_VREG w3, w2 // w3<- object we're operating on
6459 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006460 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006461 add x4, x3, x4 // create direct pointer
6462 ldr x0, [x4]
6463 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6464 SET_VREG_WIDE x0, w2
6465 GET_INST_OPCODE ip // extract opcode from wINST
6466 GOTO_OPCODE ip // jump to next instruction
6467
6468/* ------------------------------ */
6469 .balign 128
6470.L_op_iget_object_quick: /* 0xe5 */
6471/* File: arm64/op_iget_object_quick.S */
6472 /* For: iget-object-quick */
6473 /* op vA, vB, offset//CCCC */
6474 lsr w2, wINST, #12 // w2<- B
6475 FETCH w1, 1 // w1<- field byte offset
6476 EXPORT_PC
6477 GET_VREG w0, w2 // w0<- object we're operating on
6478 bl artIGetObjectFromMterp // (obj, offset)
6479 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6480 ubfx w2, wINST, #8, #4 // w2<- A
6481 PREFETCH_INST 2
6482 cbnz w3, MterpPossibleException // bail out
6483 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6484 ADVANCE 2 // advance rPC
6485 GET_INST_OPCODE ip // extract opcode from wINST
6486 GOTO_OPCODE ip // jump to next instruction
6487
6488/* ------------------------------ */
6489 .balign 128
6490.L_op_iput_quick: /* 0xe6 */
6491/* File: arm64/op_iput_quick.S */
6492 /* For: iput-quick, iput-object-quick */
6493 /* op vA, vB, offset//CCCC */
6494 lsr w2, wINST, #12 // w2<- B
6495 FETCH w1, 1 // w1<- field byte offset
6496 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6497 ubfx w2, wINST, #8, #4 // w2<- A
6498 cmp w3, #0 // check object for null
6499 cbz w3, common_errNullObject // object was null
6500 GET_VREG w0, w2 // w0<- fp[A]
6501 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6502 str w0, [x3, x1] // obj.field<- w0
6503 GET_INST_OPCODE ip // extract opcode from rINST
6504 GOTO_OPCODE ip // jump to next instruction
6505
6506/* ------------------------------ */
6507 .balign 128
6508.L_op_iput_wide_quick: /* 0xe7 */
6509/* File: arm64/op_iput_wide_quick.S */
6510 /* iput-wide-quick vA, vB, offset//CCCC */
6511 lsr w2, wINST, #12 // w2<- B
6512 FETCH w3, 1 // w3<- field byte offset
6513 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6514 ubfx w0, wINST, #8, #4 // w0<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006515 cbz w2, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006516 GET_VREG_WIDE x0, w0 // x0-< fp[A]
6517 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6518 add x1, x2, x3 // create a direct pointer
6519 str x0, [x1]
6520 GET_INST_OPCODE ip // extract opcode from wINST
6521 GOTO_OPCODE ip // jump to next instruction
6522
6523/* ------------------------------ */
6524 .balign 128
6525.L_op_iput_object_quick: /* 0xe8 */
6526/* File: arm64/op_iput_object_quick.S */
6527 EXPORT_PC
6528 add x0, xFP, #OFF_FP_SHADOWFRAME
6529 mov x1, xPC
6530 mov w2, wINST
6531 bl MterpIputObjectQuick
6532 cbz w0, MterpException
6533 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6534 GET_INST_OPCODE ip // extract opcode from rINST
6535 GOTO_OPCODE ip // jump to next instruction
6536
6537/* ------------------------------ */
6538 .balign 128
6539.L_op_invoke_virtual_quick: /* 0xe9 */
6540/* File: arm64/op_invoke_virtual_quick.S */
6541/* File: arm64/invoke.S */
6542 /*
6543 * Generic invoke handler wrapper.
6544 */
6545 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6546 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6547 .extern MterpInvokeVirtualQuick
6548 EXPORT_PC
6549 mov x0, xSELF
6550 add x1, xFP, #OFF_FP_SHADOWFRAME
6551 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006552 mov x3, xINST
6553 bl MterpInvokeVirtualQuick
6554 cbz w0, MterpException
6555 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006556 bl MterpShouldSwitchInterpreters
6557 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006558 GET_INST_OPCODE ip
6559 GOTO_OPCODE ip
6560
6561
6562
6563/* ------------------------------ */
6564 .balign 128
6565.L_op_invoke_virtual_range_quick: /* 0xea */
6566/* File: arm64/op_invoke_virtual_range_quick.S */
6567/* File: arm64/invoke.S */
6568 /*
6569 * Generic invoke handler wrapper.
6570 */
6571 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6572 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6573 .extern MterpInvokeVirtualQuickRange
6574 EXPORT_PC
6575 mov x0, xSELF
6576 add x1, xFP, #OFF_FP_SHADOWFRAME
6577 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006578 mov x3, xINST
6579 bl MterpInvokeVirtualQuickRange
6580 cbz w0, MterpException
6581 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006582 bl MterpShouldSwitchInterpreters
6583 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006584 GET_INST_OPCODE ip
6585 GOTO_OPCODE ip
6586
6587
6588
6589/* ------------------------------ */
6590 .balign 128
6591.L_op_iput_boolean_quick: /* 0xeb */
6592/* File: arm64/op_iput_boolean_quick.S */
6593/* File: arm64/op_iput_quick.S */
6594 /* For: iput-quick, iput-object-quick */
6595 /* op vA, vB, offset//CCCC */
6596 lsr w2, wINST, #12 // w2<- B
6597 FETCH w1, 1 // w1<- field byte offset
6598 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6599 ubfx w2, wINST, #8, #4 // w2<- A
6600 cmp w3, #0 // check object for null
6601 cbz w3, common_errNullObject // object was null
6602 GET_VREG w0, w2 // w0<- fp[A]
6603 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6604 strb w0, [x3, x1] // obj.field<- w0
6605 GET_INST_OPCODE ip // extract opcode from rINST
6606 GOTO_OPCODE ip // jump to next instruction
6607
6608
6609/* ------------------------------ */
6610 .balign 128
6611.L_op_iput_byte_quick: /* 0xec */
6612/* File: arm64/op_iput_byte_quick.S */
6613/* File: arm64/op_iput_quick.S */
6614 /* For: iput-quick, iput-object-quick */
6615 /* op vA, vB, offset//CCCC */
6616 lsr w2, wINST, #12 // w2<- B
6617 FETCH w1, 1 // w1<- field byte offset
6618 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6619 ubfx w2, wINST, #8, #4 // w2<- A
6620 cmp w3, #0 // check object for null
6621 cbz w3, common_errNullObject // object was null
6622 GET_VREG w0, w2 // w0<- fp[A]
6623 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6624 strb w0, [x3, x1] // obj.field<- w0
6625 GET_INST_OPCODE ip // extract opcode from rINST
6626 GOTO_OPCODE ip // jump to next instruction
6627
6628
6629/* ------------------------------ */
6630 .balign 128
6631.L_op_iput_char_quick: /* 0xed */
6632/* File: arm64/op_iput_char_quick.S */
6633/* File: arm64/op_iput_quick.S */
6634 /* For: iput-quick, iput-object-quick */
6635 /* op vA, vB, offset//CCCC */
6636 lsr w2, wINST, #12 // w2<- B
6637 FETCH w1, 1 // w1<- field byte offset
6638 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6639 ubfx w2, wINST, #8, #4 // w2<- A
6640 cmp w3, #0 // check object for null
6641 cbz w3, common_errNullObject // object was null
6642 GET_VREG w0, w2 // w0<- fp[A]
6643 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6644 strh w0, [x3, x1] // obj.field<- w0
6645 GET_INST_OPCODE ip // extract opcode from rINST
6646 GOTO_OPCODE ip // jump to next instruction
6647
6648
6649/* ------------------------------ */
6650 .balign 128
6651.L_op_iput_short_quick: /* 0xee */
6652/* File: arm64/op_iput_short_quick.S */
6653/* File: arm64/op_iput_quick.S */
6654 /* For: iput-quick, iput-object-quick */
6655 /* op vA, vB, offset//CCCC */
6656 lsr w2, wINST, #12 // w2<- B
6657 FETCH w1, 1 // w1<- field byte offset
6658 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6659 ubfx w2, wINST, #8, #4 // w2<- A
6660 cmp w3, #0 // check object for null
6661 cbz w3, common_errNullObject // object was null
6662 GET_VREG w0, w2 // w0<- fp[A]
6663 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6664 strh w0, [x3, x1] // obj.field<- w0
6665 GET_INST_OPCODE ip // extract opcode from rINST
6666 GOTO_OPCODE ip // jump to next instruction
6667
6668
6669/* ------------------------------ */
6670 .balign 128
6671.L_op_iget_boolean_quick: /* 0xef */
6672/* File: arm64/op_iget_boolean_quick.S */
6673/* File: arm64/op_iget_quick.S */
6674 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6675 /* op vA, vB, offset//CCCC */
6676 lsr w2, wINST, #12 // w2<- B
6677 FETCH w1, 1 // w1<- field byte offset
6678 GET_VREG w3, w2 // w3<- object we're operating on
6679 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006680 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006681 ldrb w0, [x3, x1] // w0<- obj.field
6682 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6683
6684 SET_VREG w0, w2 // fp[A]<- w0
6685 GET_INST_OPCODE ip // extract opcode from rINST
6686 GOTO_OPCODE ip // jump to next instruction
6687
6688
6689/* ------------------------------ */
6690 .balign 128
6691.L_op_iget_byte_quick: /* 0xf0 */
6692/* File: arm64/op_iget_byte_quick.S */
6693/* File: arm64/op_iget_quick.S */
6694 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6695 /* op vA, vB, offset//CCCC */
6696 lsr w2, wINST, #12 // w2<- B
6697 FETCH w1, 1 // w1<- field byte offset
6698 GET_VREG w3, w2 // w3<- object we're operating on
6699 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006700 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006701 ldrsb w0, [x3, x1] // w0<- obj.field
6702 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6703
6704 SET_VREG w0, w2 // fp[A]<- w0
6705 GET_INST_OPCODE ip // extract opcode from rINST
6706 GOTO_OPCODE ip // jump to next instruction
6707
6708
6709/* ------------------------------ */
6710 .balign 128
6711.L_op_iget_char_quick: /* 0xf1 */
6712/* File: arm64/op_iget_char_quick.S */
6713/* File: arm64/op_iget_quick.S */
6714 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6715 /* op vA, vB, offset//CCCC */
6716 lsr w2, wINST, #12 // w2<- B
6717 FETCH w1, 1 // w1<- field byte offset
6718 GET_VREG w3, w2 // w3<- object we're operating on
6719 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006720 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006721 ldrh w0, [x3, x1] // w0<- obj.field
6722 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6723
6724 SET_VREG w0, w2 // fp[A]<- w0
6725 GET_INST_OPCODE ip // extract opcode from rINST
6726 GOTO_OPCODE ip // jump to next instruction
6727
6728
6729/* ------------------------------ */
6730 .balign 128
6731.L_op_iget_short_quick: /* 0xf2 */
6732/* File: arm64/op_iget_short_quick.S */
6733/* File: arm64/op_iget_quick.S */
6734 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6735 /* op vA, vB, offset//CCCC */
6736 lsr w2, wINST, #12 // w2<- B
6737 FETCH w1, 1 // w1<- field byte offset
6738 GET_VREG w3, w2 // w3<- object we're operating on
6739 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006740 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006741 ldrsh w0, [x3, x1] // w0<- obj.field
6742 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6743
6744 SET_VREG w0, w2 // fp[A]<- w0
6745 GET_INST_OPCODE ip // extract opcode from rINST
6746 GOTO_OPCODE ip // jump to next instruction
6747
6748
6749/* ------------------------------ */
6750 .balign 128
6751.L_op_invoke_lambda: /* 0xf3 */
6752/* Transfer stub to alternate interpreter */
6753 b MterpFallback
6754
6755
6756/* ------------------------------ */
6757 .balign 128
6758.L_op_unused_f4: /* 0xf4 */
6759/* File: arm64/op_unused_f4.S */
6760/* File: arm64/unused.S */
6761/*
6762 * Bail to reference interpreter to throw.
6763 */
6764 b MterpFallback
6765
6766
6767/* ------------------------------ */
6768 .balign 128
6769.L_op_capture_variable: /* 0xf5 */
6770/* Transfer stub to alternate interpreter */
6771 b MterpFallback
6772
6773
6774/* ------------------------------ */
6775 .balign 128
6776.L_op_create_lambda: /* 0xf6 */
6777/* Transfer stub to alternate interpreter */
6778 b MterpFallback
6779
6780
6781/* ------------------------------ */
6782 .balign 128
6783.L_op_liberate_variable: /* 0xf7 */
6784/* Transfer stub to alternate interpreter */
6785 b MterpFallback
6786
6787
6788/* ------------------------------ */
6789 .balign 128
6790.L_op_box_lambda: /* 0xf8 */
6791/* Transfer stub to alternate interpreter */
6792 b MterpFallback
6793
6794
6795/* ------------------------------ */
6796 .balign 128
6797.L_op_unbox_lambda: /* 0xf9 */
6798/* Transfer stub to alternate interpreter */
6799 b MterpFallback
6800
6801
6802/* ------------------------------ */
6803 .balign 128
6804.L_op_unused_fa: /* 0xfa */
6805/* File: arm64/op_unused_fa.S */
6806/* File: arm64/unused.S */
6807/*
6808 * Bail to reference interpreter to throw.
6809 */
6810 b MterpFallback
6811
6812
6813/* ------------------------------ */
6814 .balign 128
6815.L_op_unused_fb: /* 0xfb */
6816/* File: arm64/op_unused_fb.S */
6817/* File: arm64/unused.S */
6818/*
6819 * Bail to reference interpreter to throw.
6820 */
6821 b MterpFallback
6822
6823
6824/* ------------------------------ */
6825 .balign 128
6826.L_op_unused_fc: /* 0xfc */
6827/* File: arm64/op_unused_fc.S */
6828/* File: arm64/unused.S */
6829/*
6830 * Bail to reference interpreter to throw.
6831 */
6832 b MterpFallback
6833
6834
6835/* ------------------------------ */
6836 .balign 128
6837.L_op_unused_fd: /* 0xfd */
6838/* File: arm64/op_unused_fd.S */
6839/* File: arm64/unused.S */
6840/*
6841 * Bail to reference interpreter to throw.
6842 */
6843 b MterpFallback
6844
6845
6846/* ------------------------------ */
6847 .balign 128
6848.L_op_unused_fe: /* 0xfe */
6849/* File: arm64/op_unused_fe.S */
6850/* File: arm64/unused.S */
6851/*
6852 * Bail to reference interpreter to throw.
6853 */
6854 b MterpFallback
6855
6856
6857/* ------------------------------ */
6858 .balign 128
6859.L_op_unused_ff: /* 0xff */
6860/* File: arm64/op_unused_ff.S */
6861/* File: arm64/unused.S */
6862/*
6863 * Bail to reference interpreter to throw.
6864 */
6865 b MterpFallback
6866
6867
6868 .balign 128
6869 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
6870 .global artMterpAsmInstructionEnd
6871artMterpAsmInstructionEnd:
6872
6873/*
6874 * ===========================================================================
6875 * Sister implementations
6876 * ===========================================================================
6877 */
6878 .global artMterpAsmSisterStart
6879 .type artMterpAsmSisterStart, %function
6880 .text
6881 .balign 4
6882artMterpAsmSisterStart:
6883
6884 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
6885 .global artMterpAsmSisterEnd
6886artMterpAsmSisterEnd:
6887
6888
6889 .global artMterpAsmAltInstructionStart
6890 .type artMterpAsmAltInstructionStart, %function
6891 .text
6892
6893artMterpAsmAltInstructionStart = .L_ALT_op_nop
6894/* ------------------------------ */
6895 .balign 128
6896.L_ALT_op_nop: /* 0x00 */
6897/* File: arm64/alt_stub.S */
6898/*
6899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6900 * any interesting requests and then jump to the real instruction
6901 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6902 */
6903 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006904 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6905 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
6906 mov x0, xSELF
6907 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006908 mov x2, xPC
6909 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006910
6911/* ------------------------------ */
6912 .balign 128
6913.L_ALT_op_move: /* 0x01 */
6914/* File: arm64/alt_stub.S */
6915/*
6916 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6917 * any interesting requests and then jump to the real instruction
6918 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6919 */
6920 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006921 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6922 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
6923 mov x0, xSELF
6924 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006925 mov x2, xPC
6926 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006927
6928/* ------------------------------ */
6929 .balign 128
6930.L_ALT_op_move_from16: /* 0x02 */
6931/* File: arm64/alt_stub.S */
6932/*
6933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6934 * any interesting requests and then jump to the real instruction
6935 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6936 */
6937 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006938 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6939 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
6940 mov x0, xSELF
6941 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006942 mov x2, xPC
6943 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006944
6945/* ------------------------------ */
6946 .balign 128
6947.L_ALT_op_move_16: /* 0x03 */
6948/* File: arm64/alt_stub.S */
6949/*
6950 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6951 * any interesting requests and then jump to the real instruction
6952 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6953 */
6954 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006955 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6956 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
6957 mov x0, xSELF
6958 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006959 mov x2, xPC
6960 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006961
6962/* ------------------------------ */
6963 .balign 128
6964.L_ALT_op_move_wide: /* 0x04 */
6965/* File: arm64/alt_stub.S */
6966/*
6967 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6968 * any interesting requests and then jump to the real instruction
6969 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6970 */
6971 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006972 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6973 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
6974 mov x0, xSELF
6975 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006976 mov x2, xPC
6977 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006978
6979/* ------------------------------ */
6980 .balign 128
6981.L_ALT_op_move_wide_from16: /* 0x05 */
6982/* File: arm64/alt_stub.S */
6983/*
6984 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6985 * any interesting requests and then jump to the real instruction
6986 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6987 */
6988 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006989 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6990 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
6991 mov x0, xSELF
6992 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006993 mov x2, xPC
6994 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006995
6996/* ------------------------------ */
6997 .balign 128
6998.L_ALT_op_move_wide_16: /* 0x06 */
6999/* File: arm64/alt_stub.S */
7000/*
7001 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7002 * any interesting requests and then jump to the real instruction
7003 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7004 */
7005 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007006 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7007 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7008 mov x0, xSELF
7009 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007010 mov x2, xPC
7011 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007012
7013/* ------------------------------ */
7014 .balign 128
7015.L_ALT_op_move_object: /* 0x07 */
7016/* File: arm64/alt_stub.S */
7017/*
7018 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7019 * any interesting requests and then jump to the real instruction
7020 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7021 */
7022 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007023 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7024 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7025 mov x0, xSELF
7026 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007027 mov x2, xPC
7028 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007029
7030/* ------------------------------ */
7031 .balign 128
7032.L_ALT_op_move_object_from16: /* 0x08 */
7033/* File: arm64/alt_stub.S */
7034/*
7035 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7036 * any interesting requests and then jump to the real instruction
7037 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7038 */
7039 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007040 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7041 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7042 mov x0, xSELF
7043 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007044 mov x2, xPC
7045 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007046
7047/* ------------------------------ */
7048 .balign 128
7049.L_ALT_op_move_object_16: /* 0x09 */
7050/* File: arm64/alt_stub.S */
7051/*
7052 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7053 * any interesting requests and then jump to the real instruction
7054 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7055 */
7056 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007057 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7058 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7059 mov x0, xSELF
7060 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007061 mov x2, xPC
7062 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007063
7064/* ------------------------------ */
7065 .balign 128
7066.L_ALT_op_move_result: /* 0x0a */
7067/* File: arm64/alt_stub.S */
7068/*
7069 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7070 * any interesting requests and then jump to the real instruction
7071 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7072 */
7073 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007074 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7075 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7076 mov x0, xSELF
7077 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007078 mov x2, xPC
7079 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007080
7081/* ------------------------------ */
7082 .balign 128
7083.L_ALT_op_move_result_wide: /* 0x0b */
7084/* File: arm64/alt_stub.S */
7085/*
7086 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7087 * any interesting requests and then jump to the real instruction
7088 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7089 */
7090 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007091 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7092 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7093 mov x0, xSELF
7094 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007095 mov x2, xPC
7096 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007097
7098/* ------------------------------ */
7099 .balign 128
7100.L_ALT_op_move_result_object: /* 0x0c */
7101/* File: arm64/alt_stub.S */
7102/*
7103 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7104 * any interesting requests and then jump to the real instruction
7105 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7106 */
7107 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007108 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7109 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7110 mov x0, xSELF
7111 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007112 mov x2, xPC
7113 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007114
7115/* ------------------------------ */
7116 .balign 128
7117.L_ALT_op_move_exception: /* 0x0d */
7118/* File: arm64/alt_stub.S */
7119/*
7120 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7121 * any interesting requests and then jump to the real instruction
7122 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7123 */
7124 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007125 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7126 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7127 mov x0, xSELF
7128 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007129 mov x2, xPC
7130 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007131
7132/* ------------------------------ */
7133 .balign 128
7134.L_ALT_op_return_void: /* 0x0e */
7135/* File: arm64/alt_stub.S */
7136/*
7137 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7138 * any interesting requests and then jump to the real instruction
7139 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7140 */
7141 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007142 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7143 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7144 mov x0, xSELF
7145 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007146 mov x2, xPC
7147 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007148
7149/* ------------------------------ */
7150 .balign 128
7151.L_ALT_op_return: /* 0x0f */
7152/* File: arm64/alt_stub.S */
7153/*
7154 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7155 * any interesting requests and then jump to the real instruction
7156 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7157 */
7158 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007159 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7160 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7161 mov x0, xSELF
7162 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007163 mov x2, xPC
7164 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007165
7166/* ------------------------------ */
7167 .balign 128
7168.L_ALT_op_return_wide: /* 0x10 */
7169/* File: arm64/alt_stub.S */
7170/*
7171 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7172 * any interesting requests and then jump to the real instruction
7173 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7174 */
7175 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007176 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7177 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7178 mov x0, xSELF
7179 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007180 mov x2, xPC
7181 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007182
7183/* ------------------------------ */
7184 .balign 128
7185.L_ALT_op_return_object: /* 0x11 */
7186/* File: arm64/alt_stub.S */
7187/*
7188 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7189 * any interesting requests and then jump to the real instruction
7190 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7191 */
7192 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007193 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7194 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7195 mov x0, xSELF
7196 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007197 mov x2, xPC
7198 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007199
7200/* ------------------------------ */
7201 .balign 128
7202.L_ALT_op_const_4: /* 0x12 */
7203/* File: arm64/alt_stub.S */
7204/*
7205 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7206 * any interesting requests and then jump to the real instruction
7207 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7208 */
7209 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007210 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7211 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7212 mov x0, xSELF
7213 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007214 mov x2, xPC
7215 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007216
7217/* ------------------------------ */
7218 .balign 128
7219.L_ALT_op_const_16: /* 0x13 */
7220/* File: arm64/alt_stub.S */
7221/*
7222 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7223 * any interesting requests and then jump to the real instruction
7224 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7225 */
7226 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007227 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7228 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7229 mov x0, xSELF
7230 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007231 mov x2, xPC
7232 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007233
7234/* ------------------------------ */
7235 .balign 128
7236.L_ALT_op_const: /* 0x14 */
7237/* File: arm64/alt_stub.S */
7238/*
7239 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7240 * any interesting requests and then jump to the real instruction
7241 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7242 */
7243 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007244 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7245 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7246 mov x0, xSELF
7247 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007248 mov x2, xPC
7249 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007250
7251/* ------------------------------ */
7252 .balign 128
7253.L_ALT_op_const_high16: /* 0x15 */
7254/* File: arm64/alt_stub.S */
7255/*
7256 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7257 * any interesting requests and then jump to the real instruction
7258 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7259 */
7260 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007261 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7262 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7263 mov x0, xSELF
7264 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007265 mov x2, xPC
7266 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007267
7268/* ------------------------------ */
7269 .balign 128
7270.L_ALT_op_const_wide_16: /* 0x16 */
7271/* File: arm64/alt_stub.S */
7272/*
7273 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7274 * any interesting requests and then jump to the real instruction
7275 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7276 */
7277 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007278 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7279 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7280 mov x0, xSELF
7281 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007282 mov x2, xPC
7283 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007284
7285/* ------------------------------ */
7286 .balign 128
7287.L_ALT_op_const_wide_32: /* 0x17 */
7288/* File: arm64/alt_stub.S */
7289/*
7290 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7291 * any interesting requests and then jump to the real instruction
7292 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7293 */
7294 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007295 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7296 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7297 mov x0, xSELF
7298 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007299 mov x2, xPC
7300 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007301
7302/* ------------------------------ */
7303 .balign 128
7304.L_ALT_op_const_wide: /* 0x18 */
7305/* File: arm64/alt_stub.S */
7306/*
7307 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7308 * any interesting requests and then jump to the real instruction
7309 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7310 */
7311 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007312 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7313 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7314 mov x0, xSELF
7315 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007316 mov x2, xPC
7317 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007318
7319/* ------------------------------ */
7320 .balign 128
7321.L_ALT_op_const_wide_high16: /* 0x19 */
7322/* File: arm64/alt_stub.S */
7323/*
7324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7325 * any interesting requests and then jump to the real instruction
7326 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7327 */
7328 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007329 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7330 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7331 mov x0, xSELF
7332 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007333 mov x2, xPC
7334 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007335
7336/* ------------------------------ */
7337 .balign 128
7338.L_ALT_op_const_string: /* 0x1a */
7339/* File: arm64/alt_stub.S */
7340/*
7341 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7342 * any interesting requests and then jump to the real instruction
7343 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7344 */
7345 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007346 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7347 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7348 mov x0, xSELF
7349 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007350 mov x2, xPC
7351 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007352
7353/* ------------------------------ */
7354 .balign 128
7355.L_ALT_op_const_string_jumbo: /* 0x1b */
7356/* File: arm64/alt_stub.S */
7357/*
7358 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7359 * any interesting requests and then jump to the real instruction
7360 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7361 */
7362 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007363 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7364 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7365 mov x0, xSELF
7366 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007367 mov x2, xPC
7368 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007369
7370/* ------------------------------ */
7371 .balign 128
7372.L_ALT_op_const_class: /* 0x1c */
7373/* File: arm64/alt_stub.S */
7374/*
7375 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7376 * any interesting requests and then jump to the real instruction
7377 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7378 */
7379 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007380 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7381 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7382 mov x0, xSELF
7383 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007384 mov x2, xPC
7385 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007386
7387/* ------------------------------ */
7388 .balign 128
7389.L_ALT_op_monitor_enter: /* 0x1d */
7390/* File: arm64/alt_stub.S */
7391/*
7392 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7393 * any interesting requests and then jump to the real instruction
7394 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7395 */
7396 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007397 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7398 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7399 mov x0, xSELF
7400 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007401 mov x2, xPC
7402 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007403
7404/* ------------------------------ */
7405 .balign 128
7406.L_ALT_op_monitor_exit: /* 0x1e */
7407/* File: arm64/alt_stub.S */
7408/*
7409 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7410 * any interesting requests and then jump to the real instruction
7411 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7412 */
7413 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007414 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7415 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7416 mov x0, xSELF
7417 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007418 mov x2, xPC
7419 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007420
7421/* ------------------------------ */
7422 .balign 128
7423.L_ALT_op_check_cast: /* 0x1f */
7424/* File: arm64/alt_stub.S */
7425/*
7426 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7427 * any interesting requests and then jump to the real instruction
7428 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7429 */
7430 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007431 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7432 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7433 mov x0, xSELF
7434 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007435 mov x2, xPC
7436 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007437
7438/* ------------------------------ */
7439 .balign 128
7440.L_ALT_op_instance_of: /* 0x20 */
7441/* File: arm64/alt_stub.S */
7442/*
7443 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7444 * any interesting requests and then jump to the real instruction
7445 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7446 */
7447 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007448 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7449 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7450 mov x0, xSELF
7451 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007452 mov x2, xPC
7453 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007454
7455/* ------------------------------ */
7456 .balign 128
7457.L_ALT_op_array_length: /* 0x21 */
7458/* File: arm64/alt_stub.S */
7459/*
7460 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7461 * any interesting requests and then jump to the real instruction
7462 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7463 */
7464 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007465 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7466 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7467 mov x0, xSELF
7468 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007469 mov x2, xPC
7470 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007471
7472/* ------------------------------ */
7473 .balign 128
7474.L_ALT_op_new_instance: /* 0x22 */
7475/* File: arm64/alt_stub.S */
7476/*
7477 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7478 * any interesting requests and then jump to the real instruction
7479 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7480 */
7481 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007482 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7483 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7484 mov x0, xSELF
7485 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007486 mov x2, xPC
7487 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007488
7489/* ------------------------------ */
7490 .balign 128
7491.L_ALT_op_new_array: /* 0x23 */
7492/* File: arm64/alt_stub.S */
7493/*
7494 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7495 * any interesting requests and then jump to the real instruction
7496 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7497 */
7498 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007499 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7500 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7501 mov x0, xSELF
7502 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007503 mov x2, xPC
7504 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007505
7506/* ------------------------------ */
7507 .balign 128
7508.L_ALT_op_filled_new_array: /* 0x24 */
7509/* File: arm64/alt_stub.S */
7510/*
7511 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7512 * any interesting requests and then jump to the real instruction
7513 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7514 */
7515 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007516 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7517 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7518 mov x0, xSELF
7519 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007520 mov x2, xPC
7521 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007522
7523/* ------------------------------ */
7524 .balign 128
7525.L_ALT_op_filled_new_array_range: /* 0x25 */
7526/* File: arm64/alt_stub.S */
7527/*
7528 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7529 * any interesting requests and then jump to the real instruction
7530 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7531 */
7532 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007533 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7534 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7535 mov x0, xSELF
7536 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007537 mov x2, xPC
7538 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007539
7540/* ------------------------------ */
7541 .balign 128
7542.L_ALT_op_fill_array_data: /* 0x26 */
7543/* File: arm64/alt_stub.S */
7544/*
7545 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7546 * any interesting requests and then jump to the real instruction
7547 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7548 */
7549 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007550 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7551 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7552 mov x0, xSELF
7553 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007554 mov x2, xPC
7555 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007556
7557/* ------------------------------ */
7558 .balign 128
7559.L_ALT_op_throw: /* 0x27 */
7560/* File: arm64/alt_stub.S */
7561/*
7562 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7563 * any interesting requests and then jump to the real instruction
7564 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7565 */
7566 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007567 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7568 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
7569 mov x0, xSELF
7570 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007571 mov x2, xPC
7572 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007573
7574/* ------------------------------ */
7575 .balign 128
7576.L_ALT_op_goto: /* 0x28 */
7577/* File: arm64/alt_stub.S */
7578/*
7579 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7580 * any interesting requests and then jump to the real instruction
7581 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7582 */
7583 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007584 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7585 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
7586 mov x0, xSELF
7587 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007588 mov x2, xPC
7589 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007590
7591/* ------------------------------ */
7592 .balign 128
7593.L_ALT_op_goto_16: /* 0x29 */
7594/* File: arm64/alt_stub.S */
7595/*
7596 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7597 * any interesting requests and then jump to the real instruction
7598 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7599 */
7600 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007601 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7602 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
7603 mov x0, xSELF
7604 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007605 mov x2, xPC
7606 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007607
7608/* ------------------------------ */
7609 .balign 128
7610.L_ALT_op_goto_32: /* 0x2a */
7611/* File: arm64/alt_stub.S */
7612/*
7613 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7614 * any interesting requests and then jump to the real instruction
7615 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7616 */
7617 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007618 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7619 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
7620 mov x0, xSELF
7621 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007622 mov x2, xPC
7623 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007624
7625/* ------------------------------ */
7626 .balign 128
7627.L_ALT_op_packed_switch: /* 0x2b */
7628/* File: arm64/alt_stub.S */
7629/*
7630 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7631 * any interesting requests and then jump to the real instruction
7632 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7633 */
7634 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007635 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7636 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
7637 mov x0, xSELF
7638 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007639 mov x2, xPC
7640 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007641
7642/* ------------------------------ */
7643 .balign 128
7644.L_ALT_op_sparse_switch: /* 0x2c */
7645/* File: arm64/alt_stub.S */
7646/*
7647 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7648 * any interesting requests and then jump to the real instruction
7649 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7650 */
7651 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007652 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7653 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
7654 mov x0, xSELF
7655 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007656 mov x2, xPC
7657 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007658
7659/* ------------------------------ */
7660 .balign 128
7661.L_ALT_op_cmpl_float: /* 0x2d */
7662/* File: arm64/alt_stub.S */
7663/*
7664 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7665 * any interesting requests and then jump to the real instruction
7666 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7667 */
7668 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007669 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7670 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
7671 mov x0, xSELF
7672 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007673 mov x2, xPC
7674 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007675
7676/* ------------------------------ */
7677 .balign 128
7678.L_ALT_op_cmpg_float: /* 0x2e */
7679/* File: arm64/alt_stub.S */
7680/*
7681 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7682 * any interesting requests and then jump to the real instruction
7683 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7684 */
7685 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007686 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7687 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
7688 mov x0, xSELF
7689 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007690 mov x2, xPC
7691 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007692
7693/* ------------------------------ */
7694 .balign 128
7695.L_ALT_op_cmpl_double: /* 0x2f */
7696/* File: arm64/alt_stub.S */
7697/*
7698 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7699 * any interesting requests and then jump to the real instruction
7700 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7701 */
7702 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007703 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7704 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
7705 mov x0, xSELF
7706 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007707 mov x2, xPC
7708 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007709
7710/* ------------------------------ */
7711 .balign 128
7712.L_ALT_op_cmpg_double: /* 0x30 */
7713/* File: arm64/alt_stub.S */
7714/*
7715 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7716 * any interesting requests and then jump to the real instruction
7717 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7718 */
7719 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007720 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7721 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
7722 mov x0, xSELF
7723 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007724 mov x2, xPC
7725 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007726
7727/* ------------------------------ */
7728 .balign 128
7729.L_ALT_op_cmp_long: /* 0x31 */
7730/* File: arm64/alt_stub.S */
7731/*
7732 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7733 * any interesting requests and then jump to the real instruction
7734 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7735 */
7736 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007737 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7738 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
7739 mov x0, xSELF
7740 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007741 mov x2, xPC
7742 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007743
7744/* ------------------------------ */
7745 .balign 128
7746.L_ALT_op_if_eq: /* 0x32 */
7747/* File: arm64/alt_stub.S */
7748/*
7749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7750 * any interesting requests and then jump to the real instruction
7751 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7752 */
7753 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007754 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7755 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
7756 mov x0, xSELF
7757 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007758 mov x2, xPC
7759 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007760
7761/* ------------------------------ */
7762 .balign 128
7763.L_ALT_op_if_ne: /* 0x33 */
7764/* File: arm64/alt_stub.S */
7765/*
7766 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7767 * any interesting requests and then jump to the real instruction
7768 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7769 */
7770 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007771 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7772 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
7773 mov x0, xSELF
7774 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007775 mov x2, xPC
7776 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007777
7778/* ------------------------------ */
7779 .balign 128
7780.L_ALT_op_if_lt: /* 0x34 */
7781/* File: arm64/alt_stub.S */
7782/*
7783 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7784 * any interesting requests and then jump to the real instruction
7785 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7786 */
7787 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007788 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7789 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
7790 mov x0, xSELF
7791 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007792 mov x2, xPC
7793 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007794
7795/* ------------------------------ */
7796 .balign 128
7797.L_ALT_op_if_ge: /* 0x35 */
7798/* File: arm64/alt_stub.S */
7799/*
7800 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7801 * any interesting requests and then jump to the real instruction
7802 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7803 */
7804 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007805 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7806 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
7807 mov x0, xSELF
7808 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007809 mov x2, xPC
7810 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007811
7812/* ------------------------------ */
7813 .balign 128
7814.L_ALT_op_if_gt: /* 0x36 */
7815/* File: arm64/alt_stub.S */
7816/*
7817 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7818 * any interesting requests and then jump to the real instruction
7819 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7820 */
7821 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007822 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7823 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
7824 mov x0, xSELF
7825 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007826 mov x2, xPC
7827 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007828
7829/* ------------------------------ */
7830 .balign 128
7831.L_ALT_op_if_le: /* 0x37 */
7832/* File: arm64/alt_stub.S */
7833/*
7834 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7835 * any interesting requests and then jump to the real instruction
7836 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7837 */
7838 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007839 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7840 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
7841 mov x0, xSELF
7842 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007843 mov x2, xPC
7844 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007845
7846/* ------------------------------ */
7847 .balign 128
7848.L_ALT_op_if_eqz: /* 0x38 */
7849/* File: arm64/alt_stub.S */
7850/*
7851 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7852 * any interesting requests and then jump to the real instruction
7853 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7854 */
7855 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007856 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7857 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
7858 mov x0, xSELF
7859 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007860 mov x2, xPC
7861 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007862
7863/* ------------------------------ */
7864 .balign 128
7865.L_ALT_op_if_nez: /* 0x39 */
7866/* File: arm64/alt_stub.S */
7867/*
7868 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7869 * any interesting requests and then jump to the real instruction
7870 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7871 */
7872 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007873 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7874 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
7875 mov x0, xSELF
7876 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007877 mov x2, xPC
7878 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007879
7880/* ------------------------------ */
7881 .balign 128
7882.L_ALT_op_if_ltz: /* 0x3a */
7883/* File: arm64/alt_stub.S */
7884/*
7885 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7886 * any interesting requests and then jump to the real instruction
7887 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7888 */
7889 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007890 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7891 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
7892 mov x0, xSELF
7893 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007894 mov x2, xPC
7895 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007896
7897/* ------------------------------ */
7898 .balign 128
7899.L_ALT_op_if_gez: /* 0x3b */
7900/* File: arm64/alt_stub.S */
7901/*
7902 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7903 * any interesting requests and then jump to the real instruction
7904 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7905 */
7906 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007907 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7908 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
7909 mov x0, xSELF
7910 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007911 mov x2, xPC
7912 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007913
7914/* ------------------------------ */
7915 .balign 128
7916.L_ALT_op_if_gtz: /* 0x3c */
7917/* File: arm64/alt_stub.S */
7918/*
7919 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7920 * any interesting requests and then jump to the real instruction
7921 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7922 */
7923 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007924 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7925 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
7926 mov x0, xSELF
7927 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007928 mov x2, xPC
7929 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007930
7931/* ------------------------------ */
7932 .balign 128
7933.L_ALT_op_if_lez: /* 0x3d */
7934/* File: arm64/alt_stub.S */
7935/*
7936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7937 * any interesting requests and then jump to the real instruction
7938 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7939 */
7940 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007941 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7942 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
7943 mov x0, xSELF
7944 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007945 mov x2, xPC
7946 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007947
7948/* ------------------------------ */
7949 .balign 128
7950.L_ALT_op_unused_3e: /* 0x3e */
7951/* File: arm64/alt_stub.S */
7952/*
7953 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7954 * any interesting requests and then jump to the real instruction
7955 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7956 */
7957 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007958 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7959 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
7960 mov x0, xSELF
7961 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007962 mov x2, xPC
7963 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007964
7965/* ------------------------------ */
7966 .balign 128
7967.L_ALT_op_unused_3f: /* 0x3f */
7968/* File: arm64/alt_stub.S */
7969/*
7970 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7971 * any interesting requests and then jump to the real instruction
7972 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7973 */
7974 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007975 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7976 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
7977 mov x0, xSELF
7978 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007979 mov x2, xPC
7980 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007981
7982/* ------------------------------ */
7983 .balign 128
7984.L_ALT_op_unused_40: /* 0x40 */
7985/* File: arm64/alt_stub.S */
7986/*
7987 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7988 * any interesting requests and then jump to the real instruction
7989 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7990 */
7991 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007992 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7993 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
7994 mov x0, xSELF
7995 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007996 mov x2, xPC
7997 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007998
7999/* ------------------------------ */
8000 .balign 128
8001.L_ALT_op_unused_41: /* 0x41 */
8002/* File: arm64/alt_stub.S */
8003/*
8004 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8005 * any interesting requests and then jump to the real instruction
8006 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8007 */
8008 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008009 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8010 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8011 mov x0, xSELF
8012 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008013 mov x2, xPC
8014 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008015
8016/* ------------------------------ */
8017 .balign 128
8018.L_ALT_op_unused_42: /* 0x42 */
8019/* File: arm64/alt_stub.S */
8020/*
8021 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8022 * any interesting requests and then jump to the real instruction
8023 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8024 */
8025 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008026 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8027 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8028 mov x0, xSELF
8029 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008030 mov x2, xPC
8031 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008032
8033/* ------------------------------ */
8034 .balign 128
8035.L_ALT_op_unused_43: /* 0x43 */
8036/* File: arm64/alt_stub.S */
8037/*
8038 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8039 * any interesting requests and then jump to the real instruction
8040 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8041 */
8042 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008043 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8044 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8045 mov x0, xSELF
8046 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008047 mov x2, xPC
8048 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008049
8050/* ------------------------------ */
8051 .balign 128
8052.L_ALT_op_aget: /* 0x44 */
8053/* File: arm64/alt_stub.S */
8054/*
8055 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8056 * any interesting requests and then jump to the real instruction
8057 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8058 */
8059 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008060 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8061 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8062 mov x0, xSELF
8063 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008064 mov x2, xPC
8065 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008066
8067/* ------------------------------ */
8068 .balign 128
8069.L_ALT_op_aget_wide: /* 0x45 */
8070/* File: arm64/alt_stub.S */
8071/*
8072 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8073 * any interesting requests and then jump to the real instruction
8074 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8075 */
8076 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008077 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8078 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8079 mov x0, xSELF
8080 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008081 mov x2, xPC
8082 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008083
8084/* ------------------------------ */
8085 .balign 128
8086.L_ALT_op_aget_object: /* 0x46 */
8087/* File: arm64/alt_stub.S */
8088/*
8089 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8090 * any interesting requests and then jump to the real instruction
8091 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8092 */
8093 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008094 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8095 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8096 mov x0, xSELF
8097 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008098 mov x2, xPC
8099 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008100
8101/* ------------------------------ */
8102 .balign 128
8103.L_ALT_op_aget_boolean: /* 0x47 */
8104/* File: arm64/alt_stub.S */
8105/*
8106 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8107 * any interesting requests and then jump to the real instruction
8108 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8109 */
8110 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008111 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8112 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8113 mov x0, xSELF
8114 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008115 mov x2, xPC
8116 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008117
8118/* ------------------------------ */
8119 .balign 128
8120.L_ALT_op_aget_byte: /* 0x48 */
8121/* File: arm64/alt_stub.S */
8122/*
8123 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8124 * any interesting requests and then jump to the real instruction
8125 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8126 */
8127 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008128 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8129 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8130 mov x0, xSELF
8131 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008132 mov x2, xPC
8133 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008134
8135/* ------------------------------ */
8136 .balign 128
8137.L_ALT_op_aget_char: /* 0x49 */
8138/* File: arm64/alt_stub.S */
8139/*
8140 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8141 * any interesting requests and then jump to the real instruction
8142 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8143 */
8144 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008145 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8146 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8147 mov x0, xSELF
8148 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008149 mov x2, xPC
8150 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008151
8152/* ------------------------------ */
8153 .balign 128
8154.L_ALT_op_aget_short: /* 0x4a */
8155/* File: arm64/alt_stub.S */
8156/*
8157 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8158 * any interesting requests and then jump to the real instruction
8159 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8160 */
8161 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008162 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8163 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8164 mov x0, xSELF
8165 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008166 mov x2, xPC
8167 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008168
8169/* ------------------------------ */
8170 .balign 128
8171.L_ALT_op_aput: /* 0x4b */
8172/* File: arm64/alt_stub.S */
8173/*
8174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8175 * any interesting requests and then jump to the real instruction
8176 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8177 */
8178 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008179 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8180 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8181 mov x0, xSELF
8182 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008183 mov x2, xPC
8184 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008185
8186/* ------------------------------ */
8187 .balign 128
8188.L_ALT_op_aput_wide: /* 0x4c */
8189/* File: arm64/alt_stub.S */
8190/*
8191 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8192 * any interesting requests and then jump to the real instruction
8193 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8194 */
8195 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008196 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8197 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8198 mov x0, xSELF
8199 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008200 mov x2, xPC
8201 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008202
8203/* ------------------------------ */
8204 .balign 128
8205.L_ALT_op_aput_object: /* 0x4d */
8206/* File: arm64/alt_stub.S */
8207/*
8208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8209 * any interesting requests and then jump to the real instruction
8210 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8211 */
8212 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008213 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8214 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8215 mov x0, xSELF
8216 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008217 mov x2, xPC
8218 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008219
8220/* ------------------------------ */
8221 .balign 128
8222.L_ALT_op_aput_boolean: /* 0x4e */
8223/* File: arm64/alt_stub.S */
8224/*
8225 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8226 * any interesting requests and then jump to the real instruction
8227 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8228 */
8229 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008230 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8231 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8232 mov x0, xSELF
8233 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008234 mov x2, xPC
8235 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008236
8237/* ------------------------------ */
8238 .balign 128
8239.L_ALT_op_aput_byte: /* 0x4f */
8240/* File: arm64/alt_stub.S */
8241/*
8242 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8243 * any interesting requests and then jump to the real instruction
8244 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8245 */
8246 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008247 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8248 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8249 mov x0, xSELF
8250 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008251 mov x2, xPC
8252 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008253
8254/* ------------------------------ */
8255 .balign 128
8256.L_ALT_op_aput_char: /* 0x50 */
8257/* File: arm64/alt_stub.S */
8258/*
8259 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8260 * any interesting requests and then jump to the real instruction
8261 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8262 */
8263 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008264 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8265 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8266 mov x0, xSELF
8267 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008268 mov x2, xPC
8269 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008270
8271/* ------------------------------ */
8272 .balign 128
8273.L_ALT_op_aput_short: /* 0x51 */
8274/* File: arm64/alt_stub.S */
8275/*
8276 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8277 * any interesting requests and then jump to the real instruction
8278 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8279 */
8280 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008281 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8282 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8283 mov x0, xSELF
8284 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008285 mov x2, xPC
8286 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008287
8288/* ------------------------------ */
8289 .balign 128
8290.L_ALT_op_iget: /* 0x52 */
8291/* File: arm64/alt_stub.S */
8292/*
8293 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8294 * any interesting requests and then jump to the real instruction
8295 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8296 */
8297 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008298 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8299 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8300 mov x0, xSELF
8301 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008302 mov x2, xPC
8303 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008304
8305/* ------------------------------ */
8306 .balign 128
8307.L_ALT_op_iget_wide: /* 0x53 */
8308/* File: arm64/alt_stub.S */
8309/*
8310 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8311 * any interesting requests and then jump to the real instruction
8312 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8313 */
8314 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008315 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8316 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8317 mov x0, xSELF
8318 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008319 mov x2, xPC
8320 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008321
8322/* ------------------------------ */
8323 .balign 128
8324.L_ALT_op_iget_object: /* 0x54 */
8325/* File: arm64/alt_stub.S */
8326/*
8327 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8328 * any interesting requests and then jump to the real instruction
8329 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8330 */
8331 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008332 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8333 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8334 mov x0, xSELF
8335 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008336 mov x2, xPC
8337 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008338
8339/* ------------------------------ */
8340 .balign 128
8341.L_ALT_op_iget_boolean: /* 0x55 */
8342/* File: arm64/alt_stub.S */
8343/*
8344 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8345 * any interesting requests and then jump to the real instruction
8346 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8347 */
8348 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008349 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8350 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8351 mov x0, xSELF
8352 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008353 mov x2, xPC
8354 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008355
8356/* ------------------------------ */
8357 .balign 128
8358.L_ALT_op_iget_byte: /* 0x56 */
8359/* File: arm64/alt_stub.S */
8360/*
8361 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8362 * any interesting requests and then jump to the real instruction
8363 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8364 */
8365 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008366 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8367 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8368 mov x0, xSELF
8369 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008370 mov x2, xPC
8371 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008372
8373/* ------------------------------ */
8374 .balign 128
8375.L_ALT_op_iget_char: /* 0x57 */
8376/* File: arm64/alt_stub.S */
8377/*
8378 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8379 * any interesting requests and then jump to the real instruction
8380 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8381 */
8382 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008383 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8384 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8385 mov x0, xSELF
8386 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008387 mov x2, xPC
8388 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008389
8390/* ------------------------------ */
8391 .balign 128
8392.L_ALT_op_iget_short: /* 0x58 */
8393/* File: arm64/alt_stub.S */
8394/*
8395 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8396 * any interesting requests and then jump to the real instruction
8397 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8398 */
8399 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008400 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8401 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8402 mov x0, xSELF
8403 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008404 mov x2, xPC
8405 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008406
8407/* ------------------------------ */
8408 .balign 128
8409.L_ALT_op_iput: /* 0x59 */
8410/* File: arm64/alt_stub.S */
8411/*
8412 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8413 * any interesting requests and then jump to the real instruction
8414 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8415 */
8416 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008417 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8418 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8419 mov x0, xSELF
8420 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008421 mov x2, xPC
8422 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008423
8424/* ------------------------------ */
8425 .balign 128
8426.L_ALT_op_iput_wide: /* 0x5a */
8427/* File: arm64/alt_stub.S */
8428/*
8429 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8430 * any interesting requests and then jump to the real instruction
8431 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8432 */
8433 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008434 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8435 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8436 mov x0, xSELF
8437 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008438 mov x2, xPC
8439 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008440
8441/* ------------------------------ */
8442 .balign 128
8443.L_ALT_op_iput_object: /* 0x5b */
8444/* File: arm64/alt_stub.S */
8445/*
8446 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8447 * any interesting requests and then jump to the real instruction
8448 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8449 */
8450 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008451 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8452 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8453 mov x0, xSELF
8454 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008455 mov x2, xPC
8456 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008457
8458/* ------------------------------ */
8459 .balign 128
8460.L_ALT_op_iput_boolean: /* 0x5c */
8461/* File: arm64/alt_stub.S */
8462/*
8463 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8464 * any interesting requests and then jump to the real instruction
8465 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8466 */
8467 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008468 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8469 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8470 mov x0, xSELF
8471 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008472 mov x2, xPC
8473 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008474
8475/* ------------------------------ */
8476 .balign 128
8477.L_ALT_op_iput_byte: /* 0x5d */
8478/* File: arm64/alt_stub.S */
8479/*
8480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8481 * any interesting requests and then jump to the real instruction
8482 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8483 */
8484 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008485 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8486 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8487 mov x0, xSELF
8488 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008489 mov x2, xPC
8490 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008491
8492/* ------------------------------ */
8493 .balign 128
8494.L_ALT_op_iput_char: /* 0x5e */
8495/* File: arm64/alt_stub.S */
8496/*
8497 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8498 * any interesting requests and then jump to the real instruction
8499 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8500 */
8501 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008502 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8503 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8504 mov x0, xSELF
8505 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008506 mov x2, xPC
8507 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008508
8509/* ------------------------------ */
8510 .balign 128
8511.L_ALT_op_iput_short: /* 0x5f */
8512/* File: arm64/alt_stub.S */
8513/*
8514 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8515 * any interesting requests and then jump to the real instruction
8516 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8517 */
8518 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008519 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8520 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8521 mov x0, xSELF
8522 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008523 mov x2, xPC
8524 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008525
8526/* ------------------------------ */
8527 .balign 128
8528.L_ALT_op_sget: /* 0x60 */
8529/* File: arm64/alt_stub.S */
8530/*
8531 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8532 * any interesting requests and then jump to the real instruction
8533 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8534 */
8535 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008536 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8537 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8538 mov x0, xSELF
8539 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008540 mov x2, xPC
8541 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008542
8543/* ------------------------------ */
8544 .balign 128
8545.L_ALT_op_sget_wide: /* 0x61 */
8546/* File: arm64/alt_stub.S */
8547/*
8548 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8549 * any interesting requests and then jump to the real instruction
8550 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8551 */
8552 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008553 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8554 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8555 mov x0, xSELF
8556 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008557 mov x2, xPC
8558 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008559
8560/* ------------------------------ */
8561 .balign 128
8562.L_ALT_op_sget_object: /* 0x62 */
8563/* File: arm64/alt_stub.S */
8564/*
8565 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8566 * any interesting requests and then jump to the real instruction
8567 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8568 */
8569 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008570 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8571 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
8572 mov x0, xSELF
8573 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008574 mov x2, xPC
8575 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008576
8577/* ------------------------------ */
8578 .balign 128
8579.L_ALT_op_sget_boolean: /* 0x63 */
8580/* File: arm64/alt_stub.S */
8581/*
8582 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8583 * any interesting requests and then jump to the real instruction
8584 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8585 */
8586 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008587 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8588 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
8589 mov x0, xSELF
8590 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008591 mov x2, xPC
8592 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008593
8594/* ------------------------------ */
8595 .balign 128
8596.L_ALT_op_sget_byte: /* 0x64 */
8597/* File: arm64/alt_stub.S */
8598/*
8599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8600 * any interesting requests and then jump to the real instruction
8601 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8602 */
8603 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008604 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8605 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
8606 mov x0, xSELF
8607 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008608 mov x2, xPC
8609 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008610
8611/* ------------------------------ */
8612 .balign 128
8613.L_ALT_op_sget_char: /* 0x65 */
8614/* File: arm64/alt_stub.S */
8615/*
8616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8617 * any interesting requests and then jump to the real instruction
8618 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8619 */
8620 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008621 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8622 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
8623 mov x0, xSELF
8624 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008625 mov x2, xPC
8626 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008627
8628/* ------------------------------ */
8629 .balign 128
8630.L_ALT_op_sget_short: /* 0x66 */
8631/* File: arm64/alt_stub.S */
8632/*
8633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8634 * any interesting requests and then jump to the real instruction
8635 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8636 */
8637 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008638 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8639 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
8640 mov x0, xSELF
8641 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008642 mov x2, xPC
8643 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008644
8645/* ------------------------------ */
8646 .balign 128
8647.L_ALT_op_sput: /* 0x67 */
8648/* File: arm64/alt_stub.S */
8649/*
8650 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8651 * any interesting requests and then jump to the real instruction
8652 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8653 */
8654 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008655 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8656 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
8657 mov x0, xSELF
8658 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008659 mov x2, xPC
8660 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008661
8662/* ------------------------------ */
8663 .balign 128
8664.L_ALT_op_sput_wide: /* 0x68 */
8665/* File: arm64/alt_stub.S */
8666/*
8667 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8668 * any interesting requests and then jump to the real instruction
8669 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8670 */
8671 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008672 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8673 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
8674 mov x0, xSELF
8675 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008676 mov x2, xPC
8677 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008678
8679/* ------------------------------ */
8680 .balign 128
8681.L_ALT_op_sput_object: /* 0x69 */
8682/* File: arm64/alt_stub.S */
8683/*
8684 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8685 * any interesting requests and then jump to the real instruction
8686 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8687 */
8688 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008689 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8690 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
8691 mov x0, xSELF
8692 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008693 mov x2, xPC
8694 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008695
8696/* ------------------------------ */
8697 .balign 128
8698.L_ALT_op_sput_boolean: /* 0x6a */
8699/* File: arm64/alt_stub.S */
8700/*
8701 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8702 * any interesting requests and then jump to the real instruction
8703 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8704 */
8705 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008706 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8707 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
8708 mov x0, xSELF
8709 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008710 mov x2, xPC
8711 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008712
8713/* ------------------------------ */
8714 .balign 128
8715.L_ALT_op_sput_byte: /* 0x6b */
8716/* File: arm64/alt_stub.S */
8717/*
8718 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8719 * any interesting requests and then jump to the real instruction
8720 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8721 */
8722 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008723 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8724 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
8725 mov x0, xSELF
8726 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008727 mov x2, xPC
8728 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008729
8730/* ------------------------------ */
8731 .balign 128
8732.L_ALT_op_sput_char: /* 0x6c */
8733/* File: arm64/alt_stub.S */
8734/*
8735 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8736 * any interesting requests and then jump to the real instruction
8737 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8738 */
8739 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008740 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8741 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
8742 mov x0, xSELF
8743 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008744 mov x2, xPC
8745 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008746
8747/* ------------------------------ */
8748 .balign 128
8749.L_ALT_op_sput_short: /* 0x6d */
8750/* File: arm64/alt_stub.S */
8751/*
8752 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8753 * any interesting requests and then jump to the real instruction
8754 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8755 */
8756 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008757 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8758 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
8759 mov x0, xSELF
8760 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008761 mov x2, xPC
8762 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008763
8764/* ------------------------------ */
8765 .balign 128
8766.L_ALT_op_invoke_virtual: /* 0x6e */
8767/* File: arm64/alt_stub.S */
8768/*
8769 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8770 * any interesting requests and then jump to the real instruction
8771 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8772 */
8773 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008774 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8775 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
8776 mov x0, xSELF
8777 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008778 mov x2, xPC
8779 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008780
8781/* ------------------------------ */
8782 .balign 128
8783.L_ALT_op_invoke_super: /* 0x6f */
8784/* File: arm64/alt_stub.S */
8785/*
8786 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8787 * any interesting requests and then jump to the real instruction
8788 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8789 */
8790 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008791 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8792 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
8793 mov x0, xSELF
8794 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008795 mov x2, xPC
8796 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008797
8798/* ------------------------------ */
8799 .balign 128
8800.L_ALT_op_invoke_direct: /* 0x70 */
8801/* File: arm64/alt_stub.S */
8802/*
8803 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8804 * any interesting requests and then jump to the real instruction
8805 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8806 */
8807 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008808 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8809 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
8810 mov x0, xSELF
8811 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008812 mov x2, xPC
8813 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008814
8815/* ------------------------------ */
8816 .balign 128
8817.L_ALT_op_invoke_static: /* 0x71 */
8818/* File: arm64/alt_stub.S */
8819/*
8820 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8821 * any interesting requests and then jump to the real instruction
8822 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8823 */
8824 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008825 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8826 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
8827 mov x0, xSELF
8828 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008829 mov x2, xPC
8830 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008831
8832/* ------------------------------ */
8833 .balign 128
8834.L_ALT_op_invoke_interface: /* 0x72 */
8835/* File: arm64/alt_stub.S */
8836/*
8837 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8838 * any interesting requests and then jump to the real instruction
8839 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8840 */
8841 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008842 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8843 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
8844 mov x0, xSELF
8845 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008846 mov x2, xPC
8847 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008848
8849/* ------------------------------ */
8850 .balign 128
8851.L_ALT_op_return_void_no_barrier: /* 0x73 */
8852/* File: arm64/alt_stub.S */
8853/*
8854 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8855 * any interesting requests and then jump to the real instruction
8856 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8857 */
8858 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008859 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8860 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
8861 mov x0, xSELF
8862 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008863 mov x2, xPC
8864 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008865
8866/* ------------------------------ */
8867 .balign 128
8868.L_ALT_op_invoke_virtual_range: /* 0x74 */
8869/* File: arm64/alt_stub.S */
8870/*
8871 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8872 * any interesting requests and then jump to the real instruction
8873 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8874 */
8875 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008876 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8877 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
8878 mov x0, xSELF
8879 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008880 mov x2, xPC
8881 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008882
8883/* ------------------------------ */
8884 .balign 128
8885.L_ALT_op_invoke_super_range: /* 0x75 */
8886/* File: arm64/alt_stub.S */
8887/*
8888 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8889 * any interesting requests and then jump to the real instruction
8890 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8891 */
8892 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008893 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8894 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
8895 mov x0, xSELF
8896 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008897 mov x2, xPC
8898 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008899
8900/* ------------------------------ */
8901 .balign 128
8902.L_ALT_op_invoke_direct_range: /* 0x76 */
8903/* File: arm64/alt_stub.S */
8904/*
8905 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8906 * any interesting requests and then jump to the real instruction
8907 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8908 */
8909 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008910 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8911 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
8912 mov x0, xSELF
8913 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008914 mov x2, xPC
8915 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008916
8917/* ------------------------------ */
8918 .balign 128
8919.L_ALT_op_invoke_static_range: /* 0x77 */
8920/* File: arm64/alt_stub.S */
8921/*
8922 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8923 * any interesting requests and then jump to the real instruction
8924 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8925 */
8926 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008927 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8928 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
8929 mov x0, xSELF
8930 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008931 mov x2, xPC
8932 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008933
8934/* ------------------------------ */
8935 .balign 128
8936.L_ALT_op_invoke_interface_range: /* 0x78 */
8937/* File: arm64/alt_stub.S */
8938/*
8939 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8940 * any interesting requests and then jump to the real instruction
8941 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8942 */
8943 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008944 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8945 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
8946 mov x0, xSELF
8947 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008948 mov x2, xPC
8949 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008950
8951/* ------------------------------ */
8952 .balign 128
8953.L_ALT_op_unused_79: /* 0x79 */
8954/* File: arm64/alt_stub.S */
8955/*
8956 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8957 * any interesting requests and then jump to the real instruction
8958 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8959 */
8960 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008961 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8962 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
8963 mov x0, xSELF
8964 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008965 mov x2, xPC
8966 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008967
8968/* ------------------------------ */
8969 .balign 128
8970.L_ALT_op_unused_7a: /* 0x7a */
8971/* File: arm64/alt_stub.S */
8972/*
8973 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8974 * any interesting requests and then jump to the real instruction
8975 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8976 */
8977 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008978 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8979 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
8980 mov x0, xSELF
8981 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008982 mov x2, xPC
8983 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008984
8985/* ------------------------------ */
8986 .balign 128
8987.L_ALT_op_neg_int: /* 0x7b */
8988/* File: arm64/alt_stub.S */
8989/*
8990 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8991 * any interesting requests and then jump to the real instruction
8992 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8993 */
8994 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008995 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8996 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
8997 mov x0, xSELF
8998 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008999 mov x2, xPC
9000 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009001
9002/* ------------------------------ */
9003 .balign 128
9004.L_ALT_op_not_int: /* 0x7c */
9005/* File: arm64/alt_stub.S */
9006/*
9007 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9008 * any interesting requests and then jump to the real instruction
9009 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9010 */
9011 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009012 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9013 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9014 mov x0, xSELF
9015 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009016 mov x2, xPC
9017 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009018
9019/* ------------------------------ */
9020 .balign 128
9021.L_ALT_op_neg_long: /* 0x7d */
9022/* File: arm64/alt_stub.S */
9023/*
9024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9025 * any interesting requests and then jump to the real instruction
9026 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9027 */
9028 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009029 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9030 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9031 mov x0, xSELF
9032 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009033 mov x2, xPC
9034 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009035
9036/* ------------------------------ */
9037 .balign 128
9038.L_ALT_op_not_long: /* 0x7e */
9039/* File: arm64/alt_stub.S */
9040/*
9041 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9042 * any interesting requests and then jump to the real instruction
9043 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9044 */
9045 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009046 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9047 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9048 mov x0, xSELF
9049 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009050 mov x2, xPC
9051 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009052
9053/* ------------------------------ */
9054 .balign 128
9055.L_ALT_op_neg_float: /* 0x7f */
9056/* File: arm64/alt_stub.S */
9057/*
9058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9059 * any interesting requests and then jump to the real instruction
9060 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9061 */
9062 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009063 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9064 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9065 mov x0, xSELF
9066 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009067 mov x2, xPC
9068 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009069
9070/* ------------------------------ */
9071 .balign 128
9072.L_ALT_op_neg_double: /* 0x80 */
9073/* File: arm64/alt_stub.S */
9074/*
9075 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9076 * any interesting requests and then jump to the real instruction
9077 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9078 */
9079 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009080 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9081 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9082 mov x0, xSELF
9083 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009084 mov x2, xPC
9085 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009086
9087/* ------------------------------ */
9088 .balign 128
9089.L_ALT_op_int_to_long: /* 0x81 */
9090/* File: arm64/alt_stub.S */
9091/*
9092 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9093 * any interesting requests and then jump to the real instruction
9094 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9095 */
9096 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009097 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9098 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9099 mov x0, xSELF
9100 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009101 mov x2, xPC
9102 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009103
9104/* ------------------------------ */
9105 .balign 128
9106.L_ALT_op_int_to_float: /* 0x82 */
9107/* File: arm64/alt_stub.S */
9108/*
9109 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9110 * any interesting requests and then jump to the real instruction
9111 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9112 */
9113 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009114 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9115 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9116 mov x0, xSELF
9117 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009118 mov x2, xPC
9119 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009120
9121/* ------------------------------ */
9122 .balign 128
9123.L_ALT_op_int_to_double: /* 0x83 */
9124/* File: arm64/alt_stub.S */
9125/*
9126 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9127 * any interesting requests and then jump to the real instruction
9128 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9129 */
9130 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009131 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9132 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9133 mov x0, xSELF
9134 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009135 mov x2, xPC
9136 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009137
9138/* ------------------------------ */
9139 .balign 128
9140.L_ALT_op_long_to_int: /* 0x84 */
9141/* File: arm64/alt_stub.S */
9142/*
9143 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9144 * any interesting requests and then jump to the real instruction
9145 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9146 */
9147 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009148 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9149 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9150 mov x0, xSELF
9151 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009152 mov x2, xPC
9153 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009154
9155/* ------------------------------ */
9156 .balign 128
9157.L_ALT_op_long_to_float: /* 0x85 */
9158/* File: arm64/alt_stub.S */
9159/*
9160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9161 * any interesting requests and then jump to the real instruction
9162 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9163 */
9164 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009165 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9166 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9167 mov x0, xSELF
9168 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009169 mov x2, xPC
9170 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009171
9172/* ------------------------------ */
9173 .balign 128
9174.L_ALT_op_long_to_double: /* 0x86 */
9175/* File: arm64/alt_stub.S */
9176/*
9177 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9178 * any interesting requests and then jump to the real instruction
9179 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9180 */
9181 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009182 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9183 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9184 mov x0, xSELF
9185 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009186 mov x2, xPC
9187 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009188
9189/* ------------------------------ */
9190 .balign 128
9191.L_ALT_op_float_to_int: /* 0x87 */
9192/* File: arm64/alt_stub.S */
9193/*
9194 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9195 * any interesting requests and then jump to the real instruction
9196 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9197 */
9198 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009199 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9200 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9201 mov x0, xSELF
9202 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009203 mov x2, xPC
9204 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009205
9206/* ------------------------------ */
9207 .balign 128
9208.L_ALT_op_float_to_long: /* 0x88 */
9209/* File: arm64/alt_stub.S */
9210/*
9211 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9212 * any interesting requests and then jump to the real instruction
9213 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9214 */
9215 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009216 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9217 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9218 mov x0, xSELF
9219 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009220 mov x2, xPC
9221 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009222
9223/* ------------------------------ */
9224 .balign 128
9225.L_ALT_op_float_to_double: /* 0x89 */
9226/* File: arm64/alt_stub.S */
9227/*
9228 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9229 * any interesting requests and then jump to the real instruction
9230 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9231 */
9232 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009233 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9234 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9235 mov x0, xSELF
9236 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009237 mov x2, xPC
9238 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009239
9240/* ------------------------------ */
9241 .balign 128
9242.L_ALT_op_double_to_int: /* 0x8a */
9243/* File: arm64/alt_stub.S */
9244/*
9245 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9246 * any interesting requests and then jump to the real instruction
9247 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9248 */
9249 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009250 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9251 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9252 mov x0, xSELF
9253 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009254 mov x2, xPC
9255 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009256
9257/* ------------------------------ */
9258 .balign 128
9259.L_ALT_op_double_to_long: /* 0x8b */
9260/* File: arm64/alt_stub.S */
9261/*
9262 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9263 * any interesting requests and then jump to the real instruction
9264 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9265 */
9266 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009267 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9268 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9269 mov x0, xSELF
9270 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009271 mov x2, xPC
9272 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009273
9274/* ------------------------------ */
9275 .balign 128
9276.L_ALT_op_double_to_float: /* 0x8c */
9277/* File: arm64/alt_stub.S */
9278/*
9279 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9280 * any interesting requests and then jump to the real instruction
9281 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9282 */
9283 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009284 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9285 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9286 mov x0, xSELF
9287 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009288 mov x2, xPC
9289 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009290
9291/* ------------------------------ */
9292 .balign 128
9293.L_ALT_op_int_to_byte: /* 0x8d */
9294/* File: arm64/alt_stub.S */
9295/*
9296 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9297 * any interesting requests and then jump to the real instruction
9298 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9299 */
9300 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009301 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9302 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9303 mov x0, xSELF
9304 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009305 mov x2, xPC
9306 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009307
9308/* ------------------------------ */
9309 .balign 128
9310.L_ALT_op_int_to_char: /* 0x8e */
9311/* File: arm64/alt_stub.S */
9312/*
9313 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9314 * any interesting requests and then jump to the real instruction
9315 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9316 */
9317 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009318 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9319 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9320 mov x0, xSELF
9321 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009322 mov x2, xPC
9323 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009324
9325/* ------------------------------ */
9326 .balign 128
9327.L_ALT_op_int_to_short: /* 0x8f */
9328/* File: arm64/alt_stub.S */
9329/*
9330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9331 * any interesting requests and then jump to the real instruction
9332 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9333 */
9334 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009335 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9336 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9337 mov x0, xSELF
9338 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009339 mov x2, xPC
9340 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009341
9342/* ------------------------------ */
9343 .balign 128
9344.L_ALT_op_add_int: /* 0x90 */
9345/* File: arm64/alt_stub.S */
9346/*
9347 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9348 * any interesting requests and then jump to the real instruction
9349 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9350 */
9351 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009352 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9353 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9354 mov x0, xSELF
9355 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009356 mov x2, xPC
9357 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009358
9359/* ------------------------------ */
9360 .balign 128
9361.L_ALT_op_sub_int: /* 0x91 */
9362/* File: arm64/alt_stub.S */
9363/*
9364 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9365 * any interesting requests and then jump to the real instruction
9366 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9367 */
9368 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009369 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9370 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9371 mov x0, xSELF
9372 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009373 mov x2, xPC
9374 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009375
9376/* ------------------------------ */
9377 .balign 128
9378.L_ALT_op_mul_int: /* 0x92 */
9379/* File: arm64/alt_stub.S */
9380/*
9381 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9382 * any interesting requests and then jump to the real instruction
9383 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9384 */
9385 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009386 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9387 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9388 mov x0, xSELF
9389 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009390 mov x2, xPC
9391 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009392
9393/* ------------------------------ */
9394 .balign 128
9395.L_ALT_op_div_int: /* 0x93 */
9396/* File: arm64/alt_stub.S */
9397/*
9398 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9399 * any interesting requests and then jump to the real instruction
9400 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9401 */
9402 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009403 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9404 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9405 mov x0, xSELF
9406 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009407 mov x2, xPC
9408 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009409
9410/* ------------------------------ */
9411 .balign 128
9412.L_ALT_op_rem_int: /* 0x94 */
9413/* File: arm64/alt_stub.S */
9414/*
9415 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9416 * any interesting requests and then jump to the real instruction
9417 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9418 */
9419 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009420 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9421 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9422 mov x0, xSELF
9423 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009424 mov x2, xPC
9425 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009426
9427/* ------------------------------ */
9428 .balign 128
9429.L_ALT_op_and_int: /* 0x95 */
9430/* File: arm64/alt_stub.S */
9431/*
9432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9433 * any interesting requests and then jump to the real instruction
9434 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9435 */
9436 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009437 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9438 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9439 mov x0, xSELF
9440 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009441 mov x2, xPC
9442 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009443
9444/* ------------------------------ */
9445 .balign 128
9446.L_ALT_op_or_int: /* 0x96 */
9447/* File: arm64/alt_stub.S */
9448/*
9449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9450 * any interesting requests and then jump to the real instruction
9451 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9452 */
9453 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009454 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9455 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9456 mov x0, xSELF
9457 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009458 mov x2, xPC
9459 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009460
9461/* ------------------------------ */
9462 .balign 128
9463.L_ALT_op_xor_int: /* 0x97 */
9464/* File: arm64/alt_stub.S */
9465/*
9466 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9467 * any interesting requests and then jump to the real instruction
9468 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9469 */
9470 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009471 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9472 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9473 mov x0, xSELF
9474 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009475 mov x2, xPC
9476 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009477
9478/* ------------------------------ */
9479 .balign 128
9480.L_ALT_op_shl_int: /* 0x98 */
9481/* File: arm64/alt_stub.S */
9482/*
9483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9484 * any interesting requests and then jump to the real instruction
9485 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9486 */
9487 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009488 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9489 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9490 mov x0, xSELF
9491 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009492 mov x2, xPC
9493 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009494
9495/* ------------------------------ */
9496 .balign 128
9497.L_ALT_op_shr_int: /* 0x99 */
9498/* File: arm64/alt_stub.S */
9499/*
9500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9501 * any interesting requests and then jump to the real instruction
9502 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9503 */
9504 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009505 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9506 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9507 mov x0, xSELF
9508 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009509 mov x2, xPC
9510 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009511
9512/* ------------------------------ */
9513 .balign 128
9514.L_ALT_op_ushr_int: /* 0x9a */
9515/* File: arm64/alt_stub.S */
9516/*
9517 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9518 * any interesting requests and then jump to the real instruction
9519 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9520 */
9521 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009522 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9523 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9524 mov x0, xSELF
9525 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009526 mov x2, xPC
9527 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009528
9529/* ------------------------------ */
9530 .balign 128
9531.L_ALT_op_add_long: /* 0x9b */
9532/* File: arm64/alt_stub.S */
9533/*
9534 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9535 * any interesting requests and then jump to the real instruction
9536 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9537 */
9538 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009539 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9540 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9541 mov x0, xSELF
9542 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009543 mov x2, xPC
9544 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009545
9546/* ------------------------------ */
9547 .balign 128
9548.L_ALT_op_sub_long: /* 0x9c */
9549/* File: arm64/alt_stub.S */
9550/*
9551 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9552 * any interesting requests and then jump to the real instruction
9553 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9554 */
9555 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009556 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9557 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9558 mov x0, xSELF
9559 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009560 mov x2, xPC
9561 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009562
9563/* ------------------------------ */
9564 .balign 128
9565.L_ALT_op_mul_long: /* 0x9d */
9566/* File: arm64/alt_stub.S */
9567/*
9568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9569 * any interesting requests and then jump to the real instruction
9570 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9571 */
9572 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009573 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9574 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
9575 mov x0, xSELF
9576 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009577 mov x2, xPC
9578 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009579
9580/* ------------------------------ */
9581 .balign 128
9582.L_ALT_op_div_long: /* 0x9e */
9583/* File: arm64/alt_stub.S */
9584/*
9585 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9586 * any interesting requests and then jump to the real instruction
9587 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9588 */
9589 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009590 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9591 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
9592 mov x0, xSELF
9593 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009594 mov x2, xPC
9595 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009596
9597/* ------------------------------ */
9598 .balign 128
9599.L_ALT_op_rem_long: /* 0x9f */
9600/* File: arm64/alt_stub.S */
9601/*
9602 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9603 * any interesting requests and then jump to the real instruction
9604 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9605 */
9606 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009607 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9608 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
9609 mov x0, xSELF
9610 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009611 mov x2, xPC
9612 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009613
9614/* ------------------------------ */
9615 .balign 128
9616.L_ALT_op_and_long: /* 0xa0 */
9617/* File: arm64/alt_stub.S */
9618/*
9619 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9620 * any interesting requests and then jump to the real instruction
9621 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9622 */
9623 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009624 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9625 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
9626 mov x0, xSELF
9627 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009628 mov x2, xPC
9629 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009630
9631/* ------------------------------ */
9632 .balign 128
9633.L_ALT_op_or_long: /* 0xa1 */
9634/* File: arm64/alt_stub.S */
9635/*
9636 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9637 * any interesting requests and then jump to the real instruction
9638 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9639 */
9640 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009641 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9642 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
9643 mov x0, xSELF
9644 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009645 mov x2, xPC
9646 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009647
9648/* ------------------------------ */
9649 .balign 128
9650.L_ALT_op_xor_long: /* 0xa2 */
9651/* File: arm64/alt_stub.S */
9652/*
9653 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9654 * any interesting requests and then jump to the real instruction
9655 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9656 */
9657 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009658 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9659 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
9660 mov x0, xSELF
9661 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009662 mov x2, xPC
9663 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009664
9665/* ------------------------------ */
9666 .balign 128
9667.L_ALT_op_shl_long: /* 0xa3 */
9668/* File: arm64/alt_stub.S */
9669/*
9670 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9671 * any interesting requests and then jump to the real instruction
9672 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9673 */
9674 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009675 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9676 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
9677 mov x0, xSELF
9678 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009679 mov x2, xPC
9680 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009681
9682/* ------------------------------ */
9683 .balign 128
9684.L_ALT_op_shr_long: /* 0xa4 */
9685/* File: arm64/alt_stub.S */
9686/*
9687 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9688 * any interesting requests and then jump to the real instruction
9689 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9690 */
9691 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009692 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9693 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
9694 mov x0, xSELF
9695 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009696 mov x2, xPC
9697 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009698
9699/* ------------------------------ */
9700 .balign 128
9701.L_ALT_op_ushr_long: /* 0xa5 */
9702/* File: arm64/alt_stub.S */
9703/*
9704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9705 * any interesting requests and then jump to the real instruction
9706 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9707 */
9708 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009709 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9710 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
9711 mov x0, xSELF
9712 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009713 mov x2, xPC
9714 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009715
9716/* ------------------------------ */
9717 .balign 128
9718.L_ALT_op_add_float: /* 0xa6 */
9719/* File: arm64/alt_stub.S */
9720/*
9721 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9722 * any interesting requests and then jump to the real instruction
9723 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9724 */
9725 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009726 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9727 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
9728 mov x0, xSELF
9729 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009730 mov x2, xPC
9731 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009732
9733/* ------------------------------ */
9734 .balign 128
9735.L_ALT_op_sub_float: /* 0xa7 */
9736/* File: arm64/alt_stub.S */
9737/*
9738 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9739 * any interesting requests and then jump to the real instruction
9740 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9741 */
9742 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009743 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9744 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
9745 mov x0, xSELF
9746 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009747 mov x2, xPC
9748 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009749
9750/* ------------------------------ */
9751 .balign 128
9752.L_ALT_op_mul_float: /* 0xa8 */
9753/* File: arm64/alt_stub.S */
9754/*
9755 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9756 * any interesting requests and then jump to the real instruction
9757 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9758 */
9759 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009760 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9761 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
9762 mov x0, xSELF
9763 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009764 mov x2, xPC
9765 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009766
9767/* ------------------------------ */
9768 .balign 128
9769.L_ALT_op_div_float: /* 0xa9 */
9770/* File: arm64/alt_stub.S */
9771/*
9772 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9773 * any interesting requests and then jump to the real instruction
9774 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9775 */
9776 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009777 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9778 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
9779 mov x0, xSELF
9780 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009781 mov x2, xPC
9782 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009783
9784/* ------------------------------ */
9785 .balign 128
9786.L_ALT_op_rem_float: /* 0xaa */
9787/* File: arm64/alt_stub.S */
9788/*
9789 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9790 * any interesting requests and then jump to the real instruction
9791 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9792 */
9793 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009794 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9795 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
9796 mov x0, xSELF
9797 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009798 mov x2, xPC
9799 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009800
9801/* ------------------------------ */
9802 .balign 128
9803.L_ALT_op_add_double: /* 0xab */
9804/* File: arm64/alt_stub.S */
9805/*
9806 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9807 * any interesting requests and then jump to the real instruction
9808 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9809 */
9810 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009811 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9812 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
9813 mov x0, xSELF
9814 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009815 mov x2, xPC
9816 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009817
9818/* ------------------------------ */
9819 .balign 128
9820.L_ALT_op_sub_double: /* 0xac */
9821/* File: arm64/alt_stub.S */
9822/*
9823 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9824 * any interesting requests and then jump to the real instruction
9825 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9826 */
9827 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009828 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9829 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
9830 mov x0, xSELF
9831 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009832 mov x2, xPC
9833 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009834
9835/* ------------------------------ */
9836 .balign 128
9837.L_ALT_op_mul_double: /* 0xad */
9838/* File: arm64/alt_stub.S */
9839/*
9840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9841 * any interesting requests and then jump to the real instruction
9842 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9843 */
9844 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009845 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9846 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
9847 mov x0, xSELF
9848 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009849 mov x2, xPC
9850 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009851
9852/* ------------------------------ */
9853 .balign 128
9854.L_ALT_op_div_double: /* 0xae */
9855/* File: arm64/alt_stub.S */
9856/*
9857 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9858 * any interesting requests and then jump to the real instruction
9859 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9860 */
9861 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009862 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9863 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
9864 mov x0, xSELF
9865 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009866 mov x2, xPC
9867 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009868
9869/* ------------------------------ */
9870 .balign 128
9871.L_ALT_op_rem_double: /* 0xaf */
9872/* File: arm64/alt_stub.S */
9873/*
9874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9875 * any interesting requests and then jump to the real instruction
9876 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9877 */
9878 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009879 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9880 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
9881 mov x0, xSELF
9882 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009883 mov x2, xPC
9884 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009885
9886/* ------------------------------ */
9887 .balign 128
9888.L_ALT_op_add_int_2addr: /* 0xb0 */
9889/* File: arm64/alt_stub.S */
9890/*
9891 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9892 * any interesting requests and then jump to the real instruction
9893 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9894 */
9895 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009896 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9897 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
9898 mov x0, xSELF
9899 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009900 mov x2, xPC
9901 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009902
9903/* ------------------------------ */
9904 .balign 128
9905.L_ALT_op_sub_int_2addr: /* 0xb1 */
9906/* File: arm64/alt_stub.S */
9907/*
9908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9909 * any interesting requests and then jump to the real instruction
9910 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9911 */
9912 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009913 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9914 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
9915 mov x0, xSELF
9916 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009917 mov x2, xPC
9918 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009919
9920/* ------------------------------ */
9921 .balign 128
9922.L_ALT_op_mul_int_2addr: /* 0xb2 */
9923/* File: arm64/alt_stub.S */
9924/*
9925 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9926 * any interesting requests and then jump to the real instruction
9927 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9928 */
9929 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009930 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9931 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
9932 mov x0, xSELF
9933 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009934 mov x2, xPC
9935 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009936
9937/* ------------------------------ */
9938 .balign 128
9939.L_ALT_op_div_int_2addr: /* 0xb3 */
9940/* File: arm64/alt_stub.S */
9941/*
9942 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9943 * any interesting requests and then jump to the real instruction
9944 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9945 */
9946 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009947 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9948 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
9949 mov x0, xSELF
9950 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009951 mov x2, xPC
9952 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009953
9954/* ------------------------------ */
9955 .balign 128
9956.L_ALT_op_rem_int_2addr: /* 0xb4 */
9957/* File: arm64/alt_stub.S */
9958/*
9959 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9960 * any interesting requests and then jump to the real instruction
9961 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9962 */
9963 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009964 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9965 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
9966 mov x0, xSELF
9967 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009968 mov x2, xPC
9969 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009970
9971/* ------------------------------ */
9972 .balign 128
9973.L_ALT_op_and_int_2addr: /* 0xb5 */
9974/* File: arm64/alt_stub.S */
9975/*
9976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9977 * any interesting requests and then jump to the real instruction
9978 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9979 */
9980 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009981 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9982 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
9983 mov x0, xSELF
9984 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009985 mov x2, xPC
9986 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009987
9988/* ------------------------------ */
9989 .balign 128
9990.L_ALT_op_or_int_2addr: /* 0xb6 */
9991/* File: arm64/alt_stub.S */
9992/*
9993 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9994 * any interesting requests and then jump to the real instruction
9995 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9996 */
9997 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009998 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9999 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10000 mov x0, xSELF
10001 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010002 mov x2, xPC
10003 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010004
10005/* ------------------------------ */
10006 .balign 128
10007.L_ALT_op_xor_int_2addr: /* 0xb7 */
10008/* File: arm64/alt_stub.S */
10009/*
10010 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10011 * any interesting requests and then jump to the real instruction
10012 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10013 */
10014 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010015 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10016 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10017 mov x0, xSELF
10018 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010019 mov x2, xPC
10020 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010021
10022/* ------------------------------ */
10023 .balign 128
10024.L_ALT_op_shl_int_2addr: /* 0xb8 */
10025/* File: arm64/alt_stub.S */
10026/*
10027 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10028 * any interesting requests and then jump to the real instruction
10029 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10030 */
10031 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010032 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10033 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10034 mov x0, xSELF
10035 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010036 mov x2, xPC
10037 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010038
10039/* ------------------------------ */
10040 .balign 128
10041.L_ALT_op_shr_int_2addr: /* 0xb9 */
10042/* File: arm64/alt_stub.S */
10043/*
10044 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10045 * any interesting requests and then jump to the real instruction
10046 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10047 */
10048 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010049 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10050 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10051 mov x0, xSELF
10052 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010053 mov x2, xPC
10054 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010055
10056/* ------------------------------ */
10057 .balign 128
10058.L_ALT_op_ushr_int_2addr: /* 0xba */
10059/* File: arm64/alt_stub.S */
10060/*
10061 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10062 * any interesting requests and then jump to the real instruction
10063 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10064 */
10065 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010066 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10067 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10068 mov x0, xSELF
10069 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010070 mov x2, xPC
10071 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010072
10073/* ------------------------------ */
10074 .balign 128
10075.L_ALT_op_add_long_2addr: /* 0xbb */
10076/* File: arm64/alt_stub.S */
10077/*
10078 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10079 * any interesting requests and then jump to the real instruction
10080 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10081 */
10082 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010083 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10084 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10085 mov x0, xSELF
10086 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010087 mov x2, xPC
10088 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010089
10090/* ------------------------------ */
10091 .balign 128
10092.L_ALT_op_sub_long_2addr: /* 0xbc */
10093/* File: arm64/alt_stub.S */
10094/*
10095 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10096 * any interesting requests and then jump to the real instruction
10097 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10098 */
10099 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010100 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10101 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10102 mov x0, xSELF
10103 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010104 mov x2, xPC
10105 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010106
10107/* ------------------------------ */
10108 .balign 128
10109.L_ALT_op_mul_long_2addr: /* 0xbd */
10110/* File: arm64/alt_stub.S */
10111/*
10112 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10113 * any interesting requests and then jump to the real instruction
10114 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10115 */
10116 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010117 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10118 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10119 mov x0, xSELF
10120 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010121 mov x2, xPC
10122 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010123
10124/* ------------------------------ */
10125 .balign 128
10126.L_ALT_op_div_long_2addr: /* 0xbe */
10127/* File: arm64/alt_stub.S */
10128/*
10129 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10130 * any interesting requests and then jump to the real instruction
10131 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10132 */
10133 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010134 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10135 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10136 mov x0, xSELF
10137 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010138 mov x2, xPC
10139 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010140
10141/* ------------------------------ */
10142 .balign 128
10143.L_ALT_op_rem_long_2addr: /* 0xbf */
10144/* File: arm64/alt_stub.S */
10145/*
10146 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10147 * any interesting requests and then jump to the real instruction
10148 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10149 */
10150 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010151 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10152 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10153 mov x0, xSELF
10154 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010155 mov x2, xPC
10156 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010157
10158/* ------------------------------ */
10159 .balign 128
10160.L_ALT_op_and_long_2addr: /* 0xc0 */
10161/* File: arm64/alt_stub.S */
10162/*
10163 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10164 * any interesting requests and then jump to the real instruction
10165 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10166 */
10167 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010168 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10169 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10170 mov x0, xSELF
10171 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010172 mov x2, xPC
10173 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010174
10175/* ------------------------------ */
10176 .balign 128
10177.L_ALT_op_or_long_2addr: /* 0xc1 */
10178/* File: arm64/alt_stub.S */
10179/*
10180 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10181 * any interesting requests and then jump to the real instruction
10182 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10183 */
10184 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010185 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10186 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10187 mov x0, xSELF
10188 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010189 mov x2, xPC
10190 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010191
10192/* ------------------------------ */
10193 .balign 128
10194.L_ALT_op_xor_long_2addr: /* 0xc2 */
10195/* File: arm64/alt_stub.S */
10196/*
10197 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10198 * any interesting requests and then jump to the real instruction
10199 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10200 */
10201 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010202 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10203 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10204 mov x0, xSELF
10205 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010206 mov x2, xPC
10207 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010208
10209/* ------------------------------ */
10210 .balign 128
10211.L_ALT_op_shl_long_2addr: /* 0xc3 */
10212/* File: arm64/alt_stub.S */
10213/*
10214 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10215 * any interesting requests and then jump to the real instruction
10216 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10217 */
10218 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010219 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10220 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10221 mov x0, xSELF
10222 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010223 mov x2, xPC
10224 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010225
10226/* ------------------------------ */
10227 .balign 128
10228.L_ALT_op_shr_long_2addr: /* 0xc4 */
10229/* File: arm64/alt_stub.S */
10230/*
10231 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10232 * any interesting requests and then jump to the real instruction
10233 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10234 */
10235 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010236 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10237 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10238 mov x0, xSELF
10239 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010240 mov x2, xPC
10241 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010242
10243/* ------------------------------ */
10244 .balign 128
10245.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10246/* File: arm64/alt_stub.S */
10247/*
10248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10249 * any interesting requests and then jump to the real instruction
10250 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10251 */
10252 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010253 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10254 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10255 mov x0, xSELF
10256 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010257 mov x2, xPC
10258 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010259
10260/* ------------------------------ */
10261 .balign 128
10262.L_ALT_op_add_float_2addr: /* 0xc6 */
10263/* File: arm64/alt_stub.S */
10264/*
10265 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10266 * any interesting requests and then jump to the real instruction
10267 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10268 */
10269 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010270 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10271 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10272 mov x0, xSELF
10273 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010274 mov x2, xPC
10275 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010276
10277/* ------------------------------ */
10278 .balign 128
10279.L_ALT_op_sub_float_2addr: /* 0xc7 */
10280/* File: arm64/alt_stub.S */
10281/*
10282 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10283 * any interesting requests and then jump to the real instruction
10284 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10285 */
10286 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010287 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10288 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10289 mov x0, xSELF
10290 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010291 mov x2, xPC
10292 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010293
10294/* ------------------------------ */
10295 .balign 128
10296.L_ALT_op_mul_float_2addr: /* 0xc8 */
10297/* File: arm64/alt_stub.S */
10298/*
10299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10300 * any interesting requests and then jump to the real instruction
10301 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10302 */
10303 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010304 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10305 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10306 mov x0, xSELF
10307 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010308 mov x2, xPC
10309 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010310
10311/* ------------------------------ */
10312 .balign 128
10313.L_ALT_op_div_float_2addr: /* 0xc9 */
10314/* File: arm64/alt_stub.S */
10315/*
10316 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10317 * any interesting requests and then jump to the real instruction
10318 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10319 */
10320 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010321 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10322 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10323 mov x0, xSELF
10324 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010325 mov x2, xPC
10326 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010327
10328/* ------------------------------ */
10329 .balign 128
10330.L_ALT_op_rem_float_2addr: /* 0xca */
10331/* File: arm64/alt_stub.S */
10332/*
10333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10334 * any interesting requests and then jump to the real instruction
10335 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10336 */
10337 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010338 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10339 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10340 mov x0, xSELF
10341 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010342 mov x2, xPC
10343 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010344
10345/* ------------------------------ */
10346 .balign 128
10347.L_ALT_op_add_double_2addr: /* 0xcb */
10348/* File: arm64/alt_stub.S */
10349/*
10350 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10351 * any interesting requests and then jump to the real instruction
10352 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10353 */
10354 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010355 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10356 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10357 mov x0, xSELF
10358 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010359 mov x2, xPC
10360 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010361
10362/* ------------------------------ */
10363 .balign 128
10364.L_ALT_op_sub_double_2addr: /* 0xcc */
10365/* File: arm64/alt_stub.S */
10366/*
10367 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10368 * any interesting requests and then jump to the real instruction
10369 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10370 */
10371 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010372 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10373 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10374 mov x0, xSELF
10375 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010376 mov x2, xPC
10377 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010378
10379/* ------------------------------ */
10380 .balign 128
10381.L_ALT_op_mul_double_2addr: /* 0xcd */
10382/* File: arm64/alt_stub.S */
10383/*
10384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10385 * any interesting requests and then jump to the real instruction
10386 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10387 */
10388 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010389 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10390 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10391 mov x0, xSELF
10392 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010393 mov x2, xPC
10394 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010395
10396/* ------------------------------ */
10397 .balign 128
10398.L_ALT_op_div_double_2addr: /* 0xce */
10399/* File: arm64/alt_stub.S */
10400/*
10401 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10402 * any interesting requests and then jump to the real instruction
10403 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10404 */
10405 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010406 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10407 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10408 mov x0, xSELF
10409 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010410 mov x2, xPC
10411 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010412
10413/* ------------------------------ */
10414 .balign 128
10415.L_ALT_op_rem_double_2addr: /* 0xcf */
10416/* File: arm64/alt_stub.S */
10417/*
10418 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10419 * any interesting requests and then jump to the real instruction
10420 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10421 */
10422 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010423 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10424 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10425 mov x0, xSELF
10426 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010427 mov x2, xPC
10428 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010429
10430/* ------------------------------ */
10431 .balign 128
10432.L_ALT_op_add_int_lit16: /* 0xd0 */
10433/* File: arm64/alt_stub.S */
10434/*
10435 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10436 * any interesting requests and then jump to the real instruction
10437 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10438 */
10439 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010440 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10441 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10442 mov x0, xSELF
10443 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010444 mov x2, xPC
10445 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010446
10447/* ------------------------------ */
10448 .balign 128
10449.L_ALT_op_rsub_int: /* 0xd1 */
10450/* File: arm64/alt_stub.S */
10451/*
10452 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10453 * any interesting requests and then jump to the real instruction
10454 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10455 */
10456 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010457 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10458 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10459 mov x0, xSELF
10460 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010461 mov x2, xPC
10462 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010463
10464/* ------------------------------ */
10465 .balign 128
10466.L_ALT_op_mul_int_lit16: /* 0xd2 */
10467/* File: arm64/alt_stub.S */
10468/*
10469 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10470 * any interesting requests and then jump to the real instruction
10471 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10472 */
10473 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010474 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10475 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10476 mov x0, xSELF
10477 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010478 mov x2, xPC
10479 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010480
10481/* ------------------------------ */
10482 .balign 128
10483.L_ALT_op_div_int_lit16: /* 0xd3 */
10484/* File: arm64/alt_stub.S */
10485/*
10486 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10487 * any interesting requests and then jump to the real instruction
10488 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10489 */
10490 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010491 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10492 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10493 mov x0, xSELF
10494 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010495 mov x2, xPC
10496 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010497
10498/* ------------------------------ */
10499 .balign 128
10500.L_ALT_op_rem_int_lit16: /* 0xd4 */
10501/* File: arm64/alt_stub.S */
10502/*
10503 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10504 * any interesting requests and then jump to the real instruction
10505 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10506 */
10507 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010508 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10509 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10510 mov x0, xSELF
10511 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010512 mov x2, xPC
10513 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010514
10515/* ------------------------------ */
10516 .balign 128
10517.L_ALT_op_and_int_lit16: /* 0xd5 */
10518/* File: arm64/alt_stub.S */
10519/*
10520 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10521 * any interesting requests and then jump to the real instruction
10522 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10523 */
10524 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010525 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10526 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10527 mov x0, xSELF
10528 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010529 mov x2, xPC
10530 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010531
10532/* ------------------------------ */
10533 .balign 128
10534.L_ALT_op_or_int_lit16: /* 0xd6 */
10535/* File: arm64/alt_stub.S */
10536/*
10537 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10538 * any interesting requests and then jump to the real instruction
10539 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10540 */
10541 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010542 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10543 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10544 mov x0, xSELF
10545 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010546 mov x2, xPC
10547 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010548
10549/* ------------------------------ */
10550 .balign 128
10551.L_ALT_op_xor_int_lit16: /* 0xd7 */
10552/* File: arm64/alt_stub.S */
10553/*
10554 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10555 * any interesting requests and then jump to the real instruction
10556 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10557 */
10558 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010559 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10560 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10561 mov x0, xSELF
10562 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010563 mov x2, xPC
10564 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010565
10566/* ------------------------------ */
10567 .balign 128
10568.L_ALT_op_add_int_lit8: /* 0xd8 */
10569/* File: arm64/alt_stub.S */
10570/*
10571 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10572 * any interesting requests and then jump to the real instruction
10573 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10574 */
10575 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010576 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10577 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
10578 mov x0, xSELF
10579 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010580 mov x2, xPC
10581 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010582
10583/* ------------------------------ */
10584 .balign 128
10585.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10586/* File: arm64/alt_stub.S */
10587/*
10588 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10589 * any interesting requests and then jump to the real instruction
10590 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10591 */
10592 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010593 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10594 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
10595 mov x0, xSELF
10596 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010597 mov x2, xPC
10598 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010599
10600/* ------------------------------ */
10601 .balign 128
10602.L_ALT_op_mul_int_lit8: /* 0xda */
10603/* File: arm64/alt_stub.S */
10604/*
10605 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10606 * any interesting requests and then jump to the real instruction
10607 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10608 */
10609 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010610 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10611 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
10612 mov x0, xSELF
10613 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010614 mov x2, xPC
10615 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010616
10617/* ------------------------------ */
10618 .balign 128
10619.L_ALT_op_div_int_lit8: /* 0xdb */
10620/* File: arm64/alt_stub.S */
10621/*
10622 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10623 * any interesting requests and then jump to the real instruction
10624 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10625 */
10626 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010627 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10628 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
10629 mov x0, xSELF
10630 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010631 mov x2, xPC
10632 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010633
10634/* ------------------------------ */
10635 .balign 128
10636.L_ALT_op_rem_int_lit8: /* 0xdc */
10637/* File: arm64/alt_stub.S */
10638/*
10639 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10640 * any interesting requests and then jump to the real instruction
10641 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10642 */
10643 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010644 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10645 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
10646 mov x0, xSELF
10647 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010648 mov x2, xPC
10649 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010650
10651/* ------------------------------ */
10652 .balign 128
10653.L_ALT_op_and_int_lit8: /* 0xdd */
10654/* File: arm64/alt_stub.S */
10655/*
10656 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10657 * any interesting requests and then jump to the real instruction
10658 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10659 */
10660 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010661 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10662 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
10663 mov x0, xSELF
10664 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010665 mov x2, xPC
10666 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010667
10668/* ------------------------------ */
10669 .balign 128
10670.L_ALT_op_or_int_lit8: /* 0xde */
10671/* File: arm64/alt_stub.S */
10672/*
10673 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10674 * any interesting requests and then jump to the real instruction
10675 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10676 */
10677 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010678 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10679 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
10680 mov x0, xSELF
10681 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010682 mov x2, xPC
10683 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010684
10685/* ------------------------------ */
10686 .balign 128
10687.L_ALT_op_xor_int_lit8: /* 0xdf */
10688/* File: arm64/alt_stub.S */
10689/*
10690 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10691 * any interesting requests and then jump to the real instruction
10692 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10693 */
10694 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010695 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10696 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
10697 mov x0, xSELF
10698 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010699 mov x2, xPC
10700 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010701
10702/* ------------------------------ */
10703 .balign 128
10704.L_ALT_op_shl_int_lit8: /* 0xe0 */
10705/* File: arm64/alt_stub.S */
10706/*
10707 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10708 * any interesting requests and then jump to the real instruction
10709 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10710 */
10711 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010712 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10713 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
10714 mov x0, xSELF
10715 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010716 mov x2, xPC
10717 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010718
10719/* ------------------------------ */
10720 .balign 128
10721.L_ALT_op_shr_int_lit8: /* 0xe1 */
10722/* File: arm64/alt_stub.S */
10723/*
10724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10725 * any interesting requests and then jump to the real instruction
10726 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10727 */
10728 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010729 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10730 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
10731 mov x0, xSELF
10732 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010733 mov x2, xPC
10734 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010735
10736/* ------------------------------ */
10737 .balign 128
10738.L_ALT_op_ushr_int_lit8: /* 0xe2 */
10739/* File: arm64/alt_stub.S */
10740/*
10741 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10742 * any interesting requests and then jump to the real instruction
10743 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10744 */
10745 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010746 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10747 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
10748 mov x0, xSELF
10749 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010750 mov x2, xPC
10751 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010752
10753/* ------------------------------ */
10754 .balign 128
10755.L_ALT_op_iget_quick: /* 0xe3 */
10756/* File: arm64/alt_stub.S */
10757/*
10758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10759 * any interesting requests and then jump to the real instruction
10760 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10761 */
10762 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010763 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10764 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
10765 mov x0, xSELF
10766 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010767 mov x2, xPC
10768 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010769
10770/* ------------------------------ */
10771 .balign 128
10772.L_ALT_op_iget_wide_quick: /* 0xe4 */
10773/* File: arm64/alt_stub.S */
10774/*
10775 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10776 * any interesting requests and then jump to the real instruction
10777 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10778 */
10779 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010780 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10781 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
10782 mov x0, xSELF
10783 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010784 mov x2, xPC
10785 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010786
10787/* ------------------------------ */
10788 .balign 128
10789.L_ALT_op_iget_object_quick: /* 0xe5 */
10790/* File: arm64/alt_stub.S */
10791/*
10792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10793 * any interesting requests and then jump to the real instruction
10794 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10795 */
10796 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010797 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10798 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
10799 mov x0, xSELF
10800 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010801 mov x2, xPC
10802 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010803
10804/* ------------------------------ */
10805 .balign 128
10806.L_ALT_op_iput_quick: /* 0xe6 */
10807/* File: arm64/alt_stub.S */
10808/*
10809 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10810 * any interesting requests and then jump to the real instruction
10811 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10812 */
10813 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010814 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10815 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
10816 mov x0, xSELF
10817 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010818 mov x2, xPC
10819 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010820
10821/* ------------------------------ */
10822 .balign 128
10823.L_ALT_op_iput_wide_quick: /* 0xe7 */
10824/* File: arm64/alt_stub.S */
10825/*
10826 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10827 * any interesting requests and then jump to the real instruction
10828 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10829 */
10830 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010831 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10832 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
10833 mov x0, xSELF
10834 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010835 mov x2, xPC
10836 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010837
10838/* ------------------------------ */
10839 .balign 128
10840.L_ALT_op_iput_object_quick: /* 0xe8 */
10841/* File: arm64/alt_stub.S */
10842/*
10843 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10844 * any interesting requests and then jump to the real instruction
10845 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10846 */
10847 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010848 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10849 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
10850 mov x0, xSELF
10851 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010852 mov x2, xPC
10853 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010854
10855/* ------------------------------ */
10856 .balign 128
10857.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
10858/* File: arm64/alt_stub.S */
10859/*
10860 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10861 * any interesting requests and then jump to the real instruction
10862 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10863 */
10864 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010865 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10866 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
10867 mov x0, xSELF
10868 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010869 mov x2, xPC
10870 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010871
10872/* ------------------------------ */
10873 .balign 128
10874.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
10875/* File: arm64/alt_stub.S */
10876/*
10877 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10878 * any interesting requests and then jump to the real instruction
10879 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10880 */
10881 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010882 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10883 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
10884 mov x0, xSELF
10885 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010886 mov x2, xPC
10887 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010888
10889/* ------------------------------ */
10890 .balign 128
10891.L_ALT_op_iput_boolean_quick: /* 0xeb */
10892/* File: arm64/alt_stub.S */
10893/*
10894 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10895 * any interesting requests and then jump to the real instruction
10896 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10897 */
10898 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010899 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10900 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
10901 mov x0, xSELF
10902 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010903 mov x2, xPC
10904 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010905
10906/* ------------------------------ */
10907 .balign 128
10908.L_ALT_op_iput_byte_quick: /* 0xec */
10909/* File: arm64/alt_stub.S */
10910/*
10911 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10912 * any interesting requests and then jump to the real instruction
10913 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10914 */
10915 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010916 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10917 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
10918 mov x0, xSELF
10919 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010920 mov x2, xPC
10921 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010922
10923/* ------------------------------ */
10924 .balign 128
10925.L_ALT_op_iput_char_quick: /* 0xed */
10926/* File: arm64/alt_stub.S */
10927/*
10928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10929 * any interesting requests and then jump to the real instruction
10930 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10931 */
10932 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010933 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10934 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
10935 mov x0, xSELF
10936 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010937 mov x2, xPC
10938 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010939
10940/* ------------------------------ */
10941 .balign 128
10942.L_ALT_op_iput_short_quick: /* 0xee */
10943/* File: arm64/alt_stub.S */
10944/*
10945 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10946 * any interesting requests and then jump to the real instruction
10947 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10948 */
10949 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010950 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10951 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
10952 mov x0, xSELF
10953 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010954 mov x2, xPC
10955 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010956
10957/* ------------------------------ */
10958 .balign 128
10959.L_ALT_op_iget_boolean_quick: /* 0xef */
10960/* File: arm64/alt_stub.S */
10961/*
10962 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10963 * any interesting requests and then jump to the real instruction
10964 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10965 */
10966 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010967 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10968 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
10969 mov x0, xSELF
10970 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010971 mov x2, xPC
10972 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010973
10974/* ------------------------------ */
10975 .balign 128
10976.L_ALT_op_iget_byte_quick: /* 0xf0 */
10977/* File: arm64/alt_stub.S */
10978/*
10979 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10980 * any interesting requests and then jump to the real instruction
10981 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10982 */
10983 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010984 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10985 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
10986 mov x0, xSELF
10987 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010988 mov x2, xPC
10989 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010990
10991/* ------------------------------ */
10992 .balign 128
10993.L_ALT_op_iget_char_quick: /* 0xf1 */
10994/* File: arm64/alt_stub.S */
10995/*
10996 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10997 * any interesting requests and then jump to the real instruction
10998 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10999 */
11000 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011001 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11002 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11003 mov x0, xSELF
11004 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011005 mov x2, xPC
11006 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011007
11008/* ------------------------------ */
11009 .balign 128
11010.L_ALT_op_iget_short_quick: /* 0xf2 */
11011/* File: arm64/alt_stub.S */
11012/*
11013 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11014 * any interesting requests and then jump to the real instruction
11015 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11016 */
11017 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011018 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11019 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11020 mov x0, xSELF
11021 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011022 mov x2, xPC
11023 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011024
11025/* ------------------------------ */
11026 .balign 128
11027.L_ALT_op_invoke_lambda: /* 0xf3 */
11028/* File: arm64/alt_stub.S */
11029/*
11030 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11031 * any interesting requests and then jump to the real instruction
11032 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11033 */
11034 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011035 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11036 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11037 mov x0, xSELF
11038 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011039 mov x2, xPC
11040 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011041
11042/* ------------------------------ */
11043 .balign 128
11044.L_ALT_op_unused_f4: /* 0xf4 */
11045/* File: arm64/alt_stub.S */
11046/*
11047 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11048 * any interesting requests and then jump to the real instruction
11049 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11050 */
11051 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011052 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11053 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11054 mov x0, xSELF
11055 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011056 mov x2, xPC
11057 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011058
11059/* ------------------------------ */
11060 .balign 128
11061.L_ALT_op_capture_variable: /* 0xf5 */
11062/* File: arm64/alt_stub.S */
11063/*
11064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11065 * any interesting requests and then jump to the real instruction
11066 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11067 */
11068 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011069 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11070 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11071 mov x0, xSELF
11072 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011073 mov x2, xPC
11074 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011075
11076/* ------------------------------ */
11077 .balign 128
11078.L_ALT_op_create_lambda: /* 0xf6 */
11079/* File: arm64/alt_stub.S */
11080/*
11081 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11082 * any interesting requests and then jump to the real instruction
11083 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11084 */
11085 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011086 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11087 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11088 mov x0, xSELF
11089 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011090 mov x2, xPC
11091 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011092
11093/* ------------------------------ */
11094 .balign 128
11095.L_ALT_op_liberate_variable: /* 0xf7 */
11096/* File: arm64/alt_stub.S */
11097/*
11098 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11099 * any interesting requests and then jump to the real instruction
11100 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11101 */
11102 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011103 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11104 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11105 mov x0, xSELF
11106 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011107 mov x2, xPC
11108 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011109
11110/* ------------------------------ */
11111 .balign 128
11112.L_ALT_op_box_lambda: /* 0xf8 */
11113/* File: arm64/alt_stub.S */
11114/*
11115 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11116 * any interesting requests and then jump to the real instruction
11117 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11118 */
11119 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011120 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11121 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11122 mov x0, xSELF
11123 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011124 mov x2, xPC
11125 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011126
11127/* ------------------------------ */
11128 .balign 128
11129.L_ALT_op_unbox_lambda: /* 0xf9 */
11130/* File: arm64/alt_stub.S */
11131/*
11132 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11133 * any interesting requests and then jump to the real instruction
11134 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11135 */
11136 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011137 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11138 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11139 mov x0, xSELF
11140 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011141 mov x2, xPC
11142 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011143
11144/* ------------------------------ */
11145 .balign 128
11146.L_ALT_op_unused_fa: /* 0xfa */
11147/* File: arm64/alt_stub.S */
11148/*
11149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11150 * any interesting requests and then jump to the real instruction
11151 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11152 */
11153 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011154 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11155 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11156 mov x0, xSELF
11157 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011158 mov x2, xPC
11159 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011160
11161/* ------------------------------ */
11162 .balign 128
11163.L_ALT_op_unused_fb: /* 0xfb */
11164/* File: arm64/alt_stub.S */
11165/*
11166 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11167 * any interesting requests and then jump to the real instruction
11168 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11169 */
11170 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011171 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11172 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11173 mov x0, xSELF
11174 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011175 mov x2, xPC
11176 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011177
11178/* ------------------------------ */
11179 .balign 128
11180.L_ALT_op_unused_fc: /* 0xfc */
11181/* File: arm64/alt_stub.S */
11182/*
11183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11184 * any interesting requests and then jump to the real instruction
11185 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11186 */
11187 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011188 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11189 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11190 mov x0, xSELF
11191 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011192 mov x2, xPC
11193 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011194
11195/* ------------------------------ */
11196 .balign 128
11197.L_ALT_op_unused_fd: /* 0xfd */
11198/* File: arm64/alt_stub.S */
11199/*
11200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11201 * any interesting requests and then jump to the real instruction
11202 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11203 */
11204 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011205 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11206 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11207 mov x0, xSELF
11208 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011209 mov x2, xPC
11210 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011211
11212/* ------------------------------ */
11213 .balign 128
11214.L_ALT_op_unused_fe: /* 0xfe */
11215/* File: arm64/alt_stub.S */
11216/*
11217 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11218 * any interesting requests and then jump to the real instruction
11219 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11220 */
11221 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011222 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11223 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11224 mov x0, xSELF
11225 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011226 mov x2, xPC
11227 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011228
11229/* ------------------------------ */
11230 .balign 128
11231.L_ALT_op_unused_ff: /* 0xff */
11232/* File: arm64/alt_stub.S */
11233/*
11234 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11235 * any interesting requests and then jump to the real instruction
11236 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11237 */
11238 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011239 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11240 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11241 mov x0, xSELF
11242 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011243 mov x2, xPC
11244 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011245
11246 .balign 128
11247 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11248 .global artMterpAsmAltInstructionEnd
11249artMterpAsmAltInstructionEnd:
11250/* File: arm64/footer.S */
11251/*
11252 * ===========================================================================
11253 * Common subroutines and data
11254 * ===========================================================================
11255 */
11256
11257
11258/*
11259 * We've detected a condition that will result in an exception, but the exception
11260 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
11261 * TUNING: for consistency, we may want to just go ahead and handle these here.
11262 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011263common_errDivideByZero:
11264 EXPORT_PC
11265#if MTERP_LOGGING
11266 mov x0, xSELF
11267 add x1, xFP, #OFF_FP_SHADOWFRAME
11268 bl MterpLogDivideByZeroException
11269#endif
11270 b MterpCommonFallback
11271
11272common_errArrayIndex:
11273 EXPORT_PC
11274#if MTERP_LOGGING
11275 mov x0, xSELF
11276 add x1, xFP, #OFF_FP_SHADOWFRAME
11277 bl MterpLogArrayIndexException
11278#endif
11279 b MterpCommonFallback
11280
11281common_errNegativeArraySize:
11282 EXPORT_PC
11283#if MTERP_LOGGING
11284 mov x0, xSELF
11285 add x1, xFP, #OFF_FP_SHADOWFRAME
11286 bl MterpLogNegativeArraySizeException
11287#endif
11288 b MterpCommonFallback
11289
11290common_errNoSuchMethod:
11291 EXPORT_PC
11292#if MTERP_LOGGING
11293 mov x0, xSELF
11294 add x1, xFP, #OFF_FP_SHADOWFRAME
11295 bl MterpLogNoSuchMethodException
11296#endif
11297 b MterpCommonFallback
11298
11299common_errNullObject:
11300 EXPORT_PC
11301#if MTERP_LOGGING
11302 mov x0, xSELF
11303 add x1, xFP, #OFF_FP_SHADOWFRAME
11304 bl MterpLogNullObjectException
11305#endif
11306 b MterpCommonFallback
11307
11308common_exceptionThrown:
11309 EXPORT_PC
11310#if MTERP_LOGGING
11311 mov x0, xSELF
11312 add x1, xFP, #OFF_FP_SHADOWFRAME
11313 bl MterpLogExceptionThrownException
11314#endif
11315 b MterpCommonFallback
11316
11317MterpSuspendFallback:
11318 EXPORT_PC
11319#if MTERP_LOGGING
11320 mov x0, xSELF
11321 add x1, xFP, #OFF_FP_SHADOWFRAME
11322 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
11323 bl MterpLogSuspendFallback
11324#endif
11325 b MterpCommonFallback
11326
11327/*
11328 * If we're here, something is out of the ordinary. If there is a pending
11329 * exception, handle it. Otherwise, roll back and retry with the reference
11330 * interpreter.
11331 */
11332MterpPossibleException:
11333 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
11334 cbz x0, MterpFallback // If not, fall back to reference interpreter.
11335 /* intentional fallthrough - handle pending exception. */
11336/*
11337 * On return from a runtime helper routine, we've found a pending exception.
11338 * Can we handle it here - or need to bail out to caller?
11339 *
11340 */
11341MterpException:
11342 mov x0, xSELF
11343 add x1, xFP, #OFF_FP_SHADOWFRAME
11344 bl MterpHandleException // (self, shadow_frame)
11345 cbz w0, MterpExceptionReturn // no local catch, back to caller.
11346 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
11347 ldr w1, [xFP, #OFF_FP_DEX_PC]
11348 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
11349 add xPC, x0, #CODEITEM_INSNS_OFFSET
11350 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
Bill Buzbeefd522f92016-02-11 22:37:42 +000011351 /* Do we need to switch interpreters? */
11352 bl MterpShouldSwitchInterpreters
11353 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011354 /* resume execution at catch block */
Bill Buzbeefd522f92016-02-11 22:37:42 +000011355 EXPORT_PC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011356 FETCH_INST
11357 GET_INST_OPCODE ip
11358 GOTO_OPCODE ip
11359 /* NOTE: no fallthrough */
Bill Buzbee1d011d92016-04-04 16:59:29 +000011360/*
11361 * Common handling for branches with support for Jit profiling.
11362 * On entry:
11363 * wINST <= signed offset
11364 * wPROFILE <= signed hotness countdown (expanded to 32 bits)
11365 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
11366 *
11367 * We have quite a few different cases for branch profiling, OSR detection and
11368 * suspend check support here.
11369 *
11370 * Taken backward branches:
11371 * If profiling active, do hotness countdown and report if we hit zero.
11372 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11373 * Is there a pending suspend request? If so, suspend.
11374 *
11375 * Taken forward branches and not-taken backward branches:
11376 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11377 *
11378 * Our most common case is expected to be a taken backward branch with active jit profiling,
11379 * but no full OSR check and no pending suspend request.
11380 * Next most common case is not-taken branch with no full OSR check.
11381 *
11382 */
11383MterpCommonTakenBranchNoFlags:
11384 cmp wINST, #0
11385 b.gt .L_forward_branch // don't add forward branches to hotness
11386 tbnz wPROFILE, #31, .L_no_count_backwards // go if negative
11387 subs wPROFILE, wPROFILE, #1 // countdown
11388 b.eq .L_add_batch // counted down to zero - report
11389.L_resume_backward_branch:
11390 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
11391 add w2, wINST, wINST // w2<- byte offset
11392 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
11393 REFRESH_IBASE
11394 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11395 b.ne .L_suspend_request_pending
11396 GET_INST_OPCODE ip // extract opcode from wINST
11397 GOTO_OPCODE ip // jump to next instruction
11398
11399.L_suspend_request_pending:
11400 EXPORT_PC
11401 mov x0, xSELF
11402 bl MterpSuspendCheck // (self)
11403 cbnz x0, MterpFallback
11404 REFRESH_IBASE // might have changed during suspend
11405 GET_INST_OPCODE ip // extract opcode from wINST
11406 GOTO_OPCODE ip // jump to next instruction
11407
11408.L_no_count_backwards:
11409 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
11410 b.ne .L_resume_backward_branch
11411 mov x0, xSELF
11412 add x1, xFP, #OFF_FP_SHADOWFRAME
11413 mov x2, xINST
11414 EXPORT_PC
11415 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11416 cbnz x0, MterpOnStackReplacement
11417 b .L_resume_backward_branch
11418
11419.L_forward_branch:
11420 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
11421 b.eq .L_check_osr_forward
11422.L_resume_forward_branch:
11423 add w2, wINST, wINST // w2<- byte offset
11424 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
11425 GET_INST_OPCODE ip // extract opcode from wINST
11426 GOTO_OPCODE ip // jump to next instruction
11427
11428.L_check_osr_forward:
11429 mov x0, xSELF
11430 add x1, xFP, #OFF_FP_SHADOWFRAME
11431 mov x2, xINST
11432 EXPORT_PC
11433 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11434 cbnz x0, MterpOnStackReplacement
11435 b .L_resume_forward_branch
11436
11437.L_add_batch:
11438 add x1, xFP, #OFF_FP_SHADOWFRAME
11439 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
11440 ldr x0, [xFP, #OFF_FP_METHOD]
11441 mov x2, xSELF
11442 bl MterpAddHotnessBatch // (method, shadow_frame, self)
11443 mov wPROFILE, w0 // restore new hotness countdown to wPROFILE
11444 b .L_no_count_backwards
11445
11446/*
11447 * Entered from the conditional branch handlers when OSR check request active on
11448 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
11449 */
11450.L_check_not_taken_osr:
11451 mov x0, xSELF
11452 add x1, xFP, #OFF_FP_SHADOWFRAME
11453 mov x2, #2
11454 EXPORT_PC
11455 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11456 cbnz x0, MterpOnStackReplacement
11457 FETCH_ADVANCE_INST 2
11458 GET_INST_OPCODE ip // extract opcode from wINST
11459 GOTO_OPCODE ip // jump to next instruction
11460
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011461
11462/*
11463 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
11464 * still needs to get the opcode and branch to it, and flags are in lr.
11465 */
11466MterpCheckSuspendAndContinue:
11467 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
11468 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11469 b.ne check1
11470 GET_INST_OPCODE ip // extract opcode from wINST
11471 GOTO_OPCODE ip // jump to next instruction
11472check1:
11473 EXPORT_PC
11474 mov x0, xSELF
11475 bl MterpSuspendCheck // (self)
Bill Buzbeefd522f92016-02-11 22:37:42 +000011476 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011477 GET_INST_OPCODE ip // extract opcode from wINST
11478 GOTO_OPCODE ip // jump to next instruction
11479
11480/*
Bill Buzbeefd522f92016-02-11 22:37:42 +000011481 * On-stack replacement has happened, and now we've returned from the compiled method.
11482 */
11483MterpOnStackReplacement:
11484#if MTERP_LOGGING
11485 mov x0, xSELF
11486 add x1, xFP, #OFF_FP_SHADOWFRAME
Vladimir Markoe6220222016-07-20 14:25:30 +010011487 sxtw x2, wINST
Bill Buzbeefd522f92016-02-11 22:37:42 +000011488 bl MterpLogOSR
11489#endif
11490 mov x0, #1 // Signal normal return
11491 b MterpDone
11492
11493/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011494 * Bail out to reference interpreter.
11495 */
11496MterpFallback:
11497 EXPORT_PC
11498#if MTERP_LOGGING
11499 mov x0, xSELF
11500 add x1, xFP, #OFF_FP_SHADOWFRAME
11501 bl MterpLogFallback
11502#endif
11503MterpCommonFallback:
11504 mov x0, #0 // signal retry with reference interpreter.
11505 b MterpDone
11506
11507/*
11508 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
11509 * SP and LR. Here we restore SP, restore the registers, and then restore
11510 * LR to PC.
11511 *
11512 * On entry:
11513 * uint32_t* xFP (should still be live, pointer to base of vregs)
11514 */
11515MterpExceptionReturn:
11516 mov x0, #1 // signal return to caller.
11517 b MterpDone
11518MterpReturn:
11519 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
11520 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
11521 str x0, [x2]
11522 mov x0, xSELF
11523 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11524 b.eq check2
11525 bl MterpSuspendCheck // (self)
11526check2:
11527 mov x0, #1 // signal return to caller.
11528MterpDone:
Bill Buzbee1d011d92016-04-04 16:59:29 +000011529/*
11530 * At this point, we expect wPROFILE to be non-zero. If negative, hotness is disabled or we're
11531 * checking for OSR. If greater than zero, we might have unreported hotness to register
11532 * (the difference between the ending wPROFILE and the cached hotness counter). wPROFILE
11533 * should only reach zero immediately after a hotness decrement, and is then reset to either
11534 * a negative special state or the new non-zero countdown value.
11535 */
11536 cmp wPROFILE, #0
11537 bgt MterpProfileActive // if > 0, we may have some counts to report.
11538 ldp fp, lr, [sp, #64]
11539 ldp xPC, xFP, [sp, #48]
11540 ldp xSELF, xINST, [sp, #32]
11541 ldp xIBASE, xREFS, [sp, #16]
11542 ldp xPROFILE, x27, [sp], #80
11543 ret
11544
11545MterpProfileActive:
11546 mov xINST, x0 // stash return value
11547 /* Report cached hotness counts */
11548 ldr x0, [xFP, #OFF_FP_METHOD]
11549 add x1, xFP, #OFF_FP_SHADOWFRAME
11550 mov x2, xSELF
11551 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
11552 bl MterpAddHotnessBatch // (method, shadow_frame, self)
11553 mov x0, xINST // restore return value
11554 ldp fp, lr, [sp, #64]
11555 ldp xPC, xFP, [sp, #48]
11556 ldp xSELF, xINST, [sp, #32]
11557 ldp xIBASE, xREFS, [sp, #16]
11558 ldp xPROFILE, x27, [sp], #80
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011559 ret
11560
11561 .cfi_endproc
11562 .size ExecuteMterpImpl, .-ExecuteMterpImpl
11563
11564