blob: 51e71634a57381ff4bb77cef9fc70984cee8a3d6 [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 */
750 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended
751 lsr w3, wINST, #8 // w3<- AA
752 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
753 sbfm x0, x0, 0, 31
754 GET_INST_OPCODE ip // extract opcode from rINST
755 SET_VREG_WIDE x0, w3
756 GOTO_OPCODE ip // jump to next instruction
757
758/* ------------------------------ */
759 .balign 128
760.L_op_const_wide_32: /* 0x17 */
761/* File: arm64/op_const_wide_32.S */
762 /* const-wide/32 vAA, #+BBBBbbbb */
763 FETCH w0, 1 // w0<- 0000bbbb (low)
764 lsr w3, wINST, #8 // w3<- AA
765 FETCH_S w2, 2 // w2<- ssssBBBB (high)
766 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
767 GET_INST_OPCODE ip // extract opcode from wINST
768 orr w0, w0, w2, lsl #16 // w0<- BBBBbbbb
769 sbfm x0, x0, 0, 31
770 SET_VREG_WIDE x0, w3
771 GOTO_OPCODE ip // jump to next instruction
772
773/* ------------------------------ */
774 .balign 128
775.L_op_const_wide: /* 0x18 */
776/* File: arm64/op_const_wide.S */
777 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
778 FETCH w0, 1 // w0<- bbbb (low)
779 FETCH w1, 2 // w1<- BBBB (low middle)
780 FETCH w2, 3 // w2<- hhhh (high middle)
781 FETCH w3, 4 // w3<- HHHH (high)
782 lsr w4, wINST, #8 // r4<- AA
783 FETCH_ADVANCE_INST 5 // advance rPC, load wINST
784 GET_INST_OPCODE ip // extract opcode from wINST
785 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
786 orr x0, x0, x2, lsl #32 // w0<- hhhhBBBBbbbb
787 orr x0, x0, x3, lsl #48 // w0<- HHHHhhhhBBBBbbbb
788 SET_VREG_WIDE x0, w4
789 GOTO_OPCODE ip // jump to next instruction
790
791/* ------------------------------ */
792 .balign 128
793.L_op_const_wide_high16: /* 0x19 */
794/* File: arm64/op_const_wide_high16.S */
795 /* const-wide/high16 vAA, #+BBBB000000000000 */
796 FETCH w0, 1 // w0<- 0000BBBB (zero-extended)
797 lsr w1, wINST, #8 // w1<- AA
798 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
799 lsl x0, x0, #48
800 SET_VREG_WIDE x0, w1
801 GET_INST_OPCODE ip // extract opcode from wINST
802 GOTO_OPCODE ip // jump to next instruction
803
804/* ------------------------------ */
805 .balign 128
806.L_op_const_string: /* 0x1a */
807/* File: arm64/op_const_string.S */
808 /* const/string vAA, String//BBBB */
809 EXPORT_PC
810 FETCH w0, 1 // w0<- BBBB
811 lsr w1, wINST, #8 // w1<- AA
812 add x2, xFP, #OFF_FP_SHADOWFRAME
813 mov x3, xSELF
814 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
815 PREFETCH_INST 2 // load rINST
816 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
817 ADVANCE 2 // advance rPC
818 GET_INST_OPCODE ip // extract opcode from rINST
819 GOTO_OPCODE ip // jump to next instruction
820
821/* ------------------------------ */
822 .balign 128
823.L_op_const_string_jumbo: /* 0x1b */
824/* File: arm64/op_const_string_jumbo.S */
825 /* const/string vAA, String//BBBBBBBB */
826 EXPORT_PC
827 FETCH w0, 1 // w0<- bbbb (low
828 FETCH w2, 2 // w2<- BBBB (high
829 lsr w1, wINST, #8 // w1<- AA
830 orr w0, w0, w2, lsl #16 // w1<- BBBBbbbb
831 add x2, xFP, #OFF_FP_SHADOWFRAME
832 mov x3, xSELF
833 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
834 PREFETCH_INST 3 // advance rPC
835 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
836 ADVANCE 3 // advance rPC
837 GET_INST_OPCODE ip // extract opcode from rINST
838 GOTO_OPCODE ip // jump to next instruction
839
840/* ------------------------------ */
841 .balign 128
842.L_op_const_class: /* 0x1c */
843/* File: arm64/op_const_class.S */
844 /* const/class vAA, Class//BBBB */
845 EXPORT_PC
846 FETCH w0, 1 // w0<- BBBB
847 lsr w1, wINST, #8 // w1<- AA
848 add x2, xFP, #OFF_FP_SHADOWFRAME
849 mov x3, xSELF
850 bl MterpConstClass // (index, tgt_reg, shadow_frame, self)
851 PREFETCH_INST 2
852 cbnz w0, MterpPossibleException
853 ADVANCE 2
854 GET_INST_OPCODE ip // extract opcode from rINST
855 GOTO_OPCODE ip // jump to next instruction
856
857/* ------------------------------ */
858 .balign 128
859.L_op_monitor_enter: /* 0x1d */
860/* File: arm64/op_monitor_enter.S */
861 /*
862 * Synchronize on an object.
863 */
864 /* monitor-enter vAA */
865 EXPORT_PC
866 lsr w2, wINST, #8 // w2<- AA
867 GET_VREG w0, w2 // w0<- vAA (object)
868 mov x1, xSELF // w1<- self
869 bl artLockObjectFromCode
870 cbnz w0, MterpException
871 FETCH_ADVANCE_INST 1
872 GET_INST_OPCODE ip // extract opcode from rINST
873 GOTO_OPCODE ip // jump to next instruction
874
875/* ------------------------------ */
876 .balign 128
877.L_op_monitor_exit: /* 0x1e */
878/* File: arm64/op_monitor_exit.S */
879 /*
880 * Unlock an object.
881 *
882 * Exceptions that occur when unlocking a monitor need to appear as
883 * if they happened at the following instruction. See the Dalvik
884 * instruction spec.
885 */
886 /* monitor-exit vAA */
887 EXPORT_PC
888 lsr w2, wINST, #8 // w2<- AA
889 GET_VREG w0, w2 // w0<- vAA (object)
890 mov x1, xSELF // w0<- self
891 bl artUnlockObjectFromCode // w0<- success for unlock(self, obj)
892 cbnz w0, MterpException
893 FETCH_ADVANCE_INST 1 // before throw: advance rPC, load rINST
894 GET_INST_OPCODE ip // extract opcode from rINST
895 GOTO_OPCODE ip // jump to next instruction
896
897/* ------------------------------ */
898 .balign 128
899.L_op_check_cast: /* 0x1f */
900/* File: arm64/op_check_cast.S */
901 /*
902 * Check to see if a cast from one class to another is allowed.
903 */
904 /* check-cast vAA, class//BBBB */
905 EXPORT_PC
906 FETCH w0, 1 // w0<- BBBB
907 lsr w1, wINST, #8 // w1<- AA
908 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
909 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
910 mov x3, xSELF // w3<- self
911 bl MterpCheckCast // (index, &obj, method, self)
912 PREFETCH_INST 2
913 cbnz w0, MterpPossibleException
914 ADVANCE 2
915 GET_INST_OPCODE ip // extract opcode from rINST
916 GOTO_OPCODE ip // jump to next instruction
917
918/* ------------------------------ */
919 .balign 128
920.L_op_instance_of: /* 0x20 */
921/* File: arm64/op_instance_of.S */
922 /*
923 * Check to see if an object reference is an instance of a class.
924 *
925 * Most common situation is a non-null object, being compared against
926 * an already-resolved class.
927 */
928 /* instance-of vA, vB, class//CCCC */
929 EXPORT_PC
930 FETCH w0, 1 // w0<- CCCC
931 lsr w1, wINST, #12 // w1<- B
932 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
933 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
934 mov x3, xSELF // w3<- self
935 bl MterpInstanceOf // (index, &obj, method, self)
936 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
937 lsr w2, wINST, #8 // w2<- A+
938 and w2, w2, #15 // w2<- A
939 PREFETCH_INST 2
940 cbnz x1, MterpException
941 ADVANCE 2 // advance rPC
942 SET_VREG w0, w2 // vA<- w0
943 GET_INST_OPCODE ip // extract opcode from rINST
944 GOTO_OPCODE ip // jump to next instruction
945
946/* ------------------------------ */
947 .balign 128
948.L_op_array_length: /* 0x21 */
949/* File: arm64/op_array_length.S */
950 /*
951 * Return the length of an array.
952 */
953 lsr w1, wINST, #12 // w1<- B
954 ubfx w2, wINST, #8, #4 // w2<- A
955 GET_VREG w0, w1 // w0<- vB (object ref)
956 cbz w0, common_errNullObject // yup, fail
957 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
958 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- array length
959 GET_INST_OPCODE ip // extract opcode from rINST
960 SET_VREG w3, w2 // vB<- length
961 GOTO_OPCODE ip // jump to next instruction
962
963/* ------------------------------ */
964 .balign 128
965.L_op_new_instance: /* 0x22 */
966/* File: arm64/op_new_instance.S */
967 /*
968 * Create a new instance of a class.
969 */
970 /* new-instance vAA, class//BBBB */
971 EXPORT_PC
972 add x0, xFP, #OFF_FP_SHADOWFRAME
973 mov x1, xSELF
974 mov w2, wINST
975 bl MterpNewInstance // (shadow_frame, self, inst_data)
976 cbz w0, MterpPossibleException
977 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
978 GET_INST_OPCODE ip // extract opcode from rINST
979 GOTO_OPCODE ip // jump to next instruction
980
981/* ------------------------------ */
982 .balign 128
983.L_op_new_array: /* 0x23 */
984/* File: arm64/op_new_array.S */
985 /*
986 * Allocate an array of objects, specified with the array class
987 * and a count.
988 *
989 * The verifier guarantees that this is an array class, so we don't
990 * check for it here.
991 */
992 /* new-array vA, vB, class//CCCC */
993 EXPORT_PC
994 add x0, xFP, #OFF_FP_SHADOWFRAME
995 mov x1, xPC
996 mov w2, wINST
997 mov x3, xSELF
998 bl MterpNewArray
999 cbz w0, MterpPossibleException
1000 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1001 GET_INST_OPCODE ip // extract opcode from rINST
1002 GOTO_OPCODE ip // jump to next instruction
1003
1004/* ------------------------------ */
1005 .balign 128
1006.L_op_filled_new_array: /* 0x24 */
1007/* File: arm64/op_filled_new_array.S */
1008 /*
1009 * Create a new array with elements filled from registers.
1010 *
1011 * for: filled-new-array, filled-new-array/range
1012 */
1013 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1014 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1015 .extern MterpFilledNewArray
1016 EXPORT_PC
1017 add x0, xFP, #OFF_FP_SHADOWFRAME
1018 mov x1, xPC
1019 mov x2, xSELF
1020 bl MterpFilledNewArray
1021 cbz w0, MterpPossibleException
1022 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1023 GET_INST_OPCODE ip // extract opcode from rINST
1024 GOTO_OPCODE ip // jump to next instruction
1025
1026/* ------------------------------ */
1027 .balign 128
1028.L_op_filled_new_array_range: /* 0x25 */
1029/* File: arm64/op_filled_new_array_range.S */
1030/* File: arm64/op_filled_new_array.S */
1031 /*
1032 * Create a new array with elements filled from registers.
1033 *
1034 * for: filled-new-array, filled-new-array/range
1035 */
1036 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1037 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1038 .extern MterpFilledNewArrayRange
1039 EXPORT_PC
1040 add x0, xFP, #OFF_FP_SHADOWFRAME
1041 mov x1, xPC
1042 mov x2, xSELF
1043 bl MterpFilledNewArrayRange
1044 cbz w0, MterpPossibleException
1045 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1046 GET_INST_OPCODE ip // extract opcode from rINST
1047 GOTO_OPCODE ip // jump to next instruction
1048
1049
1050/* ------------------------------ */
1051 .balign 128
1052.L_op_fill_array_data: /* 0x26 */
1053/* File: arm64/op_fill_array_data.S */
1054 /* fill-array-data vAA, +BBBBBBBB */
1055 EXPORT_PC
1056 FETCH w0, 1 // w0<- bbbb (lo)
1057 FETCH w1, 2 // w1<- BBBB (hi)
1058 lsr w3, wINST, #8 // w3<- AA
1059 orr w1, w0, w1, lsl #16 // w1<- BBBBbbbb
1060 GET_VREG w0, w3 // w0<- vAA (array object)
1061 add x1, xPC, w1, lsl #1 // w1<- PC + BBBBbbbb*2 (array data off.)
1062 bl MterpFillArrayData // (obj, payload)
1063 cbz w0, MterpPossibleException // exception?
1064 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1065 GET_INST_OPCODE ip // extract opcode from rINST
1066 GOTO_OPCODE ip // jump to next instruction
1067
1068/* ------------------------------ */
1069 .balign 128
1070.L_op_throw: /* 0x27 */
1071/* File: arm64/op_throw.S */
1072 /*
1073 * Throw an exception object in the current thread.
1074 */
1075 /* throw vAA */
1076 EXPORT_PC
1077 lsr w2, wINST, #8 // r2<- AA
1078 GET_VREG w1, w2 // r1<- vAA (exception object)
1079 cbz w1, common_errNullObject
1080 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // thread->exception<- obj
1081 b MterpException
1082
1083/* ------------------------------ */
1084 .balign 128
1085.L_op_goto: /* 0x28 */
1086/* File: arm64/op_goto.S */
1087 /*
1088 * Unconditional branch, 8-bit offset.
1089 *
1090 * The branch distance is a signed code-unit offset, which we need to
1091 * double to get a byte offset.
1092 */
1093 /* goto +AA */
Bill Buzbee1d011d92016-04-04 16:59:29 +00001094 sbfx wINST, wINST, #8, #8 // wINST<- ssssssAA (sign-extended)
1095 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001096
1097/* ------------------------------ */
1098 .balign 128
1099.L_op_goto_16: /* 0x29 */
1100/* File: arm64/op_goto_16.S */
1101 /*
1102 * Unconditional branch, 16-bit offset.
1103 *
1104 * The branch distance is a signed code-unit offset, which we need to
1105 * double to get a byte offset.
1106 */
1107 /* goto/16 +AAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001108 FETCH_S wINST, 1 // wINST<- ssssAAAA (sign-extended)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001109 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001110
1111/* ------------------------------ */
1112 .balign 128
1113.L_op_goto_32: /* 0x2a */
1114/* File: arm64/op_goto_32.S */
1115 /*
1116 * Unconditional branch, 32-bit offset.
1117 *
1118 * The branch distance is a signed code-unit offset, which we need to
1119 * double to get a byte offset.
1120 *
1121 * Unlike most opcodes, this one is allowed to branch to itself, so
1122 * our "backward branch" test must be "<=0" instead of "<0". Because
1123 * we need the V bit set, we'll use an adds to convert from Dalvik
1124 * offset to byte offset.
1125 */
1126 /* goto/32 +AAAAAAAA */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001127 FETCH w0, 1 // w0<- aaaa (lo)
1128 FETCH w1, 2 // w1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001129 orr wINST, w0, w1, lsl #16 // wINST<- AAAAaaaa
Bill Buzbee1d011d92016-04-04 16:59:29 +00001130 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001131
1132/* ------------------------------ */
1133 .balign 128
1134.L_op_packed_switch: /* 0x2b */
1135/* File: arm64/op_packed_switch.S */
1136 /*
1137 * Handle a packed-switch or sparse-switch instruction. In both cases
1138 * we decode it and hand it off to a helper function.
1139 *
1140 * We don't really expect backward branches in a switch statement, but
1141 * they're perfectly legal, so we check for them here.
1142 *
1143 * for: packed-switch, sparse-switch
1144 */
1145 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001146 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1147 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001148 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001149 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001150 GET_VREG w1, w3 // w1<- vAA
Vladimir Marko5733e982016-07-20 17:52:51 +01001151 add x0, xPC, x0, lsl #1 // x0<- PC + BBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001152 bl MterpDoPackedSwitch // w0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001153 sbfm xINST, x0, 0, 31
Bill Buzbee1d011d92016-04-04 16:59:29 +00001154 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001155
1156/* ------------------------------ */
1157 .balign 128
1158.L_op_sparse_switch: /* 0x2c */
1159/* File: arm64/op_sparse_switch.S */
1160/* File: arm64/op_packed_switch.S */
1161 /*
1162 * Handle a packed-switch or sparse-switch instruction. In both cases
1163 * we decode it and hand it off to a helper function.
1164 *
1165 * We don't really expect backward branches in a switch statement, but
1166 * they're perfectly legal, so we check for them here.
1167 *
1168 * for: packed-switch, sparse-switch
1169 */
1170 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001171 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1172 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001173 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001174 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001175 GET_VREG w1, w3 // w1<- vAA
Vladimir Marko5733e982016-07-20 17:52:51 +01001176 add x0, xPC, x0, lsl #1 // x0<- PC + BBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001177 bl MterpDoSparseSwitch // w0<- code-unit branch offset
Bill Buzbeefd522f92016-02-11 22:37:42 +00001178 sbfm xINST, x0, 0, 31
Bill Buzbee1d011d92016-04-04 16:59:29 +00001179 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001180
1181
1182/* ------------------------------ */
1183 .balign 128
1184.L_op_cmpl_float: /* 0x2d */
1185/* File: arm64/op_cmpl_float.S */
1186/* File: arm64/fcmp.S */
1187 /*
1188 * Compare two floating-point values. Puts 0, 1, or -1 into the
1189 * destination register based on the results of the comparison.
1190 */
1191 /* op vAA, vBB, vCC */
1192 FETCH w0, 1 // w0<- CCBB
1193 lsr w4, wINST, #8 // w4<- AA
1194 and w2, w0, #255 // w2<- BB
1195 lsr w3, w0, #8 // w3<- CC
1196 GET_VREG s1, w2
1197 GET_VREG s2, w3
1198 mov w0, #-1
1199 fcmp s1, s2
1200 csneg w0, w0, w0, le
1201 csel w0, wzr, w0, eq
1202 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1203 GET_INST_OPCODE ip // extract opcode from rINST
1204 SET_VREG w0, w4 // vAA<- w0
1205 GOTO_OPCODE ip // jump to next instruction
1206
1207
1208/* ------------------------------ */
1209 .balign 128
1210.L_op_cmpg_float: /* 0x2e */
1211/* File: arm64/op_cmpg_float.S */
1212/* File: arm64/fcmp.S */
1213 /*
1214 * Compare two floating-point values. Puts 0, 1, or -1 into the
1215 * destination register based on the results of the comparison.
1216 */
1217 /* op vAA, vBB, vCC */
1218 FETCH w0, 1 // w0<- CCBB
1219 lsr w4, wINST, #8 // w4<- AA
1220 and w2, w0, #255 // w2<- BB
1221 lsr w3, w0, #8 // w3<- CC
1222 GET_VREG s1, w2
1223 GET_VREG s2, w3
1224 mov w0, #1
1225 fcmp s1, s2
1226 csneg w0, w0, w0, pl
1227 csel w0, wzr, w0, eq
1228 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1229 GET_INST_OPCODE ip // extract opcode from rINST
1230 SET_VREG w0, w4 // vAA<- w0
1231 GOTO_OPCODE ip // jump to next instruction
1232
1233
1234/* ------------------------------ */
1235 .balign 128
1236.L_op_cmpl_double: /* 0x2f */
1237/* File: arm64/op_cmpl_double.S */
1238/* File: arm64/fcmp.S */
1239 /*
1240 * Compare two floating-point values. Puts 0, 1, or -1 into the
1241 * destination register based on the results of the comparison.
1242 */
1243 /* op vAA, vBB, vCC */
1244 FETCH w0, 1 // w0<- CCBB
1245 lsr w4, wINST, #8 // w4<- AA
1246 and w2, w0, #255 // w2<- BB
1247 lsr w3, w0, #8 // w3<- CC
1248 GET_VREG_WIDE d1, w2
1249 GET_VREG_WIDE d2, w3
1250 mov w0, #-1
1251 fcmp d1, d2
1252 csneg w0, w0, w0, le
1253 csel w0, wzr, w0, eq
1254 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1255 GET_INST_OPCODE ip // extract opcode from rINST
1256 SET_VREG w0, w4 // vAA<- w0
1257 GOTO_OPCODE ip // jump to next instruction
1258
1259
1260/* ------------------------------ */
1261 .balign 128
1262.L_op_cmpg_double: /* 0x30 */
1263/* File: arm64/op_cmpg_double.S */
1264/* File: arm64/fcmp.S */
1265 /*
1266 * Compare two floating-point values. Puts 0, 1, or -1 into the
1267 * destination register based on the results of the comparison.
1268 */
1269 /* op vAA, vBB, vCC */
1270 FETCH w0, 1 // w0<- CCBB
1271 lsr w4, wINST, #8 // w4<- AA
1272 and w2, w0, #255 // w2<- BB
1273 lsr w3, w0, #8 // w3<- CC
1274 GET_VREG_WIDE d1, w2
1275 GET_VREG_WIDE d2, w3
1276 mov w0, #1
1277 fcmp d1, d2
1278 csneg w0, w0, w0, pl
1279 csel w0, wzr, w0, eq
1280 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1281 GET_INST_OPCODE ip // extract opcode from rINST
1282 SET_VREG w0, w4 // vAA<- w0
1283 GOTO_OPCODE ip // jump to next instruction
1284
1285
1286/* ------------------------------ */
1287 .balign 128
1288.L_op_cmp_long: /* 0x31 */
1289/* File: arm64/op_cmp_long.S */
1290 FETCH w0, 1 // w0<- CCBB
1291 lsr w4, wINST, #8 // w4<- AA
1292 and w2, w0, #255 // w2<- BB
1293 lsr w3, w0, #8 // w3<- CC
1294 GET_VREG_WIDE x1, w2
1295 GET_VREG_WIDE x2, w3
1296 cmp x1, x2
1297 csinc w0, wzr, wzr, eq
1298 csneg w0, w0, w0, ge
1299 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1300 SET_VREG w0, w4
1301 GET_INST_OPCODE ip // extract opcode from wINST
1302 GOTO_OPCODE ip // jump to next instruction
1303
1304/* ------------------------------ */
1305 .balign 128
1306.L_op_if_eq: /* 0x32 */
1307/* File: arm64/op_if_eq.S */
1308/* File: arm64/bincmp.S */
1309 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001310 * Generic two-operand compare-and-branch operation. Provide a "condition"
1311 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001312 *
1313 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1314 */
1315 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001316 lsr w1, wINST, #12 // w1<- B
1317 ubfx w0, wINST, #8, #4 // w0<- A
1318 GET_VREG w3, w1 // w3<- vB
1319 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001320 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001321 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001322 b.eq MterpCommonTakenBranchNoFlags
1323 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1324 b.eq .L_check_not_taken_osr
1325 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001326 GET_INST_OPCODE ip // extract opcode from wINST
1327 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001328
1329
1330/* ------------------------------ */
1331 .balign 128
1332.L_op_if_ne: /* 0x33 */
1333/* File: arm64/op_if_ne.S */
1334/* File: arm64/bincmp.S */
1335 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001336 * Generic two-operand compare-and-branch operation. Provide a "condition"
1337 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001338 *
1339 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1340 */
1341 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001342 lsr w1, wINST, #12 // w1<- B
1343 ubfx w0, wINST, #8, #4 // w0<- A
1344 GET_VREG w3, w1 // w3<- vB
1345 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001346 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001347 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001348 b.ne MterpCommonTakenBranchNoFlags
1349 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1350 b.eq .L_check_not_taken_osr
1351 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001352 GET_INST_OPCODE ip // extract opcode from wINST
1353 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001354
1355
1356/* ------------------------------ */
1357 .balign 128
1358.L_op_if_lt: /* 0x34 */
1359/* File: arm64/op_if_lt.S */
1360/* File: arm64/bincmp.S */
1361 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001362 * Generic two-operand compare-and-branch operation. Provide a "condition"
1363 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001364 *
1365 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1366 */
1367 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001368 lsr w1, wINST, #12 // w1<- B
1369 ubfx w0, wINST, #8, #4 // w0<- A
1370 GET_VREG w3, w1 // w3<- vB
1371 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001372 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001373 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001374 b.lt MterpCommonTakenBranchNoFlags
1375 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1376 b.eq .L_check_not_taken_osr
1377 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001378 GET_INST_OPCODE ip // extract opcode from wINST
1379 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001380
1381
1382/* ------------------------------ */
1383 .balign 128
1384.L_op_if_ge: /* 0x35 */
1385/* File: arm64/op_if_ge.S */
1386/* File: arm64/bincmp.S */
1387 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001388 * Generic two-operand compare-and-branch operation. Provide a "condition"
1389 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001390 *
1391 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1392 */
1393 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001394 lsr w1, wINST, #12 // w1<- B
1395 ubfx w0, wINST, #8, #4 // w0<- A
1396 GET_VREG w3, w1 // w3<- vB
1397 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001398 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001399 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001400 b.ge MterpCommonTakenBranchNoFlags
1401 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1402 b.eq .L_check_not_taken_osr
1403 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001404 GET_INST_OPCODE ip // extract opcode from wINST
1405 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001406
1407
1408/* ------------------------------ */
1409 .balign 128
1410.L_op_if_gt: /* 0x36 */
1411/* File: arm64/op_if_gt.S */
1412/* File: arm64/bincmp.S */
1413 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001414 * Generic two-operand compare-and-branch operation. Provide a "condition"
1415 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001416 *
1417 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1418 */
1419 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001420 lsr w1, wINST, #12 // w1<- B
1421 ubfx w0, wINST, #8, #4 // w0<- A
1422 GET_VREG w3, w1 // w3<- vB
1423 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001424 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001425 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001426 b.gt MterpCommonTakenBranchNoFlags
1427 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1428 b.eq .L_check_not_taken_osr
1429 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001430 GET_INST_OPCODE ip // extract opcode from wINST
1431 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001432
1433
1434/* ------------------------------ */
1435 .balign 128
1436.L_op_if_le: /* 0x37 */
1437/* File: arm64/op_if_le.S */
1438/* File: arm64/bincmp.S */
1439 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001440 * Generic two-operand compare-and-branch operation. Provide a "condition"
1441 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001442 *
1443 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1444 */
1445 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001446 lsr w1, wINST, #12 // w1<- B
1447 ubfx w0, wINST, #8, #4 // w0<- A
1448 GET_VREG w3, w1 // w3<- vB
1449 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001450 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001451 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001452 b.le MterpCommonTakenBranchNoFlags
1453 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1454 b.eq .L_check_not_taken_osr
1455 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001456 GET_INST_OPCODE ip // extract opcode from wINST
1457 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001458
1459
1460/* ------------------------------ */
1461 .balign 128
1462.L_op_if_eqz: /* 0x38 */
1463/* File: arm64/op_if_eqz.S */
1464/* File: arm64/zcmp.S */
1465 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001466 * Generic one-operand compare-and-branch operation. Provide a "condition"
1467 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001468 *
1469 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1470 */
1471 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001472 lsr w0, wINST, #8 // w0<- AA
1473 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001474 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001475 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001476 b.eq MterpCommonTakenBranchNoFlags
1477 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1478 b.eq .L_check_not_taken_osr
1479 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001480 GET_INST_OPCODE ip // extract opcode from wINST
1481 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001482
1483
1484/* ------------------------------ */
1485 .balign 128
1486.L_op_if_nez: /* 0x39 */
1487/* File: arm64/op_if_nez.S */
1488/* File: arm64/zcmp.S */
1489 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001490 * Generic one-operand compare-and-branch operation. Provide a "condition"
1491 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001492 *
1493 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1494 */
1495 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001496 lsr w0, wINST, #8 // w0<- AA
1497 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001498 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001499 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001500 b.ne MterpCommonTakenBranchNoFlags
1501 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1502 b.eq .L_check_not_taken_osr
1503 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001504 GET_INST_OPCODE ip // extract opcode from wINST
1505 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001506
1507
1508/* ------------------------------ */
1509 .balign 128
1510.L_op_if_ltz: /* 0x3a */
1511/* File: arm64/op_if_ltz.S */
1512/* File: arm64/zcmp.S */
1513 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001514 * Generic one-operand compare-and-branch operation. Provide a "condition"
1515 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001516 *
1517 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1518 */
1519 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001520 lsr w0, wINST, #8 // w0<- AA
1521 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001522 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001523 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001524 b.lt MterpCommonTakenBranchNoFlags
1525 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1526 b.eq .L_check_not_taken_osr
1527 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001528 GET_INST_OPCODE ip // extract opcode from wINST
1529 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001530
1531
1532/* ------------------------------ */
1533 .balign 128
1534.L_op_if_gez: /* 0x3b */
1535/* File: arm64/op_if_gez.S */
1536/* File: arm64/zcmp.S */
1537 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001538 * Generic one-operand compare-and-branch operation. Provide a "condition"
1539 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001540 *
1541 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1542 */
1543 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001544 lsr w0, wINST, #8 // w0<- AA
1545 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001546 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001547 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001548 b.ge MterpCommonTakenBranchNoFlags
1549 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1550 b.eq .L_check_not_taken_osr
1551 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001552 GET_INST_OPCODE ip // extract opcode from wINST
1553 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001554
1555
1556/* ------------------------------ */
1557 .balign 128
1558.L_op_if_gtz: /* 0x3c */
1559/* File: arm64/op_if_gtz.S */
1560/* File: arm64/zcmp.S */
1561 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001562 * Generic one-operand compare-and-branch operation. Provide a "condition"
1563 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001564 *
1565 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1566 */
1567 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001568 lsr w0, wINST, #8 // w0<- AA
1569 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001570 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001571 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001572 b.gt MterpCommonTakenBranchNoFlags
1573 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1574 b.eq .L_check_not_taken_osr
1575 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001576 GET_INST_OPCODE ip // extract opcode from wINST
1577 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001578
1579
1580/* ------------------------------ */
1581 .balign 128
1582.L_op_if_lez: /* 0x3d */
1583/* File: arm64/op_if_lez.S */
1584/* File: arm64/zcmp.S */
1585 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001586 * Generic one-operand compare-and-branch operation. Provide a "condition"
1587 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001588 *
1589 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1590 */
1591 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001592 lsr w0, wINST, #8 // w0<- AA
1593 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001594 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001595 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001596 b.le MterpCommonTakenBranchNoFlags
1597 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1598 b.eq .L_check_not_taken_osr
1599 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001600 GET_INST_OPCODE ip // extract opcode from wINST
1601 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001602
1603
1604/* ------------------------------ */
1605 .balign 128
1606.L_op_unused_3e: /* 0x3e */
1607/* File: arm64/op_unused_3e.S */
1608/* File: arm64/unused.S */
1609/*
1610 * Bail to reference interpreter to throw.
1611 */
1612 b MterpFallback
1613
1614
1615/* ------------------------------ */
1616 .balign 128
1617.L_op_unused_3f: /* 0x3f */
1618/* File: arm64/op_unused_3f.S */
1619/* File: arm64/unused.S */
1620/*
1621 * Bail to reference interpreter to throw.
1622 */
1623 b MterpFallback
1624
1625
1626/* ------------------------------ */
1627 .balign 128
1628.L_op_unused_40: /* 0x40 */
1629/* File: arm64/op_unused_40.S */
1630/* File: arm64/unused.S */
1631/*
1632 * Bail to reference interpreter to throw.
1633 */
1634 b MterpFallback
1635
1636
1637/* ------------------------------ */
1638 .balign 128
1639.L_op_unused_41: /* 0x41 */
1640/* File: arm64/op_unused_41.S */
1641/* File: arm64/unused.S */
1642/*
1643 * Bail to reference interpreter to throw.
1644 */
1645 b MterpFallback
1646
1647
1648/* ------------------------------ */
1649 .balign 128
1650.L_op_unused_42: /* 0x42 */
1651/* File: arm64/op_unused_42.S */
1652/* File: arm64/unused.S */
1653/*
1654 * Bail to reference interpreter to throw.
1655 */
1656 b MterpFallback
1657
1658
1659/* ------------------------------ */
1660 .balign 128
1661.L_op_unused_43: /* 0x43 */
1662/* File: arm64/op_unused_43.S */
1663/* File: arm64/unused.S */
1664/*
1665 * Bail to reference interpreter to throw.
1666 */
1667 b MterpFallback
1668
1669
1670/* ------------------------------ */
1671 .balign 128
1672.L_op_aget: /* 0x44 */
1673/* File: arm64/op_aget.S */
1674 /*
1675 * Array get, 32 bits or less. vAA <- vBB[vCC].
1676 *
1677 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1678 * instructions. We use a pair of FETCH_Bs instead.
1679 *
1680 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1681 *
1682 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1683 * If this changes, specialize.
1684 */
1685 /* op vAA, vBB, vCC */
1686 FETCH_B w2, 1, 0 // w2<- BB
1687 lsr w9, wINST, #8 // w9<- AA
1688 FETCH_B w3, 1, 1 // w3<- CC
1689 GET_VREG w0, w2 // w0<- vBB (array object)
1690 GET_VREG w1, w3 // w1<- vCC (requested index)
1691 cbz x0, common_errNullObject // bail if null array object.
1692 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1693 add x0, x0, w1, uxtw #2 // w0<- arrayObj + index*width
1694 cmp w1, w3 // compare unsigned index, length
1695 bcs common_errArrayIndex // index >= length, bail
1696 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1697 ldr w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1698 GET_INST_OPCODE ip // extract opcode from rINST
1699 SET_VREG w2, w9 // vAA<- w2
1700 GOTO_OPCODE ip // jump to next instruction
1701
1702/* ------------------------------ */
1703 .balign 128
1704.L_op_aget_wide: /* 0x45 */
1705/* File: arm64/op_aget_wide.S */
1706 /*
1707 * Array get, 64 bits. vAA <- vBB[vCC].
1708 *
1709 */
1710 /* aget-wide vAA, vBB, vCC */
1711 FETCH w0, 1 // w0<- CCBB
1712 lsr w4, wINST, #8 // w4<- AA
1713 and w2, w0, #255 // w2<- BB
1714 lsr w3, w0, #8 // w3<- CC
1715 GET_VREG w0, w2 // w0<- vBB (array object)
1716 GET_VREG w1, w3 // w1<- vCC (requested index)
1717 cbz w0, common_errNullObject // yes, bail
1718 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1719 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1720 cmp w1, w3 // compare unsigned index, length
1721 bcs common_errArrayIndex // index >= length, bail
1722 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1723 ldr x2, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] // x2<- vBB[vCC]
1724 GET_INST_OPCODE ip // extract opcode from wINST
1725 SET_VREG_WIDE x2, w4
1726 GOTO_OPCODE ip // jump to next instruction
1727
1728/* ------------------------------ */
1729 .balign 128
1730.L_op_aget_object: /* 0x46 */
1731/* File: arm64/op_aget_object.S */
1732 /*
1733 * Array object get. vAA <- vBB[vCC].
1734 *
1735 * for: aget-object
1736 */
1737 /* op vAA, vBB, vCC */
1738 FETCH_B w2, 1, 0 // w2<- BB
1739 FETCH_B w3, 1, 1 // w3<- CC
1740 EXPORT_PC
1741 GET_VREG w0, w2 // w0<- vBB (array object)
1742 GET_VREG w1, w3 // w1<- vCC (requested index)
1743 bl artAGetObjectFromMterp // (array, index)
1744 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
1745 lsr w2, wINST, #8 // w9<- AA
1746 PREFETCH_INST 2
1747 cbnz w1, MterpException
1748 SET_VREG_OBJECT w0, w2
1749 ADVANCE 2
1750 GET_INST_OPCODE ip
1751 GOTO_OPCODE ip // jump to next instruction
1752
1753/* ------------------------------ */
1754 .balign 128
1755.L_op_aget_boolean: /* 0x47 */
1756/* File: arm64/op_aget_boolean.S */
1757/* File: arm64/op_aget.S */
1758 /*
1759 * Array get, 32 bits or less. vAA <- vBB[vCC].
1760 *
1761 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1762 * instructions. We use a pair of FETCH_Bs instead.
1763 *
1764 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1765 *
1766 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1767 * If this changes, specialize.
1768 */
1769 /* op vAA, vBB, vCC */
1770 FETCH_B w2, 1, 0 // w2<- BB
1771 lsr w9, wINST, #8 // w9<- AA
1772 FETCH_B w3, 1, 1 // w3<- CC
1773 GET_VREG w0, w2 // w0<- vBB (array object)
1774 GET_VREG w1, w3 // w1<- vCC (requested index)
1775 cbz x0, common_errNullObject // bail if null array object.
1776 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1777 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1778 cmp w1, w3 // compare unsigned index, length
1779 bcs common_errArrayIndex // index >= length, bail
1780 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1781 ldrb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1782 GET_INST_OPCODE ip // extract opcode from rINST
1783 SET_VREG w2, w9 // vAA<- w2
1784 GOTO_OPCODE ip // jump to next instruction
1785
1786
1787/* ------------------------------ */
1788 .balign 128
1789.L_op_aget_byte: /* 0x48 */
1790/* File: arm64/op_aget_byte.S */
1791/* File: arm64/op_aget.S */
1792 /*
1793 * Array get, 32 bits or less. vAA <- vBB[vCC].
1794 *
1795 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1796 * instructions. We use a pair of FETCH_Bs instead.
1797 *
1798 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1799 *
1800 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1801 * If this changes, specialize.
1802 */
1803 /* op vAA, vBB, vCC */
1804 FETCH_B w2, 1, 0 // w2<- BB
1805 lsr w9, wINST, #8 // w9<- AA
1806 FETCH_B w3, 1, 1 // w3<- CC
1807 GET_VREG w0, w2 // w0<- vBB (array object)
1808 GET_VREG w1, w3 // w1<- vCC (requested index)
1809 cbz x0, common_errNullObject // bail if null array object.
1810 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1811 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1812 cmp w1, w3 // compare unsigned index, length
1813 bcs common_errArrayIndex // index >= length, bail
1814 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1815 ldrsb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1816 GET_INST_OPCODE ip // extract opcode from rINST
1817 SET_VREG w2, w9 // vAA<- w2
1818 GOTO_OPCODE ip // jump to next instruction
1819
1820
1821/* ------------------------------ */
1822 .balign 128
1823.L_op_aget_char: /* 0x49 */
1824/* File: arm64/op_aget_char.S */
1825/* File: arm64/op_aget.S */
1826 /*
1827 * Array get, 32 bits or less. vAA <- vBB[vCC].
1828 *
1829 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1830 * instructions. We use a pair of FETCH_Bs instead.
1831 *
1832 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1833 *
1834 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1835 * If this changes, specialize.
1836 */
1837 /* op vAA, vBB, vCC */
1838 FETCH_B w2, 1, 0 // w2<- BB
1839 lsr w9, wINST, #8 // w9<- AA
1840 FETCH_B w3, 1, 1 // w3<- CC
1841 GET_VREG w0, w2 // w0<- vBB (array object)
1842 GET_VREG w1, w3 // w1<- vCC (requested index)
1843 cbz x0, common_errNullObject // bail if null array object.
1844 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1845 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1846 cmp w1, w3 // compare unsigned index, length
1847 bcs common_errArrayIndex // index >= length, bail
1848 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1849 ldrh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1850 GET_INST_OPCODE ip // extract opcode from rINST
1851 SET_VREG w2, w9 // vAA<- w2
1852 GOTO_OPCODE ip // jump to next instruction
1853
1854
1855/* ------------------------------ */
1856 .balign 128
1857.L_op_aget_short: /* 0x4a */
1858/* File: arm64/op_aget_short.S */
1859/* File: arm64/op_aget.S */
1860 /*
1861 * Array get, 32 bits or less. vAA <- vBB[vCC].
1862 *
1863 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1864 * instructions. We use a pair of FETCH_Bs instead.
1865 *
1866 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1867 *
1868 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1869 * If this changes, specialize.
1870 */
1871 /* op vAA, vBB, vCC */
1872 FETCH_B w2, 1, 0 // w2<- BB
1873 lsr w9, wINST, #8 // w9<- AA
1874 FETCH_B w3, 1, 1 // w3<- CC
1875 GET_VREG w0, w2 // w0<- vBB (array object)
1876 GET_VREG w1, w3 // w1<- vCC (requested index)
1877 cbz x0, common_errNullObject // bail if null array object.
1878 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1879 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1880 cmp w1, w3 // compare unsigned index, length
1881 bcs common_errArrayIndex // index >= length, bail
1882 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1883 ldrsh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1884 GET_INST_OPCODE ip // extract opcode from rINST
1885 SET_VREG w2, w9 // vAA<- w2
1886 GOTO_OPCODE ip // jump to next instruction
1887
1888
1889/* ------------------------------ */
1890 .balign 128
1891.L_op_aput: /* 0x4b */
1892/* File: arm64/op_aput.S */
1893 /*
1894 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1895 *
1896 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1897 * instructions. We use a pair of FETCH_Bs instead.
1898 *
1899 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1900 *
1901 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1902 * If this changes, specialize.
1903 */
1904 /* op vAA, vBB, vCC */
1905 FETCH_B w2, 1, 0 // w2<- BB
1906 lsr w9, wINST, #8 // w9<- AA
1907 FETCH_B w3, 1, 1 // w3<- CC
1908 GET_VREG w0, w2 // w0<- vBB (array object)
1909 GET_VREG w1, w3 // w1<- vCC (requested index)
1910 cbz w0, common_errNullObject // bail if null
1911 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1912 add x0, x0, w1, lsl #2 // w0<- arrayObj + index*width
1913 cmp w1, w3 // compare unsigned index, length
1914 bcs common_errArrayIndex // index >= length, bail
1915 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1916 GET_VREG w2, w9 // w2<- vAA
1917 GET_INST_OPCODE ip // extract opcode from rINST
1918 str w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
1919 GOTO_OPCODE ip // jump to next instruction
1920
1921/* ------------------------------ */
1922 .balign 128
1923.L_op_aput_wide: /* 0x4c */
1924/* File: arm64/op_aput_wide.S */
1925 /*
1926 * Array put, 64 bits. vBB[vCC] <- vAA.
1927 *
1928 */
1929 /* aput-wide vAA, vBB, vCC */
1930 FETCH w0, 1 // w0<- CCBB
1931 lsr w4, wINST, #8 // w4<- AA
1932 and w2, w0, #255 // w2<- BB
1933 lsr w3, w0, #8 // w3<- CC
1934 GET_VREG w0, w2 // w0<- vBB (array object)
1935 GET_VREG w1, w3 // w1<- vCC (requested index)
1936 cbz w0, common_errNullObject // bail if null
1937 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1938 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1939 cmp w1, w3 // compare unsigned index, length
1940 bcs common_errArrayIndex // index >= length, bail
1941 GET_VREG_WIDE x1, w4
1942 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1943 GET_INST_OPCODE ip // extract opcode from wINST
1944 str x1, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]
1945 GOTO_OPCODE ip // jump to next instruction
1946
1947/* ------------------------------ */
1948 .balign 128
1949.L_op_aput_object: /* 0x4d */
1950/* File: arm64/op_aput_object.S */
1951 /*
1952 * Store an object into an array. vBB[vCC] <- vAA.
1953 */
1954 /* op vAA, vBB, vCC */
1955 EXPORT_PC
1956 add x0, xFP, #OFF_FP_SHADOWFRAME
1957 mov x1, xPC
1958 mov w2, wINST
1959 bl MterpAputObject
1960 cbz w0, MterpPossibleException
1961 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1962 GET_INST_OPCODE ip // extract opcode from rINST
1963 GOTO_OPCODE ip // jump to next instruction
1964
1965/* ------------------------------ */
1966 .balign 128
1967.L_op_aput_boolean: /* 0x4e */
1968/* File: arm64/op_aput_boolean.S */
1969/* File: arm64/op_aput.S */
1970 /*
1971 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1972 *
1973 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1974 * instructions. We use a pair of FETCH_Bs instead.
1975 *
1976 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1977 *
1978 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1979 * If this changes, specialize.
1980 */
1981 /* op vAA, vBB, vCC */
1982 FETCH_B w2, 1, 0 // w2<- BB
1983 lsr w9, wINST, #8 // w9<- AA
1984 FETCH_B w3, 1, 1 // w3<- CC
1985 GET_VREG w0, w2 // w0<- vBB (array object)
1986 GET_VREG w1, w3 // w1<- vCC (requested index)
1987 cbz w0, common_errNullObject // bail if null
1988 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1989 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
1990 cmp w1, w3 // compare unsigned index, length
1991 bcs common_errArrayIndex // index >= length, bail
1992 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1993 GET_VREG w2, w9 // w2<- vAA
1994 GET_INST_OPCODE ip // extract opcode from rINST
1995 strb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
1996 GOTO_OPCODE ip // jump to next instruction
1997
1998
1999/* ------------------------------ */
2000 .balign 128
2001.L_op_aput_byte: /* 0x4f */
2002/* File: arm64/op_aput_byte.S */
2003/* File: arm64/op_aput.S */
2004 /*
2005 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2006 *
2007 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2008 * instructions. We use a pair of FETCH_Bs instead.
2009 *
2010 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2011 *
2012 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2013 * If this changes, specialize.
2014 */
2015 /* op vAA, vBB, vCC */
2016 FETCH_B w2, 1, 0 // w2<- BB
2017 lsr w9, wINST, #8 // w9<- AA
2018 FETCH_B w3, 1, 1 // w3<- CC
2019 GET_VREG w0, w2 // w0<- vBB (array object)
2020 GET_VREG w1, w3 // w1<- vCC (requested index)
2021 cbz w0, common_errNullObject // bail if null
2022 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2023 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2024 cmp w1, w3 // compare unsigned index, length
2025 bcs common_errArrayIndex // index >= length, bail
2026 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2027 GET_VREG w2, w9 // w2<- vAA
2028 GET_INST_OPCODE ip // extract opcode from rINST
2029 strb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2030 GOTO_OPCODE ip // jump to next instruction
2031
2032
2033/* ------------------------------ */
2034 .balign 128
2035.L_op_aput_char: /* 0x50 */
2036/* File: arm64/op_aput_char.S */
2037/* File: arm64/op_aput.S */
2038 /*
2039 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2040 *
2041 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2042 * instructions. We use a pair of FETCH_Bs instead.
2043 *
2044 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2045 *
2046 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2047 * If this changes, specialize.
2048 */
2049 /* op vAA, vBB, vCC */
2050 FETCH_B w2, 1, 0 // w2<- BB
2051 lsr w9, wINST, #8 // w9<- AA
2052 FETCH_B w3, 1, 1 // w3<- CC
2053 GET_VREG w0, w2 // w0<- vBB (array object)
2054 GET_VREG w1, w3 // w1<- vCC (requested index)
2055 cbz w0, common_errNullObject // bail if null
2056 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2057 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2058 cmp w1, w3 // compare unsigned index, length
2059 bcs common_errArrayIndex // index >= length, bail
2060 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2061 GET_VREG w2, w9 // w2<- vAA
2062 GET_INST_OPCODE ip // extract opcode from rINST
2063 strh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2064 GOTO_OPCODE ip // jump to next instruction
2065
2066
2067/* ------------------------------ */
2068 .balign 128
2069.L_op_aput_short: /* 0x51 */
2070/* File: arm64/op_aput_short.S */
2071/* File: arm64/op_aput.S */
2072 /*
2073 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2074 *
2075 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2076 * instructions. We use a pair of FETCH_Bs instead.
2077 *
2078 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2079 *
2080 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2081 * If this changes, specialize.
2082 */
2083 /* op vAA, vBB, vCC */
2084 FETCH_B w2, 1, 0 // w2<- BB
2085 lsr w9, wINST, #8 // w9<- AA
2086 FETCH_B w3, 1, 1 // w3<- CC
2087 GET_VREG w0, w2 // w0<- vBB (array object)
2088 GET_VREG w1, w3 // w1<- vCC (requested index)
2089 cbz w0, common_errNullObject // bail if null
2090 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2091 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2092 cmp w1, w3 // compare unsigned index, length
2093 bcs common_errArrayIndex // index >= length, bail
2094 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2095 GET_VREG w2, w9 // w2<- vAA
2096 GET_INST_OPCODE ip // extract opcode from rINST
2097 strh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2098 GOTO_OPCODE ip // jump to next instruction
2099
2100
2101/* ------------------------------ */
2102 .balign 128
2103.L_op_iget: /* 0x52 */
2104/* File: arm64/op_iget.S */
2105 /*
2106 * General instance field get.
2107 *
2108 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2109 */
2110 EXPORT_PC
2111 FETCH w0, 1 // w0<- field ref CCCC
2112 lsr w1, wINST, #12 // w1<- B
2113 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2114 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2115 mov x3, xSELF // w3<- self
2116 bl artGet32InstanceFromCode
2117 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002118
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002119 ubfx w2, wINST, #8, #4 // w2<- A
2120 PREFETCH_INST 2
2121 cbnz x3, MterpPossibleException // bail out
2122 .if 0
2123 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2124 .else
2125 SET_VREG w0, w2 // fp[A]<- w0
2126 .endif
2127 ADVANCE 2
2128 GET_INST_OPCODE ip // extract opcode from rINST
2129 GOTO_OPCODE ip // jump to next instruction
2130
2131/* ------------------------------ */
2132 .balign 128
2133.L_op_iget_wide: /* 0x53 */
2134/* File: arm64/op_iget_wide.S */
2135 /*
2136 * 64-bit instance field get.
2137 *
2138 * for: iget-wide
2139 */
2140 EXPORT_PC
2141 FETCH w0, 1 // w0<- field ref CCCC
2142 lsr w1, wINST, #12 // w1<- B
2143 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2144 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2145 mov x3, xSELF // w3<- self
2146 bl artGet64InstanceFromCode
2147 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2148 ubfx w2, wINST, #8, #4 // w2<- A
2149 PREFETCH_INST 2
2150 cmp w3, #0
2151 cbnz w3, MterpException // bail out
2152 SET_VREG_WIDE x0, w2
2153 ADVANCE 2
2154 GET_INST_OPCODE ip // extract opcode from wINST
2155 GOTO_OPCODE ip // jump to next instruction
2156
2157/* ------------------------------ */
2158 .balign 128
2159.L_op_iget_object: /* 0x54 */
2160/* File: arm64/op_iget_object.S */
2161/* File: arm64/op_iget.S */
2162 /*
2163 * General instance field get.
2164 *
2165 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2166 */
2167 EXPORT_PC
2168 FETCH w0, 1 // w0<- field ref CCCC
2169 lsr w1, wINST, #12 // w1<- B
2170 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2171 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2172 mov x3, xSELF // w3<- self
2173 bl artGetObjInstanceFromCode
2174 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002175
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002176 ubfx w2, wINST, #8, #4 // w2<- A
2177 PREFETCH_INST 2
2178 cbnz x3, MterpPossibleException // bail out
2179 .if 1
2180 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2181 .else
2182 SET_VREG w0, w2 // fp[A]<- w0
2183 .endif
2184 ADVANCE 2
2185 GET_INST_OPCODE ip // extract opcode from rINST
2186 GOTO_OPCODE ip // jump to next instruction
2187
2188
2189/* ------------------------------ */
2190 .balign 128
2191.L_op_iget_boolean: /* 0x55 */
2192/* File: arm64/op_iget_boolean.S */
2193/* File: arm64/op_iget.S */
2194 /*
2195 * General instance field get.
2196 *
2197 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2198 */
2199 EXPORT_PC
2200 FETCH w0, 1 // w0<- field ref CCCC
2201 lsr w1, wINST, #12 // w1<- B
2202 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2203 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2204 mov x3, xSELF // w3<- self
2205 bl artGetBooleanInstanceFromCode
2206 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002207 uxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002208 ubfx w2, wINST, #8, #4 // w2<- A
2209 PREFETCH_INST 2
2210 cbnz x3, MterpPossibleException // bail out
2211 .if 0
2212 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2213 .else
2214 SET_VREG w0, w2 // fp[A]<- w0
2215 .endif
2216 ADVANCE 2
2217 GET_INST_OPCODE ip // extract opcode from rINST
2218 GOTO_OPCODE ip // jump to next instruction
2219
2220
2221/* ------------------------------ */
2222 .balign 128
2223.L_op_iget_byte: /* 0x56 */
2224/* File: arm64/op_iget_byte.S */
2225/* File: arm64/op_iget.S */
2226 /*
2227 * General instance field get.
2228 *
2229 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2230 */
2231 EXPORT_PC
2232 FETCH w0, 1 // w0<- field ref CCCC
2233 lsr w1, wINST, #12 // w1<- B
2234 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2235 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2236 mov x3, xSELF // w3<- self
2237 bl artGetByteInstanceFromCode
2238 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002239 sxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002240 ubfx w2, wINST, #8, #4 // w2<- A
2241 PREFETCH_INST 2
2242 cbnz x3, MterpPossibleException // bail out
2243 .if 0
2244 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2245 .else
2246 SET_VREG w0, w2 // fp[A]<- w0
2247 .endif
2248 ADVANCE 2
2249 GET_INST_OPCODE ip // extract opcode from rINST
2250 GOTO_OPCODE ip // jump to next instruction
2251
2252
2253/* ------------------------------ */
2254 .balign 128
2255.L_op_iget_char: /* 0x57 */
2256/* File: arm64/op_iget_char.S */
2257/* File: arm64/op_iget.S */
2258 /*
2259 * General instance field get.
2260 *
2261 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2262 */
2263 EXPORT_PC
2264 FETCH w0, 1 // w0<- field ref CCCC
2265 lsr w1, wINST, #12 // w1<- B
2266 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2267 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2268 mov x3, xSELF // w3<- self
2269 bl artGetCharInstanceFromCode
2270 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002271 uxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002272 ubfx w2, wINST, #8, #4 // w2<- A
2273 PREFETCH_INST 2
2274 cbnz x3, MterpPossibleException // bail out
2275 .if 0
2276 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2277 .else
2278 SET_VREG w0, w2 // fp[A]<- w0
2279 .endif
2280 ADVANCE 2
2281 GET_INST_OPCODE ip // extract opcode from rINST
2282 GOTO_OPCODE ip // jump to next instruction
2283
2284
2285/* ------------------------------ */
2286 .balign 128
2287.L_op_iget_short: /* 0x58 */
2288/* File: arm64/op_iget_short.S */
2289/* File: arm64/op_iget.S */
2290 /*
2291 * General instance field get.
2292 *
2293 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2294 */
2295 EXPORT_PC
2296 FETCH w0, 1 // w0<- field ref CCCC
2297 lsr w1, wINST, #12 // w1<- B
2298 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2299 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2300 mov x3, xSELF // w3<- self
2301 bl artGetShortInstanceFromCode
2302 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002303 sxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002304 ubfx w2, wINST, #8, #4 // w2<- A
2305 PREFETCH_INST 2
2306 cbnz x3, MterpPossibleException // bail out
2307 .if 0
2308 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2309 .else
2310 SET_VREG w0, w2 // fp[A]<- w0
2311 .endif
2312 ADVANCE 2
2313 GET_INST_OPCODE ip // extract opcode from rINST
2314 GOTO_OPCODE ip // jump to next instruction
2315
2316
2317/* ------------------------------ */
2318 .balign 128
2319.L_op_iput: /* 0x59 */
2320/* File: arm64/op_iput.S */
2321 /*
2322 * General 32-bit instance field put.
2323 *
2324 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2325 */
2326 /* op vA, vB, field//CCCC */
2327 .extern artSet32InstanceFromMterp
2328 EXPORT_PC
2329 FETCH w0, 1 // w0<- field ref CCCC
2330 lsr w1, wINST, #12 // w1<- B
2331 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2332 ubfx w2, wINST, #8, #4 // w2<- A
2333 GET_VREG w2, w2 // w2<- fp[A]
2334 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2335 PREFETCH_INST 2
2336 bl artSet32InstanceFromMterp
2337 cbnz w0, MterpPossibleException
2338 ADVANCE 2 // advance rPC
2339 GET_INST_OPCODE ip // extract opcode from rINST
2340 GOTO_OPCODE ip // jump to next instruction
2341
2342/* ------------------------------ */
2343 .balign 128
2344.L_op_iput_wide: /* 0x5a */
2345/* File: arm64/op_iput_wide.S */
2346 /* iput-wide vA, vB, field//CCCC */
2347 .extern artSet64InstanceFromMterp
2348 EXPORT_PC
2349 FETCH w0, 1 // w0<- field ref CCCC
2350 lsr w1, wINST, #12 // w1<- B
2351 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2352 ubfx w2, wINST, #8, #4 // w2<- A
buzbeeace690f2016-03-11 09:51:11 -08002353 VREG_INDEX_TO_ADDR x2, x2 // w2<- &fp[A]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002354 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2355 PREFETCH_INST 2
2356 bl artSet64InstanceFromMterp
2357 cbnz w0, MterpPossibleException
2358 ADVANCE 2 // advance rPC
2359 GET_INST_OPCODE ip // extract opcode from wINST
2360 GOTO_OPCODE ip // jump to next instruction
2361
2362/* ------------------------------ */
2363 .balign 128
2364.L_op_iput_object: /* 0x5b */
2365/* File: arm64/op_iput_object.S */
2366 EXPORT_PC
2367 add x0, xFP, #OFF_FP_SHADOWFRAME
2368 mov x1, xPC
2369 mov w2, wINST
2370 mov x3, xSELF
2371 bl MterpIputObject
2372 cbz w0, MterpException
2373 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2374 GET_INST_OPCODE ip // extract opcode from rINST
2375 GOTO_OPCODE ip // jump to next instruction
2376
2377/* ------------------------------ */
2378 .balign 128
2379.L_op_iput_boolean: /* 0x5c */
2380/* File: arm64/op_iput_boolean.S */
2381/* File: arm64/op_iput.S */
2382 /*
2383 * General 32-bit instance field put.
2384 *
2385 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2386 */
2387 /* op vA, vB, field//CCCC */
2388 .extern artSet8InstanceFromMterp
2389 EXPORT_PC
2390 FETCH w0, 1 // w0<- field ref CCCC
2391 lsr w1, wINST, #12 // w1<- B
2392 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2393 ubfx w2, wINST, #8, #4 // w2<- A
2394 GET_VREG w2, w2 // w2<- fp[A]
2395 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2396 PREFETCH_INST 2
2397 bl artSet8InstanceFromMterp
2398 cbnz w0, MterpPossibleException
2399 ADVANCE 2 // advance rPC
2400 GET_INST_OPCODE ip // extract opcode from rINST
2401 GOTO_OPCODE ip // jump to next instruction
2402
2403
2404/* ------------------------------ */
2405 .balign 128
2406.L_op_iput_byte: /* 0x5d */
2407/* File: arm64/op_iput_byte.S */
2408/* File: arm64/op_iput.S */
2409 /*
2410 * General 32-bit instance field put.
2411 *
2412 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2413 */
2414 /* op vA, vB, field//CCCC */
2415 .extern artSet8InstanceFromMterp
2416 EXPORT_PC
2417 FETCH w0, 1 // w0<- field ref CCCC
2418 lsr w1, wINST, #12 // w1<- B
2419 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2420 ubfx w2, wINST, #8, #4 // w2<- A
2421 GET_VREG w2, w2 // w2<- fp[A]
2422 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2423 PREFETCH_INST 2
2424 bl artSet8InstanceFromMterp
2425 cbnz w0, MterpPossibleException
2426 ADVANCE 2 // advance rPC
2427 GET_INST_OPCODE ip // extract opcode from rINST
2428 GOTO_OPCODE ip // jump to next instruction
2429
2430
2431/* ------------------------------ */
2432 .balign 128
2433.L_op_iput_char: /* 0x5e */
2434/* File: arm64/op_iput_char.S */
2435/* File: arm64/op_iput.S */
2436 /*
2437 * General 32-bit instance field put.
2438 *
2439 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2440 */
2441 /* op vA, vB, field//CCCC */
2442 .extern artSet16InstanceFromMterp
2443 EXPORT_PC
2444 FETCH w0, 1 // w0<- field ref CCCC
2445 lsr w1, wINST, #12 // w1<- B
2446 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2447 ubfx w2, wINST, #8, #4 // w2<- A
2448 GET_VREG w2, w2 // w2<- fp[A]
2449 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2450 PREFETCH_INST 2
2451 bl artSet16InstanceFromMterp
2452 cbnz w0, MterpPossibleException
2453 ADVANCE 2 // advance rPC
2454 GET_INST_OPCODE ip // extract opcode from rINST
2455 GOTO_OPCODE ip // jump to next instruction
2456
2457
2458/* ------------------------------ */
2459 .balign 128
2460.L_op_iput_short: /* 0x5f */
2461/* File: arm64/op_iput_short.S */
2462/* File: arm64/op_iput.S */
2463 /*
2464 * General 32-bit instance field put.
2465 *
2466 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2467 */
2468 /* op vA, vB, field//CCCC */
2469 .extern artSet16InstanceFromMterp
2470 EXPORT_PC
2471 FETCH w0, 1 // w0<- field ref CCCC
2472 lsr w1, wINST, #12 // w1<- B
2473 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2474 ubfx w2, wINST, #8, #4 // w2<- A
2475 GET_VREG w2, w2 // w2<- fp[A]
2476 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2477 PREFETCH_INST 2
2478 bl artSet16InstanceFromMterp
2479 cbnz w0, MterpPossibleException
2480 ADVANCE 2 // advance rPC
2481 GET_INST_OPCODE ip // extract opcode from rINST
2482 GOTO_OPCODE ip // jump to next instruction
2483
2484
2485/* ------------------------------ */
2486 .balign 128
2487.L_op_sget: /* 0x60 */
2488/* File: arm64/op_sget.S */
2489 /*
2490 * General SGET handler wrapper.
2491 *
2492 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2493 */
2494 /* op vAA, field//BBBB */
2495
2496 .extern artGet32StaticFromCode
2497 EXPORT_PC
2498 FETCH w0, 1 // w0<- field ref BBBB
2499 ldr x1, [xFP, #OFF_FP_METHOD]
2500 mov x2, xSELF
2501 bl artGet32StaticFromCode
2502 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2503 lsr w2, wINST, #8 // w2<- AA
2504
2505 PREFETCH_INST 2
2506 cbnz x3, MterpException // bail out
2507.if 0
2508 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2509.else
2510 SET_VREG w0, w2 // fp[AA]<- w0
2511.endif
2512 ADVANCE 2
2513 GET_INST_OPCODE ip // extract opcode from rINST
2514 GOTO_OPCODE ip
2515
2516/* ------------------------------ */
2517 .balign 128
2518.L_op_sget_wide: /* 0x61 */
2519/* File: arm64/op_sget_wide.S */
2520 /*
2521 * SGET_WIDE handler wrapper.
2522 *
2523 */
2524 /* sget-wide vAA, field//BBBB */
2525
2526 .extern artGet64StaticFromCode
2527 EXPORT_PC
2528 FETCH w0, 1 // w0<- field ref BBBB
2529 ldr x1, [xFP, #OFF_FP_METHOD]
2530 mov x2, xSELF
2531 bl artGet64StaticFromCode
2532 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2533 lsr w4, wINST, #8 // w4<- AA
2534 cbnz x3, MterpException // bail out
2535 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2536 SET_VREG_WIDE x0, w4
2537 GET_INST_OPCODE ip // extract opcode from wINST
2538 GOTO_OPCODE ip // jump to next instruction
2539
2540/* ------------------------------ */
2541 .balign 128
2542.L_op_sget_object: /* 0x62 */
2543/* File: arm64/op_sget_object.S */
2544/* File: arm64/op_sget.S */
2545 /*
2546 * General SGET handler wrapper.
2547 *
2548 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2549 */
2550 /* op vAA, field//BBBB */
2551
2552 .extern artGetObjStaticFromCode
2553 EXPORT_PC
2554 FETCH w0, 1 // w0<- field ref BBBB
2555 ldr x1, [xFP, #OFF_FP_METHOD]
2556 mov x2, xSELF
2557 bl artGetObjStaticFromCode
2558 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2559 lsr w2, wINST, #8 // w2<- AA
2560
2561 PREFETCH_INST 2
2562 cbnz x3, MterpException // bail out
2563.if 1
2564 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2565.else
2566 SET_VREG w0, w2 // fp[AA]<- w0
2567.endif
2568 ADVANCE 2
2569 GET_INST_OPCODE ip // extract opcode from rINST
2570 GOTO_OPCODE ip
2571
2572
2573/* ------------------------------ */
2574 .balign 128
2575.L_op_sget_boolean: /* 0x63 */
2576/* File: arm64/op_sget_boolean.S */
2577/* File: arm64/op_sget.S */
2578 /*
2579 * General SGET handler wrapper.
2580 *
2581 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2582 */
2583 /* op vAA, field//BBBB */
2584
2585 .extern artGetBooleanStaticFromCode
2586 EXPORT_PC
2587 FETCH w0, 1 // w0<- field ref BBBB
2588 ldr x1, [xFP, #OFF_FP_METHOD]
2589 mov x2, xSELF
2590 bl artGetBooleanStaticFromCode
2591 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2592 lsr w2, wINST, #8 // w2<- AA
2593 uxtb w0, w0
2594 PREFETCH_INST 2
2595 cbnz x3, MterpException // bail out
2596.if 0
2597 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2598.else
2599 SET_VREG w0, w2 // fp[AA]<- w0
2600.endif
2601 ADVANCE 2
2602 GET_INST_OPCODE ip // extract opcode from rINST
2603 GOTO_OPCODE ip
2604
2605
2606/* ------------------------------ */
2607 .balign 128
2608.L_op_sget_byte: /* 0x64 */
2609/* File: arm64/op_sget_byte.S */
2610/* File: arm64/op_sget.S */
2611 /*
2612 * General SGET handler wrapper.
2613 *
2614 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2615 */
2616 /* op vAA, field//BBBB */
2617
2618 .extern artGetByteStaticFromCode
2619 EXPORT_PC
2620 FETCH w0, 1 // w0<- field ref BBBB
2621 ldr x1, [xFP, #OFF_FP_METHOD]
2622 mov x2, xSELF
2623 bl artGetByteStaticFromCode
2624 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2625 lsr w2, wINST, #8 // w2<- AA
2626 sxtb w0, w0
2627 PREFETCH_INST 2
2628 cbnz x3, MterpException // bail out
2629.if 0
2630 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2631.else
2632 SET_VREG w0, w2 // fp[AA]<- w0
2633.endif
2634 ADVANCE 2
2635 GET_INST_OPCODE ip // extract opcode from rINST
2636 GOTO_OPCODE ip
2637
2638
2639/* ------------------------------ */
2640 .balign 128
2641.L_op_sget_char: /* 0x65 */
2642/* File: arm64/op_sget_char.S */
2643/* File: arm64/op_sget.S */
2644 /*
2645 * General SGET handler wrapper.
2646 *
2647 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2648 */
2649 /* op vAA, field//BBBB */
2650
2651 .extern artGetCharStaticFromCode
2652 EXPORT_PC
2653 FETCH w0, 1 // w0<- field ref BBBB
2654 ldr x1, [xFP, #OFF_FP_METHOD]
2655 mov x2, xSELF
2656 bl artGetCharStaticFromCode
2657 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2658 lsr w2, wINST, #8 // w2<- AA
2659 uxth w0, w0
2660 PREFETCH_INST 2
2661 cbnz x3, MterpException // bail out
2662.if 0
2663 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2664.else
2665 SET_VREG w0, w2 // fp[AA]<- w0
2666.endif
2667 ADVANCE 2
2668 GET_INST_OPCODE ip // extract opcode from rINST
2669 GOTO_OPCODE ip
2670
2671
2672/* ------------------------------ */
2673 .balign 128
2674.L_op_sget_short: /* 0x66 */
2675/* File: arm64/op_sget_short.S */
2676/* File: arm64/op_sget.S */
2677 /*
2678 * General SGET handler wrapper.
2679 *
2680 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2681 */
2682 /* op vAA, field//BBBB */
2683
2684 .extern artGetShortStaticFromCode
2685 EXPORT_PC
2686 FETCH w0, 1 // w0<- field ref BBBB
2687 ldr x1, [xFP, #OFF_FP_METHOD]
2688 mov x2, xSELF
2689 bl artGetShortStaticFromCode
2690 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2691 lsr w2, wINST, #8 // w2<- AA
2692 sxth w0, w0
2693 PREFETCH_INST 2
2694 cbnz x3, MterpException // bail out
2695.if 0
2696 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2697.else
2698 SET_VREG w0, w2 // fp[AA]<- w0
2699.endif
2700 ADVANCE 2
2701 GET_INST_OPCODE ip // extract opcode from rINST
2702 GOTO_OPCODE ip
2703
2704
2705/* ------------------------------ */
2706 .balign 128
2707.L_op_sput: /* 0x67 */
2708/* File: arm64/op_sput.S */
2709 /*
2710 * General SPUT handler wrapper.
2711 *
2712 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2713 */
2714 /* op vAA, field//BBBB */
2715 EXPORT_PC
2716 FETCH w0, 1 // r0<- field ref BBBB
2717 lsr w3, wINST, #8 // r3<- AA
2718 GET_VREG w1, w3 // r1<= fp[AA]
2719 ldr x2, [xFP, #OFF_FP_METHOD]
2720 mov x3, xSELF
2721 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2722 bl artSet32StaticFromCode
2723 cbnz w0, MterpException // 0 on success
2724 ADVANCE 2 // Past exception point - now advance rPC
2725 GET_INST_OPCODE ip // extract opcode from rINST
2726 GOTO_OPCODE ip // jump to next instruction
2727
2728/* ------------------------------ */
2729 .balign 128
2730.L_op_sput_wide: /* 0x68 */
2731/* File: arm64/op_sput_wide.S */
2732 /*
2733 * SPUT_WIDE handler wrapper.
2734 *
2735 */
2736 /* sput-wide vAA, field//BBBB */
2737 .extern artSet64IndirectStaticFromMterp
2738 EXPORT_PC
2739 FETCH w0, 1 // w0<- field ref BBBB
2740 ldr x1, [xFP, #OFF_FP_METHOD]
2741 lsr w2, wINST, #8 // w3<- AA
buzbeeace690f2016-03-11 09:51:11 -08002742 VREG_INDEX_TO_ADDR x2, w2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002743 mov x3, xSELF
2744 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2745 bl artSet64IndirectStaticFromMterp
2746 cbnz w0, MterpException // 0 on success, -1 on failure
2747 ADVANCE 2 // Past exception point - now advance rPC
2748 GET_INST_OPCODE ip // extract opcode from wINST
2749 GOTO_OPCODE ip // jump to next instruction
2750
2751/* ------------------------------ */
2752 .balign 128
2753.L_op_sput_object: /* 0x69 */
2754/* File: arm64/op_sput_object.S */
2755 EXPORT_PC
2756 add x0, xFP, #OFF_FP_SHADOWFRAME
2757 mov x1, xPC
2758 mov x2, xINST
2759 mov x3, xSELF
2760 bl MterpSputObject
2761 cbz w0, MterpException
2762 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2763 GET_INST_OPCODE ip // extract opcode from rINST
2764 GOTO_OPCODE ip // jump to next instruction
2765
2766/* ------------------------------ */
2767 .balign 128
2768.L_op_sput_boolean: /* 0x6a */
2769/* File: arm64/op_sput_boolean.S */
2770/* File: arm64/op_sput.S */
2771 /*
2772 * General SPUT handler wrapper.
2773 *
2774 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2775 */
2776 /* op vAA, field//BBBB */
2777 EXPORT_PC
2778 FETCH w0, 1 // r0<- field ref BBBB
2779 lsr w3, wINST, #8 // r3<- AA
2780 GET_VREG w1, w3 // r1<= fp[AA]
2781 ldr x2, [xFP, #OFF_FP_METHOD]
2782 mov x3, xSELF
2783 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2784 bl artSet8StaticFromCode
2785 cbnz w0, MterpException // 0 on success
2786 ADVANCE 2 // Past exception point - now advance rPC
2787 GET_INST_OPCODE ip // extract opcode from rINST
2788 GOTO_OPCODE ip // jump to next instruction
2789
2790
2791/* ------------------------------ */
2792 .balign 128
2793.L_op_sput_byte: /* 0x6b */
2794/* File: arm64/op_sput_byte.S */
2795/* File: arm64/op_sput.S */
2796 /*
2797 * General SPUT handler wrapper.
2798 *
2799 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2800 */
2801 /* op vAA, field//BBBB */
2802 EXPORT_PC
2803 FETCH w0, 1 // r0<- field ref BBBB
2804 lsr w3, wINST, #8 // r3<- AA
2805 GET_VREG w1, w3 // r1<= fp[AA]
2806 ldr x2, [xFP, #OFF_FP_METHOD]
2807 mov x3, xSELF
2808 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2809 bl artSet8StaticFromCode
2810 cbnz w0, MterpException // 0 on success
2811 ADVANCE 2 // Past exception point - now advance rPC
2812 GET_INST_OPCODE ip // extract opcode from rINST
2813 GOTO_OPCODE ip // jump to next instruction
2814
2815
2816/* ------------------------------ */
2817 .balign 128
2818.L_op_sput_char: /* 0x6c */
2819/* File: arm64/op_sput_char.S */
2820/* File: arm64/op_sput.S */
2821 /*
2822 * General SPUT handler wrapper.
2823 *
2824 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2825 */
2826 /* op vAA, field//BBBB */
2827 EXPORT_PC
2828 FETCH w0, 1 // r0<- field ref BBBB
2829 lsr w3, wINST, #8 // r3<- AA
2830 GET_VREG w1, w3 // r1<= fp[AA]
2831 ldr x2, [xFP, #OFF_FP_METHOD]
2832 mov x3, xSELF
2833 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2834 bl artSet16StaticFromCode
2835 cbnz w0, MterpException // 0 on success
2836 ADVANCE 2 // Past exception point - now advance rPC
2837 GET_INST_OPCODE ip // extract opcode from rINST
2838 GOTO_OPCODE ip // jump to next instruction
2839
2840
2841/* ------------------------------ */
2842 .balign 128
2843.L_op_sput_short: /* 0x6d */
2844/* File: arm64/op_sput_short.S */
2845/* File: arm64/op_sput.S */
2846 /*
2847 * General SPUT handler wrapper.
2848 *
2849 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2850 */
2851 /* op vAA, field//BBBB */
2852 EXPORT_PC
2853 FETCH w0, 1 // r0<- field ref BBBB
2854 lsr w3, wINST, #8 // r3<- AA
2855 GET_VREG w1, w3 // r1<= fp[AA]
2856 ldr x2, [xFP, #OFF_FP_METHOD]
2857 mov x3, xSELF
2858 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2859 bl artSet16StaticFromCode
2860 cbnz w0, MterpException // 0 on success
2861 ADVANCE 2 // Past exception point - now advance rPC
2862 GET_INST_OPCODE ip // extract opcode from rINST
2863 GOTO_OPCODE ip // jump to next instruction
2864
2865
2866/* ------------------------------ */
2867 .balign 128
2868.L_op_invoke_virtual: /* 0x6e */
2869/* File: arm64/op_invoke_virtual.S */
2870/* File: arm64/invoke.S */
2871 /*
2872 * Generic invoke handler wrapper.
2873 */
2874 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2875 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2876 .extern MterpInvokeVirtual
2877 EXPORT_PC
2878 mov x0, xSELF
2879 add x1, xFP, #OFF_FP_SHADOWFRAME
2880 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002881 mov x3, xINST
2882 bl MterpInvokeVirtual
2883 cbz w0, MterpException
2884 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002885 bl MterpShouldSwitchInterpreters
2886 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002887 GET_INST_OPCODE ip
2888 GOTO_OPCODE ip
2889
2890
2891 /*
2892 * Handle a virtual method call.
2893 *
2894 * for: invoke-virtual, invoke-virtual/range
2895 */
2896 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2897 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2898
2899/* ------------------------------ */
2900 .balign 128
2901.L_op_invoke_super: /* 0x6f */
2902/* File: arm64/op_invoke_super.S */
2903/* File: arm64/invoke.S */
2904 /*
2905 * Generic invoke handler wrapper.
2906 */
2907 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2908 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2909 .extern MterpInvokeSuper
2910 EXPORT_PC
2911 mov x0, xSELF
2912 add x1, xFP, #OFF_FP_SHADOWFRAME
2913 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002914 mov x3, xINST
2915 bl MterpInvokeSuper
2916 cbz w0, MterpException
2917 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002918 bl MterpShouldSwitchInterpreters
2919 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002920 GET_INST_OPCODE ip
2921 GOTO_OPCODE ip
2922
2923
2924 /*
2925 * Handle a "super" method call.
2926 *
2927 * for: invoke-super, invoke-super/range
2928 */
2929 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2930 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2931
2932/* ------------------------------ */
2933 .balign 128
2934.L_op_invoke_direct: /* 0x70 */
2935/* File: arm64/op_invoke_direct.S */
2936/* File: arm64/invoke.S */
2937 /*
2938 * Generic invoke handler wrapper.
2939 */
2940 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2941 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2942 .extern MterpInvokeDirect
2943 EXPORT_PC
2944 mov x0, xSELF
2945 add x1, xFP, #OFF_FP_SHADOWFRAME
2946 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002947 mov x3, xINST
2948 bl MterpInvokeDirect
2949 cbz w0, MterpException
2950 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002951 bl MterpShouldSwitchInterpreters
2952 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002953 GET_INST_OPCODE ip
2954 GOTO_OPCODE ip
2955
2956
2957
2958/* ------------------------------ */
2959 .balign 128
2960.L_op_invoke_static: /* 0x71 */
2961/* File: arm64/op_invoke_static.S */
2962/* File: arm64/invoke.S */
2963 /*
2964 * Generic invoke handler wrapper.
2965 */
2966 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2967 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2968 .extern MterpInvokeStatic
2969 EXPORT_PC
2970 mov x0, xSELF
2971 add x1, xFP, #OFF_FP_SHADOWFRAME
2972 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002973 mov x3, xINST
2974 bl MterpInvokeStatic
2975 cbz w0, MterpException
2976 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002977 bl MterpShouldSwitchInterpreters
2978 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002979 GET_INST_OPCODE ip
2980 GOTO_OPCODE ip
2981
2982
2983
2984
2985/* ------------------------------ */
2986 .balign 128
2987.L_op_invoke_interface: /* 0x72 */
2988/* File: arm64/op_invoke_interface.S */
2989/* File: arm64/invoke.S */
2990 /*
2991 * Generic invoke handler wrapper.
2992 */
2993 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2994 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2995 .extern MterpInvokeInterface
2996 EXPORT_PC
2997 mov x0, xSELF
2998 add x1, xFP, #OFF_FP_SHADOWFRAME
2999 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003000 mov x3, xINST
3001 bl MterpInvokeInterface
3002 cbz w0, MterpException
3003 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003004 bl MterpShouldSwitchInterpreters
3005 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003006 GET_INST_OPCODE ip
3007 GOTO_OPCODE ip
3008
3009
3010 /*
3011 * Handle an interface method call.
3012 *
3013 * for: invoke-interface, invoke-interface/range
3014 */
3015 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3016 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3017
3018/* ------------------------------ */
3019 .balign 128
3020.L_op_return_void_no_barrier: /* 0x73 */
3021/* File: arm64/op_return_void_no_barrier.S */
3022 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
3023 mov x0, xSELF
3024 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3025 b.ne .Lop_return_void_no_barrier_check
3026.Lop_return_void_no_barrier_return:
3027 mov x0, #0
3028 b MterpReturn
3029.Lop_return_void_no_barrier_check:
3030 bl MterpSuspendCheck // (self)
3031 b .Lop_return_void_no_barrier_return
3032
3033/* ------------------------------ */
3034 .balign 128
3035.L_op_invoke_virtual_range: /* 0x74 */
3036/* File: arm64/op_invoke_virtual_range.S */
3037/* File: arm64/invoke.S */
3038 /*
3039 * Generic invoke handler wrapper.
3040 */
3041 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3042 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3043 .extern MterpInvokeVirtualRange
3044 EXPORT_PC
3045 mov x0, xSELF
3046 add x1, xFP, #OFF_FP_SHADOWFRAME
3047 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003048 mov x3, xINST
3049 bl MterpInvokeVirtualRange
3050 cbz w0, MterpException
3051 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003052 bl MterpShouldSwitchInterpreters
3053 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003054 GET_INST_OPCODE ip
3055 GOTO_OPCODE ip
3056
3057
3058
3059/* ------------------------------ */
3060 .balign 128
3061.L_op_invoke_super_range: /* 0x75 */
3062/* File: arm64/op_invoke_super_range.S */
3063/* File: arm64/invoke.S */
3064 /*
3065 * Generic invoke handler wrapper.
3066 */
3067 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3068 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3069 .extern MterpInvokeSuperRange
3070 EXPORT_PC
3071 mov x0, xSELF
3072 add x1, xFP, #OFF_FP_SHADOWFRAME
3073 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003074 mov x3, xINST
3075 bl MterpInvokeSuperRange
3076 cbz w0, MterpException
3077 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003078 bl MterpShouldSwitchInterpreters
3079 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003080 GET_INST_OPCODE ip
3081 GOTO_OPCODE ip
3082
3083
3084
3085/* ------------------------------ */
3086 .balign 128
3087.L_op_invoke_direct_range: /* 0x76 */
3088/* File: arm64/op_invoke_direct_range.S */
3089/* File: arm64/invoke.S */
3090 /*
3091 * Generic invoke handler wrapper.
3092 */
3093 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3094 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3095 .extern MterpInvokeDirectRange
3096 EXPORT_PC
3097 mov x0, xSELF
3098 add x1, xFP, #OFF_FP_SHADOWFRAME
3099 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003100 mov x3, xINST
3101 bl MterpInvokeDirectRange
3102 cbz w0, MterpException
3103 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003104 bl MterpShouldSwitchInterpreters
3105 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003106 GET_INST_OPCODE ip
3107 GOTO_OPCODE ip
3108
3109
3110
3111/* ------------------------------ */
3112 .balign 128
3113.L_op_invoke_static_range: /* 0x77 */
3114/* File: arm64/op_invoke_static_range.S */
3115/* File: arm64/invoke.S */
3116 /*
3117 * Generic invoke handler wrapper.
3118 */
3119 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3120 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3121 .extern MterpInvokeStaticRange
3122 EXPORT_PC
3123 mov x0, xSELF
3124 add x1, xFP, #OFF_FP_SHADOWFRAME
3125 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003126 mov x3, xINST
3127 bl MterpInvokeStaticRange
3128 cbz w0, MterpException
3129 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003130 bl MterpShouldSwitchInterpreters
3131 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003132 GET_INST_OPCODE ip
3133 GOTO_OPCODE ip
3134
3135
3136
3137/* ------------------------------ */
3138 .balign 128
3139.L_op_invoke_interface_range: /* 0x78 */
3140/* File: arm64/op_invoke_interface_range.S */
3141/* File: arm64/invoke.S */
3142 /*
3143 * Generic invoke handler wrapper.
3144 */
3145 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3146 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3147 .extern MterpInvokeInterfaceRange
3148 EXPORT_PC
3149 mov x0, xSELF
3150 add x1, xFP, #OFF_FP_SHADOWFRAME
3151 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003152 mov x3, xINST
3153 bl MterpInvokeInterfaceRange
3154 cbz w0, MterpException
3155 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003156 bl MterpShouldSwitchInterpreters
3157 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003158 GET_INST_OPCODE ip
3159 GOTO_OPCODE ip
3160
3161
3162
3163/* ------------------------------ */
3164 .balign 128
3165.L_op_unused_79: /* 0x79 */
3166/* File: arm64/op_unused_79.S */
3167/* File: arm64/unused.S */
3168/*
3169 * Bail to reference interpreter to throw.
3170 */
3171 b MterpFallback
3172
3173
3174/* ------------------------------ */
3175 .balign 128
3176.L_op_unused_7a: /* 0x7a */
3177/* File: arm64/op_unused_7a.S */
3178/* File: arm64/unused.S */
3179/*
3180 * Bail to reference interpreter to throw.
3181 */
3182 b MterpFallback
3183
3184
3185/* ------------------------------ */
3186 .balign 128
3187.L_op_neg_int: /* 0x7b */
3188/* File: arm64/op_neg_int.S */
3189/* File: arm64/unop.S */
3190 /*
3191 * Generic 32-bit unary operation. Provide an "instr" line that
3192 * specifies an instruction that performs "result = op w0".
3193 * This could be an ARM instruction or a function call.
3194 *
3195 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3196 * int-to-byte, int-to-char, int-to-short
3197 */
3198 /* unop vA, vB */
3199 lsr w3, wINST, #12 // w3<- B
3200 GET_VREG w0, w3 // w0<- vB
3201 ubfx w9, wINST, #8, #4 // w9<- A
3202 // optional op; may set condition codes
3203 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3204 sub w0, wzr, w0 // w0<- op, w0-w3 changed
3205 GET_INST_OPCODE ip // extract opcode from rINST
3206 SET_VREG w0, w9 // vAA<- w0
3207 GOTO_OPCODE ip // jump to next instruction
3208 /* 8-9 instructions */
3209
3210
3211/* ------------------------------ */
3212 .balign 128
3213.L_op_not_int: /* 0x7c */
3214/* File: arm64/op_not_int.S */
3215/* File: arm64/unop.S */
3216 /*
3217 * Generic 32-bit unary operation. Provide an "instr" line that
3218 * specifies an instruction that performs "result = op w0".
3219 * This could be an ARM instruction or a function call.
3220 *
3221 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3222 * int-to-byte, int-to-char, int-to-short
3223 */
3224 /* unop vA, vB */
3225 lsr w3, wINST, #12 // w3<- B
3226 GET_VREG w0, w3 // w0<- vB
3227 ubfx w9, wINST, #8, #4 // w9<- A
3228 // optional op; may set condition codes
3229 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3230 mvn w0, w0 // w0<- op, w0-w3 changed
3231 GET_INST_OPCODE ip // extract opcode from rINST
3232 SET_VREG w0, w9 // vAA<- w0
3233 GOTO_OPCODE ip // jump to next instruction
3234 /* 8-9 instructions */
3235
3236
3237/* ------------------------------ */
3238 .balign 128
3239.L_op_neg_long: /* 0x7d */
3240/* File: arm64/op_neg_long.S */
3241/* File: arm64/unopWide.S */
3242 /*
3243 * Generic 64-bit unary operation. Provide an "instr" line that
3244 * specifies an instruction that performs "result = op x0".
3245 *
3246 * For: neg-long, not-long
3247 */
3248 /* unop vA, vB */
3249 lsr w3, wINST, #12 // w3<- B
3250 ubfx w4, wINST, #8, #4 // w4<- A
3251 GET_VREG_WIDE x0, w3
3252 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3253
3254 sub x0, xzr, x0
3255 GET_INST_OPCODE ip // extract opcode from wINST
3256 SET_VREG_WIDE x0, w4
3257 GOTO_OPCODE ip // jump to next instruction
3258 /* 10-11 instructions */
3259
3260
3261/* ------------------------------ */
3262 .balign 128
3263.L_op_not_long: /* 0x7e */
3264/* File: arm64/op_not_long.S */
3265/* File: arm64/unopWide.S */
3266 /*
3267 * Generic 64-bit unary operation. Provide an "instr" line that
3268 * specifies an instruction that performs "result = op x0".
3269 *
3270 * For: neg-long, not-long
3271 */
3272 /* unop vA, vB */
3273 lsr w3, wINST, #12 // w3<- B
3274 ubfx w4, wINST, #8, #4 // w4<- A
3275 GET_VREG_WIDE x0, w3
3276 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3277
3278 mvn x0, x0
3279 GET_INST_OPCODE ip // extract opcode from wINST
3280 SET_VREG_WIDE x0, w4
3281 GOTO_OPCODE ip // jump to next instruction
3282 /* 10-11 instructions */
3283
3284
3285/* ------------------------------ */
3286 .balign 128
3287.L_op_neg_float: /* 0x7f */
3288/* File: arm64/op_neg_float.S */
3289/* File: arm64/unop.S */
3290 /*
3291 * Generic 32-bit unary operation. Provide an "instr" line that
3292 * specifies an instruction that performs "result = op w0".
3293 * This could be an ARM instruction or a function call.
3294 *
3295 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3296 * int-to-byte, int-to-char, int-to-short
3297 */
3298 /* unop vA, vB */
3299 lsr w3, wINST, #12 // w3<- B
3300 GET_VREG w0, w3 // w0<- vB
3301 ubfx w9, wINST, #8, #4 // w9<- A
3302 mov w4, #0x80000000 // optional op; may set condition codes
3303 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3304 add w0, w0, w4 // w0<- op, w0-w3 changed
3305 GET_INST_OPCODE ip // extract opcode from rINST
3306 SET_VREG w0, w9 // vAA<- w0
3307 GOTO_OPCODE ip // jump to next instruction
3308 /* 8-9 instructions */
3309
3310
3311/* ------------------------------ */
3312 .balign 128
3313.L_op_neg_double: /* 0x80 */
3314/* File: arm64/op_neg_double.S */
3315/* File: arm64/unopWide.S */
3316 /*
3317 * Generic 64-bit unary operation. Provide an "instr" line that
3318 * specifies an instruction that performs "result = op x0".
3319 *
3320 * For: neg-long, not-long
3321 */
3322 /* unop vA, vB */
3323 lsr w3, wINST, #12 // w3<- B
3324 ubfx w4, wINST, #8, #4 // w4<- A
3325 GET_VREG_WIDE x0, w3
3326 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3327 mov x1, #0x8000000000000000
3328 add x0, x0, x1
3329 GET_INST_OPCODE ip // extract opcode from wINST
3330 SET_VREG_WIDE x0, w4
3331 GOTO_OPCODE ip // jump to next instruction
3332 /* 10-11 instructions */
3333
3334
3335/* ------------------------------ */
3336 .balign 128
3337.L_op_int_to_long: /* 0x81 */
3338/* File: arm64/op_int_to_long.S */
3339/* File: arm64/funopWider.S */
3340 /*
3341 * Generic 32bit-to-64bit floating point unary operation. Provide an
3342 * "instr" line that specifies an instruction that performs "x0 = op w0".
3343 *
3344 * For: int-to-double, float-to-double, float-to-long
3345 */
3346 /* unop vA, vB */
3347 lsr w3, wINST, #12 // w3<- B
3348 lsr w4, wINST, #8 // w4<- A+
3349 GET_VREG w0, w3
3350 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3351 and w4, w4, #15 // w4<- A
3352 sbfm x0, x0, 0, 31 // d0<- op
3353 GET_INST_OPCODE ip // extract opcode from wINST
3354 SET_VREG_WIDE x0, w4 // vA<- d0
3355 GOTO_OPCODE ip // jump to next instruction
3356
3357
3358/* ------------------------------ */
3359 .balign 128
3360.L_op_int_to_float: /* 0x82 */
3361/* File: arm64/op_int_to_float.S */
3362/* File: arm64/funopNarrow.S */
3363 /*
3364 * Generic 32bit-to-32bit floating point unary operation. Provide an
3365 * "instr" line that specifies an instruction that performs "s0 = op w0".
3366 *
3367 * For: int-to-float, float-to-int
3368 * TODO: refactor all of the conversions - parameterize width and use same template.
3369 */
3370 /* unop vA, vB */
3371 lsr w3, wINST, #12 // w3<- B
3372 lsr w4, wINST, #8 // w4<- A+
3373 GET_VREG w0, w3
3374 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3375 and w4, w4, #15 // w4<- A
3376 scvtf s0, w0 // d0<- op
3377 GET_INST_OPCODE ip // extract opcode from wINST
3378 SET_VREG s0, w4 // vA<- d0
3379 GOTO_OPCODE ip // jump to next instruction
3380
3381
3382/* ------------------------------ */
3383 .balign 128
3384.L_op_int_to_double: /* 0x83 */
3385/* File: arm64/op_int_to_double.S */
3386/* File: arm64/funopWider.S */
3387 /*
3388 * Generic 32bit-to-64bit floating point unary operation. Provide an
3389 * "instr" line that specifies an instruction that performs "d0 = op w0".
3390 *
3391 * For: int-to-double, float-to-double, float-to-long
3392 */
3393 /* unop vA, vB */
3394 lsr w3, wINST, #12 // w3<- B
3395 lsr w4, wINST, #8 // w4<- A+
3396 GET_VREG w0, w3
3397 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3398 and w4, w4, #15 // w4<- A
3399 scvtf d0, w0 // d0<- op
3400 GET_INST_OPCODE ip // extract opcode from wINST
3401 SET_VREG_WIDE d0, w4 // vA<- d0
3402 GOTO_OPCODE ip // jump to next instruction
3403
3404
3405/* ------------------------------ */
3406 .balign 128
3407.L_op_long_to_int: /* 0x84 */
3408/* File: arm64/op_long_to_int.S */
3409/* File: arm64/funopNarrower.S */
3410 /*
3411 * Generic 64bit-to-32bit floating point unary operation. Provide an
3412 * "instr" line that specifies an instruction that performs "w0 = op x0".
3413 *
3414 * For: int-to-double, float-to-double, float-to-long
3415 */
3416 /* unop vA, vB */
3417 lsr w3, wINST, #12 // w3<- B
3418 lsr w4, wINST, #8 // w4<- A+
3419 GET_VREG_WIDE x0, w3
3420 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3421 and w4, w4, #15 // w4<- A
3422 // d0<- op
3423 GET_INST_OPCODE ip // extract opcode from wINST
3424 SET_VREG w0, w4 // vA<- d0
3425 GOTO_OPCODE ip // jump to next instruction
3426
3427
3428/* ------------------------------ */
3429 .balign 128
3430.L_op_long_to_float: /* 0x85 */
3431/* File: arm64/op_long_to_float.S */
3432/* File: arm64/funopNarrower.S */
3433 /*
3434 * Generic 64bit-to-32bit floating point unary operation. Provide an
3435 * "instr" line that specifies an instruction that performs "s0 = op x0".
3436 *
3437 * For: int-to-double, float-to-double, float-to-long
3438 */
3439 /* unop vA, vB */
3440 lsr w3, wINST, #12 // w3<- B
3441 lsr w4, wINST, #8 // w4<- A+
3442 GET_VREG_WIDE x0, w3
3443 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3444 and w4, w4, #15 // w4<- A
3445 scvtf s0, x0 // d0<- op
3446 GET_INST_OPCODE ip // extract opcode from wINST
3447 SET_VREG s0, w4 // vA<- d0
3448 GOTO_OPCODE ip // jump to next instruction
3449
3450
3451/* ------------------------------ */
3452 .balign 128
3453.L_op_long_to_double: /* 0x86 */
3454/* File: arm64/op_long_to_double.S */
3455/* File: arm64/funopWide.S */
3456 /*
3457 * Generic 64bit-to-64bit floating point unary operation. Provide an
3458 * "instr" line that specifies an instruction that performs "d0 = op x0".
3459 *
3460 * For: long-to-double, double-to-long
3461 */
3462 /* unop vA, vB */
3463 lsr w3, wINST, #12 // w3<- B
3464 lsr w4, wINST, #8 // w4<- A+
3465 GET_VREG_WIDE x0, w3
3466 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3467 and w4, w4, #15 // w4<- A
3468 scvtf d0, x0 // d0<- op
3469 GET_INST_OPCODE ip // extract opcode from wINST
3470 SET_VREG_WIDE d0, w4 // vA<- d0
3471 GOTO_OPCODE ip // jump to next instruction
3472
3473
3474/* ------------------------------ */
3475 .balign 128
3476.L_op_float_to_int: /* 0x87 */
3477/* File: arm64/op_float_to_int.S */
3478/* File: arm64/funopNarrow.S */
3479 /*
3480 * Generic 32bit-to-32bit floating point unary operation. Provide an
3481 * "instr" line that specifies an instruction that performs "w0 = op s0".
3482 *
3483 * For: int-to-float, float-to-int
3484 * TODO: refactor all of the conversions - parameterize width and use same template.
3485 */
3486 /* unop vA, vB */
3487 lsr w3, wINST, #12 // w3<- B
3488 lsr w4, wINST, #8 // w4<- A+
3489 GET_VREG s0, w3
3490 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3491 and w4, w4, #15 // w4<- A
3492 fcvtzs w0, s0 // d0<- op
3493 GET_INST_OPCODE ip // extract opcode from wINST
3494 SET_VREG w0, w4 // vA<- d0
3495 GOTO_OPCODE ip // jump to next instruction
3496
3497
3498/* ------------------------------ */
3499 .balign 128
3500.L_op_float_to_long: /* 0x88 */
3501/* File: arm64/op_float_to_long.S */
3502/* File: arm64/funopWider.S */
3503 /*
3504 * Generic 32bit-to-64bit floating point unary operation. Provide an
3505 * "instr" line that specifies an instruction that performs "x0 = op s0".
3506 *
3507 * For: int-to-double, float-to-double, float-to-long
3508 */
3509 /* unop vA, vB */
3510 lsr w3, wINST, #12 // w3<- B
3511 lsr w4, wINST, #8 // w4<- A+
3512 GET_VREG s0, w3
3513 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3514 and w4, w4, #15 // w4<- A
3515 fcvtzs x0, s0 // d0<- op
3516 GET_INST_OPCODE ip // extract opcode from wINST
3517 SET_VREG_WIDE x0, w4 // vA<- d0
3518 GOTO_OPCODE ip // jump to next instruction
3519
3520
3521/* ------------------------------ */
3522 .balign 128
3523.L_op_float_to_double: /* 0x89 */
3524/* File: arm64/op_float_to_double.S */
3525/* File: arm64/funopWider.S */
3526 /*
3527 * Generic 32bit-to-64bit floating point unary operation. Provide an
3528 * "instr" line that specifies an instruction that performs "d0 = op s0".
3529 *
3530 * For: int-to-double, float-to-double, float-to-long
3531 */
3532 /* unop vA, vB */
3533 lsr w3, wINST, #12 // w3<- B
3534 lsr w4, wINST, #8 // w4<- A+
3535 GET_VREG s0, w3
3536 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3537 and w4, w4, #15 // w4<- A
3538 fcvt d0, s0 // d0<- op
3539 GET_INST_OPCODE ip // extract opcode from wINST
3540 SET_VREG_WIDE d0, w4 // vA<- d0
3541 GOTO_OPCODE ip // jump to next instruction
3542
3543
3544/* ------------------------------ */
3545 .balign 128
3546.L_op_double_to_int: /* 0x8a */
3547/* File: arm64/op_double_to_int.S */
3548/* File: arm64/funopNarrower.S */
3549 /*
3550 * Generic 64bit-to-32bit floating point unary operation. Provide an
3551 * "instr" line that specifies an instruction that performs "w0 = op d0".
3552 *
3553 * For: int-to-double, float-to-double, float-to-long
3554 */
3555 /* unop vA, vB */
3556 lsr w3, wINST, #12 // w3<- B
3557 lsr w4, wINST, #8 // w4<- A+
3558 GET_VREG_WIDE d0, w3
3559 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3560 and w4, w4, #15 // w4<- A
3561 fcvtzs w0, d0 // d0<- op
3562 GET_INST_OPCODE ip // extract opcode from wINST
3563 SET_VREG w0, w4 // vA<- d0
3564 GOTO_OPCODE ip // jump to next instruction
3565
3566
3567/* ------------------------------ */
3568 .balign 128
3569.L_op_double_to_long: /* 0x8b */
3570/* File: arm64/op_double_to_long.S */
3571/* File: arm64/funopWide.S */
3572 /*
3573 * Generic 64bit-to-64bit floating point unary operation. Provide an
3574 * "instr" line that specifies an instruction that performs "x0 = op d0".
3575 *
3576 * For: long-to-double, double-to-long
3577 */
3578 /* unop vA, vB */
3579 lsr w3, wINST, #12 // w3<- B
3580 lsr w4, wINST, #8 // w4<- A+
3581 GET_VREG_WIDE d0, w3
3582 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3583 and w4, w4, #15 // w4<- A
3584 fcvtzs x0, d0 // d0<- op
3585 GET_INST_OPCODE ip // extract opcode from wINST
3586 SET_VREG_WIDE x0, w4 // vA<- d0
3587 GOTO_OPCODE ip // jump to next instruction
3588
3589
3590/* ------------------------------ */
3591 .balign 128
3592.L_op_double_to_float: /* 0x8c */
3593/* File: arm64/op_double_to_float.S */
3594/* File: arm64/funopNarrower.S */
3595 /*
3596 * Generic 64bit-to-32bit floating point unary operation. Provide an
3597 * "instr" line that specifies an instruction that performs "s0 = op d0".
3598 *
3599 * For: int-to-double, float-to-double, float-to-long
3600 */
3601 /* unop vA, vB */
3602 lsr w3, wINST, #12 // w3<- B
3603 lsr w4, wINST, #8 // w4<- A+
3604 GET_VREG_WIDE d0, w3
3605 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3606 and w4, w4, #15 // w4<- A
3607 fcvt s0, d0 // d0<- op
3608 GET_INST_OPCODE ip // extract opcode from wINST
3609 SET_VREG s0, w4 // vA<- d0
3610 GOTO_OPCODE ip // jump to next instruction
3611
3612
3613/* ------------------------------ */
3614 .balign 128
3615.L_op_int_to_byte: /* 0x8d */
3616/* File: arm64/op_int_to_byte.S */
3617/* File: arm64/unop.S */
3618 /*
3619 * Generic 32-bit unary operation. Provide an "instr" line that
3620 * specifies an instruction that performs "result = op w0".
3621 * This could be an ARM instruction or a function call.
3622 *
3623 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3624 * int-to-byte, int-to-char, int-to-short
3625 */
3626 /* unop vA, vB */
3627 lsr w3, wINST, #12 // w3<- B
3628 GET_VREG w0, w3 // w0<- vB
3629 ubfx w9, wINST, #8, #4 // w9<- A
3630 // optional op; may set condition codes
3631 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3632 sxtb w0, w0 // w0<- op, w0-w3 changed
3633 GET_INST_OPCODE ip // extract opcode from rINST
3634 SET_VREG w0, w9 // vAA<- w0
3635 GOTO_OPCODE ip // jump to next instruction
3636 /* 8-9 instructions */
3637
3638
3639/* ------------------------------ */
3640 .balign 128
3641.L_op_int_to_char: /* 0x8e */
3642/* File: arm64/op_int_to_char.S */
3643/* File: arm64/unop.S */
3644 /*
3645 * Generic 32-bit unary operation. Provide an "instr" line that
3646 * specifies an instruction that performs "result = op w0".
3647 * This could be an ARM instruction or a function call.
3648 *
3649 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3650 * int-to-byte, int-to-char, int-to-short
3651 */
3652 /* unop vA, vB */
3653 lsr w3, wINST, #12 // w3<- B
3654 GET_VREG w0, w3 // w0<- vB
3655 ubfx w9, wINST, #8, #4 // w9<- A
3656 // optional op; may set condition codes
3657 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3658 uxth w0, w0 // w0<- op, w0-w3 changed
3659 GET_INST_OPCODE ip // extract opcode from rINST
3660 SET_VREG w0, w9 // vAA<- w0
3661 GOTO_OPCODE ip // jump to next instruction
3662 /* 8-9 instructions */
3663
3664
3665/* ------------------------------ */
3666 .balign 128
3667.L_op_int_to_short: /* 0x8f */
3668/* File: arm64/op_int_to_short.S */
3669/* File: arm64/unop.S */
3670 /*
3671 * Generic 32-bit unary operation. Provide an "instr" line that
3672 * specifies an instruction that performs "result = op w0".
3673 * This could be an ARM instruction or a function call.
3674 *
3675 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3676 * int-to-byte, int-to-char, int-to-short
3677 */
3678 /* unop vA, vB */
3679 lsr w3, wINST, #12 // w3<- B
3680 GET_VREG w0, w3 // w0<- vB
3681 ubfx w9, wINST, #8, #4 // w9<- A
3682 // optional op; may set condition codes
3683 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3684 sxth w0, w0 // w0<- op, w0-w3 changed
3685 GET_INST_OPCODE ip // extract opcode from rINST
3686 SET_VREG w0, w9 // vAA<- w0
3687 GOTO_OPCODE ip // jump to next instruction
3688 /* 8-9 instructions */
3689
3690
3691/* ------------------------------ */
3692 .balign 128
3693.L_op_add_int: /* 0x90 */
3694/* File: arm64/op_add_int.S */
3695/* File: arm64/binop.S */
3696 /*
3697 * Generic 32-bit binary operation. Provide an "instr" line that
3698 * specifies an instruction that performs "result = w0 op w1".
3699 * This could be an ARM instruction or a function call. (If the result
3700 * comes back in a register other than w0, you can override "result".)
3701 *
3702 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3703 * vCC (w1). Useful for integer division and modulus. Note that we
3704 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3705 * handles it correctly.
3706 *
3707 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3708 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3709 * mul-float, div-float, rem-float
3710 */
3711 /* binop vAA, vBB, vCC */
3712 FETCH w0, 1 // w0<- CCBB
3713 lsr w9, wINST, #8 // w9<- AA
3714 lsr w3, w0, #8 // w3<- CC
3715 and w2, w0, #255 // w2<- BB
3716 GET_VREG w1, w3 // w1<- vCC
3717 GET_VREG w0, w2 // w0<- vBB
3718 .if 0
3719 cbz w1, common_errDivideByZero // is second operand zero?
3720 .endif
3721 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3722 // optional op; may set condition codes
3723 add w0, w0, w1 // w0<- op, w0-w3 changed
3724 GET_INST_OPCODE ip // extract opcode from rINST
3725 SET_VREG w0, w9 // vAA<- w0
3726 GOTO_OPCODE ip // jump to next instruction
3727 /* 11-14 instructions */
3728
3729
3730/* ------------------------------ */
3731 .balign 128
3732.L_op_sub_int: /* 0x91 */
3733/* File: arm64/op_sub_int.S */
3734/* File: arm64/binop.S */
3735 /*
3736 * Generic 32-bit binary operation. Provide an "instr" line that
3737 * specifies an instruction that performs "result = w0 op w1".
3738 * This could be an ARM instruction or a function call. (If the result
3739 * comes back in a register other than w0, you can override "result".)
3740 *
3741 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3742 * vCC (w1). Useful for integer division and modulus. Note that we
3743 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3744 * handles it correctly.
3745 *
3746 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3747 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3748 * mul-float, div-float, rem-float
3749 */
3750 /* binop vAA, vBB, vCC */
3751 FETCH w0, 1 // w0<- CCBB
3752 lsr w9, wINST, #8 // w9<- AA
3753 lsr w3, w0, #8 // w3<- CC
3754 and w2, w0, #255 // w2<- BB
3755 GET_VREG w1, w3 // w1<- vCC
3756 GET_VREG w0, w2 // w0<- vBB
3757 .if 0
3758 cbz w1, common_errDivideByZero // is second operand zero?
3759 .endif
3760 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3761 // optional op; may set condition codes
3762 sub w0, w0, w1 // w0<- op, w0-w3 changed
3763 GET_INST_OPCODE ip // extract opcode from rINST
3764 SET_VREG w0, w9 // vAA<- w0
3765 GOTO_OPCODE ip // jump to next instruction
3766 /* 11-14 instructions */
3767
3768
3769/* ------------------------------ */
3770 .balign 128
3771.L_op_mul_int: /* 0x92 */
3772/* File: arm64/op_mul_int.S */
3773/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
3774/* File: arm64/binop.S */
3775 /*
3776 * Generic 32-bit binary operation. Provide an "instr" line that
3777 * specifies an instruction that performs "result = w0 op w1".
3778 * This could be an ARM instruction or a function call. (If the result
3779 * comes back in a register other than w0, you can override "result".)
3780 *
3781 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3782 * vCC (w1). Useful for integer division and modulus. Note that we
3783 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3784 * handles it correctly.
3785 *
3786 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3787 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3788 * mul-float, div-float, rem-float
3789 */
3790 /* binop vAA, vBB, vCC */
3791 FETCH w0, 1 // w0<- CCBB
3792 lsr w9, wINST, #8 // w9<- AA
3793 lsr w3, w0, #8 // w3<- CC
3794 and w2, w0, #255 // w2<- BB
3795 GET_VREG w1, w3 // w1<- vCC
3796 GET_VREG w0, w2 // w0<- vBB
3797 .if 0
3798 cbz w1, common_errDivideByZero // is second operand zero?
3799 .endif
3800 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3801 // optional op; may set condition codes
3802 mul w0, w1, w0 // w0<- op, w0-w3 changed
3803 GET_INST_OPCODE ip // extract opcode from rINST
3804 SET_VREG w0, w9 // vAA<- w0
3805 GOTO_OPCODE ip // jump to next instruction
3806 /* 11-14 instructions */
3807
3808
3809/* ------------------------------ */
3810 .balign 128
3811.L_op_div_int: /* 0x93 */
3812/* File: arm64/op_div_int.S */
3813/* File: arm64/binop.S */
3814 /*
3815 * Generic 32-bit binary operation. Provide an "instr" line that
3816 * specifies an instruction that performs "result = w0 op w1".
3817 * This could be an ARM instruction or a function call. (If the result
3818 * comes back in a register other than w0, you can override "result".)
3819 *
3820 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3821 * vCC (w1). Useful for integer division and modulus. Note that we
3822 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3823 * handles it correctly.
3824 *
3825 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3826 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3827 * mul-float, div-float, rem-float
3828 */
3829 /* binop vAA, vBB, vCC */
3830 FETCH w0, 1 // w0<- CCBB
3831 lsr w9, wINST, #8 // w9<- AA
3832 lsr w3, w0, #8 // w3<- CC
3833 and w2, w0, #255 // w2<- BB
3834 GET_VREG w1, w3 // w1<- vCC
3835 GET_VREG w0, w2 // w0<- vBB
3836 .if 1
3837 cbz w1, common_errDivideByZero // is second operand zero?
3838 .endif
3839 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3840 // optional op; may set condition codes
3841 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
3842 GET_INST_OPCODE ip // extract opcode from rINST
3843 SET_VREG w0, w9 // vAA<- w0
3844 GOTO_OPCODE ip // jump to next instruction
3845 /* 11-14 instructions */
3846
3847
3848/* ------------------------------ */
3849 .balign 128
3850.L_op_rem_int: /* 0x94 */
3851/* File: arm64/op_rem_int.S */
3852/* File: arm64/binop.S */
3853 /*
3854 * Generic 32-bit binary operation. Provide an "instr" line that
3855 * specifies an instruction that performs "result = w0 op w1".
3856 * This could be an ARM instruction or a function call. (If the result
3857 * comes back in a register other than w0, you can override "result".)
3858 *
3859 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3860 * vCC (w1). Useful for integer division and modulus. Note that we
3861 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3862 * handles it correctly.
3863 *
3864 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3865 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3866 * mul-float, div-float, rem-float
3867 */
3868 /* binop vAA, vBB, vCC */
3869 FETCH w0, 1 // w0<- CCBB
3870 lsr w9, wINST, #8 // w9<- AA
3871 lsr w3, w0, #8 // w3<- CC
3872 and w2, w0, #255 // w2<- BB
3873 GET_VREG w1, w3 // w1<- vCC
3874 GET_VREG w0, w2 // w0<- vBB
3875 .if 1
3876 cbz w1, common_errDivideByZero // is second operand zero?
3877 .endif
3878 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3879 sdiv w2, w0, w1 // optional op; may set condition codes
3880 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
3881 GET_INST_OPCODE ip // extract opcode from rINST
3882 SET_VREG w0, w9 // vAA<- w0
3883 GOTO_OPCODE ip // jump to next instruction
3884 /* 11-14 instructions */
3885
3886
3887/* ------------------------------ */
3888 .balign 128
3889.L_op_and_int: /* 0x95 */
3890/* File: arm64/op_and_int.S */
3891/* File: arm64/binop.S */
3892 /*
3893 * Generic 32-bit binary operation. Provide an "instr" line that
3894 * specifies an instruction that performs "result = w0 op w1".
3895 * This could be an ARM instruction or a function call. (If the result
3896 * comes back in a register other than w0, you can override "result".)
3897 *
3898 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3899 * vCC (w1). Useful for integer division and modulus. Note that we
3900 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3901 * handles it correctly.
3902 *
3903 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3904 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3905 * mul-float, div-float, rem-float
3906 */
3907 /* binop vAA, vBB, vCC */
3908 FETCH w0, 1 // w0<- CCBB
3909 lsr w9, wINST, #8 // w9<- AA
3910 lsr w3, w0, #8 // w3<- CC
3911 and w2, w0, #255 // w2<- BB
3912 GET_VREG w1, w3 // w1<- vCC
3913 GET_VREG w0, w2 // w0<- vBB
3914 .if 0
3915 cbz w1, common_errDivideByZero // is second operand zero?
3916 .endif
3917 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3918 // optional op; may set condition codes
3919 and w0, w0, w1 // w0<- op, w0-w3 changed
3920 GET_INST_OPCODE ip // extract opcode from rINST
3921 SET_VREG w0, w9 // vAA<- w0
3922 GOTO_OPCODE ip // jump to next instruction
3923 /* 11-14 instructions */
3924
3925
3926/* ------------------------------ */
3927 .balign 128
3928.L_op_or_int: /* 0x96 */
3929/* File: arm64/op_or_int.S */
3930/* File: arm64/binop.S */
3931 /*
3932 * Generic 32-bit binary operation. Provide an "instr" line that
3933 * specifies an instruction that performs "result = w0 op w1".
3934 * This could be an ARM instruction or a function call. (If the result
3935 * comes back in a register other than w0, you can override "result".)
3936 *
3937 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3938 * vCC (w1). Useful for integer division and modulus. Note that we
3939 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3940 * handles it correctly.
3941 *
3942 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3943 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3944 * mul-float, div-float, rem-float
3945 */
3946 /* binop vAA, vBB, vCC */
3947 FETCH w0, 1 // w0<- CCBB
3948 lsr w9, wINST, #8 // w9<- AA
3949 lsr w3, w0, #8 // w3<- CC
3950 and w2, w0, #255 // w2<- BB
3951 GET_VREG w1, w3 // w1<- vCC
3952 GET_VREG w0, w2 // w0<- vBB
3953 .if 0
3954 cbz w1, common_errDivideByZero // is second operand zero?
3955 .endif
3956 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3957 // optional op; may set condition codes
3958 orr w0, w0, w1 // w0<- op, w0-w3 changed
3959 GET_INST_OPCODE ip // extract opcode from rINST
3960 SET_VREG w0, w9 // vAA<- w0
3961 GOTO_OPCODE ip // jump to next instruction
3962 /* 11-14 instructions */
3963
3964
3965/* ------------------------------ */
3966 .balign 128
3967.L_op_xor_int: /* 0x97 */
3968/* File: arm64/op_xor_int.S */
3969/* File: arm64/binop.S */
3970 /*
3971 * Generic 32-bit binary operation. Provide an "instr" line that
3972 * specifies an instruction that performs "result = w0 op w1".
3973 * This could be an ARM instruction or a function call. (If the result
3974 * comes back in a register other than w0, you can override "result".)
3975 *
3976 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3977 * vCC (w1). Useful for integer division and modulus. Note that we
3978 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3979 * handles it correctly.
3980 *
3981 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3982 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3983 * mul-float, div-float, rem-float
3984 */
3985 /* binop vAA, vBB, vCC */
3986 FETCH w0, 1 // w0<- CCBB
3987 lsr w9, wINST, #8 // w9<- AA
3988 lsr w3, w0, #8 // w3<- CC
3989 and w2, w0, #255 // w2<- BB
3990 GET_VREG w1, w3 // w1<- vCC
3991 GET_VREG w0, w2 // w0<- vBB
3992 .if 0
3993 cbz w1, common_errDivideByZero // is second operand zero?
3994 .endif
3995 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3996 // optional op; may set condition codes
3997 eor w0, w0, w1 // w0<- op, w0-w3 changed
3998 GET_INST_OPCODE ip // extract opcode from rINST
3999 SET_VREG w0, w9 // vAA<- w0
4000 GOTO_OPCODE ip // jump to next instruction
4001 /* 11-14 instructions */
4002
4003
4004/* ------------------------------ */
4005 .balign 128
4006.L_op_shl_int: /* 0x98 */
4007/* File: arm64/op_shl_int.S */
4008/* File: arm64/binop.S */
4009 /*
4010 * Generic 32-bit binary operation. Provide an "instr" line that
4011 * specifies an instruction that performs "result = w0 op w1".
4012 * This could be an ARM instruction or a function call. (If the result
4013 * comes back in a register other than w0, you can override "result".)
4014 *
4015 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4016 * vCC (w1). Useful for integer division and modulus. Note that we
4017 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4018 * handles it correctly.
4019 *
4020 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4021 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4022 * mul-float, div-float, rem-float
4023 */
4024 /* binop vAA, vBB, vCC */
4025 FETCH w0, 1 // w0<- CCBB
4026 lsr w9, wINST, #8 // w9<- AA
4027 lsr w3, w0, #8 // w3<- CC
4028 and w2, w0, #255 // w2<- BB
4029 GET_VREG w1, w3 // w1<- vCC
4030 GET_VREG w0, w2 // w0<- vBB
4031 .if 0
4032 cbz w1, common_errDivideByZero // is second operand zero?
4033 .endif
4034 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4035 and w1, w1, #31 // optional op; may set condition codes
4036 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4037 GET_INST_OPCODE ip // extract opcode from rINST
4038 SET_VREG w0, w9 // vAA<- w0
4039 GOTO_OPCODE ip // jump to next instruction
4040 /* 11-14 instructions */
4041
4042
4043/* ------------------------------ */
4044 .balign 128
4045.L_op_shr_int: /* 0x99 */
4046/* File: arm64/op_shr_int.S */
4047/* File: arm64/binop.S */
4048 /*
4049 * Generic 32-bit binary operation. Provide an "instr" line that
4050 * specifies an instruction that performs "result = w0 op w1".
4051 * This could be an ARM instruction or a function call. (If the result
4052 * comes back in a register other than w0, you can override "result".)
4053 *
4054 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4055 * vCC (w1). Useful for integer division and modulus. Note that we
4056 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4057 * handles it correctly.
4058 *
4059 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4060 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4061 * mul-float, div-float, rem-float
4062 */
4063 /* binop vAA, vBB, vCC */
4064 FETCH w0, 1 // w0<- CCBB
4065 lsr w9, wINST, #8 // w9<- AA
4066 lsr w3, w0, #8 // w3<- CC
4067 and w2, w0, #255 // w2<- BB
4068 GET_VREG w1, w3 // w1<- vCC
4069 GET_VREG w0, w2 // w0<- vBB
4070 .if 0
4071 cbz w1, common_errDivideByZero // is second operand zero?
4072 .endif
4073 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4074 and w1, w1, #31 // optional op; may set condition codes
4075 asr w0, w0, w1 // w0<- op, w0-w3 changed
4076 GET_INST_OPCODE ip // extract opcode from rINST
4077 SET_VREG w0, w9 // vAA<- w0
4078 GOTO_OPCODE ip // jump to next instruction
4079 /* 11-14 instructions */
4080
4081
4082/* ------------------------------ */
4083 .balign 128
4084.L_op_ushr_int: /* 0x9a */
4085/* File: arm64/op_ushr_int.S */
4086/* File: arm64/binop.S */
4087 /*
4088 * Generic 32-bit binary operation. Provide an "instr" line that
4089 * specifies an instruction that performs "result = w0 op w1".
4090 * This could be an ARM instruction or a function call. (If the result
4091 * comes back in a register other than w0, you can override "result".)
4092 *
4093 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4094 * vCC (w1). Useful for integer division and modulus. Note that we
4095 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4096 * handles it correctly.
4097 *
4098 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4099 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4100 * mul-float, div-float, rem-float
4101 */
4102 /* binop vAA, vBB, vCC */
4103 FETCH w0, 1 // w0<- CCBB
4104 lsr w9, wINST, #8 // w9<- AA
4105 lsr w3, w0, #8 // w3<- CC
4106 and w2, w0, #255 // w2<- BB
4107 GET_VREG w1, w3 // w1<- vCC
4108 GET_VREG w0, w2 // w0<- vBB
4109 .if 0
4110 cbz w1, common_errDivideByZero // is second operand zero?
4111 .endif
4112 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4113 and w1, w1, #31 // optional op; may set condition codes
4114 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4115 GET_INST_OPCODE ip // extract opcode from rINST
4116 SET_VREG w0, w9 // vAA<- w0
4117 GOTO_OPCODE ip // jump to next instruction
4118 /* 11-14 instructions */
4119
4120
4121/* ------------------------------ */
4122 .balign 128
4123.L_op_add_long: /* 0x9b */
4124/* File: arm64/op_add_long.S */
4125/* File: arm64/binopWide.S */
4126 /*
4127 * Generic 64-bit binary operation. Provide an "instr" line that
4128 * specifies an instruction that performs "result = x1 op x2".
4129 * This could be an ARM instruction or a function call. (If the result
4130 * comes back in a register other than x0, you can override "result".)
4131 *
4132 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4133 * vCC (w1). Useful for integer division and modulus.
4134 *
4135 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4136 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4137 */
4138 /* binop vAA, vBB, vCC */
4139 FETCH w0, 1 // w0<- CCBB
4140 lsr w4, wINST, #8 // w4<- AA
4141 lsr w2, w0, #8 // w2<- CC
4142 and w1, w0, #255 // w1<- BB
4143 GET_VREG_WIDE x2, w2 // w2<- vCC
4144 GET_VREG_WIDE x1, w1 // w1<- vBB
4145 .if 0
4146 cbz x2, common_errDivideByZero // is second operand zero?
4147 .endif
4148 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4149
4150 add x0, x1, x2 // x0<- op, w0-w4 changed
4151 GET_INST_OPCODE ip // extract opcode from rINST
4152 SET_VREG_WIDE x0, w4 // vAA<- x0
4153 GOTO_OPCODE ip // jump to next instruction
4154 /* 11-14 instructions */
4155
4156
4157/* ------------------------------ */
4158 .balign 128
4159.L_op_sub_long: /* 0x9c */
4160/* File: arm64/op_sub_long.S */
4161/* File: arm64/binopWide.S */
4162 /*
4163 * Generic 64-bit binary operation. Provide an "instr" line that
4164 * specifies an instruction that performs "result = x1 op x2".
4165 * This could be an ARM instruction or a function call. (If the result
4166 * comes back in a register other than x0, you can override "result".)
4167 *
4168 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4169 * vCC (w1). Useful for integer division and modulus.
4170 *
4171 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4172 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4173 */
4174 /* binop vAA, vBB, vCC */
4175 FETCH w0, 1 // w0<- CCBB
4176 lsr w4, wINST, #8 // w4<- AA
4177 lsr w2, w0, #8 // w2<- CC
4178 and w1, w0, #255 // w1<- BB
4179 GET_VREG_WIDE x2, w2 // w2<- vCC
4180 GET_VREG_WIDE x1, w1 // w1<- vBB
4181 .if 0
4182 cbz x2, common_errDivideByZero // is second operand zero?
4183 .endif
4184 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4185
4186 sub x0, x1, x2 // x0<- op, w0-w4 changed
4187 GET_INST_OPCODE ip // extract opcode from rINST
4188 SET_VREG_WIDE x0, w4 // vAA<- x0
4189 GOTO_OPCODE ip // jump to next instruction
4190 /* 11-14 instructions */
4191
4192
4193/* ------------------------------ */
4194 .balign 128
4195.L_op_mul_long: /* 0x9d */
4196/* File: arm64/op_mul_long.S */
4197/* File: arm64/binopWide.S */
4198 /*
4199 * Generic 64-bit binary operation. Provide an "instr" line that
4200 * specifies an instruction that performs "result = x1 op x2".
4201 * This could be an ARM instruction or a function call. (If the result
4202 * comes back in a register other than x0, you can override "result".)
4203 *
4204 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4205 * vCC (w1). Useful for integer division and modulus.
4206 *
4207 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4208 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4209 */
4210 /* binop vAA, vBB, vCC */
4211 FETCH w0, 1 // w0<- CCBB
4212 lsr w4, wINST, #8 // w4<- AA
4213 lsr w2, w0, #8 // w2<- CC
4214 and w1, w0, #255 // w1<- BB
4215 GET_VREG_WIDE x2, w2 // w2<- vCC
4216 GET_VREG_WIDE x1, w1 // w1<- vBB
4217 .if 0
4218 cbz x2, common_errDivideByZero // is second operand zero?
4219 .endif
4220 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4221
4222 mul x0, x1, x2 // x0<- op, w0-w4 changed
4223 GET_INST_OPCODE ip // extract opcode from rINST
4224 SET_VREG_WIDE x0, w4 // vAA<- x0
4225 GOTO_OPCODE ip // jump to next instruction
4226 /* 11-14 instructions */
4227
4228
4229/* ------------------------------ */
4230 .balign 128
4231.L_op_div_long: /* 0x9e */
4232/* File: arm64/op_div_long.S */
4233/* File: arm64/binopWide.S */
4234 /*
4235 * Generic 64-bit binary operation. Provide an "instr" line that
4236 * specifies an instruction that performs "result = x1 op x2".
4237 * This could be an ARM instruction or a function call. (If the result
4238 * comes back in a register other than x0, you can override "result".)
4239 *
4240 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4241 * vCC (w1). Useful for integer division and modulus.
4242 *
4243 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4244 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4245 */
4246 /* binop vAA, vBB, vCC */
4247 FETCH w0, 1 // w0<- CCBB
4248 lsr w4, wINST, #8 // w4<- AA
4249 lsr w2, w0, #8 // w2<- CC
4250 and w1, w0, #255 // w1<- BB
4251 GET_VREG_WIDE x2, w2 // w2<- vCC
4252 GET_VREG_WIDE x1, w1 // w1<- vBB
4253 .if 1
4254 cbz x2, common_errDivideByZero // is second operand zero?
4255 .endif
4256 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4257
4258 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4259 GET_INST_OPCODE ip // extract opcode from rINST
4260 SET_VREG_WIDE x0, w4 // vAA<- x0
4261 GOTO_OPCODE ip // jump to next instruction
4262 /* 11-14 instructions */
4263
4264
4265/* ------------------------------ */
4266 .balign 128
4267.L_op_rem_long: /* 0x9f */
4268/* File: arm64/op_rem_long.S */
4269/* File: arm64/binopWide.S */
4270 /*
4271 * Generic 64-bit binary operation. Provide an "instr" line that
4272 * specifies an instruction that performs "result = x1 op x2".
4273 * This could be an ARM instruction or a function call. (If the result
4274 * comes back in a register other than x0, you can override "result".)
4275 *
4276 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4277 * vCC (w1). Useful for integer division and modulus.
4278 *
4279 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4280 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4281 */
4282 /* binop vAA, vBB, vCC */
4283 FETCH w0, 1 // w0<- CCBB
4284 lsr w4, wINST, #8 // w4<- AA
4285 lsr w2, w0, #8 // w2<- CC
4286 and w1, w0, #255 // w1<- BB
4287 GET_VREG_WIDE x2, w2 // w2<- vCC
4288 GET_VREG_WIDE x1, w1 // w1<- vBB
4289 .if 1
4290 cbz x2, common_errDivideByZero // is second operand zero?
4291 .endif
4292 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4293 sdiv x3, x1, x2
4294 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4295 GET_INST_OPCODE ip // extract opcode from rINST
4296 SET_VREG_WIDE x0, w4 // vAA<- x0
4297 GOTO_OPCODE ip // jump to next instruction
4298 /* 11-14 instructions */
4299
4300
4301/* ------------------------------ */
4302 .balign 128
4303.L_op_and_long: /* 0xa0 */
4304/* File: arm64/op_and_long.S */
4305/* File: arm64/binopWide.S */
4306 /*
4307 * Generic 64-bit binary operation. Provide an "instr" line that
4308 * specifies an instruction that performs "result = x1 op x2".
4309 * This could be an ARM instruction or a function call. (If the result
4310 * comes back in a register other than x0, you can override "result".)
4311 *
4312 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4313 * vCC (w1). Useful for integer division and modulus.
4314 *
4315 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4316 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4317 */
4318 /* binop vAA, vBB, vCC */
4319 FETCH w0, 1 // w0<- CCBB
4320 lsr w4, wINST, #8 // w4<- AA
4321 lsr w2, w0, #8 // w2<- CC
4322 and w1, w0, #255 // w1<- BB
4323 GET_VREG_WIDE x2, w2 // w2<- vCC
4324 GET_VREG_WIDE x1, w1 // w1<- vBB
4325 .if 0
4326 cbz x2, common_errDivideByZero // is second operand zero?
4327 .endif
4328 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4329
4330 and x0, x1, x2 // x0<- op, w0-w4 changed
4331 GET_INST_OPCODE ip // extract opcode from rINST
4332 SET_VREG_WIDE x0, w4 // vAA<- x0
4333 GOTO_OPCODE ip // jump to next instruction
4334 /* 11-14 instructions */
4335
4336
4337/* ------------------------------ */
4338 .balign 128
4339.L_op_or_long: /* 0xa1 */
4340/* File: arm64/op_or_long.S */
4341/* File: arm64/binopWide.S */
4342 /*
4343 * Generic 64-bit binary operation. Provide an "instr" line that
4344 * specifies an instruction that performs "result = x1 op x2".
4345 * This could be an ARM instruction or a function call. (If the result
4346 * comes back in a register other than x0, you can override "result".)
4347 *
4348 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4349 * vCC (w1). Useful for integer division and modulus.
4350 *
4351 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4352 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4353 */
4354 /* binop vAA, vBB, vCC */
4355 FETCH w0, 1 // w0<- CCBB
4356 lsr w4, wINST, #8 // w4<- AA
4357 lsr w2, w0, #8 // w2<- CC
4358 and w1, w0, #255 // w1<- BB
4359 GET_VREG_WIDE x2, w2 // w2<- vCC
4360 GET_VREG_WIDE x1, w1 // w1<- vBB
4361 .if 0
4362 cbz x2, common_errDivideByZero // is second operand zero?
4363 .endif
4364 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4365
4366 orr x0, x1, x2 // x0<- op, w0-w4 changed
4367 GET_INST_OPCODE ip // extract opcode from rINST
4368 SET_VREG_WIDE x0, w4 // vAA<- x0
4369 GOTO_OPCODE ip // jump to next instruction
4370 /* 11-14 instructions */
4371
4372
4373/* ------------------------------ */
4374 .balign 128
4375.L_op_xor_long: /* 0xa2 */
4376/* File: arm64/op_xor_long.S */
4377/* File: arm64/binopWide.S */
4378 /*
4379 * Generic 64-bit binary operation. Provide an "instr" line that
4380 * specifies an instruction that performs "result = x1 op x2".
4381 * This could be an ARM instruction or a function call. (If the result
4382 * comes back in a register other than x0, you can override "result".)
4383 *
4384 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4385 * vCC (w1). Useful for integer division and modulus.
4386 *
4387 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4388 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4389 */
4390 /* binop vAA, vBB, vCC */
4391 FETCH w0, 1 // w0<- CCBB
4392 lsr w4, wINST, #8 // w4<- AA
4393 lsr w2, w0, #8 // w2<- CC
4394 and w1, w0, #255 // w1<- BB
4395 GET_VREG_WIDE x2, w2 // w2<- vCC
4396 GET_VREG_WIDE x1, w1 // w1<- vBB
4397 .if 0
4398 cbz x2, common_errDivideByZero // is second operand zero?
4399 .endif
4400 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4401
4402 eor x0, x1, x2 // x0<- op, w0-w4 changed
4403 GET_INST_OPCODE ip // extract opcode from rINST
4404 SET_VREG_WIDE x0, w4 // vAA<- x0
4405 GOTO_OPCODE ip // jump to next instruction
4406 /* 11-14 instructions */
4407
4408
4409/* ------------------------------ */
4410 .balign 128
4411.L_op_shl_long: /* 0xa3 */
4412/* File: arm64/op_shl_long.S */
4413/* File: arm64/shiftWide.S */
4414 /*
4415 * 64-bit shift operation.
4416 *
4417 * For: shl-long, shr-long, ushr-long
4418 */
4419 /* binop vAA, vBB, vCC */
4420 FETCH w0, 1 // w0<- CCBB
4421 lsr w3, wINST, #8 // w3<- AA
4422 lsr w2, w0, #8 // w2<- CC
4423 GET_VREG w2, w2 // w2<- vCC (shift count)
4424 and w1, w0, #255 // w1<- BB
4425 GET_VREG_WIDE x1, w1 // x1<- vBB
4426 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4427 and x2, x2, #63 // Mask low 6
4428 lsl x0, x1, x2 // Do the shift.
4429 GET_INST_OPCODE ip // extract opcode from rINST
4430 SET_VREG_WIDE x0, w3 // vAA<- x0
4431 GOTO_OPCODE ip // jump to next instruction
4432 /* 11-14 instructions */
4433
4434
4435/* ------------------------------ */
4436 .balign 128
4437.L_op_shr_long: /* 0xa4 */
4438/* File: arm64/op_shr_long.S */
4439/* File: arm64/shiftWide.S */
4440 /*
4441 * 64-bit shift operation.
4442 *
4443 * For: shl-long, shr-long, ushr-long
4444 */
4445 /* binop vAA, vBB, vCC */
4446 FETCH w0, 1 // w0<- CCBB
4447 lsr w3, wINST, #8 // w3<- AA
4448 lsr w2, w0, #8 // w2<- CC
4449 GET_VREG w2, w2 // w2<- vCC (shift count)
4450 and w1, w0, #255 // w1<- BB
4451 GET_VREG_WIDE x1, w1 // x1<- vBB
4452 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4453 and x2, x2, #63 // Mask low 6
4454 asr x0, x1, x2 // Do the shift.
4455 GET_INST_OPCODE ip // extract opcode from rINST
4456 SET_VREG_WIDE x0, w3 // vAA<- x0
4457 GOTO_OPCODE ip // jump to next instruction
4458 /* 11-14 instructions */
4459
4460
4461/* ------------------------------ */
4462 .balign 128
4463.L_op_ushr_long: /* 0xa5 */
4464/* File: arm64/op_ushr_long.S */
4465/* File: arm64/shiftWide.S */
4466 /*
4467 * 64-bit shift operation.
4468 *
4469 * For: shl-long, shr-long, ushr-long
4470 */
4471 /* binop vAA, vBB, vCC */
4472 FETCH w0, 1 // w0<- CCBB
4473 lsr w3, wINST, #8 // w3<- AA
4474 lsr w2, w0, #8 // w2<- CC
4475 GET_VREG w2, w2 // w2<- vCC (shift count)
4476 and w1, w0, #255 // w1<- BB
4477 GET_VREG_WIDE x1, w1 // x1<- vBB
4478 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4479 and x2, x2, #63 // Mask low 6
4480 lsr x0, x1, x2 // Do the shift.
4481 GET_INST_OPCODE ip // extract opcode from rINST
4482 SET_VREG_WIDE x0, w3 // vAA<- x0
4483 GOTO_OPCODE ip // jump to next instruction
4484 /* 11-14 instructions */
4485
4486
4487/* ------------------------------ */
4488 .balign 128
4489.L_op_add_float: /* 0xa6 */
4490/* File: arm64/op_add_float.S */
4491/* File: arm64/fbinop.S */
4492 /*:
4493 * Generic 32-bit floating-point operation.
4494 *
4495 * For: add-float, sub-float, mul-float, div-float
4496 * form: <op> s0, s0, s1
4497 */
4498 /* floatop vAA, vBB, vCC */
4499 FETCH w0, 1 // r0<- CCBB
4500 lsr w1, w0, #8 // r2<- CC
4501 and w0, w0, #255 // r1<- BB
4502 GET_VREG s1, w1
4503 GET_VREG s0, w0
4504 fadd s0, s0, s1 // s0<- op
4505 lsr w1, wINST, #8 // r1<- AA
4506 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4507 GET_INST_OPCODE ip // extract opcode from rINST
4508 SET_VREG s0, w1
4509 GOTO_OPCODE ip // jump to next instruction
4510
4511
4512/* ------------------------------ */
4513 .balign 128
4514.L_op_sub_float: /* 0xa7 */
4515/* File: arm64/op_sub_float.S */
4516/* File: arm64/fbinop.S */
4517 /*:
4518 * Generic 32-bit floating-point operation.
4519 *
4520 * For: add-float, sub-float, mul-float, div-float
4521 * form: <op> s0, s0, s1
4522 */
4523 /* floatop vAA, vBB, vCC */
4524 FETCH w0, 1 // r0<- CCBB
4525 lsr w1, w0, #8 // r2<- CC
4526 and w0, w0, #255 // r1<- BB
4527 GET_VREG s1, w1
4528 GET_VREG s0, w0
4529 fsub s0, s0, s1 // s0<- op
4530 lsr w1, wINST, #8 // r1<- AA
4531 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4532 GET_INST_OPCODE ip // extract opcode from rINST
4533 SET_VREG s0, w1
4534 GOTO_OPCODE ip // jump to next instruction
4535
4536
4537/* ------------------------------ */
4538 .balign 128
4539.L_op_mul_float: /* 0xa8 */
4540/* File: arm64/op_mul_float.S */
4541/* File: arm64/fbinop.S */
4542 /*:
4543 * Generic 32-bit floating-point operation.
4544 *
4545 * For: add-float, sub-float, mul-float, div-float
4546 * form: <op> s0, s0, s1
4547 */
4548 /* floatop vAA, vBB, vCC */
4549 FETCH w0, 1 // r0<- CCBB
4550 lsr w1, w0, #8 // r2<- CC
4551 and w0, w0, #255 // r1<- BB
4552 GET_VREG s1, w1
4553 GET_VREG s0, w0
4554 fmul s0, s0, s1 // s0<- op
4555 lsr w1, wINST, #8 // r1<- AA
4556 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4557 GET_INST_OPCODE ip // extract opcode from rINST
4558 SET_VREG s0, w1
4559 GOTO_OPCODE ip // jump to next instruction
4560
4561
4562/* ------------------------------ */
4563 .balign 128
4564.L_op_div_float: /* 0xa9 */
4565/* File: arm64/op_div_float.S */
4566/* File: arm64/fbinop.S */
4567 /*:
4568 * Generic 32-bit floating-point operation.
4569 *
4570 * For: add-float, sub-float, mul-float, div-float
4571 * form: <op> s0, s0, s1
4572 */
4573 /* floatop vAA, vBB, vCC */
4574 FETCH w0, 1 // r0<- CCBB
4575 lsr w1, w0, #8 // r2<- CC
4576 and w0, w0, #255 // r1<- BB
4577 GET_VREG s1, w1
4578 GET_VREG s0, w0
4579 fdiv s0, s0, s1 // s0<- op
4580 lsr w1, wINST, #8 // r1<- AA
4581 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4582 GET_INST_OPCODE ip // extract opcode from rINST
4583 SET_VREG s0, w1
4584 GOTO_OPCODE ip // jump to next instruction
4585
4586
4587/* ------------------------------ */
4588 .balign 128
4589.L_op_rem_float: /* 0xaa */
4590/* File: arm64/op_rem_float.S */
4591/* EABI doesn't define a float remainder function, but libm does */
4592/* File: arm64/fbinop.S */
4593 /*:
4594 * Generic 32-bit floating-point operation.
4595 *
4596 * For: add-float, sub-float, mul-float, div-float
4597 * form: <op> s0, s0, s1
4598 */
4599 /* floatop vAA, vBB, vCC */
4600 FETCH w0, 1 // r0<- CCBB
4601 lsr w1, w0, #8 // r2<- CC
4602 and w0, w0, #255 // r1<- BB
4603 GET_VREG s1, w1
4604 GET_VREG s0, w0
4605 bl fmodf // s0<- op
4606 lsr w1, wINST, #8 // r1<- AA
4607 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4608 GET_INST_OPCODE ip // extract opcode from rINST
4609 SET_VREG s0, w1
4610 GOTO_OPCODE ip // jump to next instruction
4611
4612
4613/* ------------------------------ */
4614 .balign 128
4615.L_op_add_double: /* 0xab */
4616/* File: arm64/op_add_double.S */
4617/* File: arm64/binopWide.S */
4618 /*
4619 * Generic 64-bit binary operation. Provide an "instr" line that
4620 * specifies an instruction that performs "result = x1 op x2".
4621 * This could be an ARM instruction or a function call. (If the result
4622 * comes back in a register other than x0, you can override "result".)
4623 *
4624 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4625 * vCC (w1). Useful for integer division and modulus.
4626 *
4627 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4628 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4629 */
4630 /* binop vAA, vBB, vCC */
4631 FETCH w0, 1 // w0<- CCBB
4632 lsr w4, wINST, #8 // w4<- AA
4633 lsr w2, w0, #8 // w2<- CC
4634 and w1, w0, #255 // w1<- BB
4635 GET_VREG_WIDE d2, w2 // w2<- vCC
4636 GET_VREG_WIDE d1, w1 // w1<- vBB
4637 .if 0
4638 cbz d2, common_errDivideByZero // is second operand zero?
4639 .endif
4640 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4641
4642 fadd d0, d1, d2 // d0<- op, w0-w4 changed
4643 GET_INST_OPCODE ip // extract opcode from rINST
4644 SET_VREG_WIDE d0, w4 // vAA<- d0
4645 GOTO_OPCODE ip // jump to next instruction
4646 /* 11-14 instructions */
4647
4648
4649/* ------------------------------ */
4650 .balign 128
4651.L_op_sub_double: /* 0xac */
4652/* File: arm64/op_sub_double.S */
4653/* File: arm64/binopWide.S */
4654 /*
4655 * Generic 64-bit binary operation. Provide an "instr" line that
4656 * specifies an instruction that performs "result = x1 op x2".
4657 * This could be an ARM instruction or a function call. (If the result
4658 * comes back in a register other than x0, you can override "result".)
4659 *
4660 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4661 * vCC (w1). Useful for integer division and modulus.
4662 *
4663 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4664 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4665 */
4666 /* binop vAA, vBB, vCC */
4667 FETCH w0, 1 // w0<- CCBB
4668 lsr w4, wINST, #8 // w4<- AA
4669 lsr w2, w0, #8 // w2<- CC
4670 and w1, w0, #255 // w1<- BB
4671 GET_VREG_WIDE d2, w2 // w2<- vCC
4672 GET_VREG_WIDE d1, w1 // w1<- vBB
4673 .if 0
4674 cbz d2, common_errDivideByZero // is second operand zero?
4675 .endif
4676 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4677
4678 fsub d0, d1, d2 // d0<- op, w0-w4 changed
4679 GET_INST_OPCODE ip // extract opcode from rINST
4680 SET_VREG_WIDE d0, w4 // vAA<- d0
4681 GOTO_OPCODE ip // jump to next instruction
4682 /* 11-14 instructions */
4683
4684
4685/* ------------------------------ */
4686 .balign 128
4687.L_op_mul_double: /* 0xad */
4688/* File: arm64/op_mul_double.S */
4689/* File: arm64/binopWide.S */
4690 /*
4691 * Generic 64-bit binary operation. Provide an "instr" line that
4692 * specifies an instruction that performs "result = x1 op x2".
4693 * This could be an ARM instruction or a function call. (If the result
4694 * comes back in a register other than x0, you can override "result".)
4695 *
4696 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4697 * vCC (w1). Useful for integer division and modulus.
4698 *
4699 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4700 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4701 */
4702 /* binop vAA, vBB, vCC */
4703 FETCH w0, 1 // w0<- CCBB
4704 lsr w4, wINST, #8 // w4<- AA
4705 lsr w2, w0, #8 // w2<- CC
4706 and w1, w0, #255 // w1<- BB
4707 GET_VREG_WIDE d2, w2 // w2<- vCC
4708 GET_VREG_WIDE d1, w1 // w1<- vBB
4709 .if 0
4710 cbz d2, common_errDivideByZero // is second operand zero?
4711 .endif
4712 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4713
4714 fmul d0, d1, d2 // d0<- op, w0-w4 changed
4715 GET_INST_OPCODE ip // extract opcode from rINST
4716 SET_VREG_WIDE d0, w4 // vAA<- d0
4717 GOTO_OPCODE ip // jump to next instruction
4718 /* 11-14 instructions */
4719
4720
4721/* ------------------------------ */
4722 .balign 128
4723.L_op_div_double: /* 0xae */
4724/* File: arm64/op_div_double.S */
4725/* File: arm64/binopWide.S */
4726 /*
4727 * Generic 64-bit binary operation. Provide an "instr" line that
4728 * specifies an instruction that performs "result = x1 op x2".
4729 * This could be an ARM instruction or a function call. (If the result
4730 * comes back in a register other than x0, you can override "result".)
4731 *
4732 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4733 * vCC (w1). Useful for integer division and modulus.
4734 *
4735 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4736 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4737 */
4738 /* binop vAA, vBB, vCC */
4739 FETCH w0, 1 // w0<- CCBB
4740 lsr w4, wINST, #8 // w4<- AA
4741 lsr w2, w0, #8 // w2<- CC
4742 and w1, w0, #255 // w1<- BB
4743 GET_VREG_WIDE d2, w2 // w2<- vCC
4744 GET_VREG_WIDE d1, w1 // w1<- vBB
4745 .if 0
4746 cbz d2, common_errDivideByZero // is second operand zero?
4747 .endif
4748 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4749
4750 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
4751 GET_INST_OPCODE ip // extract opcode from rINST
4752 SET_VREG_WIDE d0, w4 // vAA<- d0
4753 GOTO_OPCODE ip // jump to next instruction
4754 /* 11-14 instructions */
4755
4756
4757/* ------------------------------ */
4758 .balign 128
4759.L_op_rem_double: /* 0xaf */
4760/* File: arm64/op_rem_double.S */
4761 /* rem vAA, vBB, vCC */
4762 FETCH w0, 1 // w0<- CCBB
4763 lsr w2, w0, #8 // w2<- CC
4764 and w1, w0, #255 // w1<- BB
4765 GET_VREG_WIDE d1, w2 // d1<- vCC
4766 GET_VREG_WIDE d0, w1 // d0<- vBB
4767 bl fmod
4768 lsr w4, wINST, #8 // w4<- AA
4769 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4770 GET_INST_OPCODE ip // extract opcode from rINST
4771 SET_VREG_WIDE d0, w4 // vAA<- result
4772 GOTO_OPCODE ip // jump to next instruction
4773 /* 11-14 instructions */
4774
4775/* ------------------------------ */
4776 .balign 128
4777.L_op_add_int_2addr: /* 0xb0 */
4778/* File: arm64/op_add_int_2addr.S */
4779/* File: arm64/binop2addr.S */
4780 /*
4781 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4782 * that specifies an instruction that performs "result = w0 op w1".
4783 * This could be an ARM instruction or a function call. (If the result
4784 * comes back in a register other than w0, you can override "result".)
4785 *
4786 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4787 * vCC (w1). Useful for integer division and modulus.
4788 *
4789 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4790 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4791 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4792 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4793 */
4794 /* binop/2addr vA, vB */
4795 lsr w3, wINST, #12 // w3<- B
4796 ubfx w9, wINST, #8, #4 // w9<- A
4797 GET_VREG w1, w3 // w1<- vB
4798 GET_VREG w0, w9 // w0<- vA
4799 .if 0
4800 cbz w1, common_errDivideByZero
4801 .endif
4802 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4803 // optional op; may set condition codes
4804 add w0, w0, w1 // w0<- op, w0-w3 changed
4805 GET_INST_OPCODE ip // extract opcode from rINST
4806 SET_VREG w0, w9 // vAA<- w0
4807 GOTO_OPCODE ip // jump to next instruction
4808 /* 10-13 instructions */
4809
4810
4811/* ------------------------------ */
4812 .balign 128
4813.L_op_sub_int_2addr: /* 0xb1 */
4814/* File: arm64/op_sub_int_2addr.S */
4815/* File: arm64/binop2addr.S */
4816 /*
4817 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4818 * that specifies an instruction that performs "result = w0 op w1".
4819 * This could be an ARM instruction or a function call. (If the result
4820 * comes back in a register other than w0, you can override "result".)
4821 *
4822 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4823 * vCC (w1). Useful for integer division and modulus.
4824 *
4825 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4826 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4827 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4828 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4829 */
4830 /* binop/2addr vA, vB */
4831 lsr w3, wINST, #12 // w3<- B
4832 ubfx w9, wINST, #8, #4 // w9<- A
4833 GET_VREG w1, w3 // w1<- vB
4834 GET_VREG w0, w9 // w0<- vA
4835 .if 0
4836 cbz w1, common_errDivideByZero
4837 .endif
4838 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4839 // optional op; may set condition codes
4840 sub w0, w0, w1 // w0<- op, w0-w3 changed
4841 GET_INST_OPCODE ip // extract opcode from rINST
4842 SET_VREG w0, w9 // vAA<- w0
4843 GOTO_OPCODE ip // jump to next instruction
4844 /* 10-13 instructions */
4845
4846
4847/* ------------------------------ */
4848 .balign 128
4849.L_op_mul_int_2addr: /* 0xb2 */
4850/* File: arm64/op_mul_int_2addr.S */
4851/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
4852/* File: arm64/binop2addr.S */
4853 /*
4854 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4855 * that specifies an instruction that performs "result = w0 op w1".
4856 * This could be an ARM instruction or a function call. (If the result
4857 * comes back in a register other than w0, you can override "result".)
4858 *
4859 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4860 * vCC (w1). Useful for integer division and modulus.
4861 *
4862 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4863 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4864 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4865 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4866 */
4867 /* binop/2addr vA, vB */
4868 lsr w3, wINST, #12 // w3<- B
4869 ubfx w9, wINST, #8, #4 // w9<- A
4870 GET_VREG w1, w3 // w1<- vB
4871 GET_VREG w0, w9 // w0<- vA
4872 .if 0
4873 cbz w1, common_errDivideByZero
4874 .endif
4875 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4876 // optional op; may set condition codes
4877 mul w0, w1, w0 // w0<- op, w0-w3 changed
4878 GET_INST_OPCODE ip // extract opcode from rINST
4879 SET_VREG w0, w9 // vAA<- w0
4880 GOTO_OPCODE ip // jump to next instruction
4881 /* 10-13 instructions */
4882
4883
4884/* ------------------------------ */
4885 .balign 128
4886.L_op_div_int_2addr: /* 0xb3 */
4887/* File: arm64/op_div_int_2addr.S */
4888/* File: arm64/binop2addr.S */
4889 /*
4890 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4891 * that specifies an instruction that performs "result = w0 op w1".
4892 * This could be an ARM instruction or a function call. (If the result
4893 * comes back in a register other than w0, you can override "result".)
4894 *
4895 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4896 * vCC (w1). Useful for integer division and modulus.
4897 *
4898 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4899 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4900 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4901 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4902 */
4903 /* binop/2addr vA, vB */
4904 lsr w3, wINST, #12 // w3<- B
4905 ubfx w9, wINST, #8, #4 // w9<- A
4906 GET_VREG w1, w3 // w1<- vB
4907 GET_VREG w0, w9 // w0<- vA
4908 .if 1
4909 cbz w1, common_errDivideByZero
4910 .endif
4911 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4912 // optional op; may set condition codes
4913 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4914 GET_INST_OPCODE ip // extract opcode from rINST
4915 SET_VREG w0, w9 // vAA<- w0
4916 GOTO_OPCODE ip // jump to next instruction
4917 /* 10-13 instructions */
4918
4919
4920/* ------------------------------ */
4921 .balign 128
4922.L_op_rem_int_2addr: /* 0xb4 */
4923/* File: arm64/op_rem_int_2addr.S */
4924/* File: arm64/binop2addr.S */
4925 /*
4926 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4927 * that specifies an instruction that performs "result = w0 op w1".
4928 * This could be an ARM instruction or a function call. (If the result
4929 * comes back in a register other than w0, you can override "result".)
4930 *
4931 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4932 * vCC (w1). Useful for integer division and modulus.
4933 *
4934 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4935 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4936 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4937 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4938 */
4939 /* binop/2addr vA, vB */
4940 lsr w3, wINST, #12 // w3<- B
4941 ubfx w9, wINST, #8, #4 // w9<- A
4942 GET_VREG w1, w3 // w1<- vB
4943 GET_VREG w0, w9 // w0<- vA
4944 .if 1
4945 cbz w1, common_errDivideByZero
4946 .endif
4947 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4948 sdiv w2, w0, w1 // optional op; may set condition codes
4949 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4950 GET_INST_OPCODE ip // extract opcode from rINST
4951 SET_VREG w0, w9 // vAA<- w0
4952 GOTO_OPCODE ip // jump to next instruction
4953 /* 10-13 instructions */
4954
4955
4956/* ------------------------------ */
4957 .balign 128
4958.L_op_and_int_2addr: /* 0xb5 */
4959/* File: arm64/op_and_int_2addr.S */
4960/* File: arm64/binop2addr.S */
4961 /*
4962 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4963 * that specifies an instruction that performs "result = w0 op w1".
4964 * This could be an ARM instruction or a function call. (If the result
4965 * comes back in a register other than w0, you can override "result".)
4966 *
4967 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4968 * vCC (w1). Useful for integer division and modulus.
4969 *
4970 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4971 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4972 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4973 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4974 */
4975 /* binop/2addr vA, vB */
4976 lsr w3, wINST, #12 // w3<- B
4977 ubfx w9, wINST, #8, #4 // w9<- A
4978 GET_VREG w1, w3 // w1<- vB
4979 GET_VREG w0, w9 // w0<- vA
4980 .if 0
4981 cbz w1, common_errDivideByZero
4982 .endif
4983 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4984 // optional op; may set condition codes
4985 and w0, w0, w1 // w0<- op, w0-w3 changed
4986 GET_INST_OPCODE ip // extract opcode from rINST
4987 SET_VREG w0, w9 // vAA<- w0
4988 GOTO_OPCODE ip // jump to next instruction
4989 /* 10-13 instructions */
4990
4991
4992/* ------------------------------ */
4993 .balign 128
4994.L_op_or_int_2addr: /* 0xb6 */
4995/* File: arm64/op_or_int_2addr.S */
4996/* File: arm64/binop2addr.S */
4997 /*
4998 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4999 * that specifies an instruction that performs "result = w0 op w1".
5000 * This could be an ARM instruction or a function call. (If the result
5001 * comes back in a register other than w0, you can override "result".)
5002 *
5003 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5004 * vCC (w1). Useful for integer division and modulus.
5005 *
5006 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5007 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5008 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5009 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5010 */
5011 /* binop/2addr vA, vB */
5012 lsr w3, wINST, #12 // w3<- B
5013 ubfx w9, wINST, #8, #4 // w9<- A
5014 GET_VREG w1, w3 // w1<- vB
5015 GET_VREG w0, w9 // w0<- vA
5016 .if 0
5017 cbz w1, common_errDivideByZero
5018 .endif
5019 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5020 // optional op; may set condition codes
5021 orr w0, w0, w1 // w0<- op, w0-w3 changed
5022 GET_INST_OPCODE ip // extract opcode from rINST
5023 SET_VREG w0, w9 // vAA<- w0
5024 GOTO_OPCODE ip // jump to next instruction
5025 /* 10-13 instructions */
5026
5027
5028/* ------------------------------ */
5029 .balign 128
5030.L_op_xor_int_2addr: /* 0xb7 */
5031/* File: arm64/op_xor_int_2addr.S */
5032/* File: arm64/binop2addr.S */
5033 /*
5034 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5035 * that specifies an instruction that performs "result = w0 op w1".
5036 * This could be an ARM instruction or a function call. (If the result
5037 * comes back in a register other than w0, you can override "result".)
5038 *
5039 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5040 * vCC (w1). Useful for integer division and modulus.
5041 *
5042 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5043 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5044 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5045 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5046 */
5047 /* binop/2addr vA, vB */
5048 lsr w3, wINST, #12 // w3<- B
5049 ubfx w9, wINST, #8, #4 // w9<- A
5050 GET_VREG w1, w3 // w1<- vB
5051 GET_VREG w0, w9 // w0<- vA
5052 .if 0
5053 cbz w1, common_errDivideByZero
5054 .endif
5055 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5056 // optional op; may set condition codes
5057 eor w0, w0, w1 // w0<- op, w0-w3 changed
5058 GET_INST_OPCODE ip // extract opcode from rINST
5059 SET_VREG w0, w9 // vAA<- w0
5060 GOTO_OPCODE ip // jump to next instruction
5061 /* 10-13 instructions */
5062
5063
5064/* ------------------------------ */
5065 .balign 128
5066.L_op_shl_int_2addr: /* 0xb8 */
5067/* File: arm64/op_shl_int_2addr.S */
5068/* File: arm64/binop2addr.S */
5069 /*
5070 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5071 * that specifies an instruction that performs "result = w0 op w1".
5072 * This could be an ARM instruction or a function call. (If the result
5073 * comes back in a register other than w0, you can override "result".)
5074 *
5075 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5076 * vCC (w1). Useful for integer division and modulus.
5077 *
5078 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5079 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5080 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5081 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5082 */
5083 /* binop/2addr vA, vB */
5084 lsr w3, wINST, #12 // w3<- B
5085 ubfx w9, wINST, #8, #4 // w9<- A
5086 GET_VREG w1, w3 // w1<- vB
5087 GET_VREG w0, w9 // w0<- vA
5088 .if 0
5089 cbz w1, common_errDivideByZero
5090 .endif
5091 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5092 and w1, w1, #31 // optional op; may set condition codes
5093 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5094 GET_INST_OPCODE ip // extract opcode from rINST
5095 SET_VREG w0, w9 // vAA<- w0
5096 GOTO_OPCODE ip // jump to next instruction
5097 /* 10-13 instructions */
5098
5099
5100/* ------------------------------ */
5101 .balign 128
5102.L_op_shr_int_2addr: /* 0xb9 */
5103/* File: arm64/op_shr_int_2addr.S */
5104/* File: arm64/binop2addr.S */
5105 /*
5106 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5107 * that specifies an instruction that performs "result = w0 op w1".
5108 * This could be an ARM instruction or a function call. (If the result
5109 * comes back in a register other than w0, you can override "result".)
5110 *
5111 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5112 * vCC (w1). Useful for integer division and modulus.
5113 *
5114 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5115 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5116 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5117 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5118 */
5119 /* binop/2addr vA, vB */
5120 lsr w3, wINST, #12 // w3<- B
5121 ubfx w9, wINST, #8, #4 // w9<- A
5122 GET_VREG w1, w3 // w1<- vB
5123 GET_VREG w0, w9 // w0<- vA
5124 .if 0
5125 cbz w1, common_errDivideByZero
5126 .endif
5127 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5128 and w1, w1, #31 // optional op; may set condition codes
5129 asr w0, w0, w1 // w0<- op, w0-w3 changed
5130 GET_INST_OPCODE ip // extract opcode from rINST
5131 SET_VREG w0, w9 // vAA<- w0
5132 GOTO_OPCODE ip // jump to next instruction
5133 /* 10-13 instructions */
5134
5135
5136/* ------------------------------ */
5137 .balign 128
5138.L_op_ushr_int_2addr: /* 0xba */
5139/* File: arm64/op_ushr_int_2addr.S */
5140/* File: arm64/binop2addr.S */
5141 /*
5142 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5143 * that specifies an instruction that performs "result = w0 op w1".
5144 * This could be an ARM instruction or a function call. (If the result
5145 * comes back in a register other than w0, you can override "result".)
5146 *
5147 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5148 * vCC (w1). Useful for integer division and modulus.
5149 *
5150 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5151 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5152 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5153 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5154 */
5155 /* binop/2addr vA, vB */
5156 lsr w3, wINST, #12 // w3<- B
5157 ubfx w9, wINST, #8, #4 // w9<- A
5158 GET_VREG w1, w3 // w1<- vB
5159 GET_VREG w0, w9 // w0<- vA
5160 .if 0
5161 cbz w1, common_errDivideByZero
5162 .endif
5163 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5164 and w1, w1, #31 // optional op; may set condition codes
5165 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5166 GET_INST_OPCODE ip // extract opcode from rINST
5167 SET_VREG w0, w9 // vAA<- w0
5168 GOTO_OPCODE ip // jump to next instruction
5169 /* 10-13 instructions */
5170
5171
5172/* ------------------------------ */
5173 .balign 128
5174.L_op_add_long_2addr: /* 0xbb */
5175/* File: arm64/op_add_long_2addr.S */
5176/* File: arm64/binopWide2addr.S */
5177 /*
5178 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5179 * that specifies an instruction that performs "x0 = x0 op x1".
5180 * This must not be a function call, as we keep w2 live across it.
5181 *
5182 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5183 * vCC (w1). Useful for integer division and modulus.
5184 *
5185 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5186 * and-long/2addr, or-long/2addr, xor-long/2addr,
5187 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5188 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5189 */
5190 /* binop/2addr vA, vB */
5191 lsr w1, wINST, #12 // w1<- B
5192 ubfx w2, wINST, #8, #4 // w2<- A
5193 GET_VREG_WIDE x1, w1 // x1<- vB
5194 GET_VREG_WIDE x0, w2 // x0<- vA
5195 .if 0
5196 cbz x1, common_errDivideByZero
5197 .endif
5198 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5199
5200 add x0, x0, x1 // result<- op
5201 GET_INST_OPCODE ip // extract opcode from rINST
5202 SET_VREG_WIDE x0, w2 // vAA<- result
5203 GOTO_OPCODE ip // jump to next instruction
5204 /* 10-13 instructions */
5205
5206
5207/* ------------------------------ */
5208 .balign 128
5209.L_op_sub_long_2addr: /* 0xbc */
5210/* File: arm64/op_sub_long_2addr.S */
5211/* File: arm64/binopWide2addr.S */
5212 /*
5213 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5214 * that specifies an instruction that performs "x0 = x0 op x1".
5215 * This must not be a function call, as we keep w2 live across it.
5216 *
5217 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5218 * vCC (w1). Useful for integer division and modulus.
5219 *
5220 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5221 * and-long/2addr, or-long/2addr, xor-long/2addr,
5222 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5223 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5224 */
5225 /* binop/2addr vA, vB */
5226 lsr w1, wINST, #12 // w1<- B
5227 ubfx w2, wINST, #8, #4 // w2<- A
5228 GET_VREG_WIDE x1, w1 // x1<- vB
5229 GET_VREG_WIDE x0, w2 // x0<- vA
5230 .if 0
5231 cbz x1, common_errDivideByZero
5232 .endif
5233 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5234
5235 sub x0, x0, x1 // result<- op
5236 GET_INST_OPCODE ip // extract opcode from rINST
5237 SET_VREG_WIDE x0, w2 // vAA<- result
5238 GOTO_OPCODE ip // jump to next instruction
5239 /* 10-13 instructions */
5240
5241
5242/* ------------------------------ */
5243 .balign 128
5244.L_op_mul_long_2addr: /* 0xbd */
5245/* File: arm64/op_mul_long_2addr.S */
5246/* File: arm64/binopWide2addr.S */
5247 /*
5248 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5249 * that specifies an instruction that performs "x0 = x0 op x1".
5250 * This must not be a function call, as we keep w2 live across it.
5251 *
5252 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5253 * vCC (w1). Useful for integer division and modulus.
5254 *
5255 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5256 * and-long/2addr, or-long/2addr, xor-long/2addr,
5257 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5258 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5259 */
5260 /* binop/2addr vA, vB */
5261 lsr w1, wINST, #12 // w1<- B
5262 ubfx w2, wINST, #8, #4 // w2<- A
5263 GET_VREG_WIDE x1, w1 // x1<- vB
5264 GET_VREG_WIDE x0, w2 // x0<- vA
5265 .if 0
5266 cbz x1, common_errDivideByZero
5267 .endif
5268 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5269
5270 mul x0, x0, x1 // result<- op
5271 GET_INST_OPCODE ip // extract opcode from rINST
5272 SET_VREG_WIDE x0, w2 // vAA<- result
5273 GOTO_OPCODE ip // jump to next instruction
5274 /* 10-13 instructions */
5275
5276
5277/* ------------------------------ */
5278 .balign 128
5279.L_op_div_long_2addr: /* 0xbe */
5280/* File: arm64/op_div_long_2addr.S */
5281/* File: arm64/binopWide2addr.S */
5282 /*
5283 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5284 * that specifies an instruction that performs "x0 = x0 op x1".
5285 * This must not be a function call, as we keep w2 live across it.
5286 *
5287 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5288 * vCC (w1). Useful for integer division and modulus.
5289 *
5290 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5291 * and-long/2addr, or-long/2addr, xor-long/2addr,
5292 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5293 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5294 */
5295 /* binop/2addr vA, vB */
5296 lsr w1, wINST, #12 // w1<- B
5297 ubfx w2, wINST, #8, #4 // w2<- A
5298 GET_VREG_WIDE x1, w1 // x1<- vB
5299 GET_VREG_WIDE x0, w2 // x0<- vA
5300 .if 1
5301 cbz x1, common_errDivideByZero
5302 .endif
5303 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5304
5305 sdiv x0, x0, x1 // result<- op
5306 GET_INST_OPCODE ip // extract opcode from rINST
5307 SET_VREG_WIDE x0, w2 // vAA<- result
5308 GOTO_OPCODE ip // jump to next instruction
5309 /* 10-13 instructions */
5310
5311
5312/* ------------------------------ */
5313 .balign 128
5314.L_op_rem_long_2addr: /* 0xbf */
5315/* File: arm64/op_rem_long_2addr.S */
5316/* File: arm64/binopWide2addr.S */
5317 /*
5318 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5319 * that specifies an instruction that performs "x0 = x0 op x1".
5320 * This must not be a function call, as we keep w2 live across it.
5321 *
5322 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5323 * vCC (w1). Useful for integer division and modulus.
5324 *
5325 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5326 * and-long/2addr, or-long/2addr, xor-long/2addr,
5327 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5328 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5329 */
5330 /* binop/2addr vA, vB */
5331 lsr w1, wINST, #12 // w1<- B
5332 ubfx w2, wINST, #8, #4 // w2<- A
5333 GET_VREG_WIDE x1, w1 // x1<- vB
5334 GET_VREG_WIDE x0, w2 // x0<- vA
5335 .if 1
5336 cbz x1, common_errDivideByZero
5337 .endif
5338 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5339 sdiv x3, x0, x1
5340 msub x0, x3, x1, x0 // result<- op
5341 GET_INST_OPCODE ip // extract opcode from rINST
5342 SET_VREG_WIDE x0, w2 // vAA<- result
5343 GOTO_OPCODE ip // jump to next instruction
5344 /* 10-13 instructions */
5345
5346
5347/* ------------------------------ */
5348 .balign 128
5349.L_op_and_long_2addr: /* 0xc0 */
5350/* File: arm64/op_and_long_2addr.S */
5351/* File: arm64/binopWide2addr.S */
5352 /*
5353 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5354 * that specifies an instruction that performs "x0 = x0 op x1".
5355 * This must not be a function call, as we keep w2 live across it.
5356 *
5357 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5358 * vCC (w1). Useful for integer division and modulus.
5359 *
5360 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5361 * and-long/2addr, or-long/2addr, xor-long/2addr,
5362 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5363 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5364 */
5365 /* binop/2addr vA, vB */
5366 lsr w1, wINST, #12 // w1<- B
5367 ubfx w2, wINST, #8, #4 // w2<- A
5368 GET_VREG_WIDE x1, w1 // x1<- vB
5369 GET_VREG_WIDE x0, w2 // x0<- vA
5370 .if 0
5371 cbz x1, common_errDivideByZero
5372 .endif
5373 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5374
5375 and x0, x0, x1 // result<- op
5376 GET_INST_OPCODE ip // extract opcode from rINST
5377 SET_VREG_WIDE x0, w2 // vAA<- result
5378 GOTO_OPCODE ip // jump to next instruction
5379 /* 10-13 instructions */
5380
5381
5382/* ------------------------------ */
5383 .balign 128
5384.L_op_or_long_2addr: /* 0xc1 */
5385/* File: arm64/op_or_long_2addr.S */
5386/* File: arm64/binopWide2addr.S */
5387 /*
5388 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5389 * that specifies an instruction that performs "x0 = x0 op x1".
5390 * This must not be a function call, as we keep w2 live across it.
5391 *
5392 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5393 * vCC (w1). Useful for integer division and modulus.
5394 *
5395 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5396 * and-long/2addr, or-long/2addr, xor-long/2addr,
5397 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5398 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5399 */
5400 /* binop/2addr vA, vB */
5401 lsr w1, wINST, #12 // w1<- B
5402 ubfx w2, wINST, #8, #4 // w2<- A
5403 GET_VREG_WIDE x1, w1 // x1<- vB
5404 GET_VREG_WIDE x0, w2 // x0<- vA
5405 .if 0
5406 cbz x1, common_errDivideByZero
5407 .endif
5408 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5409
5410 orr x0, x0, x1 // result<- op
5411 GET_INST_OPCODE ip // extract opcode from rINST
5412 SET_VREG_WIDE x0, w2 // vAA<- result
5413 GOTO_OPCODE ip // jump to next instruction
5414 /* 10-13 instructions */
5415
5416
5417/* ------------------------------ */
5418 .balign 128
5419.L_op_xor_long_2addr: /* 0xc2 */
5420/* File: arm64/op_xor_long_2addr.S */
5421/* File: arm64/binopWide2addr.S */
5422 /*
5423 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5424 * that specifies an instruction that performs "x0 = x0 op x1".
5425 * This must not be a function call, as we keep w2 live across it.
5426 *
5427 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5428 * vCC (w1). Useful for integer division and modulus.
5429 *
5430 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5431 * and-long/2addr, or-long/2addr, xor-long/2addr,
5432 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5433 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5434 */
5435 /* binop/2addr vA, vB */
5436 lsr w1, wINST, #12 // w1<- B
5437 ubfx w2, wINST, #8, #4 // w2<- A
5438 GET_VREG_WIDE x1, w1 // x1<- vB
5439 GET_VREG_WIDE x0, w2 // x0<- vA
5440 .if 0
5441 cbz x1, common_errDivideByZero
5442 .endif
5443 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5444
5445 eor x0, x0, x1 // result<- op
5446 GET_INST_OPCODE ip // extract opcode from rINST
5447 SET_VREG_WIDE x0, w2 // vAA<- result
5448 GOTO_OPCODE ip // jump to next instruction
5449 /* 10-13 instructions */
5450
5451
5452/* ------------------------------ */
5453 .balign 128
5454.L_op_shl_long_2addr: /* 0xc3 */
5455/* File: arm64/op_shl_long_2addr.S */
5456/* File: arm64/shiftWide2addr.S */
5457 /*
5458 * Generic 64-bit shift operation.
5459 */
5460 /* binop/2addr vA, vB */
5461 lsr w1, wINST, #12 // w1<- B
5462 ubfx w2, wINST, #8, #4 // w2<- A
5463 GET_VREG w1, w1 // x1<- vB
5464 GET_VREG_WIDE x0, w2 // x0<- vA
5465 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5466 and x1, x1, #63 // Mask low 6 bits.
5467 lsl x0, x0, x1
5468 GET_INST_OPCODE ip // extract opcode from rINST
5469 SET_VREG_WIDE x0, w2 // vAA<- result
5470 GOTO_OPCODE ip // jump to next instruction
5471 /* 10-13 instructions */
5472
5473
5474/* ------------------------------ */
5475 .balign 128
5476.L_op_shr_long_2addr: /* 0xc4 */
5477/* File: arm64/op_shr_long_2addr.S */
5478/* File: arm64/shiftWide2addr.S */
5479 /*
5480 * Generic 64-bit shift operation.
5481 */
5482 /* binop/2addr vA, vB */
5483 lsr w1, wINST, #12 // w1<- B
5484 ubfx w2, wINST, #8, #4 // w2<- A
5485 GET_VREG w1, w1 // x1<- vB
5486 GET_VREG_WIDE x0, w2 // x0<- vA
5487 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5488 and x1, x1, #63 // Mask low 6 bits.
5489 asr x0, x0, x1
5490 GET_INST_OPCODE ip // extract opcode from rINST
5491 SET_VREG_WIDE x0, w2 // vAA<- result
5492 GOTO_OPCODE ip // jump to next instruction
5493 /* 10-13 instructions */
5494
5495
5496/* ------------------------------ */
5497 .balign 128
5498.L_op_ushr_long_2addr: /* 0xc5 */
5499/* File: arm64/op_ushr_long_2addr.S */
5500/* File: arm64/shiftWide2addr.S */
5501 /*
5502 * Generic 64-bit shift operation.
5503 */
5504 /* binop/2addr vA, vB */
5505 lsr w1, wINST, #12 // w1<- B
5506 ubfx w2, wINST, #8, #4 // w2<- A
5507 GET_VREG w1, w1 // x1<- vB
5508 GET_VREG_WIDE x0, w2 // x0<- vA
5509 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5510 and x1, x1, #63 // Mask low 6 bits.
5511 lsr x0, x0, x1
5512 GET_INST_OPCODE ip // extract opcode from rINST
5513 SET_VREG_WIDE x0, w2 // vAA<- result
5514 GOTO_OPCODE ip // jump to next instruction
5515 /* 10-13 instructions */
5516
5517
5518/* ------------------------------ */
5519 .balign 128
5520.L_op_add_float_2addr: /* 0xc6 */
5521/* File: arm64/op_add_float_2addr.S */
5522/* File: arm64/fbinop2addr.S */
5523 /*
5524 * Generic 32-bit floating point "/2addr" binary operation. Provide
5525 * an "instr" line that specifies an instruction that performs
5526 * "s2 = s0 op s1".
5527 *
5528 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5529 */
5530 /* binop/2addr vA, vB */
5531 lsr w3, wINST, #12 // w3<- B
5532 lsr w9, wINST, #8 // w9<- A+
5533 and w9, w9, #15 // w9<- A
5534 GET_VREG s1, w3
5535 GET_VREG s0, w9
5536 fadd s2, s0, s1 // s2<- op
5537 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5538 GET_INST_OPCODE ip // extract opcode from rINST
5539 SET_VREG s2, w9
5540 GOTO_OPCODE ip // jump to next instruction
5541
5542
5543/* ------------------------------ */
5544 .balign 128
5545.L_op_sub_float_2addr: /* 0xc7 */
5546/* File: arm64/op_sub_float_2addr.S */
5547/* File: arm64/fbinop2addr.S */
5548 /*
5549 * Generic 32-bit floating point "/2addr" binary operation. Provide
5550 * an "instr" line that specifies an instruction that performs
5551 * "s2 = s0 op s1".
5552 *
5553 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5554 */
5555 /* binop/2addr vA, vB */
5556 lsr w3, wINST, #12 // w3<- B
5557 lsr w9, wINST, #8 // w9<- A+
5558 and w9, w9, #15 // w9<- A
5559 GET_VREG s1, w3
5560 GET_VREG s0, w9
5561 fsub s2, s0, s1 // s2<- op
5562 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5563 GET_INST_OPCODE ip // extract opcode from rINST
5564 SET_VREG s2, w9
5565 GOTO_OPCODE ip // jump to next instruction
5566
5567
5568/* ------------------------------ */
5569 .balign 128
5570.L_op_mul_float_2addr: /* 0xc8 */
5571/* File: arm64/op_mul_float_2addr.S */
5572/* File: arm64/fbinop2addr.S */
5573 /*
5574 * Generic 32-bit floating point "/2addr" binary operation. Provide
5575 * an "instr" line that specifies an instruction that performs
5576 * "s2 = s0 op s1".
5577 *
5578 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5579 */
5580 /* binop/2addr vA, vB */
5581 lsr w3, wINST, #12 // w3<- B
5582 lsr w9, wINST, #8 // w9<- A+
5583 and w9, w9, #15 // w9<- A
5584 GET_VREG s1, w3
5585 GET_VREG s0, w9
5586 fmul s2, s0, s1 // s2<- op
5587 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5588 GET_INST_OPCODE ip // extract opcode from rINST
5589 SET_VREG s2, w9
5590 GOTO_OPCODE ip // jump to next instruction
5591
5592
5593/* ------------------------------ */
5594 .balign 128
5595.L_op_div_float_2addr: /* 0xc9 */
5596/* File: arm64/op_div_float_2addr.S */
5597/* File: arm64/fbinop2addr.S */
5598 /*
5599 * Generic 32-bit floating point "/2addr" binary operation. Provide
5600 * an "instr" line that specifies an instruction that performs
5601 * "s2 = s0 op s1".
5602 *
5603 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5604 */
5605 /* binop/2addr vA, vB */
5606 lsr w3, wINST, #12 // w3<- B
5607 lsr w9, wINST, #8 // w9<- A+
5608 and w9, w9, #15 // w9<- A
5609 GET_VREG s1, w3
5610 GET_VREG s0, w9
5611 fdiv s2, s0, s1 // s2<- op
5612 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5613 GET_INST_OPCODE ip // extract opcode from rINST
5614 SET_VREG s2, w9
5615 GOTO_OPCODE ip // jump to next instruction
5616
5617
5618/* ------------------------------ */
5619 .balign 128
5620.L_op_rem_float_2addr: /* 0xca */
5621/* File: arm64/op_rem_float_2addr.S */
5622 /* rem vA, vB */
5623 lsr w3, wINST, #12 // w3<- B
5624 lsr w9, wINST, #8 // w9<- A+
5625 and w9, w9, #15 // w9<- A
5626 GET_VREG s1, w3
5627 GET_VREG s0, w9
5628 bl fmodf
5629 lsr w9, wINST, #8 // w9<- A+
5630 and w9, w9, #15 // w9<- A
5631 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5632 GET_INST_OPCODE ip // extract opcode from rINST
5633 SET_VREG s0, w9
5634 GOTO_OPCODE ip // jump to next instruction
5635
5636/* ------------------------------ */
5637 .balign 128
5638.L_op_add_double_2addr: /* 0xcb */
5639/* File: arm64/op_add_double_2addr.S */
5640/* File: arm64/binopWide2addr.S */
5641 /*
5642 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5643 * that specifies an instruction that performs "x0 = x0 op x1".
5644 * This must not be a function call, as we keep w2 live across it.
5645 *
5646 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5647 * vCC (w1). Useful for integer division and modulus.
5648 *
5649 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5650 * and-long/2addr, or-long/2addr, xor-long/2addr,
5651 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5652 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5653 */
5654 /* binop/2addr vA, vB */
5655 lsr w1, wINST, #12 // w1<- B
5656 ubfx w2, wINST, #8, #4 // w2<- A
5657 GET_VREG_WIDE d1, w1 // x1<- vB
5658 GET_VREG_WIDE d0, w2 // x0<- vA
5659 .if 0
5660 cbz d1, common_errDivideByZero
5661 .endif
5662 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5663
5664 fadd d0, d0, d1 // result<- op
5665 GET_INST_OPCODE ip // extract opcode from rINST
5666 SET_VREG_WIDE d0, w2 // vAA<- result
5667 GOTO_OPCODE ip // jump to next instruction
5668 /* 10-13 instructions */
5669
5670
5671/* ------------------------------ */
5672 .balign 128
5673.L_op_sub_double_2addr: /* 0xcc */
5674/* File: arm64/op_sub_double_2addr.S */
5675/* File: arm64/binopWide2addr.S */
5676 /*
5677 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5678 * that specifies an instruction that performs "x0 = x0 op x1".
5679 * This must not be a function call, as we keep w2 live across it.
5680 *
5681 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5682 * vCC (w1). Useful for integer division and modulus.
5683 *
5684 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5685 * and-long/2addr, or-long/2addr, xor-long/2addr,
5686 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5687 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5688 */
5689 /* binop/2addr vA, vB */
5690 lsr w1, wINST, #12 // w1<- B
5691 ubfx w2, wINST, #8, #4 // w2<- A
5692 GET_VREG_WIDE d1, w1 // x1<- vB
5693 GET_VREG_WIDE d0, w2 // x0<- vA
5694 .if 0
5695 cbz d1, common_errDivideByZero
5696 .endif
5697 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5698
5699 fsub d0, d0, d1 // result<- op
5700 GET_INST_OPCODE ip // extract opcode from rINST
5701 SET_VREG_WIDE d0, w2 // vAA<- result
5702 GOTO_OPCODE ip // jump to next instruction
5703 /* 10-13 instructions */
5704
5705
5706/* ------------------------------ */
5707 .balign 128
5708.L_op_mul_double_2addr: /* 0xcd */
5709/* File: arm64/op_mul_double_2addr.S */
5710/* File: arm64/binopWide2addr.S */
5711 /*
5712 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5713 * that specifies an instruction that performs "x0 = x0 op x1".
5714 * This must not be a function call, as we keep w2 live across it.
5715 *
5716 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5717 * vCC (w1). Useful for integer division and modulus.
5718 *
5719 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5720 * and-long/2addr, or-long/2addr, xor-long/2addr,
5721 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5722 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5723 */
5724 /* binop/2addr vA, vB */
5725 lsr w1, wINST, #12 // w1<- B
5726 ubfx w2, wINST, #8, #4 // w2<- A
5727 GET_VREG_WIDE d1, w1 // x1<- vB
5728 GET_VREG_WIDE d0, w2 // x0<- vA
5729 .if 0
5730 cbz d1, common_errDivideByZero
5731 .endif
5732 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5733
5734 fmul d0, d0, d1 // result<- op
5735 GET_INST_OPCODE ip // extract opcode from rINST
5736 SET_VREG_WIDE d0, w2 // vAA<- result
5737 GOTO_OPCODE ip // jump to next instruction
5738 /* 10-13 instructions */
5739
5740
5741/* ------------------------------ */
5742 .balign 128
5743.L_op_div_double_2addr: /* 0xce */
5744/* File: arm64/op_div_double_2addr.S */
5745/* File: arm64/binopWide2addr.S */
5746 /*
5747 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5748 * that specifies an instruction that performs "x0 = x0 op x1".
5749 * This must not be a function call, as we keep w2 live across it.
5750 *
5751 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5752 * vCC (w1). Useful for integer division and modulus.
5753 *
5754 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5755 * and-long/2addr, or-long/2addr, xor-long/2addr,
5756 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5757 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5758 */
5759 /* binop/2addr vA, vB */
5760 lsr w1, wINST, #12 // w1<- B
5761 ubfx w2, wINST, #8, #4 // w2<- A
5762 GET_VREG_WIDE d1, w1 // x1<- vB
5763 GET_VREG_WIDE d0, w2 // x0<- vA
5764 .if 0
5765 cbz d1, common_errDivideByZero
5766 .endif
5767 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5768
5769 fdiv d0, d0, d1 // result<- op
5770 GET_INST_OPCODE ip // extract opcode from rINST
5771 SET_VREG_WIDE d0, w2 // vAA<- result
5772 GOTO_OPCODE ip // jump to next instruction
5773 /* 10-13 instructions */
5774
5775
5776/* ------------------------------ */
5777 .balign 128
5778.L_op_rem_double_2addr: /* 0xcf */
5779/* File: arm64/op_rem_double_2addr.S */
5780 /* rem vA, vB */
5781 lsr w1, wINST, #12 // w1<- B
5782 ubfx w2, wINST, #8, #4 // w2<- A
5783 GET_VREG_WIDE d1, w1 // d1<- vB
5784 GET_VREG_WIDE d0, w2 // d0<- vA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005785 bl fmod
5786 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
buzbee908c0b22016-03-16 14:39:50 -07005787 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005788 GET_INST_OPCODE ip // extract opcode from rINST
5789 SET_VREG_WIDE d0, w2 // vAA<- result
5790 GOTO_OPCODE ip // jump to next instruction
5791 /* 10-13 instructions */
5792
5793/* ------------------------------ */
5794 .balign 128
5795.L_op_add_int_lit16: /* 0xd0 */
5796/* File: arm64/op_add_int_lit16.S */
5797/* File: arm64/binopLit16.S */
5798 /*
5799 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5800 * that specifies an instruction that performs "result = w0 op w1".
5801 * This could be an ARM instruction or a function call. (If the result
5802 * comes back in a register other than w0, you can override "result".)
5803 *
5804 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5805 * vCC (w1). Useful for integer division and modulus.
5806 *
5807 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5808 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5809 */
5810 /* binop/lit16 vA, vB, #+CCCC */
5811 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5812 lsr w2, wINST, #12 // w2<- B
5813 ubfx w9, wINST, #8, #4 // w9<- A
5814 GET_VREG w0, w2 // w0<- vB
5815 .if 0
5816 cbz w1, common_errDivideByZero
5817 .endif
5818 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5819
5820 add w0, w0, w1 // w0<- op, w0-w3 changed
5821 GET_INST_OPCODE ip // extract opcode from rINST
5822 SET_VREG w0, w9 // vAA<- w0
5823 GOTO_OPCODE ip // jump to next instruction
5824 /* 10-13 instructions */
5825
5826
5827/* ------------------------------ */
5828 .balign 128
5829.L_op_rsub_int: /* 0xd1 */
5830/* File: arm64/op_rsub_int.S */
5831/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5832/* File: arm64/binopLit16.S */
5833 /*
5834 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5835 * that specifies an instruction that performs "result = w0 op w1".
5836 * This could be an ARM instruction or a function call. (If the result
5837 * comes back in a register other than w0, you can override "result".)
5838 *
5839 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5840 * vCC (w1). Useful for integer division and modulus.
5841 *
5842 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5843 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5844 */
5845 /* binop/lit16 vA, vB, #+CCCC */
5846 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5847 lsr w2, wINST, #12 // w2<- B
5848 ubfx w9, wINST, #8, #4 // w9<- A
5849 GET_VREG w0, w2 // w0<- vB
5850 .if 0
5851 cbz w1, common_errDivideByZero
5852 .endif
5853 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5854
5855 sub w0, w1, w0 // w0<- op, w0-w3 changed
5856 GET_INST_OPCODE ip // extract opcode from rINST
5857 SET_VREG w0, w9 // vAA<- w0
5858 GOTO_OPCODE ip // jump to next instruction
5859 /* 10-13 instructions */
5860
5861
5862/* ------------------------------ */
5863 .balign 128
5864.L_op_mul_int_lit16: /* 0xd2 */
5865/* File: arm64/op_mul_int_lit16.S */
5866/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5867/* File: arm64/binopLit16.S */
5868 /*
5869 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5870 * that specifies an instruction that performs "result = w0 op w1".
5871 * This could be an ARM instruction or a function call. (If the result
5872 * comes back in a register other than w0, you can override "result".)
5873 *
5874 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5875 * vCC (w1). Useful for integer division and modulus.
5876 *
5877 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5878 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5879 */
5880 /* binop/lit16 vA, vB, #+CCCC */
5881 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5882 lsr w2, wINST, #12 // w2<- B
5883 ubfx w9, wINST, #8, #4 // w9<- A
5884 GET_VREG w0, w2 // w0<- vB
5885 .if 0
5886 cbz w1, common_errDivideByZero
5887 .endif
5888 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5889
5890 mul w0, w1, w0 // w0<- op, w0-w3 changed
5891 GET_INST_OPCODE ip // extract opcode from rINST
5892 SET_VREG w0, w9 // vAA<- w0
5893 GOTO_OPCODE ip // jump to next instruction
5894 /* 10-13 instructions */
5895
5896
5897/* ------------------------------ */
5898 .balign 128
5899.L_op_div_int_lit16: /* 0xd3 */
5900/* File: arm64/op_div_int_lit16.S */
5901/* File: arm64/binopLit16.S */
5902 /*
5903 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5904 * that specifies an instruction that performs "result = w0 op w1".
5905 * This could be an ARM instruction or a function call. (If the result
5906 * comes back in a register other than w0, you can override "result".)
5907 *
5908 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5909 * vCC (w1). Useful for integer division and modulus.
5910 *
5911 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5912 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5913 */
5914 /* binop/lit16 vA, vB, #+CCCC */
5915 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5916 lsr w2, wINST, #12 // w2<- B
5917 ubfx w9, wINST, #8, #4 // w9<- A
5918 GET_VREG w0, w2 // w0<- vB
5919 .if 1
5920 cbz w1, common_errDivideByZero
5921 .endif
5922 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5923
5924 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5925 GET_INST_OPCODE ip // extract opcode from rINST
5926 SET_VREG w0, w9 // vAA<- w0
5927 GOTO_OPCODE ip // jump to next instruction
5928 /* 10-13 instructions */
5929
5930
5931/* ------------------------------ */
5932 .balign 128
5933.L_op_rem_int_lit16: /* 0xd4 */
5934/* File: arm64/op_rem_int_lit16.S */
5935/* File: arm64/binopLit16.S */
5936 /*
5937 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5938 * that specifies an instruction that performs "result = w0 op w1".
5939 * This could be an ARM instruction or a function call. (If the result
5940 * comes back in a register other than w0, you can override "result".)
5941 *
5942 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5943 * vCC (w1). Useful for integer division and modulus.
5944 *
5945 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5946 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5947 */
5948 /* binop/lit16 vA, vB, #+CCCC */
5949 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5950 lsr w2, wINST, #12 // w2<- B
5951 ubfx w9, wINST, #8, #4 // w9<- A
5952 GET_VREG w0, w2 // w0<- vB
5953 .if 1
5954 cbz w1, common_errDivideByZero
5955 .endif
5956 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5957 sdiv w3, w0, w1
5958 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
5959 GET_INST_OPCODE ip // extract opcode from rINST
5960 SET_VREG w0, w9 // vAA<- w0
5961 GOTO_OPCODE ip // jump to next instruction
5962 /* 10-13 instructions */
5963
5964
5965/* ------------------------------ */
5966 .balign 128
5967.L_op_and_int_lit16: /* 0xd5 */
5968/* File: arm64/op_and_int_lit16.S */
5969/* File: arm64/binopLit16.S */
5970 /*
5971 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5972 * that specifies an instruction that performs "result = w0 op w1".
5973 * This could be an ARM instruction or a function call. (If the result
5974 * comes back in a register other than w0, you can override "result".)
5975 *
5976 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5977 * vCC (w1). Useful for integer division and modulus.
5978 *
5979 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5980 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5981 */
5982 /* binop/lit16 vA, vB, #+CCCC */
5983 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5984 lsr w2, wINST, #12 // w2<- B
5985 ubfx w9, wINST, #8, #4 // w9<- A
5986 GET_VREG w0, w2 // w0<- vB
5987 .if 0
5988 cbz w1, common_errDivideByZero
5989 .endif
5990 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5991
5992 and w0, w0, w1 // w0<- op, w0-w3 changed
5993 GET_INST_OPCODE ip // extract opcode from rINST
5994 SET_VREG w0, w9 // vAA<- w0
5995 GOTO_OPCODE ip // jump to next instruction
5996 /* 10-13 instructions */
5997
5998
5999/* ------------------------------ */
6000 .balign 128
6001.L_op_or_int_lit16: /* 0xd6 */
6002/* File: arm64/op_or_int_lit16.S */
6003/* File: arm64/binopLit16.S */
6004 /*
6005 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6006 * that specifies an instruction that performs "result = w0 op w1".
6007 * This could be an ARM instruction or a function call. (If the result
6008 * comes back in a register other than w0, you can override "result".)
6009 *
6010 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6011 * vCC (w1). Useful for integer division and modulus.
6012 *
6013 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6014 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6015 */
6016 /* binop/lit16 vA, vB, #+CCCC */
6017 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6018 lsr w2, wINST, #12 // w2<- B
6019 ubfx w9, wINST, #8, #4 // w9<- A
6020 GET_VREG w0, w2 // w0<- vB
6021 .if 0
6022 cbz w1, common_errDivideByZero
6023 .endif
6024 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6025
6026 orr w0, w0, w1 // w0<- op, w0-w3 changed
6027 GET_INST_OPCODE ip // extract opcode from rINST
6028 SET_VREG w0, w9 // vAA<- w0
6029 GOTO_OPCODE ip // jump to next instruction
6030 /* 10-13 instructions */
6031
6032
6033/* ------------------------------ */
6034 .balign 128
6035.L_op_xor_int_lit16: /* 0xd7 */
6036/* File: arm64/op_xor_int_lit16.S */
6037/* File: arm64/binopLit16.S */
6038 /*
6039 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6040 * that specifies an instruction that performs "result = w0 op w1".
6041 * This could be an ARM instruction or a function call. (If the result
6042 * comes back in a register other than w0, you can override "result".)
6043 *
6044 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6045 * vCC (w1). Useful for integer division and modulus.
6046 *
6047 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6048 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6049 */
6050 /* binop/lit16 vA, vB, #+CCCC */
6051 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6052 lsr w2, wINST, #12 // w2<- B
6053 ubfx w9, wINST, #8, #4 // w9<- A
6054 GET_VREG w0, w2 // w0<- vB
6055 .if 0
6056 cbz w1, common_errDivideByZero
6057 .endif
6058 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6059
6060 eor w0, w0, w1 // w0<- op, w0-w3 changed
6061 GET_INST_OPCODE ip // extract opcode from rINST
6062 SET_VREG w0, w9 // vAA<- w0
6063 GOTO_OPCODE ip // jump to next instruction
6064 /* 10-13 instructions */
6065
6066
6067/* ------------------------------ */
6068 .balign 128
6069.L_op_add_int_lit8: /* 0xd8 */
6070/* File: arm64/op_add_int_lit8.S */
6071/* File: arm64/binopLit8.S */
6072 /*
6073 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6074 * that specifies an instruction that performs "result = w0 op w1".
6075 * This could be an ARM instruction or a function call. (If the result
6076 * comes back in a register other than w0, you can override "result".)
6077 *
6078 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6079 * vCC (w1). Useful for integer division and modulus.
6080 *
6081 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6082 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6083 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6084 */
6085 /* binop/lit8 vAA, vBB, #+CC */
6086 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6087 lsr w9, wINST, #8 // w9<- AA
6088 and w2, w3, #255 // w2<- BB
6089 GET_VREG w0, w2 // w0<- vBB
6090 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6091 .if 0
6092 cbz w1, common_errDivideByZero
6093 .endif
6094 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6095 // optional op; may set condition codes
6096 add w0, w0, w1 // w0<- op, w0-w3 changed
6097 GET_INST_OPCODE ip // extract opcode from rINST
6098 SET_VREG w0, w9 // vAA<- w0
6099 GOTO_OPCODE ip // jump to next instruction
6100 /* 10-12 instructions */
6101
6102
6103/* ------------------------------ */
6104 .balign 128
6105.L_op_rsub_int_lit8: /* 0xd9 */
6106/* File: arm64/op_rsub_int_lit8.S */
6107/* File: arm64/binopLit8.S */
6108 /*
6109 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6110 * that specifies an instruction that performs "result = w0 op w1".
6111 * This could be an ARM instruction or a function call. (If the result
6112 * comes back in a register other than w0, you can override "result".)
6113 *
6114 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6115 * vCC (w1). Useful for integer division and modulus.
6116 *
6117 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6118 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6119 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6120 */
6121 /* binop/lit8 vAA, vBB, #+CC */
6122 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6123 lsr w9, wINST, #8 // w9<- AA
6124 and w2, w3, #255 // w2<- BB
6125 GET_VREG w0, w2 // w0<- vBB
6126 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6127 .if 0
6128 cbz w1, common_errDivideByZero
6129 .endif
6130 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6131 // optional op; may set condition codes
6132 sub w0, w1, w0 // w0<- op, w0-w3 changed
6133 GET_INST_OPCODE ip // extract opcode from rINST
6134 SET_VREG w0, w9 // vAA<- w0
6135 GOTO_OPCODE ip // jump to next instruction
6136 /* 10-12 instructions */
6137
6138
6139/* ------------------------------ */
6140 .balign 128
6141.L_op_mul_int_lit8: /* 0xda */
6142/* File: arm64/op_mul_int_lit8.S */
6143/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6144/* File: arm64/binopLit8.S */
6145 /*
6146 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6147 * that specifies an instruction that performs "result = w0 op w1".
6148 * This could be an ARM instruction or a function call. (If the result
6149 * comes back in a register other than w0, you can override "result".)
6150 *
6151 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6152 * vCC (w1). Useful for integer division and modulus.
6153 *
6154 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6155 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6156 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6157 */
6158 /* binop/lit8 vAA, vBB, #+CC */
6159 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6160 lsr w9, wINST, #8 // w9<- AA
6161 and w2, w3, #255 // w2<- BB
6162 GET_VREG w0, w2 // w0<- vBB
6163 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6164 .if 0
6165 cbz w1, common_errDivideByZero
6166 .endif
6167 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6168 // optional op; may set condition codes
6169 mul w0, w1, w0 // w0<- op, w0-w3 changed
6170 GET_INST_OPCODE ip // extract opcode from rINST
6171 SET_VREG w0, w9 // vAA<- w0
6172 GOTO_OPCODE ip // jump to next instruction
6173 /* 10-12 instructions */
6174
6175
6176/* ------------------------------ */
6177 .balign 128
6178.L_op_div_int_lit8: /* 0xdb */
6179/* File: arm64/op_div_int_lit8.S */
6180/* File: arm64/binopLit8.S */
6181 /*
6182 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6183 * that specifies an instruction that performs "result = w0 op w1".
6184 * This could be an ARM instruction or a function call. (If the result
6185 * comes back in a register other than w0, you can override "result".)
6186 *
6187 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6188 * vCC (w1). Useful for integer division and modulus.
6189 *
6190 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6191 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6192 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6193 */
6194 /* binop/lit8 vAA, vBB, #+CC */
6195 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6196 lsr w9, wINST, #8 // w9<- AA
6197 and w2, w3, #255 // w2<- BB
6198 GET_VREG w0, w2 // w0<- vBB
6199 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6200 .if 1
6201 cbz w1, common_errDivideByZero
6202 .endif
6203 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6204 // optional op; may set condition codes
6205 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6206 GET_INST_OPCODE ip // extract opcode from rINST
6207 SET_VREG w0, w9 // vAA<- w0
6208 GOTO_OPCODE ip // jump to next instruction
6209 /* 10-12 instructions */
6210
6211
6212/* ------------------------------ */
6213 .balign 128
6214.L_op_rem_int_lit8: /* 0xdc */
6215/* File: arm64/op_rem_int_lit8.S */
6216/* File: arm64/binopLit8.S */
6217 /*
6218 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6219 * that specifies an instruction that performs "result = w0 op w1".
6220 * This could be an ARM instruction or a function call. (If the result
6221 * comes back in a register other than w0, you can override "result".)
6222 *
6223 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6224 * vCC (w1). Useful for integer division and modulus.
6225 *
6226 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6227 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6228 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6229 */
6230 /* binop/lit8 vAA, vBB, #+CC */
6231 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6232 lsr w9, wINST, #8 // w9<- AA
6233 and w2, w3, #255 // w2<- BB
6234 GET_VREG w0, w2 // w0<- vBB
6235 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6236 .if 1
6237 cbz w1, common_errDivideByZero
6238 .endif
6239 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6240 sdiv w3, w0, w1 // optional op; may set condition codes
6241 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6242 GET_INST_OPCODE ip // extract opcode from rINST
6243 SET_VREG w0, w9 // vAA<- w0
6244 GOTO_OPCODE ip // jump to next instruction
6245 /* 10-12 instructions */
6246
6247
6248/* ------------------------------ */
6249 .balign 128
6250.L_op_and_int_lit8: /* 0xdd */
6251/* File: arm64/op_and_int_lit8.S */
6252/* File: arm64/binopLit8.S */
6253 /*
6254 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6255 * that specifies an instruction that performs "result = w0 op w1".
6256 * This could be an ARM instruction or a function call. (If the result
6257 * comes back in a register other than w0, you can override "result".)
6258 *
6259 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6260 * vCC (w1). Useful for integer division and modulus.
6261 *
6262 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6263 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6264 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6265 */
6266 /* binop/lit8 vAA, vBB, #+CC */
6267 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6268 lsr w9, wINST, #8 // w9<- AA
6269 and w2, w3, #255 // w2<- BB
6270 GET_VREG w0, w2 // w0<- vBB
6271 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6272 .if 0
6273 cbz w1, common_errDivideByZero
6274 .endif
6275 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6276 // optional op; may set condition codes
6277 and w0, w0, w1 // w0<- op, w0-w3 changed
6278 GET_INST_OPCODE ip // extract opcode from rINST
6279 SET_VREG w0, w9 // vAA<- w0
6280 GOTO_OPCODE ip // jump to next instruction
6281 /* 10-12 instructions */
6282
6283
6284/* ------------------------------ */
6285 .balign 128
6286.L_op_or_int_lit8: /* 0xde */
6287/* File: arm64/op_or_int_lit8.S */
6288/* File: arm64/binopLit8.S */
6289 /*
6290 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6291 * that specifies an instruction that performs "result = w0 op w1".
6292 * This could be an ARM instruction or a function call. (If the result
6293 * comes back in a register other than w0, you can override "result".)
6294 *
6295 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6296 * vCC (w1). Useful for integer division and modulus.
6297 *
6298 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6299 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6300 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6301 */
6302 /* binop/lit8 vAA, vBB, #+CC */
6303 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6304 lsr w9, wINST, #8 // w9<- AA
6305 and w2, w3, #255 // w2<- BB
6306 GET_VREG w0, w2 // w0<- vBB
6307 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6308 .if 0
6309 cbz w1, common_errDivideByZero
6310 .endif
6311 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6312 // optional op; may set condition codes
6313 orr w0, w0, w1 // w0<- op, w0-w3 changed
6314 GET_INST_OPCODE ip // extract opcode from rINST
6315 SET_VREG w0, w9 // vAA<- w0
6316 GOTO_OPCODE ip // jump to next instruction
6317 /* 10-12 instructions */
6318
6319
6320/* ------------------------------ */
6321 .balign 128
6322.L_op_xor_int_lit8: /* 0xdf */
6323/* File: arm64/op_xor_int_lit8.S */
6324/* File: arm64/binopLit8.S */
6325 /*
6326 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6327 * that specifies an instruction that performs "result = w0 op w1".
6328 * This could be an ARM instruction or a function call. (If the result
6329 * comes back in a register other than w0, you can override "result".)
6330 *
6331 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6332 * vCC (w1). Useful for integer division and modulus.
6333 *
6334 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6335 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6336 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6337 */
6338 /* binop/lit8 vAA, vBB, #+CC */
6339 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6340 lsr w9, wINST, #8 // w9<- AA
6341 and w2, w3, #255 // w2<- BB
6342 GET_VREG w0, w2 // w0<- vBB
6343 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6344 .if 0
6345 cbz w1, common_errDivideByZero
6346 .endif
6347 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6348 // optional op; may set condition codes
6349 eor w0, w0, w1 // w0<- op, w0-w3 changed
6350 GET_INST_OPCODE ip // extract opcode from rINST
6351 SET_VREG w0, w9 // vAA<- w0
6352 GOTO_OPCODE ip // jump to next instruction
6353 /* 10-12 instructions */
6354
6355
6356/* ------------------------------ */
6357 .balign 128
6358.L_op_shl_int_lit8: /* 0xe0 */
6359/* File: arm64/op_shl_int_lit8.S */
6360/* File: arm64/binopLit8.S */
6361 /*
6362 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6363 * that specifies an instruction that performs "result = w0 op w1".
6364 * This could be an ARM instruction or a function call. (If the result
6365 * comes back in a register other than w0, you can override "result".)
6366 *
6367 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6368 * vCC (w1). Useful for integer division and modulus.
6369 *
6370 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6371 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6372 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6373 */
6374 /* binop/lit8 vAA, vBB, #+CC */
6375 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6376 lsr w9, wINST, #8 // w9<- AA
6377 and w2, w3, #255 // w2<- BB
6378 GET_VREG w0, w2 // w0<- vBB
6379 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6380 .if 0
6381 cbz w1, common_errDivideByZero
6382 .endif
6383 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6384 and w1, w1, #31 // optional op; may set condition codes
6385 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6386 GET_INST_OPCODE ip // extract opcode from rINST
6387 SET_VREG w0, w9 // vAA<- w0
6388 GOTO_OPCODE ip // jump to next instruction
6389 /* 10-12 instructions */
6390
6391
6392/* ------------------------------ */
6393 .balign 128
6394.L_op_shr_int_lit8: /* 0xe1 */
6395/* File: arm64/op_shr_int_lit8.S */
6396/* File: arm64/binopLit8.S */
6397 /*
6398 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6399 * that specifies an instruction that performs "result = w0 op w1".
6400 * This could be an ARM instruction or a function call. (If the result
6401 * comes back in a register other than w0, you can override "result".)
6402 *
6403 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6404 * vCC (w1). Useful for integer division and modulus.
6405 *
6406 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6407 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6408 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6409 */
6410 /* binop/lit8 vAA, vBB, #+CC */
6411 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6412 lsr w9, wINST, #8 // w9<- AA
6413 and w2, w3, #255 // w2<- BB
6414 GET_VREG w0, w2 // w0<- vBB
6415 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6416 .if 0
6417 cbz w1, common_errDivideByZero
6418 .endif
6419 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6420 and w1, w1, #31 // optional op; may set condition codes
6421 asr w0, w0, w1 // w0<- op, w0-w3 changed
6422 GET_INST_OPCODE ip // extract opcode from rINST
6423 SET_VREG w0, w9 // vAA<- w0
6424 GOTO_OPCODE ip // jump to next instruction
6425 /* 10-12 instructions */
6426
6427
6428/* ------------------------------ */
6429 .balign 128
6430.L_op_ushr_int_lit8: /* 0xe2 */
6431/* File: arm64/op_ushr_int_lit8.S */
6432/* File: arm64/binopLit8.S */
6433 /*
6434 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6435 * that specifies an instruction that performs "result = w0 op w1".
6436 * This could be an ARM instruction or a function call. (If the result
6437 * comes back in a register other than w0, you can override "result".)
6438 *
6439 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6440 * vCC (w1). Useful for integer division and modulus.
6441 *
6442 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6443 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6444 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6445 */
6446 /* binop/lit8 vAA, vBB, #+CC */
6447 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6448 lsr w9, wINST, #8 // w9<- AA
6449 and w2, w3, #255 // w2<- BB
6450 GET_VREG w0, w2 // w0<- vBB
6451 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6452 .if 0
6453 cbz w1, common_errDivideByZero
6454 .endif
6455 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6456 and w1, w1, #31 // optional op; may set condition codes
6457 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6458 GET_INST_OPCODE ip // extract opcode from rINST
6459 SET_VREG w0, w9 // vAA<- w0
6460 GOTO_OPCODE ip // jump to next instruction
6461 /* 10-12 instructions */
6462
6463
6464/* ------------------------------ */
6465 .balign 128
6466.L_op_iget_quick: /* 0xe3 */
6467/* File: arm64/op_iget_quick.S */
6468 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6469 /* op vA, vB, offset//CCCC */
6470 lsr w2, wINST, #12 // w2<- B
6471 FETCH w1, 1 // w1<- field byte offset
6472 GET_VREG w3, w2 // w3<- object we're operating on
6473 ubfx w2, wINST, #8, #4 // w2<- A
6474 cmp x3, #0 // check object for null
6475 beq common_errNullObject // object was null
6476 ldr w0, [x3, x1] // w0<- obj.field
6477 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6478
6479 SET_VREG w0, w2 // fp[A]<- w0
6480 GET_INST_OPCODE ip // extract opcode from rINST
6481 GOTO_OPCODE ip // jump to next instruction
6482
6483/* ------------------------------ */
6484 .balign 128
6485.L_op_iget_wide_quick: /* 0xe4 */
6486/* File: arm64/op_iget_wide_quick.S */
6487 /* iget-wide-quick vA, vB, offset//CCCC */
6488 lsr w2, wINST, #12 // w2<- B
6489 FETCH w4, 1 // w4<- field byte offset
6490 GET_VREG w3, w2 // w3<- object we're operating on
6491 ubfx w2, wINST, #8, #4 // w2<- A
6492 cbz w3, common_errNullObject // object was null
6493 add x4, x3, x4 // create direct pointer
6494 ldr x0, [x4]
6495 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6496 SET_VREG_WIDE x0, w2
6497 GET_INST_OPCODE ip // extract opcode from wINST
6498 GOTO_OPCODE ip // jump to next instruction
6499
6500/* ------------------------------ */
6501 .balign 128
6502.L_op_iget_object_quick: /* 0xe5 */
6503/* File: arm64/op_iget_object_quick.S */
6504 /* For: iget-object-quick */
6505 /* op vA, vB, offset//CCCC */
6506 lsr w2, wINST, #12 // w2<- B
6507 FETCH w1, 1 // w1<- field byte offset
6508 EXPORT_PC
6509 GET_VREG w0, w2 // w0<- object we're operating on
6510 bl artIGetObjectFromMterp // (obj, offset)
6511 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6512 ubfx w2, wINST, #8, #4 // w2<- A
6513 PREFETCH_INST 2
6514 cbnz w3, MterpPossibleException // bail out
6515 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6516 ADVANCE 2 // advance rPC
6517 GET_INST_OPCODE ip // extract opcode from wINST
6518 GOTO_OPCODE ip // jump to next instruction
6519
6520/* ------------------------------ */
6521 .balign 128
6522.L_op_iput_quick: /* 0xe6 */
6523/* File: arm64/op_iput_quick.S */
6524 /* For: iput-quick, iput-object-quick */
6525 /* op vA, vB, offset//CCCC */
6526 lsr w2, wINST, #12 // w2<- B
6527 FETCH w1, 1 // w1<- field byte offset
6528 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6529 ubfx w2, wINST, #8, #4 // w2<- A
6530 cmp w3, #0 // check object for null
6531 cbz w3, common_errNullObject // object was null
6532 GET_VREG w0, w2 // w0<- fp[A]
6533 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6534 str w0, [x3, x1] // obj.field<- w0
6535 GET_INST_OPCODE ip // extract opcode from rINST
6536 GOTO_OPCODE ip // jump to next instruction
6537
6538/* ------------------------------ */
6539 .balign 128
6540.L_op_iput_wide_quick: /* 0xe7 */
6541/* File: arm64/op_iput_wide_quick.S */
6542 /* iput-wide-quick vA, vB, offset//CCCC */
6543 lsr w2, wINST, #12 // w2<- B
6544 FETCH w3, 1 // w3<- field byte offset
6545 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6546 ubfx w0, wINST, #8, #4 // w0<- A
6547 cmp w2, #0 // check object for null
6548 beq common_errNullObject // object was null
6549 GET_VREG_WIDE x0, w0 // x0-< fp[A]
6550 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6551 add x1, x2, x3 // create a direct pointer
6552 str x0, [x1]
6553 GET_INST_OPCODE ip // extract opcode from wINST
6554 GOTO_OPCODE ip // jump to next instruction
6555
6556/* ------------------------------ */
6557 .balign 128
6558.L_op_iput_object_quick: /* 0xe8 */
6559/* File: arm64/op_iput_object_quick.S */
6560 EXPORT_PC
6561 add x0, xFP, #OFF_FP_SHADOWFRAME
6562 mov x1, xPC
6563 mov w2, wINST
6564 bl MterpIputObjectQuick
6565 cbz w0, MterpException
6566 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6567 GET_INST_OPCODE ip // extract opcode from rINST
6568 GOTO_OPCODE ip // jump to next instruction
6569
6570/* ------------------------------ */
6571 .balign 128
6572.L_op_invoke_virtual_quick: /* 0xe9 */
6573/* File: arm64/op_invoke_virtual_quick.S */
6574/* File: arm64/invoke.S */
6575 /*
6576 * Generic invoke handler wrapper.
6577 */
6578 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6579 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6580 .extern MterpInvokeVirtualQuick
6581 EXPORT_PC
6582 mov x0, xSELF
6583 add x1, xFP, #OFF_FP_SHADOWFRAME
6584 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006585 mov x3, xINST
6586 bl MterpInvokeVirtualQuick
6587 cbz w0, MterpException
6588 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006589 bl MterpShouldSwitchInterpreters
6590 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006591 GET_INST_OPCODE ip
6592 GOTO_OPCODE ip
6593
6594
6595
6596/* ------------------------------ */
6597 .balign 128
6598.L_op_invoke_virtual_range_quick: /* 0xea */
6599/* File: arm64/op_invoke_virtual_range_quick.S */
6600/* File: arm64/invoke.S */
6601 /*
6602 * Generic invoke handler wrapper.
6603 */
6604 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6605 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6606 .extern MterpInvokeVirtualQuickRange
6607 EXPORT_PC
6608 mov x0, xSELF
6609 add x1, xFP, #OFF_FP_SHADOWFRAME
6610 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006611 mov x3, xINST
6612 bl MterpInvokeVirtualQuickRange
6613 cbz w0, MterpException
6614 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006615 bl MterpShouldSwitchInterpreters
6616 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006617 GET_INST_OPCODE ip
6618 GOTO_OPCODE ip
6619
6620
6621
6622/* ------------------------------ */
6623 .balign 128
6624.L_op_iput_boolean_quick: /* 0xeb */
6625/* File: arm64/op_iput_boolean_quick.S */
6626/* File: arm64/op_iput_quick.S */
6627 /* For: iput-quick, iput-object-quick */
6628 /* op vA, vB, offset//CCCC */
6629 lsr w2, wINST, #12 // w2<- B
6630 FETCH w1, 1 // w1<- field byte offset
6631 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6632 ubfx w2, wINST, #8, #4 // w2<- A
6633 cmp w3, #0 // check object for null
6634 cbz w3, common_errNullObject // object was null
6635 GET_VREG w0, w2 // w0<- fp[A]
6636 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6637 strb w0, [x3, x1] // obj.field<- w0
6638 GET_INST_OPCODE ip // extract opcode from rINST
6639 GOTO_OPCODE ip // jump to next instruction
6640
6641
6642/* ------------------------------ */
6643 .balign 128
6644.L_op_iput_byte_quick: /* 0xec */
6645/* File: arm64/op_iput_byte_quick.S */
6646/* File: arm64/op_iput_quick.S */
6647 /* For: iput-quick, iput-object-quick */
6648 /* op vA, vB, offset//CCCC */
6649 lsr w2, wINST, #12 // w2<- B
6650 FETCH w1, 1 // w1<- field byte offset
6651 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6652 ubfx w2, wINST, #8, #4 // w2<- A
6653 cmp w3, #0 // check object for null
6654 cbz w3, common_errNullObject // object was null
6655 GET_VREG w0, w2 // w0<- fp[A]
6656 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6657 strb w0, [x3, x1] // obj.field<- w0
6658 GET_INST_OPCODE ip // extract opcode from rINST
6659 GOTO_OPCODE ip // jump to next instruction
6660
6661
6662/* ------------------------------ */
6663 .balign 128
6664.L_op_iput_char_quick: /* 0xed */
6665/* File: arm64/op_iput_char_quick.S */
6666/* File: arm64/op_iput_quick.S */
6667 /* For: iput-quick, iput-object-quick */
6668 /* op vA, vB, offset//CCCC */
6669 lsr w2, wINST, #12 // w2<- B
6670 FETCH w1, 1 // w1<- field byte offset
6671 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6672 ubfx w2, wINST, #8, #4 // w2<- A
6673 cmp w3, #0 // check object for null
6674 cbz w3, common_errNullObject // object was null
6675 GET_VREG w0, w2 // w0<- fp[A]
6676 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6677 strh w0, [x3, x1] // obj.field<- w0
6678 GET_INST_OPCODE ip // extract opcode from rINST
6679 GOTO_OPCODE ip // jump to next instruction
6680
6681
6682/* ------------------------------ */
6683 .balign 128
6684.L_op_iput_short_quick: /* 0xee */
6685/* File: arm64/op_iput_short_quick.S */
6686/* File: arm64/op_iput_quick.S */
6687 /* For: iput-quick, iput-object-quick */
6688 /* op vA, vB, offset//CCCC */
6689 lsr w2, wINST, #12 // w2<- B
6690 FETCH w1, 1 // w1<- field byte offset
6691 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6692 ubfx w2, wINST, #8, #4 // w2<- A
6693 cmp w3, #0 // check object for null
6694 cbz w3, common_errNullObject // object was null
6695 GET_VREG w0, w2 // w0<- fp[A]
6696 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6697 strh w0, [x3, x1] // obj.field<- w0
6698 GET_INST_OPCODE ip // extract opcode from rINST
6699 GOTO_OPCODE ip // jump to next instruction
6700
6701
6702/* ------------------------------ */
6703 .balign 128
6704.L_op_iget_boolean_quick: /* 0xef */
6705/* File: arm64/op_iget_boolean_quick.S */
6706/* File: arm64/op_iget_quick.S */
6707 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6708 /* op vA, vB, offset//CCCC */
6709 lsr w2, wINST, #12 // w2<- B
6710 FETCH w1, 1 // w1<- field byte offset
6711 GET_VREG w3, w2 // w3<- object we're operating on
6712 ubfx w2, wINST, #8, #4 // w2<- A
6713 cmp x3, #0 // check object for null
6714 beq common_errNullObject // object was null
6715 ldrb w0, [x3, x1] // w0<- obj.field
6716 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6717
6718 SET_VREG w0, w2 // fp[A]<- w0
6719 GET_INST_OPCODE ip // extract opcode from rINST
6720 GOTO_OPCODE ip // jump to next instruction
6721
6722
6723/* ------------------------------ */
6724 .balign 128
6725.L_op_iget_byte_quick: /* 0xf0 */
6726/* File: arm64/op_iget_byte_quick.S */
6727/* File: arm64/op_iget_quick.S */
6728 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6729 /* op vA, vB, offset//CCCC */
6730 lsr w2, wINST, #12 // w2<- B
6731 FETCH w1, 1 // w1<- field byte offset
6732 GET_VREG w3, w2 // w3<- object we're operating on
6733 ubfx w2, wINST, #8, #4 // w2<- A
6734 cmp x3, #0 // check object for null
6735 beq common_errNullObject // object was null
6736 ldrsb w0, [x3, x1] // w0<- obj.field
6737 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6738
6739 SET_VREG w0, w2 // fp[A]<- w0
6740 GET_INST_OPCODE ip // extract opcode from rINST
6741 GOTO_OPCODE ip // jump to next instruction
6742
6743
6744/* ------------------------------ */
6745 .balign 128
6746.L_op_iget_char_quick: /* 0xf1 */
6747/* File: arm64/op_iget_char_quick.S */
6748/* File: arm64/op_iget_quick.S */
6749 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6750 /* op vA, vB, offset//CCCC */
6751 lsr w2, wINST, #12 // w2<- B
6752 FETCH w1, 1 // w1<- field byte offset
6753 GET_VREG w3, w2 // w3<- object we're operating on
6754 ubfx w2, wINST, #8, #4 // w2<- A
6755 cmp x3, #0 // check object for null
6756 beq common_errNullObject // object was null
6757 ldrh w0, [x3, x1] // w0<- obj.field
6758 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6759
6760 SET_VREG w0, w2 // fp[A]<- w0
6761 GET_INST_OPCODE ip // extract opcode from rINST
6762 GOTO_OPCODE ip // jump to next instruction
6763
6764
6765/* ------------------------------ */
6766 .balign 128
6767.L_op_iget_short_quick: /* 0xf2 */
6768/* File: arm64/op_iget_short_quick.S */
6769/* File: arm64/op_iget_quick.S */
6770 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6771 /* op vA, vB, offset//CCCC */
6772 lsr w2, wINST, #12 // w2<- B
6773 FETCH w1, 1 // w1<- field byte offset
6774 GET_VREG w3, w2 // w3<- object we're operating on
6775 ubfx w2, wINST, #8, #4 // w2<- A
6776 cmp x3, #0 // check object for null
6777 beq common_errNullObject // object was null
6778 ldrsh w0, [x3, x1] // w0<- obj.field
6779 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6780
6781 SET_VREG w0, w2 // fp[A]<- w0
6782 GET_INST_OPCODE ip // extract opcode from rINST
6783 GOTO_OPCODE ip // jump to next instruction
6784
6785
6786/* ------------------------------ */
6787 .balign 128
6788.L_op_invoke_lambda: /* 0xf3 */
6789/* Transfer stub to alternate interpreter */
6790 b MterpFallback
6791
6792
6793/* ------------------------------ */
6794 .balign 128
6795.L_op_unused_f4: /* 0xf4 */
6796/* File: arm64/op_unused_f4.S */
6797/* File: arm64/unused.S */
6798/*
6799 * Bail to reference interpreter to throw.
6800 */
6801 b MterpFallback
6802
6803
6804/* ------------------------------ */
6805 .balign 128
6806.L_op_capture_variable: /* 0xf5 */
6807/* Transfer stub to alternate interpreter */
6808 b MterpFallback
6809
6810
6811/* ------------------------------ */
6812 .balign 128
6813.L_op_create_lambda: /* 0xf6 */
6814/* Transfer stub to alternate interpreter */
6815 b MterpFallback
6816
6817
6818/* ------------------------------ */
6819 .balign 128
6820.L_op_liberate_variable: /* 0xf7 */
6821/* Transfer stub to alternate interpreter */
6822 b MterpFallback
6823
6824
6825/* ------------------------------ */
6826 .balign 128
6827.L_op_box_lambda: /* 0xf8 */
6828/* Transfer stub to alternate interpreter */
6829 b MterpFallback
6830
6831
6832/* ------------------------------ */
6833 .balign 128
6834.L_op_unbox_lambda: /* 0xf9 */
6835/* Transfer stub to alternate interpreter */
6836 b MterpFallback
6837
6838
6839/* ------------------------------ */
6840 .balign 128
6841.L_op_unused_fa: /* 0xfa */
6842/* File: arm64/op_unused_fa.S */
6843/* File: arm64/unused.S */
6844/*
6845 * Bail to reference interpreter to throw.
6846 */
6847 b MterpFallback
6848
6849
6850/* ------------------------------ */
6851 .balign 128
6852.L_op_unused_fb: /* 0xfb */
6853/* File: arm64/op_unused_fb.S */
6854/* File: arm64/unused.S */
6855/*
6856 * Bail to reference interpreter to throw.
6857 */
6858 b MterpFallback
6859
6860
6861/* ------------------------------ */
6862 .balign 128
6863.L_op_unused_fc: /* 0xfc */
6864/* File: arm64/op_unused_fc.S */
6865/* File: arm64/unused.S */
6866/*
6867 * Bail to reference interpreter to throw.
6868 */
6869 b MterpFallback
6870
6871
6872/* ------------------------------ */
6873 .balign 128
6874.L_op_unused_fd: /* 0xfd */
6875/* File: arm64/op_unused_fd.S */
6876/* File: arm64/unused.S */
6877/*
6878 * Bail to reference interpreter to throw.
6879 */
6880 b MterpFallback
6881
6882
6883/* ------------------------------ */
6884 .balign 128
6885.L_op_unused_fe: /* 0xfe */
6886/* File: arm64/op_unused_fe.S */
6887/* File: arm64/unused.S */
6888/*
6889 * Bail to reference interpreter to throw.
6890 */
6891 b MterpFallback
6892
6893
6894/* ------------------------------ */
6895 .balign 128
6896.L_op_unused_ff: /* 0xff */
6897/* File: arm64/op_unused_ff.S */
6898/* File: arm64/unused.S */
6899/*
6900 * Bail to reference interpreter to throw.
6901 */
6902 b MterpFallback
6903
6904
6905 .balign 128
6906 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
6907 .global artMterpAsmInstructionEnd
6908artMterpAsmInstructionEnd:
6909
6910/*
6911 * ===========================================================================
6912 * Sister implementations
6913 * ===========================================================================
6914 */
6915 .global artMterpAsmSisterStart
6916 .type artMterpAsmSisterStart, %function
6917 .text
6918 .balign 4
6919artMterpAsmSisterStart:
6920
6921 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
6922 .global artMterpAsmSisterEnd
6923artMterpAsmSisterEnd:
6924
6925
6926 .global artMterpAsmAltInstructionStart
6927 .type artMterpAsmAltInstructionStart, %function
6928 .text
6929
6930artMterpAsmAltInstructionStart = .L_ALT_op_nop
6931/* ------------------------------ */
6932 .balign 128
6933.L_ALT_op_nop: /* 0x00 */
6934/* File: arm64/alt_stub.S */
6935/*
6936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6937 * any interesting requests and then jump to the real instruction
6938 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6939 */
6940 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006941 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6942 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
6943 mov x0, xSELF
6944 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006945 mov x2, xPC
6946 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006947
6948/* ------------------------------ */
6949 .balign 128
6950.L_ALT_op_move: /* 0x01 */
6951/* File: arm64/alt_stub.S */
6952/*
6953 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6954 * any interesting requests and then jump to the real instruction
6955 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6956 */
6957 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006958 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6959 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
6960 mov x0, xSELF
6961 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006962 mov x2, xPC
6963 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006964
6965/* ------------------------------ */
6966 .balign 128
6967.L_ALT_op_move_from16: /* 0x02 */
6968/* File: arm64/alt_stub.S */
6969/*
6970 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6971 * any interesting requests and then jump to the real instruction
6972 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6973 */
6974 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006975 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6976 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
6977 mov x0, xSELF
6978 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006979 mov x2, xPC
6980 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006981
6982/* ------------------------------ */
6983 .balign 128
6984.L_ALT_op_move_16: /* 0x03 */
6985/* File: arm64/alt_stub.S */
6986/*
6987 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6988 * any interesting requests and then jump to the real instruction
6989 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6990 */
6991 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006992 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6993 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
6994 mov x0, xSELF
6995 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006996 mov x2, xPC
6997 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006998
6999/* ------------------------------ */
7000 .balign 128
7001.L_ALT_op_move_wide: /* 0x04 */
7002/* File: arm64/alt_stub.S */
7003/*
7004 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7005 * any interesting requests and then jump to the real instruction
7006 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7007 */
7008 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007009 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7010 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
7011 mov x0, xSELF
7012 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007013 mov x2, xPC
7014 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007015
7016/* ------------------------------ */
7017 .balign 128
7018.L_ALT_op_move_wide_from16: /* 0x05 */
7019/* File: arm64/alt_stub.S */
7020/*
7021 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7022 * any interesting requests and then jump to the real instruction
7023 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7024 */
7025 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007026 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7027 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
7028 mov x0, xSELF
7029 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007030 mov x2, xPC
7031 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007032
7033/* ------------------------------ */
7034 .balign 128
7035.L_ALT_op_move_wide_16: /* 0x06 */
7036/* File: arm64/alt_stub.S */
7037/*
7038 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7039 * any interesting requests and then jump to the real instruction
7040 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7041 */
7042 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007043 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7044 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7045 mov x0, xSELF
7046 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007047 mov x2, xPC
7048 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007049
7050/* ------------------------------ */
7051 .balign 128
7052.L_ALT_op_move_object: /* 0x07 */
7053/* File: arm64/alt_stub.S */
7054/*
7055 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7056 * any interesting requests and then jump to the real instruction
7057 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7058 */
7059 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007060 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7061 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7062 mov x0, xSELF
7063 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007064 mov x2, xPC
7065 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007066
7067/* ------------------------------ */
7068 .balign 128
7069.L_ALT_op_move_object_from16: /* 0x08 */
7070/* File: arm64/alt_stub.S */
7071/*
7072 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7073 * any interesting requests and then jump to the real instruction
7074 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7075 */
7076 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007077 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7078 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7079 mov x0, xSELF
7080 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007081 mov x2, xPC
7082 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007083
7084/* ------------------------------ */
7085 .balign 128
7086.L_ALT_op_move_object_16: /* 0x09 */
7087/* File: arm64/alt_stub.S */
7088/*
7089 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7090 * any interesting requests and then jump to the real instruction
7091 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7092 */
7093 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007094 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7095 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7096 mov x0, xSELF
7097 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007098 mov x2, xPC
7099 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007100
7101/* ------------------------------ */
7102 .balign 128
7103.L_ALT_op_move_result: /* 0x0a */
7104/* File: arm64/alt_stub.S */
7105/*
7106 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7107 * any interesting requests and then jump to the real instruction
7108 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7109 */
7110 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007111 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7112 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7113 mov x0, xSELF
7114 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007115 mov x2, xPC
7116 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007117
7118/* ------------------------------ */
7119 .balign 128
7120.L_ALT_op_move_result_wide: /* 0x0b */
7121/* File: arm64/alt_stub.S */
7122/*
7123 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7124 * any interesting requests and then jump to the real instruction
7125 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7126 */
7127 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007128 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7129 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7130 mov x0, xSELF
7131 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007132 mov x2, xPC
7133 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007134
7135/* ------------------------------ */
7136 .balign 128
7137.L_ALT_op_move_result_object: /* 0x0c */
7138/* File: arm64/alt_stub.S */
7139/*
7140 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7141 * any interesting requests and then jump to the real instruction
7142 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7143 */
7144 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007145 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7146 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7147 mov x0, xSELF
7148 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007149 mov x2, xPC
7150 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007151
7152/* ------------------------------ */
7153 .balign 128
7154.L_ALT_op_move_exception: /* 0x0d */
7155/* File: arm64/alt_stub.S */
7156/*
7157 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7158 * any interesting requests and then jump to the real instruction
7159 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7160 */
7161 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007162 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7163 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7164 mov x0, xSELF
7165 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007166 mov x2, xPC
7167 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007168
7169/* ------------------------------ */
7170 .balign 128
7171.L_ALT_op_return_void: /* 0x0e */
7172/* File: arm64/alt_stub.S */
7173/*
7174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7175 * any interesting requests and then jump to the real instruction
7176 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7177 */
7178 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007179 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7180 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7181 mov x0, xSELF
7182 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007183 mov x2, xPC
7184 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007185
7186/* ------------------------------ */
7187 .balign 128
7188.L_ALT_op_return: /* 0x0f */
7189/* File: arm64/alt_stub.S */
7190/*
7191 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7192 * any interesting requests and then jump to the real instruction
7193 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7194 */
7195 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007196 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7197 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7198 mov x0, xSELF
7199 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007200 mov x2, xPC
7201 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007202
7203/* ------------------------------ */
7204 .balign 128
7205.L_ALT_op_return_wide: /* 0x10 */
7206/* File: arm64/alt_stub.S */
7207/*
7208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7209 * any interesting requests and then jump to the real instruction
7210 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7211 */
7212 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007213 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7214 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7215 mov x0, xSELF
7216 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007217 mov x2, xPC
7218 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007219
7220/* ------------------------------ */
7221 .balign 128
7222.L_ALT_op_return_object: /* 0x11 */
7223/* File: arm64/alt_stub.S */
7224/*
7225 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7226 * any interesting requests and then jump to the real instruction
7227 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7228 */
7229 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007230 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7231 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7232 mov x0, xSELF
7233 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007234 mov x2, xPC
7235 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007236
7237/* ------------------------------ */
7238 .balign 128
7239.L_ALT_op_const_4: /* 0x12 */
7240/* File: arm64/alt_stub.S */
7241/*
7242 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7243 * any interesting requests and then jump to the real instruction
7244 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7245 */
7246 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007247 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7248 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7249 mov x0, xSELF
7250 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007251 mov x2, xPC
7252 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007253
7254/* ------------------------------ */
7255 .balign 128
7256.L_ALT_op_const_16: /* 0x13 */
7257/* File: arm64/alt_stub.S */
7258/*
7259 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7260 * any interesting requests and then jump to the real instruction
7261 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7262 */
7263 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007264 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7265 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7266 mov x0, xSELF
7267 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007268 mov x2, xPC
7269 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007270
7271/* ------------------------------ */
7272 .balign 128
7273.L_ALT_op_const: /* 0x14 */
7274/* File: arm64/alt_stub.S */
7275/*
7276 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7277 * any interesting requests and then jump to the real instruction
7278 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7279 */
7280 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007281 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7282 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7283 mov x0, xSELF
7284 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007285 mov x2, xPC
7286 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007287
7288/* ------------------------------ */
7289 .balign 128
7290.L_ALT_op_const_high16: /* 0x15 */
7291/* File: arm64/alt_stub.S */
7292/*
7293 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7294 * any interesting requests and then jump to the real instruction
7295 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7296 */
7297 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007298 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7299 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7300 mov x0, xSELF
7301 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007302 mov x2, xPC
7303 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007304
7305/* ------------------------------ */
7306 .balign 128
7307.L_ALT_op_const_wide_16: /* 0x16 */
7308/* File: arm64/alt_stub.S */
7309/*
7310 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7311 * any interesting requests and then jump to the real instruction
7312 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7313 */
7314 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007315 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7316 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7317 mov x0, xSELF
7318 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007319 mov x2, xPC
7320 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007321
7322/* ------------------------------ */
7323 .balign 128
7324.L_ALT_op_const_wide_32: /* 0x17 */
7325/* File: arm64/alt_stub.S */
7326/*
7327 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7328 * any interesting requests and then jump to the real instruction
7329 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7330 */
7331 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007332 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7333 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7334 mov x0, xSELF
7335 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007336 mov x2, xPC
7337 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007338
7339/* ------------------------------ */
7340 .balign 128
7341.L_ALT_op_const_wide: /* 0x18 */
7342/* File: arm64/alt_stub.S */
7343/*
7344 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7345 * any interesting requests and then jump to the real instruction
7346 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7347 */
7348 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007349 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7350 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7351 mov x0, xSELF
7352 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007353 mov x2, xPC
7354 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007355
7356/* ------------------------------ */
7357 .balign 128
7358.L_ALT_op_const_wide_high16: /* 0x19 */
7359/* File: arm64/alt_stub.S */
7360/*
7361 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7362 * any interesting requests and then jump to the real instruction
7363 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7364 */
7365 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007366 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7367 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7368 mov x0, xSELF
7369 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007370 mov x2, xPC
7371 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007372
7373/* ------------------------------ */
7374 .balign 128
7375.L_ALT_op_const_string: /* 0x1a */
7376/* File: arm64/alt_stub.S */
7377/*
7378 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7379 * any interesting requests and then jump to the real instruction
7380 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7381 */
7382 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007383 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7384 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7385 mov x0, xSELF
7386 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007387 mov x2, xPC
7388 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007389
7390/* ------------------------------ */
7391 .balign 128
7392.L_ALT_op_const_string_jumbo: /* 0x1b */
7393/* File: arm64/alt_stub.S */
7394/*
7395 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7396 * any interesting requests and then jump to the real instruction
7397 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7398 */
7399 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007400 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7401 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7402 mov x0, xSELF
7403 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007404 mov x2, xPC
7405 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007406
7407/* ------------------------------ */
7408 .balign 128
7409.L_ALT_op_const_class: /* 0x1c */
7410/* File: arm64/alt_stub.S */
7411/*
7412 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7413 * any interesting requests and then jump to the real instruction
7414 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7415 */
7416 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007417 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7418 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7419 mov x0, xSELF
7420 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007421 mov x2, xPC
7422 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007423
7424/* ------------------------------ */
7425 .balign 128
7426.L_ALT_op_monitor_enter: /* 0x1d */
7427/* File: arm64/alt_stub.S */
7428/*
7429 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7430 * any interesting requests and then jump to the real instruction
7431 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7432 */
7433 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007434 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7435 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7436 mov x0, xSELF
7437 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007438 mov x2, xPC
7439 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007440
7441/* ------------------------------ */
7442 .balign 128
7443.L_ALT_op_monitor_exit: /* 0x1e */
7444/* File: arm64/alt_stub.S */
7445/*
7446 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7447 * any interesting requests and then jump to the real instruction
7448 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7449 */
7450 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007451 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7452 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7453 mov x0, xSELF
7454 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007455 mov x2, xPC
7456 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007457
7458/* ------------------------------ */
7459 .balign 128
7460.L_ALT_op_check_cast: /* 0x1f */
7461/* File: arm64/alt_stub.S */
7462/*
7463 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7464 * any interesting requests and then jump to the real instruction
7465 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7466 */
7467 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007468 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7469 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7470 mov x0, xSELF
7471 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007472 mov x2, xPC
7473 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007474
7475/* ------------------------------ */
7476 .balign 128
7477.L_ALT_op_instance_of: /* 0x20 */
7478/* File: arm64/alt_stub.S */
7479/*
7480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7481 * any interesting requests and then jump to the real instruction
7482 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7483 */
7484 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007485 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7486 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7487 mov x0, xSELF
7488 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007489 mov x2, xPC
7490 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007491
7492/* ------------------------------ */
7493 .balign 128
7494.L_ALT_op_array_length: /* 0x21 */
7495/* File: arm64/alt_stub.S */
7496/*
7497 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7498 * any interesting requests and then jump to the real instruction
7499 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7500 */
7501 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007502 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7503 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7504 mov x0, xSELF
7505 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007506 mov x2, xPC
7507 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007508
7509/* ------------------------------ */
7510 .balign 128
7511.L_ALT_op_new_instance: /* 0x22 */
7512/* File: arm64/alt_stub.S */
7513/*
7514 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7515 * any interesting requests and then jump to the real instruction
7516 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7517 */
7518 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007519 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7520 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7521 mov x0, xSELF
7522 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007523 mov x2, xPC
7524 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007525
7526/* ------------------------------ */
7527 .balign 128
7528.L_ALT_op_new_array: /* 0x23 */
7529/* File: arm64/alt_stub.S */
7530/*
7531 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7532 * any interesting requests and then jump to the real instruction
7533 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7534 */
7535 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007536 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7537 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7538 mov x0, xSELF
7539 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007540 mov x2, xPC
7541 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007542
7543/* ------------------------------ */
7544 .balign 128
7545.L_ALT_op_filled_new_array: /* 0x24 */
7546/* File: arm64/alt_stub.S */
7547/*
7548 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7549 * any interesting requests and then jump to the real instruction
7550 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7551 */
7552 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007553 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7554 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7555 mov x0, xSELF
7556 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007557 mov x2, xPC
7558 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007559
7560/* ------------------------------ */
7561 .balign 128
7562.L_ALT_op_filled_new_array_range: /* 0x25 */
7563/* File: arm64/alt_stub.S */
7564/*
7565 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7566 * any interesting requests and then jump to the real instruction
7567 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7568 */
7569 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007570 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7571 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7572 mov x0, xSELF
7573 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007574 mov x2, xPC
7575 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007576
7577/* ------------------------------ */
7578 .balign 128
7579.L_ALT_op_fill_array_data: /* 0x26 */
7580/* File: arm64/alt_stub.S */
7581/*
7582 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7583 * any interesting requests and then jump to the real instruction
7584 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7585 */
7586 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007587 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7588 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7589 mov x0, xSELF
7590 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007591 mov x2, xPC
7592 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007593
7594/* ------------------------------ */
7595 .balign 128
7596.L_ALT_op_throw: /* 0x27 */
7597/* File: arm64/alt_stub.S */
7598/*
7599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7600 * any interesting requests and then jump to the real instruction
7601 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7602 */
7603 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007604 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7605 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
7606 mov x0, xSELF
7607 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007608 mov x2, xPC
7609 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007610
7611/* ------------------------------ */
7612 .balign 128
7613.L_ALT_op_goto: /* 0x28 */
7614/* File: arm64/alt_stub.S */
7615/*
7616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7617 * any interesting requests and then jump to the real instruction
7618 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7619 */
7620 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007621 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7622 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
7623 mov x0, xSELF
7624 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007625 mov x2, xPC
7626 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007627
7628/* ------------------------------ */
7629 .balign 128
7630.L_ALT_op_goto_16: /* 0x29 */
7631/* File: arm64/alt_stub.S */
7632/*
7633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7634 * any interesting requests and then jump to the real instruction
7635 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7636 */
7637 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007638 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7639 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
7640 mov x0, xSELF
7641 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007642 mov x2, xPC
7643 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007644
7645/* ------------------------------ */
7646 .balign 128
7647.L_ALT_op_goto_32: /* 0x2a */
7648/* File: arm64/alt_stub.S */
7649/*
7650 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7651 * any interesting requests and then jump to the real instruction
7652 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7653 */
7654 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007655 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7656 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
7657 mov x0, xSELF
7658 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007659 mov x2, xPC
7660 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007661
7662/* ------------------------------ */
7663 .balign 128
7664.L_ALT_op_packed_switch: /* 0x2b */
7665/* File: arm64/alt_stub.S */
7666/*
7667 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7668 * any interesting requests and then jump to the real instruction
7669 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7670 */
7671 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007672 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7673 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
7674 mov x0, xSELF
7675 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007676 mov x2, xPC
7677 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007678
7679/* ------------------------------ */
7680 .balign 128
7681.L_ALT_op_sparse_switch: /* 0x2c */
7682/* File: arm64/alt_stub.S */
7683/*
7684 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7685 * any interesting requests and then jump to the real instruction
7686 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7687 */
7688 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007689 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7690 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
7691 mov x0, xSELF
7692 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007693 mov x2, xPC
7694 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007695
7696/* ------------------------------ */
7697 .balign 128
7698.L_ALT_op_cmpl_float: /* 0x2d */
7699/* File: arm64/alt_stub.S */
7700/*
7701 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7702 * any interesting requests and then jump to the real instruction
7703 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7704 */
7705 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007706 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7707 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
7708 mov x0, xSELF
7709 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007710 mov x2, xPC
7711 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007712
7713/* ------------------------------ */
7714 .balign 128
7715.L_ALT_op_cmpg_float: /* 0x2e */
7716/* File: arm64/alt_stub.S */
7717/*
7718 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7719 * any interesting requests and then jump to the real instruction
7720 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7721 */
7722 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007723 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7724 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
7725 mov x0, xSELF
7726 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007727 mov x2, xPC
7728 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007729
7730/* ------------------------------ */
7731 .balign 128
7732.L_ALT_op_cmpl_double: /* 0x2f */
7733/* File: arm64/alt_stub.S */
7734/*
7735 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7736 * any interesting requests and then jump to the real instruction
7737 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7738 */
7739 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007740 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7741 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
7742 mov x0, xSELF
7743 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007744 mov x2, xPC
7745 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007746
7747/* ------------------------------ */
7748 .balign 128
7749.L_ALT_op_cmpg_double: /* 0x30 */
7750/* File: arm64/alt_stub.S */
7751/*
7752 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7753 * any interesting requests and then jump to the real instruction
7754 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7755 */
7756 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007757 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7758 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
7759 mov x0, xSELF
7760 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007761 mov x2, xPC
7762 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007763
7764/* ------------------------------ */
7765 .balign 128
7766.L_ALT_op_cmp_long: /* 0x31 */
7767/* File: arm64/alt_stub.S */
7768/*
7769 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7770 * any interesting requests and then jump to the real instruction
7771 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7772 */
7773 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007774 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7775 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
7776 mov x0, xSELF
7777 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007778 mov x2, xPC
7779 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007780
7781/* ------------------------------ */
7782 .balign 128
7783.L_ALT_op_if_eq: /* 0x32 */
7784/* File: arm64/alt_stub.S */
7785/*
7786 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7787 * any interesting requests and then jump to the real instruction
7788 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7789 */
7790 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007791 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7792 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
7793 mov x0, xSELF
7794 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007795 mov x2, xPC
7796 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007797
7798/* ------------------------------ */
7799 .balign 128
7800.L_ALT_op_if_ne: /* 0x33 */
7801/* File: arm64/alt_stub.S */
7802/*
7803 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7804 * any interesting requests and then jump to the real instruction
7805 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7806 */
7807 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007808 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7809 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
7810 mov x0, xSELF
7811 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007812 mov x2, xPC
7813 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007814
7815/* ------------------------------ */
7816 .balign 128
7817.L_ALT_op_if_lt: /* 0x34 */
7818/* File: arm64/alt_stub.S */
7819/*
7820 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7821 * any interesting requests and then jump to the real instruction
7822 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7823 */
7824 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007825 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7826 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
7827 mov x0, xSELF
7828 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007829 mov x2, xPC
7830 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007831
7832/* ------------------------------ */
7833 .balign 128
7834.L_ALT_op_if_ge: /* 0x35 */
7835/* File: arm64/alt_stub.S */
7836/*
7837 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7838 * any interesting requests and then jump to the real instruction
7839 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7840 */
7841 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007842 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7843 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
7844 mov x0, xSELF
7845 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007846 mov x2, xPC
7847 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007848
7849/* ------------------------------ */
7850 .balign 128
7851.L_ALT_op_if_gt: /* 0x36 */
7852/* File: arm64/alt_stub.S */
7853/*
7854 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7855 * any interesting requests and then jump to the real instruction
7856 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7857 */
7858 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007859 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7860 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
7861 mov x0, xSELF
7862 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007863 mov x2, xPC
7864 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007865
7866/* ------------------------------ */
7867 .balign 128
7868.L_ALT_op_if_le: /* 0x37 */
7869/* File: arm64/alt_stub.S */
7870/*
7871 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7872 * any interesting requests and then jump to the real instruction
7873 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7874 */
7875 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007876 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7877 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
7878 mov x0, xSELF
7879 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007880 mov x2, xPC
7881 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007882
7883/* ------------------------------ */
7884 .balign 128
7885.L_ALT_op_if_eqz: /* 0x38 */
7886/* File: arm64/alt_stub.S */
7887/*
7888 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7889 * any interesting requests and then jump to the real instruction
7890 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7891 */
7892 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007893 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7894 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
7895 mov x0, xSELF
7896 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007897 mov x2, xPC
7898 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007899
7900/* ------------------------------ */
7901 .balign 128
7902.L_ALT_op_if_nez: /* 0x39 */
7903/* File: arm64/alt_stub.S */
7904/*
7905 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7906 * any interesting requests and then jump to the real instruction
7907 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7908 */
7909 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007910 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7911 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
7912 mov x0, xSELF
7913 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007914 mov x2, xPC
7915 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007916
7917/* ------------------------------ */
7918 .balign 128
7919.L_ALT_op_if_ltz: /* 0x3a */
7920/* File: arm64/alt_stub.S */
7921/*
7922 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7923 * any interesting requests and then jump to the real instruction
7924 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7925 */
7926 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007927 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7928 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
7929 mov x0, xSELF
7930 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007931 mov x2, xPC
7932 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007933
7934/* ------------------------------ */
7935 .balign 128
7936.L_ALT_op_if_gez: /* 0x3b */
7937/* File: arm64/alt_stub.S */
7938/*
7939 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7940 * any interesting requests and then jump to the real instruction
7941 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7942 */
7943 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007944 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7945 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
7946 mov x0, xSELF
7947 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007948 mov x2, xPC
7949 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007950
7951/* ------------------------------ */
7952 .balign 128
7953.L_ALT_op_if_gtz: /* 0x3c */
7954/* File: arm64/alt_stub.S */
7955/*
7956 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7957 * any interesting requests and then jump to the real instruction
7958 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7959 */
7960 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007961 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7962 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
7963 mov x0, xSELF
7964 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007965 mov x2, xPC
7966 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007967
7968/* ------------------------------ */
7969 .balign 128
7970.L_ALT_op_if_lez: /* 0x3d */
7971/* File: arm64/alt_stub.S */
7972/*
7973 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7974 * any interesting requests and then jump to the real instruction
7975 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7976 */
7977 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007978 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7979 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
7980 mov x0, xSELF
7981 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007982 mov x2, xPC
7983 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007984
7985/* ------------------------------ */
7986 .balign 128
7987.L_ALT_op_unused_3e: /* 0x3e */
7988/* File: arm64/alt_stub.S */
7989/*
7990 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7991 * any interesting requests and then jump to the real instruction
7992 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7993 */
7994 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007995 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7996 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
7997 mov x0, xSELF
7998 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007999 mov x2, xPC
8000 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008001
8002/* ------------------------------ */
8003 .balign 128
8004.L_ALT_op_unused_3f: /* 0x3f */
8005/* File: arm64/alt_stub.S */
8006/*
8007 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8008 * any interesting requests and then jump to the real instruction
8009 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8010 */
8011 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008012 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8013 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
8014 mov x0, xSELF
8015 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008016 mov x2, xPC
8017 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008018
8019/* ------------------------------ */
8020 .balign 128
8021.L_ALT_op_unused_40: /* 0x40 */
8022/* File: arm64/alt_stub.S */
8023/*
8024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8025 * any interesting requests and then jump to the real instruction
8026 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8027 */
8028 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008029 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8030 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
8031 mov x0, xSELF
8032 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008033 mov x2, xPC
8034 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008035
8036/* ------------------------------ */
8037 .balign 128
8038.L_ALT_op_unused_41: /* 0x41 */
8039/* File: arm64/alt_stub.S */
8040/*
8041 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8042 * any interesting requests and then jump to the real instruction
8043 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8044 */
8045 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008046 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8047 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8048 mov x0, xSELF
8049 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008050 mov x2, xPC
8051 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008052
8053/* ------------------------------ */
8054 .balign 128
8055.L_ALT_op_unused_42: /* 0x42 */
8056/* File: arm64/alt_stub.S */
8057/*
8058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8059 * any interesting requests and then jump to the real instruction
8060 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8061 */
8062 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008063 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8064 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8065 mov x0, xSELF
8066 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008067 mov x2, xPC
8068 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008069
8070/* ------------------------------ */
8071 .balign 128
8072.L_ALT_op_unused_43: /* 0x43 */
8073/* File: arm64/alt_stub.S */
8074/*
8075 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8076 * any interesting requests and then jump to the real instruction
8077 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8078 */
8079 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008080 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8081 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8082 mov x0, xSELF
8083 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008084 mov x2, xPC
8085 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008086
8087/* ------------------------------ */
8088 .balign 128
8089.L_ALT_op_aget: /* 0x44 */
8090/* File: arm64/alt_stub.S */
8091/*
8092 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8093 * any interesting requests and then jump to the real instruction
8094 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8095 */
8096 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008097 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8098 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8099 mov x0, xSELF
8100 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008101 mov x2, xPC
8102 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008103
8104/* ------------------------------ */
8105 .balign 128
8106.L_ALT_op_aget_wide: /* 0x45 */
8107/* File: arm64/alt_stub.S */
8108/*
8109 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8110 * any interesting requests and then jump to the real instruction
8111 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8112 */
8113 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008114 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8115 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8116 mov x0, xSELF
8117 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008118 mov x2, xPC
8119 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008120
8121/* ------------------------------ */
8122 .balign 128
8123.L_ALT_op_aget_object: /* 0x46 */
8124/* File: arm64/alt_stub.S */
8125/*
8126 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8127 * any interesting requests and then jump to the real instruction
8128 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8129 */
8130 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008131 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8132 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8133 mov x0, xSELF
8134 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008135 mov x2, xPC
8136 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008137
8138/* ------------------------------ */
8139 .balign 128
8140.L_ALT_op_aget_boolean: /* 0x47 */
8141/* File: arm64/alt_stub.S */
8142/*
8143 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8144 * any interesting requests and then jump to the real instruction
8145 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8146 */
8147 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008148 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8149 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8150 mov x0, xSELF
8151 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008152 mov x2, xPC
8153 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008154
8155/* ------------------------------ */
8156 .balign 128
8157.L_ALT_op_aget_byte: /* 0x48 */
8158/* File: arm64/alt_stub.S */
8159/*
8160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8161 * any interesting requests and then jump to the real instruction
8162 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8163 */
8164 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008165 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8166 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8167 mov x0, xSELF
8168 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008169 mov x2, xPC
8170 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008171
8172/* ------------------------------ */
8173 .balign 128
8174.L_ALT_op_aget_char: /* 0x49 */
8175/* File: arm64/alt_stub.S */
8176/*
8177 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8178 * any interesting requests and then jump to the real instruction
8179 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8180 */
8181 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008182 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8183 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8184 mov x0, xSELF
8185 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008186 mov x2, xPC
8187 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008188
8189/* ------------------------------ */
8190 .balign 128
8191.L_ALT_op_aget_short: /* 0x4a */
8192/* File: arm64/alt_stub.S */
8193/*
8194 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8195 * any interesting requests and then jump to the real instruction
8196 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8197 */
8198 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008199 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8200 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8201 mov x0, xSELF
8202 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008203 mov x2, xPC
8204 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008205
8206/* ------------------------------ */
8207 .balign 128
8208.L_ALT_op_aput: /* 0x4b */
8209/* File: arm64/alt_stub.S */
8210/*
8211 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8212 * any interesting requests and then jump to the real instruction
8213 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8214 */
8215 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008216 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8217 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8218 mov x0, xSELF
8219 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008220 mov x2, xPC
8221 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008222
8223/* ------------------------------ */
8224 .balign 128
8225.L_ALT_op_aput_wide: /* 0x4c */
8226/* File: arm64/alt_stub.S */
8227/*
8228 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8229 * any interesting requests and then jump to the real instruction
8230 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8231 */
8232 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008233 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8234 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8235 mov x0, xSELF
8236 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008237 mov x2, xPC
8238 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008239
8240/* ------------------------------ */
8241 .balign 128
8242.L_ALT_op_aput_object: /* 0x4d */
8243/* File: arm64/alt_stub.S */
8244/*
8245 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8246 * any interesting requests and then jump to the real instruction
8247 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8248 */
8249 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008250 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8251 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8252 mov x0, xSELF
8253 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008254 mov x2, xPC
8255 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008256
8257/* ------------------------------ */
8258 .balign 128
8259.L_ALT_op_aput_boolean: /* 0x4e */
8260/* File: arm64/alt_stub.S */
8261/*
8262 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8263 * any interesting requests and then jump to the real instruction
8264 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8265 */
8266 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008267 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8268 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8269 mov x0, xSELF
8270 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008271 mov x2, xPC
8272 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008273
8274/* ------------------------------ */
8275 .balign 128
8276.L_ALT_op_aput_byte: /* 0x4f */
8277/* File: arm64/alt_stub.S */
8278/*
8279 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8280 * any interesting requests and then jump to the real instruction
8281 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8282 */
8283 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008284 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8285 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8286 mov x0, xSELF
8287 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008288 mov x2, xPC
8289 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008290
8291/* ------------------------------ */
8292 .balign 128
8293.L_ALT_op_aput_char: /* 0x50 */
8294/* File: arm64/alt_stub.S */
8295/*
8296 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8297 * any interesting requests and then jump to the real instruction
8298 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8299 */
8300 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008301 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8302 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8303 mov x0, xSELF
8304 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008305 mov x2, xPC
8306 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008307
8308/* ------------------------------ */
8309 .balign 128
8310.L_ALT_op_aput_short: /* 0x51 */
8311/* File: arm64/alt_stub.S */
8312/*
8313 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8314 * any interesting requests and then jump to the real instruction
8315 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8316 */
8317 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008318 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8319 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8320 mov x0, xSELF
8321 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008322 mov x2, xPC
8323 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008324
8325/* ------------------------------ */
8326 .balign 128
8327.L_ALT_op_iget: /* 0x52 */
8328/* File: arm64/alt_stub.S */
8329/*
8330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8331 * any interesting requests and then jump to the real instruction
8332 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8333 */
8334 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008335 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8336 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8337 mov x0, xSELF
8338 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008339 mov x2, xPC
8340 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008341
8342/* ------------------------------ */
8343 .balign 128
8344.L_ALT_op_iget_wide: /* 0x53 */
8345/* File: arm64/alt_stub.S */
8346/*
8347 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8348 * any interesting requests and then jump to the real instruction
8349 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8350 */
8351 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008352 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8353 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8354 mov x0, xSELF
8355 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008356 mov x2, xPC
8357 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008358
8359/* ------------------------------ */
8360 .balign 128
8361.L_ALT_op_iget_object: /* 0x54 */
8362/* File: arm64/alt_stub.S */
8363/*
8364 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8365 * any interesting requests and then jump to the real instruction
8366 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8367 */
8368 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008369 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8370 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8371 mov x0, xSELF
8372 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008373 mov x2, xPC
8374 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008375
8376/* ------------------------------ */
8377 .balign 128
8378.L_ALT_op_iget_boolean: /* 0x55 */
8379/* File: arm64/alt_stub.S */
8380/*
8381 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8382 * any interesting requests and then jump to the real instruction
8383 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8384 */
8385 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008386 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8387 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8388 mov x0, xSELF
8389 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008390 mov x2, xPC
8391 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008392
8393/* ------------------------------ */
8394 .balign 128
8395.L_ALT_op_iget_byte: /* 0x56 */
8396/* File: arm64/alt_stub.S */
8397/*
8398 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8399 * any interesting requests and then jump to the real instruction
8400 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8401 */
8402 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008403 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8404 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8405 mov x0, xSELF
8406 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008407 mov x2, xPC
8408 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008409
8410/* ------------------------------ */
8411 .balign 128
8412.L_ALT_op_iget_char: /* 0x57 */
8413/* File: arm64/alt_stub.S */
8414/*
8415 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8416 * any interesting requests and then jump to the real instruction
8417 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8418 */
8419 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008420 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8421 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8422 mov x0, xSELF
8423 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008424 mov x2, xPC
8425 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008426
8427/* ------------------------------ */
8428 .balign 128
8429.L_ALT_op_iget_short: /* 0x58 */
8430/* File: arm64/alt_stub.S */
8431/*
8432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8433 * any interesting requests and then jump to the real instruction
8434 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8435 */
8436 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008437 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8438 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8439 mov x0, xSELF
8440 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008441 mov x2, xPC
8442 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008443
8444/* ------------------------------ */
8445 .balign 128
8446.L_ALT_op_iput: /* 0x59 */
8447/* File: arm64/alt_stub.S */
8448/*
8449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8450 * any interesting requests and then jump to the real instruction
8451 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8452 */
8453 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008454 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8455 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8456 mov x0, xSELF
8457 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008458 mov x2, xPC
8459 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008460
8461/* ------------------------------ */
8462 .balign 128
8463.L_ALT_op_iput_wide: /* 0x5a */
8464/* File: arm64/alt_stub.S */
8465/*
8466 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8467 * any interesting requests and then jump to the real instruction
8468 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8469 */
8470 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008471 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8472 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8473 mov x0, xSELF
8474 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008475 mov x2, xPC
8476 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008477
8478/* ------------------------------ */
8479 .balign 128
8480.L_ALT_op_iput_object: /* 0x5b */
8481/* File: arm64/alt_stub.S */
8482/*
8483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8484 * any interesting requests and then jump to the real instruction
8485 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8486 */
8487 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008488 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8489 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8490 mov x0, xSELF
8491 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008492 mov x2, xPC
8493 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008494
8495/* ------------------------------ */
8496 .balign 128
8497.L_ALT_op_iput_boolean: /* 0x5c */
8498/* File: arm64/alt_stub.S */
8499/*
8500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8501 * any interesting requests and then jump to the real instruction
8502 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8503 */
8504 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008505 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8506 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8507 mov x0, xSELF
8508 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008509 mov x2, xPC
8510 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008511
8512/* ------------------------------ */
8513 .balign 128
8514.L_ALT_op_iput_byte: /* 0x5d */
8515/* File: arm64/alt_stub.S */
8516/*
8517 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8518 * any interesting requests and then jump to the real instruction
8519 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8520 */
8521 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008522 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8523 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8524 mov x0, xSELF
8525 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008526 mov x2, xPC
8527 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008528
8529/* ------------------------------ */
8530 .balign 128
8531.L_ALT_op_iput_char: /* 0x5e */
8532/* File: arm64/alt_stub.S */
8533/*
8534 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8535 * any interesting requests and then jump to the real instruction
8536 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8537 */
8538 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008539 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8540 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8541 mov x0, xSELF
8542 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008543 mov x2, xPC
8544 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008545
8546/* ------------------------------ */
8547 .balign 128
8548.L_ALT_op_iput_short: /* 0x5f */
8549/* File: arm64/alt_stub.S */
8550/*
8551 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8552 * any interesting requests and then jump to the real instruction
8553 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8554 */
8555 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008556 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8557 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8558 mov x0, xSELF
8559 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008560 mov x2, xPC
8561 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008562
8563/* ------------------------------ */
8564 .balign 128
8565.L_ALT_op_sget: /* 0x60 */
8566/* File: arm64/alt_stub.S */
8567/*
8568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8569 * any interesting requests and then jump to the real instruction
8570 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8571 */
8572 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008573 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8574 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8575 mov x0, xSELF
8576 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008577 mov x2, xPC
8578 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008579
8580/* ------------------------------ */
8581 .balign 128
8582.L_ALT_op_sget_wide: /* 0x61 */
8583/* File: arm64/alt_stub.S */
8584/*
8585 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8586 * any interesting requests and then jump to the real instruction
8587 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8588 */
8589 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008590 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8591 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8592 mov x0, xSELF
8593 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008594 mov x2, xPC
8595 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008596
8597/* ------------------------------ */
8598 .balign 128
8599.L_ALT_op_sget_object: /* 0x62 */
8600/* File: arm64/alt_stub.S */
8601/*
8602 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8603 * any interesting requests and then jump to the real instruction
8604 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8605 */
8606 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008607 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8608 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
8609 mov x0, xSELF
8610 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008611 mov x2, xPC
8612 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008613
8614/* ------------------------------ */
8615 .balign 128
8616.L_ALT_op_sget_boolean: /* 0x63 */
8617/* File: arm64/alt_stub.S */
8618/*
8619 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8620 * any interesting requests and then jump to the real instruction
8621 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8622 */
8623 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008624 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8625 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
8626 mov x0, xSELF
8627 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008628 mov x2, xPC
8629 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008630
8631/* ------------------------------ */
8632 .balign 128
8633.L_ALT_op_sget_byte: /* 0x64 */
8634/* File: arm64/alt_stub.S */
8635/*
8636 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8637 * any interesting requests and then jump to the real instruction
8638 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8639 */
8640 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008641 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8642 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
8643 mov x0, xSELF
8644 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008645 mov x2, xPC
8646 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008647
8648/* ------------------------------ */
8649 .balign 128
8650.L_ALT_op_sget_char: /* 0x65 */
8651/* File: arm64/alt_stub.S */
8652/*
8653 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8654 * any interesting requests and then jump to the real instruction
8655 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8656 */
8657 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008658 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8659 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
8660 mov x0, xSELF
8661 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008662 mov x2, xPC
8663 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008664
8665/* ------------------------------ */
8666 .balign 128
8667.L_ALT_op_sget_short: /* 0x66 */
8668/* File: arm64/alt_stub.S */
8669/*
8670 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8671 * any interesting requests and then jump to the real instruction
8672 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8673 */
8674 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008675 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8676 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
8677 mov x0, xSELF
8678 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008679 mov x2, xPC
8680 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008681
8682/* ------------------------------ */
8683 .balign 128
8684.L_ALT_op_sput: /* 0x67 */
8685/* File: arm64/alt_stub.S */
8686/*
8687 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8688 * any interesting requests and then jump to the real instruction
8689 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8690 */
8691 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008692 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8693 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
8694 mov x0, xSELF
8695 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008696 mov x2, xPC
8697 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008698
8699/* ------------------------------ */
8700 .balign 128
8701.L_ALT_op_sput_wide: /* 0x68 */
8702/* File: arm64/alt_stub.S */
8703/*
8704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8705 * any interesting requests and then jump to the real instruction
8706 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8707 */
8708 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008709 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8710 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
8711 mov x0, xSELF
8712 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008713 mov x2, xPC
8714 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008715
8716/* ------------------------------ */
8717 .balign 128
8718.L_ALT_op_sput_object: /* 0x69 */
8719/* File: arm64/alt_stub.S */
8720/*
8721 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8722 * any interesting requests and then jump to the real instruction
8723 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8724 */
8725 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008726 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8727 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
8728 mov x0, xSELF
8729 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008730 mov x2, xPC
8731 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008732
8733/* ------------------------------ */
8734 .balign 128
8735.L_ALT_op_sput_boolean: /* 0x6a */
8736/* File: arm64/alt_stub.S */
8737/*
8738 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8739 * any interesting requests and then jump to the real instruction
8740 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8741 */
8742 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008743 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8744 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
8745 mov x0, xSELF
8746 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008747 mov x2, xPC
8748 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008749
8750/* ------------------------------ */
8751 .balign 128
8752.L_ALT_op_sput_byte: /* 0x6b */
8753/* File: arm64/alt_stub.S */
8754/*
8755 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8756 * any interesting requests and then jump to the real instruction
8757 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8758 */
8759 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008760 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8761 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
8762 mov x0, xSELF
8763 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008764 mov x2, xPC
8765 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008766
8767/* ------------------------------ */
8768 .balign 128
8769.L_ALT_op_sput_char: /* 0x6c */
8770/* File: arm64/alt_stub.S */
8771/*
8772 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8773 * any interesting requests and then jump to the real instruction
8774 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8775 */
8776 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008777 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8778 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
8779 mov x0, xSELF
8780 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008781 mov x2, xPC
8782 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008783
8784/* ------------------------------ */
8785 .balign 128
8786.L_ALT_op_sput_short: /* 0x6d */
8787/* File: arm64/alt_stub.S */
8788/*
8789 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8790 * any interesting requests and then jump to the real instruction
8791 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8792 */
8793 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008794 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8795 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
8796 mov x0, xSELF
8797 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008798 mov x2, xPC
8799 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008800
8801/* ------------------------------ */
8802 .balign 128
8803.L_ALT_op_invoke_virtual: /* 0x6e */
8804/* File: arm64/alt_stub.S */
8805/*
8806 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8807 * any interesting requests and then jump to the real instruction
8808 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8809 */
8810 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008811 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8812 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
8813 mov x0, xSELF
8814 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008815 mov x2, xPC
8816 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008817
8818/* ------------------------------ */
8819 .balign 128
8820.L_ALT_op_invoke_super: /* 0x6f */
8821/* File: arm64/alt_stub.S */
8822/*
8823 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8824 * any interesting requests and then jump to the real instruction
8825 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8826 */
8827 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008828 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8829 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
8830 mov x0, xSELF
8831 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008832 mov x2, xPC
8833 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008834
8835/* ------------------------------ */
8836 .balign 128
8837.L_ALT_op_invoke_direct: /* 0x70 */
8838/* File: arm64/alt_stub.S */
8839/*
8840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8841 * any interesting requests and then jump to the real instruction
8842 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8843 */
8844 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008845 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8846 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
8847 mov x0, xSELF
8848 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008849 mov x2, xPC
8850 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008851
8852/* ------------------------------ */
8853 .balign 128
8854.L_ALT_op_invoke_static: /* 0x71 */
8855/* File: arm64/alt_stub.S */
8856/*
8857 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8858 * any interesting requests and then jump to the real instruction
8859 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8860 */
8861 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008862 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8863 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
8864 mov x0, xSELF
8865 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008866 mov x2, xPC
8867 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008868
8869/* ------------------------------ */
8870 .balign 128
8871.L_ALT_op_invoke_interface: /* 0x72 */
8872/* File: arm64/alt_stub.S */
8873/*
8874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8875 * any interesting requests and then jump to the real instruction
8876 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8877 */
8878 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008879 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8880 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
8881 mov x0, xSELF
8882 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008883 mov x2, xPC
8884 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008885
8886/* ------------------------------ */
8887 .balign 128
8888.L_ALT_op_return_void_no_barrier: /* 0x73 */
8889/* File: arm64/alt_stub.S */
8890/*
8891 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8892 * any interesting requests and then jump to the real instruction
8893 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8894 */
8895 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008896 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8897 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
8898 mov x0, xSELF
8899 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008900 mov x2, xPC
8901 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008902
8903/* ------------------------------ */
8904 .balign 128
8905.L_ALT_op_invoke_virtual_range: /* 0x74 */
8906/* File: arm64/alt_stub.S */
8907/*
8908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8909 * any interesting requests and then jump to the real instruction
8910 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8911 */
8912 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008913 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8914 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
8915 mov x0, xSELF
8916 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008917 mov x2, xPC
8918 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008919
8920/* ------------------------------ */
8921 .balign 128
8922.L_ALT_op_invoke_super_range: /* 0x75 */
8923/* File: arm64/alt_stub.S */
8924/*
8925 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8926 * any interesting requests and then jump to the real instruction
8927 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8928 */
8929 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008930 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8931 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
8932 mov x0, xSELF
8933 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008934 mov x2, xPC
8935 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008936
8937/* ------------------------------ */
8938 .balign 128
8939.L_ALT_op_invoke_direct_range: /* 0x76 */
8940/* File: arm64/alt_stub.S */
8941/*
8942 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8943 * any interesting requests and then jump to the real instruction
8944 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8945 */
8946 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008947 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8948 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
8949 mov x0, xSELF
8950 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008951 mov x2, xPC
8952 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008953
8954/* ------------------------------ */
8955 .balign 128
8956.L_ALT_op_invoke_static_range: /* 0x77 */
8957/* File: arm64/alt_stub.S */
8958/*
8959 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8960 * any interesting requests and then jump to the real instruction
8961 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8962 */
8963 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008964 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8965 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
8966 mov x0, xSELF
8967 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008968 mov x2, xPC
8969 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008970
8971/* ------------------------------ */
8972 .balign 128
8973.L_ALT_op_invoke_interface_range: /* 0x78 */
8974/* File: arm64/alt_stub.S */
8975/*
8976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8977 * any interesting requests and then jump to the real instruction
8978 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8979 */
8980 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008981 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8982 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
8983 mov x0, xSELF
8984 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008985 mov x2, xPC
8986 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008987
8988/* ------------------------------ */
8989 .balign 128
8990.L_ALT_op_unused_79: /* 0x79 */
8991/* File: arm64/alt_stub.S */
8992/*
8993 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8994 * any interesting requests and then jump to the real instruction
8995 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8996 */
8997 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008998 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8999 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
9000 mov x0, xSELF
9001 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009002 mov x2, xPC
9003 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009004
9005/* ------------------------------ */
9006 .balign 128
9007.L_ALT_op_unused_7a: /* 0x7a */
9008/* File: arm64/alt_stub.S */
9009/*
9010 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9011 * any interesting requests and then jump to the real instruction
9012 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9013 */
9014 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009015 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9016 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
9017 mov x0, xSELF
9018 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009019 mov x2, xPC
9020 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009021
9022/* ------------------------------ */
9023 .balign 128
9024.L_ALT_op_neg_int: /* 0x7b */
9025/* File: arm64/alt_stub.S */
9026/*
9027 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9028 * any interesting requests and then jump to the real instruction
9029 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9030 */
9031 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009032 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9033 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
9034 mov x0, xSELF
9035 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009036 mov x2, xPC
9037 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009038
9039/* ------------------------------ */
9040 .balign 128
9041.L_ALT_op_not_int: /* 0x7c */
9042/* File: arm64/alt_stub.S */
9043/*
9044 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9045 * any interesting requests and then jump to the real instruction
9046 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9047 */
9048 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009049 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9050 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9051 mov x0, xSELF
9052 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009053 mov x2, xPC
9054 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009055
9056/* ------------------------------ */
9057 .balign 128
9058.L_ALT_op_neg_long: /* 0x7d */
9059/* File: arm64/alt_stub.S */
9060/*
9061 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9062 * any interesting requests and then jump to the real instruction
9063 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9064 */
9065 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009066 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9067 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9068 mov x0, xSELF
9069 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009070 mov x2, xPC
9071 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009072
9073/* ------------------------------ */
9074 .balign 128
9075.L_ALT_op_not_long: /* 0x7e */
9076/* File: arm64/alt_stub.S */
9077/*
9078 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9079 * any interesting requests and then jump to the real instruction
9080 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9081 */
9082 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009083 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9084 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9085 mov x0, xSELF
9086 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009087 mov x2, xPC
9088 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009089
9090/* ------------------------------ */
9091 .balign 128
9092.L_ALT_op_neg_float: /* 0x7f */
9093/* File: arm64/alt_stub.S */
9094/*
9095 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9096 * any interesting requests and then jump to the real instruction
9097 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9098 */
9099 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009100 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9101 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9102 mov x0, xSELF
9103 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009104 mov x2, xPC
9105 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009106
9107/* ------------------------------ */
9108 .balign 128
9109.L_ALT_op_neg_double: /* 0x80 */
9110/* File: arm64/alt_stub.S */
9111/*
9112 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9113 * any interesting requests and then jump to the real instruction
9114 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9115 */
9116 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009117 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9118 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9119 mov x0, xSELF
9120 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009121 mov x2, xPC
9122 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009123
9124/* ------------------------------ */
9125 .balign 128
9126.L_ALT_op_int_to_long: /* 0x81 */
9127/* File: arm64/alt_stub.S */
9128/*
9129 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9130 * any interesting requests and then jump to the real instruction
9131 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9132 */
9133 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009134 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9135 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9136 mov x0, xSELF
9137 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009138 mov x2, xPC
9139 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009140
9141/* ------------------------------ */
9142 .balign 128
9143.L_ALT_op_int_to_float: /* 0x82 */
9144/* File: arm64/alt_stub.S */
9145/*
9146 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9147 * any interesting requests and then jump to the real instruction
9148 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9149 */
9150 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009151 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9152 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9153 mov x0, xSELF
9154 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009155 mov x2, xPC
9156 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009157
9158/* ------------------------------ */
9159 .balign 128
9160.L_ALT_op_int_to_double: /* 0x83 */
9161/* File: arm64/alt_stub.S */
9162/*
9163 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9164 * any interesting requests and then jump to the real instruction
9165 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9166 */
9167 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009168 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9169 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9170 mov x0, xSELF
9171 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009172 mov x2, xPC
9173 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009174
9175/* ------------------------------ */
9176 .balign 128
9177.L_ALT_op_long_to_int: /* 0x84 */
9178/* File: arm64/alt_stub.S */
9179/*
9180 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9181 * any interesting requests and then jump to the real instruction
9182 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9183 */
9184 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009185 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9186 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9187 mov x0, xSELF
9188 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009189 mov x2, xPC
9190 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009191
9192/* ------------------------------ */
9193 .balign 128
9194.L_ALT_op_long_to_float: /* 0x85 */
9195/* File: arm64/alt_stub.S */
9196/*
9197 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9198 * any interesting requests and then jump to the real instruction
9199 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9200 */
9201 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009202 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9203 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9204 mov x0, xSELF
9205 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009206 mov x2, xPC
9207 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009208
9209/* ------------------------------ */
9210 .balign 128
9211.L_ALT_op_long_to_double: /* 0x86 */
9212/* File: arm64/alt_stub.S */
9213/*
9214 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9215 * any interesting requests and then jump to the real instruction
9216 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9217 */
9218 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009219 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9220 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9221 mov x0, xSELF
9222 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009223 mov x2, xPC
9224 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009225
9226/* ------------------------------ */
9227 .balign 128
9228.L_ALT_op_float_to_int: /* 0x87 */
9229/* File: arm64/alt_stub.S */
9230/*
9231 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9232 * any interesting requests and then jump to the real instruction
9233 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9234 */
9235 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009236 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9237 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9238 mov x0, xSELF
9239 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009240 mov x2, xPC
9241 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009242
9243/* ------------------------------ */
9244 .balign 128
9245.L_ALT_op_float_to_long: /* 0x88 */
9246/* File: arm64/alt_stub.S */
9247/*
9248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9249 * any interesting requests and then jump to the real instruction
9250 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9251 */
9252 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009253 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9254 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9255 mov x0, xSELF
9256 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009257 mov x2, xPC
9258 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009259
9260/* ------------------------------ */
9261 .balign 128
9262.L_ALT_op_float_to_double: /* 0x89 */
9263/* File: arm64/alt_stub.S */
9264/*
9265 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9266 * any interesting requests and then jump to the real instruction
9267 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9268 */
9269 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009270 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9271 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9272 mov x0, xSELF
9273 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009274 mov x2, xPC
9275 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009276
9277/* ------------------------------ */
9278 .balign 128
9279.L_ALT_op_double_to_int: /* 0x8a */
9280/* File: arm64/alt_stub.S */
9281/*
9282 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9283 * any interesting requests and then jump to the real instruction
9284 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9285 */
9286 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009287 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9288 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9289 mov x0, xSELF
9290 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009291 mov x2, xPC
9292 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009293
9294/* ------------------------------ */
9295 .balign 128
9296.L_ALT_op_double_to_long: /* 0x8b */
9297/* File: arm64/alt_stub.S */
9298/*
9299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9300 * any interesting requests and then jump to the real instruction
9301 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9302 */
9303 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009304 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9305 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9306 mov x0, xSELF
9307 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009308 mov x2, xPC
9309 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009310
9311/* ------------------------------ */
9312 .balign 128
9313.L_ALT_op_double_to_float: /* 0x8c */
9314/* File: arm64/alt_stub.S */
9315/*
9316 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9317 * any interesting requests and then jump to the real instruction
9318 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9319 */
9320 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009321 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9322 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9323 mov x0, xSELF
9324 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009325 mov x2, xPC
9326 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009327
9328/* ------------------------------ */
9329 .balign 128
9330.L_ALT_op_int_to_byte: /* 0x8d */
9331/* File: arm64/alt_stub.S */
9332/*
9333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9334 * any interesting requests and then jump to the real instruction
9335 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9336 */
9337 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009338 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9339 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9340 mov x0, xSELF
9341 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009342 mov x2, xPC
9343 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009344
9345/* ------------------------------ */
9346 .balign 128
9347.L_ALT_op_int_to_char: /* 0x8e */
9348/* File: arm64/alt_stub.S */
9349/*
9350 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9351 * any interesting requests and then jump to the real instruction
9352 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9353 */
9354 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009355 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9356 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9357 mov x0, xSELF
9358 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009359 mov x2, xPC
9360 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009361
9362/* ------------------------------ */
9363 .balign 128
9364.L_ALT_op_int_to_short: /* 0x8f */
9365/* File: arm64/alt_stub.S */
9366/*
9367 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9368 * any interesting requests and then jump to the real instruction
9369 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9370 */
9371 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009372 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9373 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9374 mov x0, xSELF
9375 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009376 mov x2, xPC
9377 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009378
9379/* ------------------------------ */
9380 .balign 128
9381.L_ALT_op_add_int: /* 0x90 */
9382/* File: arm64/alt_stub.S */
9383/*
9384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9385 * any interesting requests and then jump to the real instruction
9386 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9387 */
9388 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009389 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9390 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9391 mov x0, xSELF
9392 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009393 mov x2, xPC
9394 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009395
9396/* ------------------------------ */
9397 .balign 128
9398.L_ALT_op_sub_int: /* 0x91 */
9399/* File: arm64/alt_stub.S */
9400/*
9401 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9402 * any interesting requests and then jump to the real instruction
9403 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9404 */
9405 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009406 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9407 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9408 mov x0, xSELF
9409 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009410 mov x2, xPC
9411 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009412
9413/* ------------------------------ */
9414 .balign 128
9415.L_ALT_op_mul_int: /* 0x92 */
9416/* File: arm64/alt_stub.S */
9417/*
9418 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9419 * any interesting requests and then jump to the real instruction
9420 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9421 */
9422 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009423 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9424 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9425 mov x0, xSELF
9426 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009427 mov x2, xPC
9428 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009429
9430/* ------------------------------ */
9431 .balign 128
9432.L_ALT_op_div_int: /* 0x93 */
9433/* File: arm64/alt_stub.S */
9434/*
9435 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9436 * any interesting requests and then jump to the real instruction
9437 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9438 */
9439 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009440 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9441 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9442 mov x0, xSELF
9443 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009444 mov x2, xPC
9445 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009446
9447/* ------------------------------ */
9448 .balign 128
9449.L_ALT_op_rem_int: /* 0x94 */
9450/* File: arm64/alt_stub.S */
9451/*
9452 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9453 * any interesting requests and then jump to the real instruction
9454 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9455 */
9456 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009457 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9458 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9459 mov x0, xSELF
9460 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009461 mov x2, xPC
9462 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009463
9464/* ------------------------------ */
9465 .balign 128
9466.L_ALT_op_and_int: /* 0x95 */
9467/* File: arm64/alt_stub.S */
9468/*
9469 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9470 * any interesting requests and then jump to the real instruction
9471 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9472 */
9473 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009474 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9475 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9476 mov x0, xSELF
9477 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009478 mov x2, xPC
9479 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009480
9481/* ------------------------------ */
9482 .balign 128
9483.L_ALT_op_or_int: /* 0x96 */
9484/* File: arm64/alt_stub.S */
9485/*
9486 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9487 * any interesting requests and then jump to the real instruction
9488 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9489 */
9490 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009491 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9492 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9493 mov x0, xSELF
9494 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009495 mov x2, xPC
9496 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009497
9498/* ------------------------------ */
9499 .balign 128
9500.L_ALT_op_xor_int: /* 0x97 */
9501/* File: arm64/alt_stub.S */
9502/*
9503 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9504 * any interesting requests and then jump to the real instruction
9505 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9506 */
9507 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009508 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9509 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9510 mov x0, xSELF
9511 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009512 mov x2, xPC
9513 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009514
9515/* ------------------------------ */
9516 .balign 128
9517.L_ALT_op_shl_int: /* 0x98 */
9518/* File: arm64/alt_stub.S */
9519/*
9520 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9521 * any interesting requests and then jump to the real instruction
9522 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9523 */
9524 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009525 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9526 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9527 mov x0, xSELF
9528 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009529 mov x2, xPC
9530 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009531
9532/* ------------------------------ */
9533 .balign 128
9534.L_ALT_op_shr_int: /* 0x99 */
9535/* File: arm64/alt_stub.S */
9536/*
9537 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9538 * any interesting requests and then jump to the real instruction
9539 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9540 */
9541 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009542 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9543 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9544 mov x0, xSELF
9545 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009546 mov x2, xPC
9547 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009548
9549/* ------------------------------ */
9550 .balign 128
9551.L_ALT_op_ushr_int: /* 0x9a */
9552/* File: arm64/alt_stub.S */
9553/*
9554 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9555 * any interesting requests and then jump to the real instruction
9556 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9557 */
9558 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009559 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9560 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9561 mov x0, xSELF
9562 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009563 mov x2, xPC
9564 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009565
9566/* ------------------------------ */
9567 .balign 128
9568.L_ALT_op_add_long: /* 0x9b */
9569/* File: arm64/alt_stub.S */
9570/*
9571 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9572 * any interesting requests and then jump to the real instruction
9573 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9574 */
9575 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009576 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9577 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9578 mov x0, xSELF
9579 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009580 mov x2, xPC
9581 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009582
9583/* ------------------------------ */
9584 .balign 128
9585.L_ALT_op_sub_long: /* 0x9c */
9586/* File: arm64/alt_stub.S */
9587/*
9588 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9589 * any interesting requests and then jump to the real instruction
9590 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9591 */
9592 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009593 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9594 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9595 mov x0, xSELF
9596 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009597 mov x2, xPC
9598 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009599
9600/* ------------------------------ */
9601 .balign 128
9602.L_ALT_op_mul_long: /* 0x9d */
9603/* File: arm64/alt_stub.S */
9604/*
9605 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9606 * any interesting requests and then jump to the real instruction
9607 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9608 */
9609 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009610 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9611 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
9612 mov x0, xSELF
9613 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009614 mov x2, xPC
9615 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009616
9617/* ------------------------------ */
9618 .balign 128
9619.L_ALT_op_div_long: /* 0x9e */
9620/* File: arm64/alt_stub.S */
9621/*
9622 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9623 * any interesting requests and then jump to the real instruction
9624 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9625 */
9626 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009627 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9628 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
9629 mov x0, xSELF
9630 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009631 mov x2, xPC
9632 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009633
9634/* ------------------------------ */
9635 .balign 128
9636.L_ALT_op_rem_long: /* 0x9f */
9637/* File: arm64/alt_stub.S */
9638/*
9639 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9640 * any interesting requests and then jump to the real instruction
9641 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9642 */
9643 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009644 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9645 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
9646 mov x0, xSELF
9647 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009648 mov x2, xPC
9649 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009650
9651/* ------------------------------ */
9652 .balign 128
9653.L_ALT_op_and_long: /* 0xa0 */
9654/* File: arm64/alt_stub.S */
9655/*
9656 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9657 * any interesting requests and then jump to the real instruction
9658 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9659 */
9660 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009661 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9662 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
9663 mov x0, xSELF
9664 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009665 mov x2, xPC
9666 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009667
9668/* ------------------------------ */
9669 .balign 128
9670.L_ALT_op_or_long: /* 0xa1 */
9671/* File: arm64/alt_stub.S */
9672/*
9673 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9674 * any interesting requests and then jump to the real instruction
9675 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9676 */
9677 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009678 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9679 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
9680 mov x0, xSELF
9681 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009682 mov x2, xPC
9683 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009684
9685/* ------------------------------ */
9686 .balign 128
9687.L_ALT_op_xor_long: /* 0xa2 */
9688/* File: arm64/alt_stub.S */
9689/*
9690 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9691 * any interesting requests and then jump to the real instruction
9692 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9693 */
9694 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009695 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9696 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
9697 mov x0, xSELF
9698 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009699 mov x2, xPC
9700 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009701
9702/* ------------------------------ */
9703 .balign 128
9704.L_ALT_op_shl_long: /* 0xa3 */
9705/* File: arm64/alt_stub.S */
9706/*
9707 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9708 * any interesting requests and then jump to the real instruction
9709 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9710 */
9711 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009712 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9713 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
9714 mov x0, xSELF
9715 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009716 mov x2, xPC
9717 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009718
9719/* ------------------------------ */
9720 .balign 128
9721.L_ALT_op_shr_long: /* 0xa4 */
9722/* File: arm64/alt_stub.S */
9723/*
9724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9725 * any interesting requests and then jump to the real instruction
9726 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9727 */
9728 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009729 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9730 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
9731 mov x0, xSELF
9732 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009733 mov x2, xPC
9734 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009735
9736/* ------------------------------ */
9737 .balign 128
9738.L_ALT_op_ushr_long: /* 0xa5 */
9739/* File: arm64/alt_stub.S */
9740/*
9741 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9742 * any interesting requests and then jump to the real instruction
9743 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9744 */
9745 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009746 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9747 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
9748 mov x0, xSELF
9749 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009750 mov x2, xPC
9751 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009752
9753/* ------------------------------ */
9754 .balign 128
9755.L_ALT_op_add_float: /* 0xa6 */
9756/* File: arm64/alt_stub.S */
9757/*
9758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9759 * any interesting requests and then jump to the real instruction
9760 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9761 */
9762 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009763 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9764 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
9765 mov x0, xSELF
9766 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009767 mov x2, xPC
9768 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009769
9770/* ------------------------------ */
9771 .balign 128
9772.L_ALT_op_sub_float: /* 0xa7 */
9773/* File: arm64/alt_stub.S */
9774/*
9775 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9776 * any interesting requests and then jump to the real instruction
9777 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9778 */
9779 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009780 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9781 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
9782 mov x0, xSELF
9783 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009784 mov x2, xPC
9785 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009786
9787/* ------------------------------ */
9788 .balign 128
9789.L_ALT_op_mul_float: /* 0xa8 */
9790/* File: arm64/alt_stub.S */
9791/*
9792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9793 * any interesting requests and then jump to the real instruction
9794 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9795 */
9796 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009797 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9798 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
9799 mov x0, xSELF
9800 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009801 mov x2, xPC
9802 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009803
9804/* ------------------------------ */
9805 .balign 128
9806.L_ALT_op_div_float: /* 0xa9 */
9807/* File: arm64/alt_stub.S */
9808/*
9809 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9810 * any interesting requests and then jump to the real instruction
9811 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9812 */
9813 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009814 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9815 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
9816 mov x0, xSELF
9817 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009818 mov x2, xPC
9819 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009820
9821/* ------------------------------ */
9822 .balign 128
9823.L_ALT_op_rem_float: /* 0xaa */
9824/* File: arm64/alt_stub.S */
9825/*
9826 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9827 * any interesting requests and then jump to the real instruction
9828 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9829 */
9830 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009831 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9832 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
9833 mov x0, xSELF
9834 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009835 mov x2, xPC
9836 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009837
9838/* ------------------------------ */
9839 .balign 128
9840.L_ALT_op_add_double: /* 0xab */
9841/* File: arm64/alt_stub.S */
9842/*
9843 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9844 * any interesting requests and then jump to the real instruction
9845 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9846 */
9847 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009848 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9849 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
9850 mov x0, xSELF
9851 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009852 mov x2, xPC
9853 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009854
9855/* ------------------------------ */
9856 .balign 128
9857.L_ALT_op_sub_double: /* 0xac */
9858/* File: arm64/alt_stub.S */
9859/*
9860 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9861 * any interesting requests and then jump to the real instruction
9862 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9863 */
9864 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009865 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9866 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
9867 mov x0, xSELF
9868 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009869 mov x2, xPC
9870 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009871
9872/* ------------------------------ */
9873 .balign 128
9874.L_ALT_op_mul_double: /* 0xad */
9875/* File: arm64/alt_stub.S */
9876/*
9877 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9878 * any interesting requests and then jump to the real instruction
9879 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9880 */
9881 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009882 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9883 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
9884 mov x0, xSELF
9885 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009886 mov x2, xPC
9887 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009888
9889/* ------------------------------ */
9890 .balign 128
9891.L_ALT_op_div_double: /* 0xae */
9892/* File: arm64/alt_stub.S */
9893/*
9894 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9895 * any interesting requests and then jump to the real instruction
9896 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9897 */
9898 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009899 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9900 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
9901 mov x0, xSELF
9902 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009903 mov x2, xPC
9904 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009905
9906/* ------------------------------ */
9907 .balign 128
9908.L_ALT_op_rem_double: /* 0xaf */
9909/* File: arm64/alt_stub.S */
9910/*
9911 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9912 * any interesting requests and then jump to the real instruction
9913 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9914 */
9915 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009916 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9917 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
9918 mov x0, xSELF
9919 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009920 mov x2, xPC
9921 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009922
9923/* ------------------------------ */
9924 .balign 128
9925.L_ALT_op_add_int_2addr: /* 0xb0 */
9926/* File: arm64/alt_stub.S */
9927/*
9928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9929 * any interesting requests and then jump to the real instruction
9930 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9931 */
9932 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009933 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9934 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
9935 mov x0, xSELF
9936 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009937 mov x2, xPC
9938 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009939
9940/* ------------------------------ */
9941 .balign 128
9942.L_ALT_op_sub_int_2addr: /* 0xb1 */
9943/* File: arm64/alt_stub.S */
9944/*
9945 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9946 * any interesting requests and then jump to the real instruction
9947 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9948 */
9949 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009950 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9951 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
9952 mov x0, xSELF
9953 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009954 mov x2, xPC
9955 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009956
9957/* ------------------------------ */
9958 .balign 128
9959.L_ALT_op_mul_int_2addr: /* 0xb2 */
9960/* File: arm64/alt_stub.S */
9961/*
9962 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9963 * any interesting requests and then jump to the real instruction
9964 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9965 */
9966 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009967 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9968 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
9969 mov x0, xSELF
9970 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009971 mov x2, xPC
9972 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009973
9974/* ------------------------------ */
9975 .balign 128
9976.L_ALT_op_div_int_2addr: /* 0xb3 */
9977/* File: arm64/alt_stub.S */
9978/*
9979 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9980 * any interesting requests and then jump to the real instruction
9981 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9982 */
9983 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009984 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9985 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
9986 mov x0, xSELF
9987 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009988 mov x2, xPC
9989 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009990
9991/* ------------------------------ */
9992 .balign 128
9993.L_ALT_op_rem_int_2addr: /* 0xb4 */
9994/* File: arm64/alt_stub.S */
9995/*
9996 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9997 * any interesting requests and then jump to the real instruction
9998 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9999 */
10000 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010001 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10002 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
10003 mov x0, xSELF
10004 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010005 mov x2, xPC
10006 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010007
10008/* ------------------------------ */
10009 .balign 128
10010.L_ALT_op_and_int_2addr: /* 0xb5 */
10011/* File: arm64/alt_stub.S */
10012/*
10013 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10014 * any interesting requests and then jump to the real instruction
10015 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10016 */
10017 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010018 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10019 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
10020 mov x0, xSELF
10021 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010022 mov x2, xPC
10023 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010024
10025/* ------------------------------ */
10026 .balign 128
10027.L_ALT_op_or_int_2addr: /* 0xb6 */
10028/* File: arm64/alt_stub.S */
10029/*
10030 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10031 * any interesting requests and then jump to the real instruction
10032 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10033 */
10034 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010035 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10036 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10037 mov x0, xSELF
10038 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010039 mov x2, xPC
10040 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010041
10042/* ------------------------------ */
10043 .balign 128
10044.L_ALT_op_xor_int_2addr: /* 0xb7 */
10045/* File: arm64/alt_stub.S */
10046/*
10047 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10048 * any interesting requests and then jump to the real instruction
10049 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10050 */
10051 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010052 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10053 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10054 mov x0, xSELF
10055 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010056 mov x2, xPC
10057 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010058
10059/* ------------------------------ */
10060 .balign 128
10061.L_ALT_op_shl_int_2addr: /* 0xb8 */
10062/* File: arm64/alt_stub.S */
10063/*
10064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10065 * any interesting requests and then jump to the real instruction
10066 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10067 */
10068 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010069 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10070 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10071 mov x0, xSELF
10072 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010073 mov x2, xPC
10074 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010075
10076/* ------------------------------ */
10077 .balign 128
10078.L_ALT_op_shr_int_2addr: /* 0xb9 */
10079/* File: arm64/alt_stub.S */
10080/*
10081 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10082 * any interesting requests and then jump to the real instruction
10083 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10084 */
10085 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010086 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10087 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10088 mov x0, xSELF
10089 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010090 mov x2, xPC
10091 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010092
10093/* ------------------------------ */
10094 .balign 128
10095.L_ALT_op_ushr_int_2addr: /* 0xba */
10096/* File: arm64/alt_stub.S */
10097/*
10098 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10099 * any interesting requests and then jump to the real instruction
10100 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10101 */
10102 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010103 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10104 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10105 mov x0, xSELF
10106 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010107 mov x2, xPC
10108 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010109
10110/* ------------------------------ */
10111 .balign 128
10112.L_ALT_op_add_long_2addr: /* 0xbb */
10113/* File: arm64/alt_stub.S */
10114/*
10115 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10116 * any interesting requests and then jump to the real instruction
10117 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10118 */
10119 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010120 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10121 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10122 mov x0, xSELF
10123 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010124 mov x2, xPC
10125 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010126
10127/* ------------------------------ */
10128 .balign 128
10129.L_ALT_op_sub_long_2addr: /* 0xbc */
10130/* File: arm64/alt_stub.S */
10131/*
10132 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10133 * any interesting requests and then jump to the real instruction
10134 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10135 */
10136 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010137 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10138 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10139 mov x0, xSELF
10140 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010141 mov x2, xPC
10142 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010143
10144/* ------------------------------ */
10145 .balign 128
10146.L_ALT_op_mul_long_2addr: /* 0xbd */
10147/* File: arm64/alt_stub.S */
10148/*
10149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10150 * any interesting requests and then jump to the real instruction
10151 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10152 */
10153 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010154 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10155 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10156 mov x0, xSELF
10157 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010158 mov x2, xPC
10159 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010160
10161/* ------------------------------ */
10162 .balign 128
10163.L_ALT_op_div_long_2addr: /* 0xbe */
10164/* File: arm64/alt_stub.S */
10165/*
10166 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10167 * any interesting requests and then jump to the real instruction
10168 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10169 */
10170 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010171 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10172 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10173 mov x0, xSELF
10174 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010175 mov x2, xPC
10176 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010177
10178/* ------------------------------ */
10179 .balign 128
10180.L_ALT_op_rem_long_2addr: /* 0xbf */
10181/* File: arm64/alt_stub.S */
10182/*
10183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10184 * any interesting requests and then jump to the real instruction
10185 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10186 */
10187 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010188 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10189 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10190 mov x0, xSELF
10191 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010192 mov x2, xPC
10193 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010194
10195/* ------------------------------ */
10196 .balign 128
10197.L_ALT_op_and_long_2addr: /* 0xc0 */
10198/* File: arm64/alt_stub.S */
10199/*
10200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10201 * any interesting requests and then jump to the real instruction
10202 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10203 */
10204 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010205 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10206 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10207 mov x0, xSELF
10208 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010209 mov x2, xPC
10210 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010211
10212/* ------------------------------ */
10213 .balign 128
10214.L_ALT_op_or_long_2addr: /* 0xc1 */
10215/* File: arm64/alt_stub.S */
10216/*
10217 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10218 * any interesting requests and then jump to the real instruction
10219 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10220 */
10221 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010222 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10223 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10224 mov x0, xSELF
10225 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010226 mov x2, xPC
10227 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010228
10229/* ------------------------------ */
10230 .balign 128
10231.L_ALT_op_xor_long_2addr: /* 0xc2 */
10232/* File: arm64/alt_stub.S */
10233/*
10234 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10235 * any interesting requests and then jump to the real instruction
10236 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10237 */
10238 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010239 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10240 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10241 mov x0, xSELF
10242 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010243 mov x2, xPC
10244 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010245
10246/* ------------------------------ */
10247 .balign 128
10248.L_ALT_op_shl_long_2addr: /* 0xc3 */
10249/* File: arm64/alt_stub.S */
10250/*
10251 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10252 * any interesting requests and then jump to the real instruction
10253 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10254 */
10255 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010256 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10257 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10258 mov x0, xSELF
10259 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010260 mov x2, xPC
10261 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010262
10263/* ------------------------------ */
10264 .balign 128
10265.L_ALT_op_shr_long_2addr: /* 0xc4 */
10266/* File: arm64/alt_stub.S */
10267/*
10268 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10269 * any interesting requests and then jump to the real instruction
10270 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10271 */
10272 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010273 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10274 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10275 mov x0, xSELF
10276 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010277 mov x2, xPC
10278 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010279
10280/* ------------------------------ */
10281 .balign 128
10282.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10283/* File: arm64/alt_stub.S */
10284/*
10285 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10286 * any interesting requests and then jump to the real instruction
10287 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10288 */
10289 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010290 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10291 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10292 mov x0, xSELF
10293 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010294 mov x2, xPC
10295 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010296
10297/* ------------------------------ */
10298 .balign 128
10299.L_ALT_op_add_float_2addr: /* 0xc6 */
10300/* File: arm64/alt_stub.S */
10301/*
10302 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10303 * any interesting requests and then jump to the real instruction
10304 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10305 */
10306 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010307 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10308 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10309 mov x0, xSELF
10310 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010311 mov x2, xPC
10312 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010313
10314/* ------------------------------ */
10315 .balign 128
10316.L_ALT_op_sub_float_2addr: /* 0xc7 */
10317/* File: arm64/alt_stub.S */
10318/*
10319 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10320 * any interesting requests and then jump to the real instruction
10321 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10322 */
10323 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010324 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10325 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10326 mov x0, xSELF
10327 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010328 mov x2, xPC
10329 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010330
10331/* ------------------------------ */
10332 .balign 128
10333.L_ALT_op_mul_float_2addr: /* 0xc8 */
10334/* File: arm64/alt_stub.S */
10335/*
10336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10337 * any interesting requests and then jump to the real instruction
10338 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10339 */
10340 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010341 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10342 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10343 mov x0, xSELF
10344 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010345 mov x2, xPC
10346 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010347
10348/* ------------------------------ */
10349 .balign 128
10350.L_ALT_op_div_float_2addr: /* 0xc9 */
10351/* File: arm64/alt_stub.S */
10352/*
10353 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10354 * any interesting requests and then jump to the real instruction
10355 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10356 */
10357 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010358 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10359 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10360 mov x0, xSELF
10361 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010362 mov x2, xPC
10363 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010364
10365/* ------------------------------ */
10366 .balign 128
10367.L_ALT_op_rem_float_2addr: /* 0xca */
10368/* File: arm64/alt_stub.S */
10369/*
10370 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10371 * any interesting requests and then jump to the real instruction
10372 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10373 */
10374 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010375 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10376 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10377 mov x0, xSELF
10378 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010379 mov x2, xPC
10380 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010381
10382/* ------------------------------ */
10383 .balign 128
10384.L_ALT_op_add_double_2addr: /* 0xcb */
10385/* File: arm64/alt_stub.S */
10386/*
10387 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10388 * any interesting requests and then jump to the real instruction
10389 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10390 */
10391 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010392 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10393 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10394 mov x0, xSELF
10395 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010396 mov x2, xPC
10397 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010398
10399/* ------------------------------ */
10400 .balign 128
10401.L_ALT_op_sub_double_2addr: /* 0xcc */
10402/* File: arm64/alt_stub.S */
10403/*
10404 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10405 * any interesting requests and then jump to the real instruction
10406 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10407 */
10408 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010409 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10410 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10411 mov x0, xSELF
10412 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010413 mov x2, xPC
10414 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010415
10416/* ------------------------------ */
10417 .balign 128
10418.L_ALT_op_mul_double_2addr: /* 0xcd */
10419/* File: arm64/alt_stub.S */
10420/*
10421 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10422 * any interesting requests and then jump to the real instruction
10423 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10424 */
10425 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010426 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10427 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10428 mov x0, xSELF
10429 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010430 mov x2, xPC
10431 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010432
10433/* ------------------------------ */
10434 .balign 128
10435.L_ALT_op_div_double_2addr: /* 0xce */
10436/* File: arm64/alt_stub.S */
10437/*
10438 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10439 * any interesting requests and then jump to the real instruction
10440 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10441 */
10442 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010443 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10444 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10445 mov x0, xSELF
10446 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010447 mov x2, xPC
10448 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010449
10450/* ------------------------------ */
10451 .balign 128
10452.L_ALT_op_rem_double_2addr: /* 0xcf */
10453/* File: arm64/alt_stub.S */
10454/*
10455 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10456 * any interesting requests and then jump to the real instruction
10457 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10458 */
10459 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010460 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10461 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10462 mov x0, xSELF
10463 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010464 mov x2, xPC
10465 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010466
10467/* ------------------------------ */
10468 .balign 128
10469.L_ALT_op_add_int_lit16: /* 0xd0 */
10470/* File: arm64/alt_stub.S */
10471/*
10472 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10473 * any interesting requests and then jump to the real instruction
10474 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10475 */
10476 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010477 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10478 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10479 mov x0, xSELF
10480 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010481 mov x2, xPC
10482 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010483
10484/* ------------------------------ */
10485 .balign 128
10486.L_ALT_op_rsub_int: /* 0xd1 */
10487/* File: arm64/alt_stub.S */
10488/*
10489 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10490 * any interesting requests and then jump to the real instruction
10491 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10492 */
10493 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010494 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10495 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10496 mov x0, xSELF
10497 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010498 mov x2, xPC
10499 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010500
10501/* ------------------------------ */
10502 .balign 128
10503.L_ALT_op_mul_int_lit16: /* 0xd2 */
10504/* File: arm64/alt_stub.S */
10505/*
10506 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10507 * any interesting requests and then jump to the real instruction
10508 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10509 */
10510 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010511 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10512 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10513 mov x0, xSELF
10514 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010515 mov x2, xPC
10516 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010517
10518/* ------------------------------ */
10519 .balign 128
10520.L_ALT_op_div_int_lit16: /* 0xd3 */
10521/* File: arm64/alt_stub.S */
10522/*
10523 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10524 * any interesting requests and then jump to the real instruction
10525 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10526 */
10527 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010528 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10529 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10530 mov x0, xSELF
10531 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010532 mov x2, xPC
10533 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010534
10535/* ------------------------------ */
10536 .balign 128
10537.L_ALT_op_rem_int_lit16: /* 0xd4 */
10538/* File: arm64/alt_stub.S */
10539/*
10540 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10541 * any interesting requests and then jump to the real instruction
10542 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10543 */
10544 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010545 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10546 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10547 mov x0, xSELF
10548 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010549 mov x2, xPC
10550 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010551
10552/* ------------------------------ */
10553 .balign 128
10554.L_ALT_op_and_int_lit16: /* 0xd5 */
10555/* File: arm64/alt_stub.S */
10556/*
10557 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10558 * any interesting requests and then jump to the real instruction
10559 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10560 */
10561 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010562 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10563 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10564 mov x0, xSELF
10565 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010566 mov x2, xPC
10567 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010568
10569/* ------------------------------ */
10570 .balign 128
10571.L_ALT_op_or_int_lit16: /* 0xd6 */
10572/* File: arm64/alt_stub.S */
10573/*
10574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10575 * any interesting requests and then jump to the real instruction
10576 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10577 */
10578 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010579 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10580 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10581 mov x0, xSELF
10582 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010583 mov x2, xPC
10584 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010585
10586/* ------------------------------ */
10587 .balign 128
10588.L_ALT_op_xor_int_lit16: /* 0xd7 */
10589/* File: arm64/alt_stub.S */
10590/*
10591 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10592 * any interesting requests and then jump to the real instruction
10593 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10594 */
10595 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010596 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10597 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10598 mov x0, xSELF
10599 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010600 mov x2, xPC
10601 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010602
10603/* ------------------------------ */
10604 .balign 128
10605.L_ALT_op_add_int_lit8: /* 0xd8 */
10606/* File: arm64/alt_stub.S */
10607/*
10608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10609 * any interesting requests and then jump to the real instruction
10610 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10611 */
10612 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010613 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10614 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
10615 mov x0, xSELF
10616 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010617 mov x2, xPC
10618 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010619
10620/* ------------------------------ */
10621 .balign 128
10622.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10623/* File: arm64/alt_stub.S */
10624/*
10625 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10626 * any interesting requests and then jump to the real instruction
10627 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10628 */
10629 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010630 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10631 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
10632 mov x0, xSELF
10633 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010634 mov x2, xPC
10635 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010636
10637/* ------------------------------ */
10638 .balign 128
10639.L_ALT_op_mul_int_lit8: /* 0xda */
10640/* File: arm64/alt_stub.S */
10641/*
10642 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10643 * any interesting requests and then jump to the real instruction
10644 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10645 */
10646 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010647 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10648 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
10649 mov x0, xSELF
10650 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010651 mov x2, xPC
10652 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010653
10654/* ------------------------------ */
10655 .balign 128
10656.L_ALT_op_div_int_lit8: /* 0xdb */
10657/* File: arm64/alt_stub.S */
10658/*
10659 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10660 * any interesting requests and then jump to the real instruction
10661 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10662 */
10663 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010664 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10665 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
10666 mov x0, xSELF
10667 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010668 mov x2, xPC
10669 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010670
10671/* ------------------------------ */
10672 .balign 128
10673.L_ALT_op_rem_int_lit8: /* 0xdc */
10674/* File: arm64/alt_stub.S */
10675/*
10676 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10677 * any interesting requests and then jump to the real instruction
10678 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10679 */
10680 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010681 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10682 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
10683 mov x0, xSELF
10684 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010685 mov x2, xPC
10686 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010687
10688/* ------------------------------ */
10689 .balign 128
10690.L_ALT_op_and_int_lit8: /* 0xdd */
10691/* File: arm64/alt_stub.S */
10692/*
10693 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10694 * any interesting requests and then jump to the real instruction
10695 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10696 */
10697 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010698 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10699 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
10700 mov x0, xSELF
10701 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010702 mov x2, xPC
10703 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010704
10705/* ------------------------------ */
10706 .balign 128
10707.L_ALT_op_or_int_lit8: /* 0xde */
10708/* File: arm64/alt_stub.S */
10709/*
10710 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10711 * any interesting requests and then jump to the real instruction
10712 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10713 */
10714 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010715 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10716 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
10717 mov x0, xSELF
10718 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010719 mov x2, xPC
10720 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010721
10722/* ------------------------------ */
10723 .balign 128
10724.L_ALT_op_xor_int_lit8: /* 0xdf */
10725/* File: arm64/alt_stub.S */
10726/*
10727 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10728 * any interesting requests and then jump to the real instruction
10729 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10730 */
10731 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010732 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10733 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
10734 mov x0, xSELF
10735 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010736 mov x2, xPC
10737 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010738
10739/* ------------------------------ */
10740 .balign 128
10741.L_ALT_op_shl_int_lit8: /* 0xe0 */
10742/* File: arm64/alt_stub.S */
10743/*
10744 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10745 * any interesting requests and then jump to the real instruction
10746 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10747 */
10748 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010749 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10750 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
10751 mov x0, xSELF
10752 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010753 mov x2, xPC
10754 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010755
10756/* ------------------------------ */
10757 .balign 128
10758.L_ALT_op_shr_int_lit8: /* 0xe1 */
10759/* File: arm64/alt_stub.S */
10760/*
10761 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10762 * any interesting requests and then jump to the real instruction
10763 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10764 */
10765 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010766 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10767 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
10768 mov x0, xSELF
10769 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010770 mov x2, xPC
10771 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010772
10773/* ------------------------------ */
10774 .balign 128
10775.L_ALT_op_ushr_int_lit8: /* 0xe2 */
10776/* File: arm64/alt_stub.S */
10777/*
10778 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10779 * any interesting requests and then jump to the real instruction
10780 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10781 */
10782 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010783 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10784 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
10785 mov x0, xSELF
10786 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010787 mov x2, xPC
10788 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010789
10790/* ------------------------------ */
10791 .balign 128
10792.L_ALT_op_iget_quick: /* 0xe3 */
10793/* File: arm64/alt_stub.S */
10794/*
10795 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10796 * any interesting requests and then jump to the real instruction
10797 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10798 */
10799 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010800 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10801 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
10802 mov x0, xSELF
10803 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010804 mov x2, xPC
10805 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010806
10807/* ------------------------------ */
10808 .balign 128
10809.L_ALT_op_iget_wide_quick: /* 0xe4 */
10810/* File: arm64/alt_stub.S */
10811/*
10812 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10813 * any interesting requests and then jump to the real instruction
10814 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10815 */
10816 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010817 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10818 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
10819 mov x0, xSELF
10820 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010821 mov x2, xPC
10822 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010823
10824/* ------------------------------ */
10825 .balign 128
10826.L_ALT_op_iget_object_quick: /* 0xe5 */
10827/* File: arm64/alt_stub.S */
10828/*
10829 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10830 * any interesting requests and then jump to the real instruction
10831 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10832 */
10833 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010834 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10835 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
10836 mov x0, xSELF
10837 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010838 mov x2, xPC
10839 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010840
10841/* ------------------------------ */
10842 .balign 128
10843.L_ALT_op_iput_quick: /* 0xe6 */
10844/* File: arm64/alt_stub.S */
10845/*
10846 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10847 * any interesting requests and then jump to the real instruction
10848 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10849 */
10850 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010851 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10852 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
10853 mov x0, xSELF
10854 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010855 mov x2, xPC
10856 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010857
10858/* ------------------------------ */
10859 .balign 128
10860.L_ALT_op_iput_wide_quick: /* 0xe7 */
10861/* File: arm64/alt_stub.S */
10862/*
10863 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10864 * any interesting requests and then jump to the real instruction
10865 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10866 */
10867 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010868 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10869 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
10870 mov x0, xSELF
10871 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010872 mov x2, xPC
10873 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010874
10875/* ------------------------------ */
10876 .balign 128
10877.L_ALT_op_iput_object_quick: /* 0xe8 */
10878/* File: arm64/alt_stub.S */
10879/*
10880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10881 * any interesting requests and then jump to the real instruction
10882 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10883 */
10884 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010885 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10886 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
10887 mov x0, xSELF
10888 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010889 mov x2, xPC
10890 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010891
10892/* ------------------------------ */
10893 .balign 128
10894.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
10895/* File: arm64/alt_stub.S */
10896/*
10897 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10898 * any interesting requests and then jump to the real instruction
10899 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10900 */
10901 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010902 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10903 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
10904 mov x0, xSELF
10905 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010906 mov x2, xPC
10907 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010908
10909/* ------------------------------ */
10910 .balign 128
10911.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
10912/* File: arm64/alt_stub.S */
10913/*
10914 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10915 * any interesting requests and then jump to the real instruction
10916 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10917 */
10918 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010919 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10920 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
10921 mov x0, xSELF
10922 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010923 mov x2, xPC
10924 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010925
10926/* ------------------------------ */
10927 .balign 128
10928.L_ALT_op_iput_boolean_quick: /* 0xeb */
10929/* File: arm64/alt_stub.S */
10930/*
10931 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10932 * any interesting requests and then jump to the real instruction
10933 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10934 */
10935 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010936 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10937 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
10938 mov x0, xSELF
10939 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010940 mov x2, xPC
10941 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010942
10943/* ------------------------------ */
10944 .balign 128
10945.L_ALT_op_iput_byte_quick: /* 0xec */
10946/* File: arm64/alt_stub.S */
10947/*
10948 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10949 * any interesting requests and then jump to the real instruction
10950 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10951 */
10952 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010953 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10954 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
10955 mov x0, xSELF
10956 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010957 mov x2, xPC
10958 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010959
10960/* ------------------------------ */
10961 .balign 128
10962.L_ALT_op_iput_char_quick: /* 0xed */
10963/* File: arm64/alt_stub.S */
10964/*
10965 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10966 * any interesting requests and then jump to the real instruction
10967 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10968 */
10969 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010970 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10971 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
10972 mov x0, xSELF
10973 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010974 mov x2, xPC
10975 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010976
10977/* ------------------------------ */
10978 .balign 128
10979.L_ALT_op_iput_short_quick: /* 0xee */
10980/* File: arm64/alt_stub.S */
10981/*
10982 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10983 * any interesting requests and then jump to the real instruction
10984 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10985 */
10986 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010987 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10988 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
10989 mov x0, xSELF
10990 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010991 mov x2, xPC
10992 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010993
10994/* ------------------------------ */
10995 .balign 128
10996.L_ALT_op_iget_boolean_quick: /* 0xef */
10997/* File: arm64/alt_stub.S */
10998/*
10999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11000 * any interesting requests and then jump to the real instruction
11001 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11002 */
11003 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011004 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11005 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
11006 mov x0, xSELF
11007 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011008 mov x2, xPC
11009 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011010
11011/* ------------------------------ */
11012 .balign 128
11013.L_ALT_op_iget_byte_quick: /* 0xf0 */
11014/* File: arm64/alt_stub.S */
11015/*
11016 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11017 * any interesting requests and then jump to the real instruction
11018 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11019 */
11020 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011021 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11022 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
11023 mov x0, xSELF
11024 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011025 mov x2, xPC
11026 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011027
11028/* ------------------------------ */
11029 .balign 128
11030.L_ALT_op_iget_char_quick: /* 0xf1 */
11031/* File: arm64/alt_stub.S */
11032/*
11033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11034 * any interesting requests and then jump to the real instruction
11035 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11036 */
11037 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011038 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11039 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11040 mov x0, xSELF
11041 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011042 mov x2, xPC
11043 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011044
11045/* ------------------------------ */
11046 .balign 128
11047.L_ALT_op_iget_short_quick: /* 0xf2 */
11048/* File: arm64/alt_stub.S */
11049/*
11050 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11051 * any interesting requests and then jump to the real instruction
11052 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11053 */
11054 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011055 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11056 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11057 mov x0, xSELF
11058 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011059 mov x2, xPC
11060 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011061
11062/* ------------------------------ */
11063 .balign 128
11064.L_ALT_op_invoke_lambda: /* 0xf3 */
11065/* File: arm64/alt_stub.S */
11066/*
11067 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11068 * any interesting requests and then jump to the real instruction
11069 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11070 */
11071 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011072 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11073 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11074 mov x0, xSELF
11075 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011076 mov x2, xPC
11077 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011078
11079/* ------------------------------ */
11080 .balign 128
11081.L_ALT_op_unused_f4: /* 0xf4 */
11082/* File: arm64/alt_stub.S */
11083/*
11084 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11085 * any interesting requests and then jump to the real instruction
11086 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11087 */
11088 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011089 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11090 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11091 mov x0, xSELF
11092 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011093 mov x2, xPC
11094 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011095
11096/* ------------------------------ */
11097 .balign 128
11098.L_ALT_op_capture_variable: /* 0xf5 */
11099/* File: arm64/alt_stub.S */
11100/*
11101 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11102 * any interesting requests and then jump to the real instruction
11103 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11104 */
11105 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011106 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11107 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11108 mov x0, xSELF
11109 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011110 mov x2, xPC
11111 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011112
11113/* ------------------------------ */
11114 .balign 128
11115.L_ALT_op_create_lambda: /* 0xf6 */
11116/* File: arm64/alt_stub.S */
11117/*
11118 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11119 * any interesting requests and then jump to the real instruction
11120 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11121 */
11122 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011123 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11124 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11125 mov x0, xSELF
11126 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011127 mov x2, xPC
11128 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011129
11130/* ------------------------------ */
11131 .balign 128
11132.L_ALT_op_liberate_variable: /* 0xf7 */
11133/* File: arm64/alt_stub.S */
11134/*
11135 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11136 * any interesting requests and then jump to the real instruction
11137 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11138 */
11139 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011140 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11141 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11142 mov x0, xSELF
11143 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011144 mov x2, xPC
11145 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011146
11147/* ------------------------------ */
11148 .balign 128
11149.L_ALT_op_box_lambda: /* 0xf8 */
11150/* File: arm64/alt_stub.S */
11151/*
11152 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11153 * any interesting requests and then jump to the real instruction
11154 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11155 */
11156 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011157 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11158 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11159 mov x0, xSELF
11160 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011161 mov x2, xPC
11162 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011163
11164/* ------------------------------ */
11165 .balign 128
11166.L_ALT_op_unbox_lambda: /* 0xf9 */
11167/* File: arm64/alt_stub.S */
11168/*
11169 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11170 * any interesting requests and then jump to the real instruction
11171 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11172 */
11173 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011174 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11175 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11176 mov x0, xSELF
11177 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011178 mov x2, xPC
11179 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011180
11181/* ------------------------------ */
11182 .balign 128
11183.L_ALT_op_unused_fa: /* 0xfa */
11184/* File: arm64/alt_stub.S */
11185/*
11186 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11187 * any interesting requests and then jump to the real instruction
11188 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11189 */
11190 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011191 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11192 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11193 mov x0, xSELF
11194 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011195 mov x2, xPC
11196 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011197
11198/* ------------------------------ */
11199 .balign 128
11200.L_ALT_op_unused_fb: /* 0xfb */
11201/* File: arm64/alt_stub.S */
11202/*
11203 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11204 * any interesting requests and then jump to the real instruction
11205 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11206 */
11207 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011208 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11209 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11210 mov x0, xSELF
11211 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011212 mov x2, xPC
11213 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011214
11215/* ------------------------------ */
11216 .balign 128
11217.L_ALT_op_unused_fc: /* 0xfc */
11218/* File: arm64/alt_stub.S */
11219/*
11220 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11221 * any interesting requests and then jump to the real instruction
11222 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11223 */
11224 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011225 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11226 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11227 mov x0, xSELF
11228 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011229 mov x2, xPC
11230 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011231
11232/* ------------------------------ */
11233 .balign 128
11234.L_ALT_op_unused_fd: /* 0xfd */
11235/* File: arm64/alt_stub.S */
11236/*
11237 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11238 * any interesting requests and then jump to the real instruction
11239 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11240 */
11241 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011242 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11243 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11244 mov x0, xSELF
11245 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011246 mov x2, xPC
11247 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011248
11249/* ------------------------------ */
11250 .balign 128
11251.L_ALT_op_unused_fe: /* 0xfe */
11252/* File: arm64/alt_stub.S */
11253/*
11254 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11255 * any interesting requests and then jump to the real instruction
11256 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11257 */
11258 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011259 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11260 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11261 mov x0, xSELF
11262 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011263 mov x2, xPC
11264 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011265
11266/* ------------------------------ */
11267 .balign 128
11268.L_ALT_op_unused_ff: /* 0xff */
11269/* File: arm64/alt_stub.S */
11270/*
11271 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11272 * any interesting requests and then jump to the real instruction
11273 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11274 */
11275 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011276 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11277 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11278 mov x0, xSELF
11279 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011280 mov x2, xPC
11281 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011282
11283 .balign 128
11284 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11285 .global artMterpAsmAltInstructionEnd
11286artMterpAsmAltInstructionEnd:
11287/* File: arm64/footer.S */
11288/*
11289 * ===========================================================================
11290 * Common subroutines and data
11291 * ===========================================================================
11292 */
11293
11294
11295/*
11296 * We've detected a condition that will result in an exception, but the exception
11297 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
11298 * TUNING: for consistency, we may want to just go ahead and handle these here.
11299 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011300common_errDivideByZero:
11301 EXPORT_PC
11302#if MTERP_LOGGING
11303 mov x0, xSELF
11304 add x1, xFP, #OFF_FP_SHADOWFRAME
11305 bl MterpLogDivideByZeroException
11306#endif
11307 b MterpCommonFallback
11308
11309common_errArrayIndex:
11310 EXPORT_PC
11311#if MTERP_LOGGING
11312 mov x0, xSELF
11313 add x1, xFP, #OFF_FP_SHADOWFRAME
11314 bl MterpLogArrayIndexException
11315#endif
11316 b MterpCommonFallback
11317
11318common_errNegativeArraySize:
11319 EXPORT_PC
11320#if MTERP_LOGGING
11321 mov x0, xSELF
11322 add x1, xFP, #OFF_FP_SHADOWFRAME
11323 bl MterpLogNegativeArraySizeException
11324#endif
11325 b MterpCommonFallback
11326
11327common_errNoSuchMethod:
11328 EXPORT_PC
11329#if MTERP_LOGGING
11330 mov x0, xSELF
11331 add x1, xFP, #OFF_FP_SHADOWFRAME
11332 bl MterpLogNoSuchMethodException
11333#endif
11334 b MterpCommonFallback
11335
11336common_errNullObject:
11337 EXPORT_PC
11338#if MTERP_LOGGING
11339 mov x0, xSELF
11340 add x1, xFP, #OFF_FP_SHADOWFRAME
11341 bl MterpLogNullObjectException
11342#endif
11343 b MterpCommonFallback
11344
11345common_exceptionThrown:
11346 EXPORT_PC
11347#if MTERP_LOGGING
11348 mov x0, xSELF
11349 add x1, xFP, #OFF_FP_SHADOWFRAME
11350 bl MterpLogExceptionThrownException
11351#endif
11352 b MterpCommonFallback
11353
11354MterpSuspendFallback:
11355 EXPORT_PC
11356#if MTERP_LOGGING
11357 mov x0, xSELF
11358 add x1, xFP, #OFF_FP_SHADOWFRAME
11359 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
11360 bl MterpLogSuspendFallback
11361#endif
11362 b MterpCommonFallback
11363
11364/*
11365 * If we're here, something is out of the ordinary. If there is a pending
11366 * exception, handle it. Otherwise, roll back and retry with the reference
11367 * interpreter.
11368 */
11369MterpPossibleException:
11370 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
11371 cbz x0, MterpFallback // If not, fall back to reference interpreter.
11372 /* intentional fallthrough - handle pending exception. */
11373/*
11374 * On return from a runtime helper routine, we've found a pending exception.
11375 * Can we handle it here - or need to bail out to caller?
11376 *
11377 */
11378MterpException:
11379 mov x0, xSELF
11380 add x1, xFP, #OFF_FP_SHADOWFRAME
11381 bl MterpHandleException // (self, shadow_frame)
11382 cbz w0, MterpExceptionReturn // no local catch, back to caller.
11383 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
11384 ldr w1, [xFP, #OFF_FP_DEX_PC]
11385 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
11386 add xPC, x0, #CODEITEM_INSNS_OFFSET
11387 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
Bill Buzbeefd522f92016-02-11 22:37:42 +000011388 /* Do we need to switch interpreters? */
11389 bl MterpShouldSwitchInterpreters
11390 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011391 /* resume execution at catch block */
Bill Buzbeefd522f92016-02-11 22:37:42 +000011392 EXPORT_PC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011393 FETCH_INST
11394 GET_INST_OPCODE ip
11395 GOTO_OPCODE ip
11396 /* NOTE: no fallthrough */
Bill Buzbee1d011d92016-04-04 16:59:29 +000011397/*
11398 * Common handling for branches with support for Jit profiling.
11399 * On entry:
11400 * wINST <= signed offset
11401 * wPROFILE <= signed hotness countdown (expanded to 32 bits)
11402 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
11403 *
11404 * We have quite a few different cases for branch profiling, OSR detection and
11405 * suspend check support here.
11406 *
11407 * Taken backward branches:
11408 * If profiling active, do hotness countdown and report if we hit zero.
11409 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11410 * Is there a pending suspend request? If so, suspend.
11411 *
11412 * Taken forward branches and not-taken backward branches:
11413 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11414 *
11415 * Our most common case is expected to be a taken backward branch with active jit profiling,
11416 * but no full OSR check and no pending suspend request.
11417 * Next most common case is not-taken branch with no full OSR check.
11418 *
11419 */
11420MterpCommonTakenBranchNoFlags:
11421 cmp wINST, #0
11422 b.gt .L_forward_branch // don't add forward branches to hotness
11423 tbnz wPROFILE, #31, .L_no_count_backwards // go if negative
11424 subs wPROFILE, wPROFILE, #1 // countdown
11425 b.eq .L_add_batch // counted down to zero - report
11426.L_resume_backward_branch:
11427 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
11428 add w2, wINST, wINST // w2<- byte offset
11429 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
11430 REFRESH_IBASE
11431 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11432 b.ne .L_suspend_request_pending
11433 GET_INST_OPCODE ip // extract opcode from wINST
11434 GOTO_OPCODE ip // jump to next instruction
11435
11436.L_suspend_request_pending:
11437 EXPORT_PC
11438 mov x0, xSELF
11439 bl MterpSuspendCheck // (self)
11440 cbnz x0, MterpFallback
11441 REFRESH_IBASE // might have changed during suspend
11442 GET_INST_OPCODE ip // extract opcode from wINST
11443 GOTO_OPCODE ip // jump to next instruction
11444
11445.L_no_count_backwards:
11446 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
11447 b.ne .L_resume_backward_branch
11448 mov x0, xSELF
11449 add x1, xFP, #OFF_FP_SHADOWFRAME
11450 mov x2, xINST
11451 EXPORT_PC
11452 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11453 cbnz x0, MterpOnStackReplacement
11454 b .L_resume_backward_branch
11455
11456.L_forward_branch:
11457 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
11458 b.eq .L_check_osr_forward
11459.L_resume_forward_branch:
11460 add w2, wINST, wINST // w2<- byte offset
11461 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
11462 GET_INST_OPCODE ip // extract opcode from wINST
11463 GOTO_OPCODE ip // jump to next instruction
11464
11465.L_check_osr_forward:
11466 mov x0, xSELF
11467 add x1, xFP, #OFF_FP_SHADOWFRAME
11468 mov x2, xINST
11469 EXPORT_PC
11470 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11471 cbnz x0, MterpOnStackReplacement
11472 b .L_resume_forward_branch
11473
11474.L_add_batch:
11475 add x1, xFP, #OFF_FP_SHADOWFRAME
11476 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
11477 ldr x0, [xFP, #OFF_FP_METHOD]
11478 mov x2, xSELF
11479 bl MterpAddHotnessBatch // (method, shadow_frame, self)
11480 mov wPROFILE, w0 // restore new hotness countdown to wPROFILE
11481 b .L_no_count_backwards
11482
11483/*
11484 * Entered from the conditional branch handlers when OSR check request active on
11485 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
11486 */
11487.L_check_not_taken_osr:
11488 mov x0, xSELF
11489 add x1, xFP, #OFF_FP_SHADOWFRAME
11490 mov x2, #2
11491 EXPORT_PC
11492 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11493 cbnz x0, MterpOnStackReplacement
11494 FETCH_ADVANCE_INST 2
11495 GET_INST_OPCODE ip // extract opcode from wINST
11496 GOTO_OPCODE ip // jump to next instruction
11497
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011498
11499/*
11500 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
11501 * still needs to get the opcode and branch to it, and flags are in lr.
11502 */
11503MterpCheckSuspendAndContinue:
11504 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
11505 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11506 b.ne check1
11507 GET_INST_OPCODE ip // extract opcode from wINST
11508 GOTO_OPCODE ip // jump to next instruction
11509check1:
11510 EXPORT_PC
11511 mov x0, xSELF
11512 bl MterpSuspendCheck // (self)
Bill Buzbeefd522f92016-02-11 22:37:42 +000011513 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011514 GET_INST_OPCODE ip // extract opcode from wINST
11515 GOTO_OPCODE ip // jump to next instruction
11516
11517/*
Bill Buzbeefd522f92016-02-11 22:37:42 +000011518 * On-stack replacement has happened, and now we've returned from the compiled method.
11519 */
11520MterpOnStackReplacement:
11521#if MTERP_LOGGING
11522 mov x0, xSELF
11523 add x1, xFP, #OFF_FP_SHADOWFRAME
11524 sbfm x2, xINST, 0, 31
11525 bl MterpLogOSR
11526#endif
11527 mov x0, #1 // Signal normal return
11528 b MterpDone
11529
11530/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011531 * Bail out to reference interpreter.
11532 */
11533MterpFallback:
11534 EXPORT_PC
11535#if MTERP_LOGGING
11536 mov x0, xSELF
11537 add x1, xFP, #OFF_FP_SHADOWFRAME
11538 bl MterpLogFallback
11539#endif
11540MterpCommonFallback:
11541 mov x0, #0 // signal retry with reference interpreter.
11542 b MterpDone
11543
11544/*
11545 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
11546 * SP and LR. Here we restore SP, restore the registers, and then restore
11547 * LR to PC.
11548 *
11549 * On entry:
11550 * uint32_t* xFP (should still be live, pointer to base of vregs)
11551 */
11552MterpExceptionReturn:
11553 mov x0, #1 // signal return to caller.
11554 b MterpDone
11555MterpReturn:
11556 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
11557 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
11558 str x0, [x2]
11559 mov x0, xSELF
11560 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11561 b.eq check2
11562 bl MterpSuspendCheck // (self)
11563check2:
11564 mov x0, #1 // signal return to caller.
11565MterpDone:
Bill Buzbee1d011d92016-04-04 16:59:29 +000011566/*
11567 * At this point, we expect wPROFILE to be non-zero. If negative, hotness is disabled or we're
11568 * checking for OSR. If greater than zero, we might have unreported hotness to register
11569 * (the difference between the ending wPROFILE and the cached hotness counter). wPROFILE
11570 * should only reach zero immediately after a hotness decrement, and is then reset to either
11571 * a negative special state or the new non-zero countdown value.
11572 */
11573 cmp wPROFILE, #0
11574 bgt MterpProfileActive // if > 0, we may have some counts to report.
11575 ldp fp, lr, [sp, #64]
11576 ldp xPC, xFP, [sp, #48]
11577 ldp xSELF, xINST, [sp, #32]
11578 ldp xIBASE, xREFS, [sp, #16]
11579 ldp xPROFILE, x27, [sp], #80
11580 ret
11581
11582MterpProfileActive:
11583 mov xINST, x0 // stash return value
11584 /* Report cached hotness counts */
11585 ldr x0, [xFP, #OFF_FP_METHOD]
11586 add x1, xFP, #OFF_FP_SHADOWFRAME
11587 mov x2, xSELF
11588 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
11589 bl MterpAddHotnessBatch // (method, shadow_frame, self)
11590 mov x0, xINST // restore return value
11591 ldp fp, lr, [sp, #64]
11592 ldp xPC, xFP, [sp, #48]
11593 ldp xSELF, xINST, [sp, #32]
11594 ldp xIBASE, xREFS, [sp, #16]
11595 ldp xPROFILE, x27, [sp], #80
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011596 ret
11597
11598 .cfi_endproc
11599 .size ExecuteMterpImpl, .-ExecuteMterpImpl
11600
11601