blob: d470551173de7b19830dff4d96fafa2a6ba97408 [file] [log] [blame]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001/*
2 * This file was generated automatically by gen-mterp.py for 'arm64'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: arm64/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 Art assembly interpreter notes:
26
27 First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28 handle invoke, allows higher-level code to create frame & shadow frame.
29
30 Once that's working, support direct entry code & eliminate shadow frame (and
31 excess locals allocation.
32
33 Some (hopefully) temporary ugliness. We'll treat xFP as pointing to the
34 base of the vreg array within the shadow frame. Access the other fields,
35 dex_pc_, method_ and number_of_vregs_ via negative offsets. For now, we'll continue
36 the shadow frame mechanism of double-storing object references - via xFP &
37 number_of_vregs_.
38
39 */
40
41/*
42ARM64 Runtime register usage conventions.
43
44 r0 : w0 is 32-bit return register and x0 is 64-bit.
45 r0-r7 : Argument registers.
46 r8-r15 : Caller save registers (used as temporary registers).
47 r16-r17: Also known as ip0-ip1, respectively. Used as scratch registers by
48 the linker, by the trampolines and other stubs (the backend uses
49 these as temporary registers).
50 r18 : Caller save register (used as temporary register).
51 r19 : Pointer to thread-local storage.
52 r20-r29: Callee save registers.
53 r30 : (lr) is reserved (the link register).
54 rsp : (sp) is reserved (the stack pointer).
55 rzr : (zr) is reserved (the zero register).
56
57 Floating-point registers
58 v0-v31
59
60 v0 : s0 is return register for singles (32-bit) and d0 for doubles (64-bit).
61 This is analogous to the C/C++ (hard-float) calling convention.
62 v0-v7 : Floating-point argument registers in both Dalvik and C/C++ conventions.
63 Also used as temporary and codegen scratch registers.
64
65 v0-v7 and v16-v31 : trashed across C calls.
66 v8-v15 : bottom 64-bits preserved across C calls (d8-d15 are preserved).
67
68 v16-v31: Used as codegen temp/scratch.
69 v8-v15 : Can be used for promotion.
70
71 Must maintain 16-byte stack alignment.
72
73Mterp notes:
74
75The following registers have fixed assignments:
76
77 reg nick purpose
78 x20 xPC interpreted program counter, used for fetching instructions
79 x21 xFP interpreted frame pointer, used for accessing locals and args
80 x22 xSELF self (Thread) pointer
81 x23 xINST first 16-bit code unit of current instruction
82 x24 xIBASE interpreted instruction base pointer, used for computed goto
83 x25 xREFS base of object references in shadow frame (ideally, we'll get rid of this later).
Bill Buzbee1d011d92016-04-04 16:59:29 +000084 x26 wPROFILE jit profile hotness countdown
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000085 x16 ip scratch reg
86 x17 ip2 scratch reg (used by macros)
87
88Macros are provided for common operations. They MUST NOT alter unspecified registers or condition
89codes.
90*/
91
92/*
93 * This is a #include, not a %include, because we want the C pre-processor
94 * to expand the macros into assembler assignment statements.
95 */
96#include "asm_support.h"
97
Bill Buzbeefd522f92016-02-11 22:37:42 +000098#define MTERP_PROFILE_BRANCHES 1
99#define MTERP_LOGGING 0
100
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000101/* During bringup, we'll use the shadow frame model instead of xFP */
102/* single-purpose registers, given names for clarity */
Bill Buzbee1d011d92016-04-04 16:59:29 +0000103#define xPC x20
104#define xFP x21
105#define xSELF x22
106#define xINST x23
107#define wINST w23
108#define xIBASE x24
109#define xREFS x25
110#define wPROFILE w26
111#define xPROFILE x26
112#define ip x16
113#define ip2 x17
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000114
115/*
116 * Instead of holding a pointer to the shadow frame, we keep xFP at the base of the vregs. So,
117 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
118 */
119#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
120#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
121#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
122#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
123#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
124#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
125#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
126#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
Bill Buzbee1d011d92016-04-04 16:59:29 +0000127#define OFF_FP_SHADOWFRAME OFF_FP(0)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000128
129/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000130 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
131 * be done *before* something throws.
132 *
133 * It's okay to do this more than once.
134 *
135 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
136 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
137 * offset into the code_items_[] array. For effiency, we will "export" the
138 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
139 * to convert to a dex pc when needed.
140 */
141.macro EXPORT_PC
142 str xPC, [xFP, #OFF_FP_DEX_PC_PTR]
143.endm
144
145/*
146 * Fetch the next instruction from xPC into wINST. Does not advance xPC.
147 */
148.macro FETCH_INST
149 ldrh wINST, [xPC]
150.endm
151
152/*
153 * Fetch the next instruction from the specified offset. Advances xPC
154 * to point to the next instruction. "_count" is in 16-bit code units.
155 *
156 * Because of the limited size of immediate constants on ARM, this is only
157 * suitable for small forward movements (i.e. don't try to implement "goto"
158 * with this).
159 *
160 * This must come AFTER anything that can throw an exception, or the
161 * exception catch may miss. (This also implies that it must come after
162 * EXPORT_PC.)
163 */
164.macro FETCH_ADVANCE_INST count
165 ldrh wINST, [xPC, #((\count)*2)]!
166.endm
167
168/*
169 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
170 * src and dest registers are parameterized (not hard-wired to xPC and xINST).
171 */
172.macro PREFETCH_ADVANCE_INST dreg, sreg, count
173 ldrh \dreg, [\sreg, #((\count)*2)]!
174.endm
175
176/*
177 * Similar to FETCH_ADVANCE_INST, but does not update xPC. Used to load
178 * xINST ahead of possible exception point. Be sure to manually advance xPC
179 * later.
180 */
181.macro PREFETCH_INST count
182 ldrh wINST, [xPC, #((\count)*2)]
183.endm
184
185/* Advance xPC by some number of code units. */
186.macro ADVANCE count
187 add xPC, xPC, #((\count)*2)
188.endm
189
190/*
191 * Fetch the next instruction from an offset specified by _reg and advance xPC.
192 * xPC to point to the next instruction. "_reg" must specify the distance
193 * in bytes, *not* 16-bit code units, and may be a signed value. Must not set flags.
194 *
195 */
196.macro FETCH_ADVANCE_INST_RB reg
197 add xPC, xPC, \reg, sxtw
198 ldrh wINST, [xPC]
199.endm
200
201/*
202 * Fetch a half-word code unit from an offset past the current PC. The
203 * "_count" value is in 16-bit code units. Does not advance xPC.
204 *
205 * The "_S" variant works the same but treats the value as signed.
206 */
207.macro FETCH reg, count
208 ldrh \reg, [xPC, #((\count)*2)]
209.endm
210
211.macro FETCH_S reg, count
212 ldrsh \reg, [xPC, #((\count)*2)]
213.endm
214
215/*
216 * Fetch one byte from an offset past the current PC. Pass in the same
217 * "_count" as you would for FETCH, and an additional 0/1 indicating which
218 * byte of the halfword you want (lo/hi).
219 */
220.macro FETCH_B reg, count, byte
221 ldrb \reg, [xPC, #((\count)*2+(\byte))]
222.endm
223
224/*
225 * Put the instruction's opcode field into the specified register.
226 */
227.macro GET_INST_OPCODE reg
228 and \reg, xINST, #255
229.endm
230
231/*
232 * Put the prefetched instruction's opcode field into the specified register.
233 */
234.macro GET_PREFETCHED_OPCODE oreg, ireg
235 and \oreg, \ireg, #255
236.endm
237
238/*
239 * Begin executing the opcode in _reg. Clobbers reg
240 */
241
242.macro GOTO_OPCODE reg
243 add \reg, xIBASE, \reg, lsl #7
244 br \reg
245.endm
246.macro GOTO_OPCODE_BASE base,reg
247 add \reg, \base, \reg, lsl #7
248 br \reg
249.endm
250
251/*
252 * Get/set the 32-bit value from a Dalvik register.
253 */
254.macro GET_VREG reg, vreg
255 ldr \reg, [xFP, \vreg, uxtw #2]
256.endm
257.macro SET_VREG reg, vreg
258 str \reg, [xFP, \vreg, uxtw #2]
259 str wzr, [xREFS, \vreg, uxtw #2]
260.endm
261.macro SET_VREG_OBJECT reg, vreg, tmpreg
262 str \reg, [xFP, \vreg, uxtw #2]
263 str \reg, [xREFS, \vreg, uxtw #2]
264.endm
265
266/*
267 * Get/set the 64-bit value from a Dalvik register.
268 * TUNING: can we do better here?
269 */
270.macro GET_VREG_WIDE reg, vreg
271 add ip2, xFP, \vreg, lsl #2
272 ldr \reg, [ip2]
273.endm
274.macro SET_VREG_WIDE reg, vreg
275 add ip2, xFP, \vreg, lsl #2
276 str \reg, [ip2]
277 add ip2, xREFS, \vreg, lsl #2
278 str xzr, [ip2]
279.endm
280
281/*
282 * Convert a virtual register index into an address.
283 */
284.macro VREG_INDEX_TO_ADDR reg, vreg
buzbeeace690f2016-03-11 09:51:11 -0800285 add \reg, xFP, \vreg, lsl #2 /* WARNING: handle shadow frame vreg zero if store */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000286.endm
287
288/*
289 * Refresh handler table.
290 */
291.macro REFRESH_IBASE
292 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
293.endm
294
295/* File: arm64/entry.S */
296/*
297 * Copyright (C) 2016 The Android Open Source Project
298 *
299 * Licensed under the Apache License, Version 2.0 (the "License");
300 * you may not use this file except in compliance with the License.
301 * You may obtain a copy of the License at
302 *
303 * http://www.apache.org/licenses/LICENSE-2.0
304 *
305 * Unless required by applicable law or agreed to in writing, software
306 * distributed under the License is distributed on an "AS IS" BASIS,
307 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
308 * See the License for the specific language governing permissions and
309 * limitations under the License.
310 */
311
312 .text
313
314/*
315 * Interpreter entry point.
316 * On entry:
317 * x0 Thread* self/
318 * x1 code_item
319 * x2 ShadowFrame
320 * x3 JValue* result_register
321 *
322 */
323 .global ExecuteMterpImpl
324 .type ExecuteMterpImpl, %function
325 .balign 16
326
327ExecuteMterpImpl:
328 .cfi_startproc
Bill Buzbee1d011d92016-04-04 16:59:29 +0000329 stp xPROFILE, x27, [sp, #-80]!
330 stp xIBASE, xREFS, [sp, #16]
331 stp xSELF, xINST, [sp, #32]
332 stp xPC, xFP, [sp, #48]
333 stp fp, lr, [sp, #64]
334 add fp, sp, #64
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000335
336 /* Remember the return register */
337 str x3, [x2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
338
339 /* Remember the code_item */
340 str x1, [x2, #SHADOWFRAME_CODE_ITEM_OFFSET]
341
342 /* set up "named" registers */
343 mov xSELF, x0
344 ldr w0, [x2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
buzbeeace690f2016-03-11 09:51:11 -0800345 add xFP, x2, #SHADOWFRAME_VREGS_OFFSET // point to vregs.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000346 add xREFS, xFP, w0, lsl #2 // point to reference array in shadow frame
347 ldr w0, [x2, #SHADOWFRAME_DEX_PC_OFFSET] // Get starting dex_pc.
348 add xPC, x1, #CODEITEM_INSNS_OFFSET // Point to base of insns[]
349 add xPC, xPC, w0, lsl #1 // Create direct pointer to 1st dex opcode
350 EXPORT_PC
351
352 /* Starting ibase */
353 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
354
Bill Buzbee1d011d92016-04-04 16:59:29 +0000355 /* Set up for backwards branches & osr profiling */
356 ldr x0, [xFP, #OFF_FP_METHOD]
357 add x1, xFP, #OFF_FP_SHADOWFRAME
358 bl MterpSetUpHotnessCountdown
359 mov wPROFILE, w0 // Starting hotness countdown to xPROFILE
360
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000361 /* start executing the instruction at rPC */
362 FETCH_INST // load wINST from rPC
363 GET_INST_OPCODE ip // extract opcode from wINST
364 GOTO_OPCODE ip // jump to next instruction
365 /* NOTE: no fallthrough */
366
367
368 .global artMterpAsmInstructionStart
369 .type artMterpAsmInstructionStart, %function
370artMterpAsmInstructionStart = .L_op_nop
371 .text
372
373/* ------------------------------ */
374 .balign 128
375.L_op_nop: /* 0x00 */
376/* File: arm64/op_nop.S */
377 FETCH_ADVANCE_INST 1 // advance to next instr, load rINST
378 GET_INST_OPCODE ip // ip<- opcode from rINST
379 GOTO_OPCODE ip // execute it
380
381/* ------------------------------ */
382 .balign 128
383.L_op_move: /* 0x01 */
384/* File: arm64/op_move.S */
385 /* for move, move-object, long-to-int */
386 /* op vA, vB */
387 lsr w1, wINST, #12 // x1<- B from 15:12
388 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
389 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
390 GET_VREG w2, w1 // x2<- fp[B]
391 GET_INST_OPCODE ip // ip<- opcode from wINST
392 .if 0
393 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
394 .else
395 SET_VREG w2, w0 // fp[A]<- x2
396 .endif
397 GOTO_OPCODE ip // execute next instruction
398
399/* ------------------------------ */
400 .balign 128
401.L_op_move_from16: /* 0x02 */
402/* File: arm64/op_move_from16.S */
403 /* for: move/from16, move-object/from16 */
404 /* op vAA, vBBBB */
405 FETCH w1, 1 // r1<- BBBB
406 lsr w0, wINST, #8 // r0<- AA
407 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
408 GET_VREG w2, w1 // r2<- fp[BBBB]
409 GET_INST_OPCODE ip // extract opcode from wINST
410 .if 0
411 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
412 .else
413 SET_VREG w2, w0 // fp[AA]<- r2
414 .endif
415 GOTO_OPCODE ip // jump to next instruction
416
417/* ------------------------------ */
418 .balign 128
419.L_op_move_16: /* 0x03 */
420/* File: arm64/op_move_16.S */
421 /* for: move/16, move-object/16 */
422 /* op vAAAA, vBBBB */
423 FETCH w1, 2 // w1<- BBBB
424 FETCH w0, 1 // w0<- AAAA
425 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
426 GET_VREG w2, w1 // w2<- fp[BBBB]
427 GET_INST_OPCODE ip // extract opcode from xINST
428 .if 0
429 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
430 .else
431 SET_VREG w2, w0 // fp[AAAA]<- w2
432 .endif
433 GOTO_OPCODE ip // jump to next instruction
434
435/* ------------------------------ */
436 .balign 128
437.L_op_move_wide: /* 0x04 */
438/* File: arm64/op_move_wide.S */
439 /* move-wide vA, vB */
440 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
441 lsr w3, wINST, #12 // w3<- B
442 ubfx w2, wINST, #8, #4 // w2<- A
443 GET_VREG_WIDE x3, w3
444 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
445 GET_INST_OPCODE ip // extract opcode from wINST
446 SET_VREG_WIDE x3, w2
447 GOTO_OPCODE ip // jump to next instruction
448
449/* ------------------------------ */
450 .balign 128
451.L_op_move_wide_from16: /* 0x05 */
452/* File: arm64/op_move_wide_from16.S */
453 /* move-wide/from16 vAA, vBBBB */
454 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
455 FETCH w3, 1 // w3<- BBBB
456 lsr w2, wINST, #8 // w2<- AA
457 GET_VREG_WIDE x3, w3
458 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
459 GET_INST_OPCODE ip // extract opcode from wINST
460 SET_VREG_WIDE x3, w2
461 GOTO_OPCODE ip // jump to next instruction
462
463/* ------------------------------ */
464 .balign 128
465.L_op_move_wide_16: /* 0x06 */
466/* File: arm64/op_move_wide_16.S */
467 /* move-wide/16 vAAAA, vBBBB */
468 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
469 FETCH w3, 2 // w3<- BBBB
470 FETCH w2, 1 // w2<- AAAA
471 GET_VREG_WIDE x3, w3
472 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
473 SET_VREG_WIDE x3, w2
474 GET_INST_OPCODE ip // extract opcode from rINST
475 GOTO_OPCODE ip // jump to next instruction
476
477/* ------------------------------ */
478 .balign 128
479.L_op_move_object: /* 0x07 */
480/* File: arm64/op_move_object.S */
481/* File: arm64/op_move.S */
482 /* for move, move-object, long-to-int */
483 /* op vA, vB */
484 lsr w1, wINST, #12 // x1<- B from 15:12
485 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
486 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
487 GET_VREG w2, w1 // x2<- fp[B]
488 GET_INST_OPCODE ip // ip<- opcode from wINST
489 .if 1
490 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
491 .else
492 SET_VREG w2, w0 // fp[A]<- x2
493 .endif
494 GOTO_OPCODE ip // execute next instruction
495
496
497/* ------------------------------ */
498 .balign 128
499.L_op_move_object_from16: /* 0x08 */
500/* File: arm64/op_move_object_from16.S */
501/* File: arm64/op_move_from16.S */
502 /* for: move/from16, move-object/from16 */
503 /* op vAA, vBBBB */
504 FETCH w1, 1 // r1<- BBBB
505 lsr w0, wINST, #8 // r0<- AA
506 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
507 GET_VREG w2, w1 // r2<- fp[BBBB]
508 GET_INST_OPCODE ip // extract opcode from wINST
509 .if 1
510 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
511 .else
512 SET_VREG w2, w0 // fp[AA]<- r2
513 .endif
514 GOTO_OPCODE ip // jump to next instruction
515
516
517/* ------------------------------ */
518 .balign 128
519.L_op_move_object_16: /* 0x09 */
520/* File: arm64/op_move_object_16.S */
521/* File: arm64/op_move_16.S */
522 /* for: move/16, move-object/16 */
523 /* op vAAAA, vBBBB */
524 FETCH w1, 2 // w1<- BBBB
525 FETCH w0, 1 // w0<- AAAA
526 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
527 GET_VREG w2, w1 // w2<- fp[BBBB]
528 GET_INST_OPCODE ip // extract opcode from xINST
529 .if 1
530 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
531 .else
532 SET_VREG w2, w0 // fp[AAAA]<- w2
533 .endif
534 GOTO_OPCODE ip // jump to next instruction
535
536
537/* ------------------------------ */
538 .balign 128
539.L_op_move_result: /* 0x0a */
540/* File: arm64/op_move_result.S */
541 /* for: move-result, move-result-object */
542 /* op vAA */
543 lsr w2, wINST, #8 // r2<- AA
544 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
545 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
546 ldr w0, [x0] // r0 <- result.i.
547 GET_INST_OPCODE ip // extract opcode from wINST
548 .if 0
549 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
550 .else
551 SET_VREG w0, w2 // fp[AA]<- r0
552 .endif
553 GOTO_OPCODE ip // jump to next instruction
554
555/* ------------------------------ */
556 .balign 128
557.L_op_move_result_wide: /* 0x0b */
558/* File: arm64/op_move_result_wide.S */
559 /* for: move-result-wide */
560 /* op vAA */
561 lsr w2, wINST, #8 // r2<- AA
562 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
563 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
564 ldr x0, [x0] // r0 <- result.i.
565 GET_INST_OPCODE ip // extract opcode from wINST
566 SET_VREG_WIDE x0, x2 // fp[AA]<- r0
567 GOTO_OPCODE ip // jump to next instruction
568
569/* ------------------------------ */
570 .balign 128
571.L_op_move_result_object: /* 0x0c */
572/* File: arm64/op_move_result_object.S */
573/* File: arm64/op_move_result.S */
574 /* for: move-result, move-result-object */
575 /* op vAA */
576 lsr w2, wINST, #8 // r2<- AA
577 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
578 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
579 ldr w0, [x0] // r0 <- result.i.
580 GET_INST_OPCODE ip // extract opcode from wINST
581 .if 1
582 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
583 .else
584 SET_VREG w0, w2 // fp[AA]<- r0
585 .endif
586 GOTO_OPCODE ip // jump to next instruction
587
588
589/* ------------------------------ */
590 .balign 128
591.L_op_move_exception: /* 0x0d */
592/* File: arm64/op_move_exception.S */
593 /* move-exception vAA */
594 lsr w2, wINST, #8 // w2<- AA
595 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
596 mov x1, #0 // w1<- 0
597 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
598 SET_VREG_OBJECT w3, w2 // fp[AA]<- exception obj
599 GET_INST_OPCODE ip // extract opcode from rINST
600 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // clear exception
601 GOTO_OPCODE ip // jump to next instruction
602
603/* ------------------------------ */
604 .balign 128
605.L_op_return_void: /* 0x0e */
606/* File: arm64/op_return_void.S */
607 .extern MterpThreadFenceForConstructor
608 bl MterpThreadFenceForConstructor
609 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
610 mov x0, xSELF
611 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
612 b.ne .Lop_return_void_check
613.Lop_return_void_return:
614 mov x0, #0
615 b MterpReturn
616.Lop_return_void_check:
617 bl MterpSuspendCheck // (self)
618 b .Lop_return_void_return
619
620/* ------------------------------ */
621 .balign 128
622.L_op_return: /* 0x0f */
623/* File: arm64/op_return.S */
624 /*
625 * Return a 32-bit value.
626 *
627 * for: return, return-object
628 */
629 /* op vAA */
630 .extern MterpThreadFenceForConstructor
631 bl MterpThreadFenceForConstructor
632 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
633 mov x0, xSELF
634 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
635 b.ne .Lop_return_check
636.Lop_return_return:
637 lsr w2, wINST, #8 // r2<- AA
638 GET_VREG w0, w2 // r0<- vAA
639 b MterpReturn
640.Lop_return_check:
641 bl MterpSuspendCheck // (self)
642 b .Lop_return_return
643
644/* ------------------------------ */
645 .balign 128
646.L_op_return_wide: /* 0x10 */
647/* File: arm64/op_return_wide.S */
648 /*
649 * Return a 64-bit value.
650 */
651 /* return-wide vAA */
652 /* op vAA */
653 .extern MterpThreadFenceForConstructor
654 bl MterpThreadFenceForConstructor
655 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
656 mov x0, xSELF
657 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
658 b.ne .Lop_return_wide_check
659.Lop_return_wide_return:
660 lsr w2, wINST, #8 // w2<- AA
661 GET_VREG_WIDE x0, w2 // x0<- vAA
662 b MterpReturn
663.Lop_return_wide_check:
664 bl MterpSuspendCheck // (self)
665 b .Lop_return_wide_return
666
667/* ------------------------------ */
668 .balign 128
669.L_op_return_object: /* 0x11 */
670/* File: arm64/op_return_object.S */
671/* File: arm64/op_return.S */
672 /*
673 * Return a 32-bit value.
674 *
675 * for: return, return-object
676 */
677 /* op vAA */
678 .extern MterpThreadFenceForConstructor
679 bl MterpThreadFenceForConstructor
680 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
681 mov x0, xSELF
682 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
683 b.ne .Lop_return_object_check
684.Lop_return_object_return:
685 lsr w2, wINST, #8 // r2<- AA
686 GET_VREG w0, w2 // r0<- vAA
687 b MterpReturn
688.Lop_return_object_check:
689 bl MterpSuspendCheck // (self)
690 b .Lop_return_object_return
691
692
693/* ------------------------------ */
694 .balign 128
695.L_op_const_4: /* 0x12 */
696/* File: arm64/op_const_4.S */
697 /* const/4 vA, #+B */
698 lsl w1, wINST, #16 // w1<- Bxxx0000
699 ubfx w0, wINST, #8, #4 // w0<- A
700 FETCH_ADVANCE_INST 1 // advance xPC, load wINST
701 asr w1, w1, #28 // w1<- sssssssB (sign-extended)
702 GET_INST_OPCODE ip // ip<- opcode from xINST
703 SET_VREG w1, w0 // fp[A]<- w1
704 GOTO_OPCODE ip // execute next instruction
705
706/* ------------------------------ */
707 .balign 128
708.L_op_const_16: /* 0x13 */
709/* File: arm64/op_const_16.S */
710 /* const/16 vAA, #+BBBB */
711 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended
712 lsr w3, wINST, #8 // w3<- AA
713 FETCH_ADVANCE_INST 2 // advance xPC, load wINST
714 SET_VREG w0, w3 // vAA<- w0
715 GET_INST_OPCODE ip // extract opcode from wINST
716 GOTO_OPCODE ip // jump to next instruction
717
718/* ------------------------------ */
719 .balign 128
720.L_op_const: /* 0x14 */
721/* File: arm64/op_const.S */
722 /* const vAA, #+BBBBbbbb */
723 lsr w3, wINST, #8 // w3<- AA
724 FETCH w0, 1 // w0<- bbbb (low
725 FETCH w1, 2 // w1<- BBBB (high
726 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
727 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
728 GET_INST_OPCODE ip // extract opcode from wINST
729 SET_VREG w0, w3 // vAA<- w0
730 GOTO_OPCODE ip // jump to next instruction
731
732/* ------------------------------ */
733 .balign 128
734.L_op_const_high16: /* 0x15 */
735/* File: arm64/op_const_high16.S */
736 /* const/high16 vAA, #+BBBB0000 */
737 FETCH w0, 1 // r0<- 0000BBBB (zero-extended
738 lsr w3, wINST, #8 // r3<- AA
739 lsl w0, w0, #16 // r0<- BBBB0000
740 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
741 SET_VREG w0, w3 // vAA<- r0
742 GET_INST_OPCODE ip // extract opcode from rINST
743 GOTO_OPCODE ip // jump to next instruction
744
745/* ------------------------------ */
746 .balign 128
747.L_op_const_wide_16: /* 0x16 */
748/* File: arm64/op_const_wide_16.S */
749 /* const-wide/16 vAA, #+BBBB */
Vladimir Markoe6220222016-07-20 14:25:30 +0100750 FETCH_S x0, 1 // x0<- ssssssssssssBBBB (sign-extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000751 lsr w3, wINST, #8 // w3<- AA
752 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000753 GET_INST_OPCODE ip // extract opcode from rINST
754 SET_VREG_WIDE x0, w3
755 GOTO_OPCODE ip // jump to next instruction
756
757/* ------------------------------ */
758 .balign 128
759.L_op_const_wide_32: /* 0x17 */
760/* File: arm64/op_const_wide_32.S */
761 /* const-wide/32 vAA, #+BBBBbbbb */
Vladimir Markoe6220222016-07-20 14:25:30 +0100762 FETCH w0, 1 // x0<- 000000000000bbbb (low)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000763 lsr w3, wINST, #8 // w3<- AA
Vladimir Markoe6220222016-07-20 14:25:30 +0100764 FETCH_S x2, 2 // x2<- ssssssssssssBBBB (high)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000765 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
766 GET_INST_OPCODE ip // extract opcode from wINST
Vladimir Markoe6220222016-07-20 14:25:30 +0100767 orr x0, x0, x2, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000768 SET_VREG_WIDE x0, w3
769 GOTO_OPCODE ip // jump to next instruction
770
771/* ------------------------------ */
772 .balign 128
773.L_op_const_wide: /* 0x18 */
774/* File: arm64/op_const_wide.S */
775 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
776 FETCH w0, 1 // w0<- bbbb (low)
777 FETCH w1, 2 // w1<- BBBB (low middle)
778 FETCH w2, 3 // w2<- hhhh (high middle)
779 FETCH w3, 4 // w3<- HHHH (high)
780 lsr w4, wINST, #8 // r4<- AA
781 FETCH_ADVANCE_INST 5 // advance rPC, load wINST
782 GET_INST_OPCODE ip // extract opcode from wINST
783 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
784 orr x0, x0, x2, lsl #32 // w0<- hhhhBBBBbbbb
785 orr x0, x0, x3, lsl #48 // w0<- HHHHhhhhBBBBbbbb
786 SET_VREG_WIDE x0, w4
787 GOTO_OPCODE ip // jump to next instruction
788
789/* ------------------------------ */
790 .balign 128
791.L_op_const_wide_high16: /* 0x19 */
792/* File: arm64/op_const_wide_high16.S */
793 /* const-wide/high16 vAA, #+BBBB000000000000 */
794 FETCH w0, 1 // w0<- 0000BBBB (zero-extended)
795 lsr w1, wINST, #8 // w1<- AA
796 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
797 lsl x0, x0, #48
798 SET_VREG_WIDE x0, w1
799 GET_INST_OPCODE ip // extract opcode from wINST
800 GOTO_OPCODE ip // jump to next instruction
801
802/* ------------------------------ */
803 .balign 128
804.L_op_const_string: /* 0x1a */
805/* File: arm64/op_const_string.S */
806 /* const/string vAA, String//BBBB */
807 EXPORT_PC
808 FETCH w0, 1 // w0<- BBBB
809 lsr w1, wINST, #8 // w1<- AA
810 add x2, xFP, #OFF_FP_SHADOWFRAME
811 mov x3, xSELF
812 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
813 PREFETCH_INST 2 // load rINST
814 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
815 ADVANCE 2 // advance rPC
816 GET_INST_OPCODE ip // extract opcode from rINST
817 GOTO_OPCODE ip // jump to next instruction
818
819/* ------------------------------ */
820 .balign 128
821.L_op_const_string_jumbo: /* 0x1b */
822/* File: arm64/op_const_string_jumbo.S */
823 /* const/string vAA, String//BBBBBBBB */
824 EXPORT_PC
825 FETCH w0, 1 // w0<- bbbb (low
826 FETCH w2, 2 // w2<- BBBB (high
827 lsr w1, wINST, #8 // w1<- AA
828 orr w0, w0, w2, lsl #16 // w1<- BBBBbbbb
829 add x2, xFP, #OFF_FP_SHADOWFRAME
830 mov x3, xSELF
831 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
832 PREFETCH_INST 3 // advance rPC
833 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
834 ADVANCE 3 // advance rPC
835 GET_INST_OPCODE ip // extract opcode from rINST
836 GOTO_OPCODE ip // jump to next instruction
837
838/* ------------------------------ */
839 .balign 128
840.L_op_const_class: /* 0x1c */
841/* File: arm64/op_const_class.S */
842 /* const/class vAA, Class//BBBB */
843 EXPORT_PC
844 FETCH w0, 1 // w0<- BBBB
845 lsr w1, wINST, #8 // w1<- AA
846 add x2, xFP, #OFF_FP_SHADOWFRAME
847 mov x3, xSELF
848 bl MterpConstClass // (index, tgt_reg, shadow_frame, self)
849 PREFETCH_INST 2
850 cbnz w0, MterpPossibleException
851 ADVANCE 2
852 GET_INST_OPCODE ip // extract opcode from rINST
853 GOTO_OPCODE ip // jump to next instruction
854
855/* ------------------------------ */
856 .balign 128
857.L_op_monitor_enter: /* 0x1d */
858/* File: arm64/op_monitor_enter.S */
859 /*
860 * Synchronize on an object.
861 */
862 /* monitor-enter vAA */
863 EXPORT_PC
864 lsr w2, wINST, #8 // w2<- AA
865 GET_VREG w0, w2 // w0<- vAA (object)
866 mov x1, xSELF // w1<- self
867 bl artLockObjectFromCode
868 cbnz w0, MterpException
869 FETCH_ADVANCE_INST 1
870 GET_INST_OPCODE ip // extract opcode from rINST
871 GOTO_OPCODE ip // jump to next instruction
872
873/* ------------------------------ */
874 .balign 128
875.L_op_monitor_exit: /* 0x1e */
876/* File: arm64/op_monitor_exit.S */
877 /*
878 * Unlock an object.
879 *
880 * Exceptions that occur when unlocking a monitor need to appear as
881 * if they happened at the following instruction. See the Dalvik
882 * instruction spec.
883 */
884 /* monitor-exit vAA */
885 EXPORT_PC
886 lsr w2, wINST, #8 // w2<- AA
887 GET_VREG w0, w2 // w0<- vAA (object)
888 mov x1, xSELF // w0<- self
889 bl artUnlockObjectFromCode // w0<- success for unlock(self, obj)
890 cbnz w0, MterpException
891 FETCH_ADVANCE_INST 1 // before throw: advance rPC, load rINST
892 GET_INST_OPCODE ip // extract opcode from rINST
893 GOTO_OPCODE ip // jump to next instruction
894
895/* ------------------------------ */
896 .balign 128
897.L_op_check_cast: /* 0x1f */
898/* File: arm64/op_check_cast.S */
899 /*
900 * Check to see if a cast from one class to another is allowed.
901 */
902 /* check-cast vAA, class//BBBB */
903 EXPORT_PC
904 FETCH w0, 1 // w0<- BBBB
905 lsr w1, wINST, #8 // w1<- AA
906 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
907 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
908 mov x3, xSELF // w3<- self
909 bl MterpCheckCast // (index, &obj, method, self)
910 PREFETCH_INST 2
911 cbnz w0, MterpPossibleException
912 ADVANCE 2
913 GET_INST_OPCODE ip // extract opcode from rINST
914 GOTO_OPCODE ip // jump to next instruction
915
916/* ------------------------------ */
917 .balign 128
918.L_op_instance_of: /* 0x20 */
919/* File: arm64/op_instance_of.S */
920 /*
921 * Check to see if an object reference is an instance of a class.
922 *
923 * Most common situation is a non-null object, being compared against
924 * an already-resolved class.
925 */
926 /* instance-of vA, vB, class//CCCC */
927 EXPORT_PC
928 FETCH w0, 1 // w0<- CCCC
929 lsr w1, wINST, #12 // w1<- B
930 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
931 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
932 mov x3, xSELF // w3<- self
933 bl MterpInstanceOf // (index, &obj, method, self)
934 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
Vladimir Markoe6220222016-07-20 14:25:30 +0100935 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000936 PREFETCH_INST 2
937 cbnz x1, MterpException
938 ADVANCE 2 // advance rPC
939 SET_VREG w0, w2 // vA<- w0
940 GET_INST_OPCODE ip // extract opcode from rINST
941 GOTO_OPCODE ip // jump to next instruction
942
943/* ------------------------------ */
944 .balign 128
945.L_op_array_length: /* 0x21 */
946/* File: arm64/op_array_length.S */
947 /*
948 * Return the length of an array.
949 */
950 lsr w1, wINST, #12 // w1<- B
951 ubfx w2, wINST, #8, #4 // w2<- A
952 GET_VREG w0, w1 // w0<- vB (object ref)
953 cbz w0, common_errNullObject // yup, fail
954 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
955 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- array length
956 GET_INST_OPCODE ip // extract opcode from rINST
957 SET_VREG w3, w2 // vB<- length
958 GOTO_OPCODE ip // jump to next instruction
959
960/* ------------------------------ */
961 .balign 128
962.L_op_new_instance: /* 0x22 */
963/* File: arm64/op_new_instance.S */
964 /*
965 * Create a new instance of a class.
966 */
967 /* new-instance vAA, class//BBBB */
968 EXPORT_PC
969 add x0, xFP, #OFF_FP_SHADOWFRAME
970 mov x1, xSELF
971 mov w2, wINST
972 bl MterpNewInstance // (shadow_frame, self, inst_data)
973 cbz w0, MterpPossibleException
974 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
975 GET_INST_OPCODE ip // extract opcode from rINST
976 GOTO_OPCODE ip // jump to next instruction
977
978/* ------------------------------ */
979 .balign 128
980.L_op_new_array: /* 0x23 */
981/* File: arm64/op_new_array.S */
982 /*
983 * Allocate an array of objects, specified with the array class
984 * and a count.
985 *
986 * The verifier guarantees that this is an array class, so we don't
987 * check for it here.
988 */
989 /* new-array vA, vB, class//CCCC */
990 EXPORT_PC
991 add x0, xFP, #OFF_FP_SHADOWFRAME
992 mov x1, xPC
993 mov w2, wINST
994 mov x3, xSELF
995 bl MterpNewArray
996 cbz w0, MterpPossibleException
997 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
998 GET_INST_OPCODE ip // extract opcode from rINST
999 GOTO_OPCODE ip // jump to next instruction
1000
1001/* ------------------------------ */
1002 .balign 128
1003.L_op_filled_new_array: /* 0x24 */
1004/* File: arm64/op_filled_new_array.S */
1005 /*
1006 * Create a new array with elements filled from registers.
1007 *
1008 * for: filled-new-array, filled-new-array/range
1009 */
1010 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1011 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1012 .extern MterpFilledNewArray
1013 EXPORT_PC
1014 add x0, xFP, #OFF_FP_SHADOWFRAME
1015 mov x1, xPC
1016 mov x2, xSELF
1017 bl MterpFilledNewArray
1018 cbz w0, MterpPossibleException
1019 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1020 GET_INST_OPCODE ip // extract opcode from rINST
1021 GOTO_OPCODE ip // jump to next instruction
1022
1023/* ------------------------------ */
1024 .balign 128
1025.L_op_filled_new_array_range: /* 0x25 */
1026/* File: arm64/op_filled_new_array_range.S */
1027/* File: arm64/op_filled_new_array.S */
1028 /*
1029 * Create a new array with elements filled from registers.
1030 *
1031 * for: filled-new-array, filled-new-array/range
1032 */
1033 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1034 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1035 .extern MterpFilledNewArrayRange
1036 EXPORT_PC
1037 add x0, xFP, #OFF_FP_SHADOWFRAME
1038 mov x1, xPC
1039 mov x2, xSELF
1040 bl MterpFilledNewArrayRange
1041 cbz w0, MterpPossibleException
1042 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1043 GET_INST_OPCODE ip // extract opcode from rINST
1044 GOTO_OPCODE ip // jump to next instruction
1045
1046
1047/* ------------------------------ */
1048 .balign 128
1049.L_op_fill_array_data: /* 0x26 */
1050/* File: arm64/op_fill_array_data.S */
1051 /* fill-array-data vAA, +BBBBBBBB */
1052 EXPORT_PC
1053 FETCH w0, 1 // w0<- bbbb (lo)
1054 FETCH w1, 2 // w1<- BBBB (hi)
1055 lsr w3, wINST, #8 // w3<- AA
1056 orr w1, w0, w1, lsl #16 // w1<- BBBBbbbb
1057 GET_VREG w0, w3 // w0<- vAA (array object)
1058 add x1, xPC, w1, lsl #1 // w1<- PC + BBBBbbbb*2 (array data off.)
1059 bl MterpFillArrayData // (obj, payload)
1060 cbz w0, MterpPossibleException // exception?
1061 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1062 GET_INST_OPCODE ip // extract opcode from rINST
1063 GOTO_OPCODE ip // jump to next instruction
1064
1065/* ------------------------------ */
1066 .balign 128
1067.L_op_throw: /* 0x27 */
1068/* File: arm64/op_throw.S */
1069 /*
1070 * Throw an exception object in the current thread.
1071 */
1072 /* throw vAA */
1073 EXPORT_PC
1074 lsr w2, wINST, #8 // r2<- AA
1075 GET_VREG w1, w2 // r1<- vAA (exception object)
1076 cbz w1, common_errNullObject
1077 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // thread->exception<- obj
1078 b MterpException
1079
1080/* ------------------------------ */
1081 .balign 128
1082.L_op_goto: /* 0x28 */
1083/* File: arm64/op_goto.S */
1084 /*
1085 * Unconditional branch, 8-bit offset.
1086 *
1087 * The branch distance is a signed code-unit offset, which we need to
1088 * double to get a byte offset.
1089 */
1090 /* goto +AA */
Bill Buzbee1d011d92016-04-04 16:59:29 +00001091 sbfx wINST, wINST, #8, #8 // wINST<- ssssssAA (sign-extended)
1092 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001093
1094/* ------------------------------ */
1095 .balign 128
1096.L_op_goto_16: /* 0x29 */
1097/* File: arm64/op_goto_16.S */
1098 /*
1099 * Unconditional branch, 16-bit offset.
1100 *
1101 * The branch distance is a signed code-unit offset, which we need to
1102 * double to get a byte offset.
1103 */
1104 /* goto/16 +AAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001105 FETCH_S wINST, 1 // wINST<- ssssAAAA (sign-extended)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001106 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001107
1108/* ------------------------------ */
1109 .balign 128
1110.L_op_goto_32: /* 0x2a */
1111/* File: arm64/op_goto_32.S */
1112 /*
1113 * Unconditional branch, 32-bit offset.
1114 *
1115 * The branch distance is a signed code-unit offset, which we need to
1116 * double to get a byte offset.
1117 *
1118 * Unlike most opcodes, this one is allowed to branch to itself, so
1119 * our "backward branch" test must be "<=0" instead of "<0". Because
1120 * we need the V bit set, we'll use an adds to convert from Dalvik
1121 * offset to byte offset.
1122 */
1123 /* goto/32 +AAAAAAAA */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001124 FETCH w0, 1 // w0<- aaaa (lo)
1125 FETCH w1, 2 // w1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001126 orr wINST, w0, w1, lsl #16 // wINST<- AAAAaaaa
Bill Buzbee1d011d92016-04-04 16:59:29 +00001127 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001128
1129/* ------------------------------ */
1130 .balign 128
1131.L_op_packed_switch: /* 0x2b */
1132/* File: arm64/op_packed_switch.S */
1133 /*
1134 * Handle a packed-switch or sparse-switch instruction. In both cases
1135 * we decode it and hand it off to a helper function.
1136 *
1137 * We don't really expect backward branches in a switch statement, but
1138 * they're perfectly legal, so we check for them here.
1139 *
1140 * for: packed-switch, sparse-switch
1141 */
1142 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001143 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1144 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001145 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001146 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001147 GET_VREG w1, w3 // w1<- vAA
Vladimir Marko5733e982016-07-20 17:52:51 +01001148 add x0, xPC, x0, lsl #1 // x0<- PC + BBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001149 bl MterpDoPackedSwitch // w0<- code-unit branch offset
Vladimir Markoe6220222016-07-20 14:25:30 +01001150 sxtw xINST, w0
Bill Buzbee1d011d92016-04-04 16:59:29 +00001151 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001152
1153/* ------------------------------ */
1154 .balign 128
1155.L_op_sparse_switch: /* 0x2c */
1156/* File: arm64/op_sparse_switch.S */
1157/* File: arm64/op_packed_switch.S */
1158 /*
1159 * Handle a packed-switch or sparse-switch instruction. In both cases
1160 * we decode it and hand it off to a helper function.
1161 *
1162 * We don't really expect backward branches in a switch statement, but
1163 * they're perfectly legal, so we check for them here.
1164 *
1165 * for: packed-switch, sparse-switch
1166 */
1167 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001168 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1169 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001170 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001171 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001172 GET_VREG w1, w3 // w1<- vAA
Vladimir Marko5733e982016-07-20 17:52:51 +01001173 add x0, xPC, x0, lsl #1 // x0<- PC + BBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001174 bl MterpDoSparseSwitch // w0<- code-unit branch offset
Vladimir Markoe6220222016-07-20 14:25:30 +01001175 sxtw xINST, w0
Bill Buzbee1d011d92016-04-04 16:59:29 +00001176 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001177
1178
1179/* ------------------------------ */
1180 .balign 128
1181.L_op_cmpl_float: /* 0x2d */
1182/* File: arm64/op_cmpl_float.S */
1183/* File: arm64/fcmp.S */
1184 /*
1185 * Compare two floating-point values. Puts 0, 1, or -1 into the
1186 * destination register based on the results of the comparison.
1187 */
1188 /* op vAA, vBB, vCC */
1189 FETCH w0, 1 // w0<- CCBB
1190 lsr w4, wINST, #8 // w4<- AA
1191 and w2, w0, #255 // w2<- BB
1192 lsr w3, w0, #8 // w3<- CC
1193 GET_VREG s1, w2
1194 GET_VREG s2, w3
1195 mov w0, #-1
1196 fcmp s1, s2
1197 csneg w0, w0, w0, le
1198 csel w0, wzr, w0, eq
1199 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1200 GET_INST_OPCODE ip // extract opcode from rINST
1201 SET_VREG w0, w4 // vAA<- w0
1202 GOTO_OPCODE ip // jump to next instruction
1203
1204
1205/* ------------------------------ */
1206 .balign 128
1207.L_op_cmpg_float: /* 0x2e */
1208/* File: arm64/op_cmpg_float.S */
1209/* File: arm64/fcmp.S */
1210 /*
1211 * Compare two floating-point values. Puts 0, 1, or -1 into the
1212 * destination register based on the results of the comparison.
1213 */
1214 /* op vAA, vBB, vCC */
1215 FETCH w0, 1 // w0<- CCBB
1216 lsr w4, wINST, #8 // w4<- AA
1217 and w2, w0, #255 // w2<- BB
1218 lsr w3, w0, #8 // w3<- CC
1219 GET_VREG s1, w2
1220 GET_VREG s2, w3
1221 mov w0, #1
1222 fcmp s1, s2
1223 csneg w0, w0, w0, pl
1224 csel w0, wzr, w0, eq
1225 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1226 GET_INST_OPCODE ip // extract opcode from rINST
1227 SET_VREG w0, w4 // vAA<- w0
1228 GOTO_OPCODE ip // jump to next instruction
1229
1230
1231/* ------------------------------ */
1232 .balign 128
1233.L_op_cmpl_double: /* 0x2f */
1234/* File: arm64/op_cmpl_double.S */
1235/* File: arm64/fcmp.S */
1236 /*
1237 * Compare two floating-point values. Puts 0, 1, or -1 into the
1238 * destination register based on the results of the comparison.
1239 */
1240 /* op vAA, vBB, vCC */
1241 FETCH w0, 1 // w0<- CCBB
1242 lsr w4, wINST, #8 // w4<- AA
1243 and w2, w0, #255 // w2<- BB
1244 lsr w3, w0, #8 // w3<- CC
1245 GET_VREG_WIDE d1, w2
1246 GET_VREG_WIDE d2, w3
1247 mov w0, #-1
1248 fcmp d1, d2
1249 csneg w0, w0, w0, le
1250 csel w0, wzr, w0, eq
1251 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1252 GET_INST_OPCODE ip // extract opcode from rINST
1253 SET_VREG w0, w4 // vAA<- w0
1254 GOTO_OPCODE ip // jump to next instruction
1255
1256
1257/* ------------------------------ */
1258 .balign 128
1259.L_op_cmpg_double: /* 0x30 */
1260/* File: arm64/op_cmpg_double.S */
1261/* File: arm64/fcmp.S */
1262 /*
1263 * Compare two floating-point values. Puts 0, 1, or -1 into the
1264 * destination register based on the results of the comparison.
1265 */
1266 /* op vAA, vBB, vCC */
1267 FETCH w0, 1 // w0<- CCBB
1268 lsr w4, wINST, #8 // w4<- AA
1269 and w2, w0, #255 // w2<- BB
1270 lsr w3, w0, #8 // w3<- CC
1271 GET_VREG_WIDE d1, w2
1272 GET_VREG_WIDE d2, w3
1273 mov w0, #1
1274 fcmp d1, d2
1275 csneg w0, w0, w0, pl
1276 csel w0, wzr, w0, eq
1277 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1278 GET_INST_OPCODE ip // extract opcode from rINST
1279 SET_VREG w0, w4 // vAA<- w0
1280 GOTO_OPCODE ip // jump to next instruction
1281
1282
1283/* ------------------------------ */
1284 .balign 128
1285.L_op_cmp_long: /* 0x31 */
1286/* File: arm64/op_cmp_long.S */
1287 FETCH w0, 1 // w0<- CCBB
1288 lsr w4, wINST, #8 // w4<- AA
1289 and w2, w0, #255 // w2<- BB
1290 lsr w3, w0, #8 // w3<- CC
1291 GET_VREG_WIDE x1, w2
1292 GET_VREG_WIDE x2, w3
1293 cmp x1, x2
1294 csinc w0, wzr, wzr, eq
1295 csneg w0, w0, w0, ge
1296 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1297 SET_VREG w0, w4
1298 GET_INST_OPCODE ip // extract opcode from wINST
1299 GOTO_OPCODE ip // jump to next instruction
1300
1301/* ------------------------------ */
1302 .balign 128
1303.L_op_if_eq: /* 0x32 */
1304/* File: arm64/op_if_eq.S */
1305/* File: arm64/bincmp.S */
1306 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001307 * Generic two-operand compare-and-branch operation. Provide a "condition"
1308 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001309 *
1310 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1311 */
1312 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001313 lsr w1, wINST, #12 // w1<- B
1314 ubfx w0, wINST, #8, #4 // w0<- A
1315 GET_VREG w3, w1 // w3<- vB
1316 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001317 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001318 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001319 b.eq MterpCommonTakenBranchNoFlags
1320 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1321 b.eq .L_check_not_taken_osr
1322 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001323 GET_INST_OPCODE ip // extract opcode from wINST
1324 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001325
1326
1327/* ------------------------------ */
1328 .balign 128
1329.L_op_if_ne: /* 0x33 */
1330/* File: arm64/op_if_ne.S */
1331/* File: arm64/bincmp.S */
1332 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001333 * Generic two-operand compare-and-branch operation. Provide a "condition"
1334 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001335 *
1336 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1337 */
1338 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001339 lsr w1, wINST, #12 // w1<- B
1340 ubfx w0, wINST, #8, #4 // w0<- A
1341 GET_VREG w3, w1 // w3<- vB
1342 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001343 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001344 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001345 b.ne MterpCommonTakenBranchNoFlags
1346 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1347 b.eq .L_check_not_taken_osr
1348 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001349 GET_INST_OPCODE ip // extract opcode from wINST
1350 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001351
1352
1353/* ------------------------------ */
1354 .balign 128
1355.L_op_if_lt: /* 0x34 */
1356/* File: arm64/op_if_lt.S */
1357/* File: arm64/bincmp.S */
1358 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001359 * Generic two-operand compare-and-branch operation. Provide a "condition"
1360 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001361 *
1362 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1363 */
1364 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001365 lsr w1, wINST, #12 // w1<- B
1366 ubfx w0, wINST, #8, #4 // w0<- A
1367 GET_VREG w3, w1 // w3<- vB
1368 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001369 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001370 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001371 b.lt MterpCommonTakenBranchNoFlags
1372 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1373 b.eq .L_check_not_taken_osr
1374 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001375 GET_INST_OPCODE ip // extract opcode from wINST
1376 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001377
1378
1379/* ------------------------------ */
1380 .balign 128
1381.L_op_if_ge: /* 0x35 */
1382/* File: arm64/op_if_ge.S */
1383/* File: arm64/bincmp.S */
1384 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001385 * Generic two-operand compare-and-branch operation. Provide a "condition"
1386 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001387 *
1388 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1389 */
1390 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001391 lsr w1, wINST, #12 // w1<- B
1392 ubfx w0, wINST, #8, #4 // w0<- A
1393 GET_VREG w3, w1 // w3<- vB
1394 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001395 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001396 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001397 b.ge MterpCommonTakenBranchNoFlags
1398 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1399 b.eq .L_check_not_taken_osr
1400 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001401 GET_INST_OPCODE ip // extract opcode from wINST
1402 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001403
1404
1405/* ------------------------------ */
1406 .balign 128
1407.L_op_if_gt: /* 0x36 */
1408/* File: arm64/op_if_gt.S */
1409/* File: arm64/bincmp.S */
1410 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001411 * Generic two-operand compare-and-branch operation. Provide a "condition"
1412 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001413 *
1414 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1415 */
1416 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001417 lsr w1, wINST, #12 // w1<- B
1418 ubfx w0, wINST, #8, #4 // w0<- A
1419 GET_VREG w3, w1 // w3<- vB
1420 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001421 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001422 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001423 b.gt MterpCommonTakenBranchNoFlags
1424 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1425 b.eq .L_check_not_taken_osr
1426 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001427 GET_INST_OPCODE ip // extract opcode from wINST
1428 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001429
1430
1431/* ------------------------------ */
1432 .balign 128
1433.L_op_if_le: /* 0x37 */
1434/* File: arm64/op_if_le.S */
1435/* File: arm64/bincmp.S */
1436 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001437 * Generic two-operand compare-and-branch operation. Provide a "condition"
1438 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001439 *
1440 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1441 */
1442 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001443 lsr w1, wINST, #12 // w1<- B
1444 ubfx w0, wINST, #8, #4 // w0<- A
1445 GET_VREG w3, w1 // w3<- vB
1446 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001447 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001448 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001449 b.le MterpCommonTakenBranchNoFlags
1450 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1451 b.eq .L_check_not_taken_osr
1452 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001453 GET_INST_OPCODE ip // extract opcode from wINST
1454 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001455
1456
1457/* ------------------------------ */
1458 .balign 128
1459.L_op_if_eqz: /* 0x38 */
1460/* File: arm64/op_if_eqz.S */
1461/* File: arm64/zcmp.S */
1462 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001463 * Generic one-operand compare-and-branch operation. Provide a "condition"
1464 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001465 *
1466 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1467 */
1468 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001469 lsr w0, wINST, #8 // w0<- AA
1470 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001471 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001472 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001473 b.eq MterpCommonTakenBranchNoFlags
1474 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1475 b.eq .L_check_not_taken_osr
1476 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001477 GET_INST_OPCODE ip // extract opcode from wINST
1478 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001479
1480
1481/* ------------------------------ */
1482 .balign 128
1483.L_op_if_nez: /* 0x39 */
1484/* File: arm64/op_if_nez.S */
1485/* File: arm64/zcmp.S */
1486 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001487 * Generic one-operand compare-and-branch operation. Provide a "condition"
1488 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001489 *
1490 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1491 */
1492 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001493 lsr w0, wINST, #8 // w0<- AA
1494 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001495 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001496 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001497 b.ne MterpCommonTakenBranchNoFlags
1498 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1499 b.eq .L_check_not_taken_osr
1500 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001501 GET_INST_OPCODE ip // extract opcode from wINST
1502 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001503
1504
1505/* ------------------------------ */
1506 .balign 128
1507.L_op_if_ltz: /* 0x3a */
1508/* File: arm64/op_if_ltz.S */
1509/* File: arm64/zcmp.S */
1510 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001511 * Generic one-operand compare-and-branch operation. Provide a "condition"
1512 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001513 *
1514 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1515 */
1516 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001517 lsr w0, wINST, #8 // w0<- AA
1518 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001519 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001520 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001521 b.lt MterpCommonTakenBranchNoFlags
1522 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1523 b.eq .L_check_not_taken_osr
1524 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001525 GET_INST_OPCODE ip // extract opcode from wINST
1526 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001527
1528
1529/* ------------------------------ */
1530 .balign 128
1531.L_op_if_gez: /* 0x3b */
1532/* File: arm64/op_if_gez.S */
1533/* File: arm64/zcmp.S */
1534 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001535 * Generic one-operand compare-and-branch operation. Provide a "condition"
1536 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001537 *
1538 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1539 */
1540 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001541 lsr w0, wINST, #8 // w0<- AA
1542 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001543 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001544 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001545 b.ge MterpCommonTakenBranchNoFlags
1546 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1547 b.eq .L_check_not_taken_osr
1548 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001549 GET_INST_OPCODE ip // extract opcode from wINST
1550 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001551
1552
1553/* ------------------------------ */
1554 .balign 128
1555.L_op_if_gtz: /* 0x3c */
1556/* File: arm64/op_if_gtz.S */
1557/* File: arm64/zcmp.S */
1558 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001559 * Generic one-operand compare-and-branch operation. Provide a "condition"
1560 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001561 *
1562 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1563 */
1564 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001565 lsr w0, wINST, #8 // w0<- AA
1566 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001567 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001568 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001569 b.gt MterpCommonTakenBranchNoFlags
1570 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1571 b.eq .L_check_not_taken_osr
1572 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001573 GET_INST_OPCODE ip // extract opcode from wINST
1574 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001575
1576
1577/* ------------------------------ */
1578 .balign 128
1579.L_op_if_lez: /* 0x3d */
1580/* File: arm64/op_if_lez.S */
1581/* File: arm64/zcmp.S */
1582 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001583 * Generic one-operand compare-and-branch operation. Provide a "condition"
1584 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001585 *
1586 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1587 */
1588 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001589 lsr w0, wINST, #8 // w0<- AA
1590 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001591 FETCH_S wINST, 1 // w1<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001592 cmp w2, #0 // compare (vA, 0)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001593 b.le MterpCommonTakenBranchNoFlags
1594 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1595 b.eq .L_check_not_taken_osr
1596 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001597 GET_INST_OPCODE ip // extract opcode from wINST
1598 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001599
1600
1601/* ------------------------------ */
1602 .balign 128
1603.L_op_unused_3e: /* 0x3e */
1604/* File: arm64/op_unused_3e.S */
1605/* File: arm64/unused.S */
1606/*
1607 * Bail to reference interpreter to throw.
1608 */
1609 b MterpFallback
1610
1611
1612/* ------------------------------ */
1613 .balign 128
1614.L_op_unused_3f: /* 0x3f */
1615/* File: arm64/op_unused_3f.S */
1616/* File: arm64/unused.S */
1617/*
1618 * Bail to reference interpreter to throw.
1619 */
1620 b MterpFallback
1621
1622
1623/* ------------------------------ */
1624 .balign 128
1625.L_op_unused_40: /* 0x40 */
1626/* File: arm64/op_unused_40.S */
1627/* File: arm64/unused.S */
1628/*
1629 * Bail to reference interpreter to throw.
1630 */
1631 b MterpFallback
1632
1633
1634/* ------------------------------ */
1635 .balign 128
1636.L_op_unused_41: /* 0x41 */
1637/* File: arm64/op_unused_41.S */
1638/* File: arm64/unused.S */
1639/*
1640 * Bail to reference interpreter to throw.
1641 */
1642 b MterpFallback
1643
1644
1645/* ------------------------------ */
1646 .balign 128
1647.L_op_unused_42: /* 0x42 */
1648/* File: arm64/op_unused_42.S */
1649/* File: arm64/unused.S */
1650/*
1651 * Bail to reference interpreter to throw.
1652 */
1653 b MterpFallback
1654
1655
1656/* ------------------------------ */
1657 .balign 128
1658.L_op_unused_43: /* 0x43 */
1659/* File: arm64/op_unused_43.S */
1660/* File: arm64/unused.S */
1661/*
1662 * Bail to reference interpreter to throw.
1663 */
1664 b MterpFallback
1665
1666
1667/* ------------------------------ */
1668 .balign 128
1669.L_op_aget: /* 0x44 */
1670/* File: arm64/op_aget.S */
1671 /*
1672 * Array get, 32 bits or less. vAA <- vBB[vCC].
1673 *
1674 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1675 * instructions. We use a pair of FETCH_Bs instead.
1676 *
1677 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1678 *
1679 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1680 * If this changes, specialize.
1681 */
1682 /* op vAA, vBB, vCC */
1683 FETCH_B w2, 1, 0 // w2<- BB
1684 lsr w9, wINST, #8 // w9<- AA
1685 FETCH_B w3, 1, 1 // w3<- CC
1686 GET_VREG w0, w2 // w0<- vBB (array object)
1687 GET_VREG w1, w3 // w1<- vCC (requested index)
1688 cbz x0, common_errNullObject // bail if null array object.
1689 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1690 add x0, x0, w1, uxtw #2 // w0<- arrayObj + index*width
1691 cmp w1, w3 // compare unsigned index, length
1692 bcs common_errArrayIndex // index >= length, bail
1693 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1694 ldr w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1695 GET_INST_OPCODE ip // extract opcode from rINST
1696 SET_VREG w2, w9 // vAA<- w2
1697 GOTO_OPCODE ip // jump to next instruction
1698
1699/* ------------------------------ */
1700 .balign 128
1701.L_op_aget_wide: /* 0x45 */
1702/* File: arm64/op_aget_wide.S */
1703 /*
1704 * Array get, 64 bits. vAA <- vBB[vCC].
1705 *
1706 */
1707 /* aget-wide vAA, vBB, vCC */
1708 FETCH w0, 1 // w0<- CCBB
1709 lsr w4, wINST, #8 // w4<- AA
1710 and w2, w0, #255 // w2<- BB
1711 lsr w3, w0, #8 // w3<- CC
1712 GET_VREG w0, w2 // w0<- vBB (array object)
1713 GET_VREG w1, w3 // w1<- vCC (requested index)
1714 cbz w0, common_errNullObject // yes, bail
1715 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1716 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1717 cmp w1, w3 // compare unsigned index, length
1718 bcs common_errArrayIndex // index >= length, bail
1719 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1720 ldr x2, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] // x2<- vBB[vCC]
1721 GET_INST_OPCODE ip // extract opcode from wINST
1722 SET_VREG_WIDE x2, w4
1723 GOTO_OPCODE ip // jump to next instruction
1724
1725/* ------------------------------ */
1726 .balign 128
1727.L_op_aget_object: /* 0x46 */
1728/* File: arm64/op_aget_object.S */
1729 /*
1730 * Array object get. vAA <- vBB[vCC].
1731 *
1732 * for: aget-object
1733 */
1734 /* op vAA, vBB, vCC */
1735 FETCH_B w2, 1, 0 // w2<- BB
1736 FETCH_B w3, 1, 1 // w3<- CC
1737 EXPORT_PC
1738 GET_VREG w0, w2 // w0<- vBB (array object)
1739 GET_VREG w1, w3 // w1<- vCC (requested index)
1740 bl artAGetObjectFromMterp // (array, index)
1741 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
1742 lsr w2, wINST, #8 // w9<- AA
1743 PREFETCH_INST 2
1744 cbnz w1, MterpException
1745 SET_VREG_OBJECT w0, w2
1746 ADVANCE 2
1747 GET_INST_OPCODE ip
1748 GOTO_OPCODE ip // jump to next instruction
1749
1750/* ------------------------------ */
1751 .balign 128
1752.L_op_aget_boolean: /* 0x47 */
1753/* File: arm64/op_aget_boolean.S */
1754/* File: arm64/op_aget.S */
1755 /*
1756 * Array get, 32 bits or less. vAA <- vBB[vCC].
1757 *
1758 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1759 * instructions. We use a pair of FETCH_Bs instead.
1760 *
1761 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1762 *
1763 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1764 * If this changes, specialize.
1765 */
1766 /* op vAA, vBB, vCC */
1767 FETCH_B w2, 1, 0 // w2<- BB
1768 lsr w9, wINST, #8 // w9<- AA
1769 FETCH_B w3, 1, 1 // w3<- CC
1770 GET_VREG w0, w2 // w0<- vBB (array object)
1771 GET_VREG w1, w3 // w1<- vCC (requested index)
1772 cbz x0, common_errNullObject // bail if null array object.
1773 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1774 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1775 cmp w1, w3 // compare unsigned index, length
1776 bcs common_errArrayIndex // index >= length, bail
1777 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1778 ldrb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1779 GET_INST_OPCODE ip // extract opcode from rINST
1780 SET_VREG w2, w9 // vAA<- w2
1781 GOTO_OPCODE ip // jump to next instruction
1782
1783
1784/* ------------------------------ */
1785 .balign 128
1786.L_op_aget_byte: /* 0x48 */
1787/* File: arm64/op_aget_byte.S */
1788/* File: arm64/op_aget.S */
1789 /*
1790 * Array get, 32 bits or less. vAA <- vBB[vCC].
1791 *
1792 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1793 * instructions. We use a pair of FETCH_Bs instead.
1794 *
1795 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1796 *
1797 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1798 * If this changes, specialize.
1799 */
1800 /* op vAA, vBB, vCC */
1801 FETCH_B w2, 1, 0 // w2<- BB
1802 lsr w9, wINST, #8 // w9<- AA
1803 FETCH_B w3, 1, 1 // w3<- CC
1804 GET_VREG w0, w2 // w0<- vBB (array object)
1805 GET_VREG w1, w3 // w1<- vCC (requested index)
1806 cbz x0, common_errNullObject // bail if null array object.
1807 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1808 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1809 cmp w1, w3 // compare unsigned index, length
1810 bcs common_errArrayIndex // index >= length, bail
1811 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1812 ldrsb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1813 GET_INST_OPCODE ip // extract opcode from rINST
1814 SET_VREG w2, w9 // vAA<- w2
1815 GOTO_OPCODE ip // jump to next instruction
1816
1817
1818/* ------------------------------ */
1819 .balign 128
1820.L_op_aget_char: /* 0x49 */
1821/* File: arm64/op_aget_char.S */
1822/* File: arm64/op_aget.S */
1823 /*
1824 * Array get, 32 bits or less. vAA <- vBB[vCC].
1825 *
1826 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1827 * instructions. We use a pair of FETCH_Bs instead.
1828 *
1829 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1830 *
1831 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1832 * If this changes, specialize.
1833 */
1834 /* op vAA, vBB, vCC */
1835 FETCH_B w2, 1, 0 // w2<- BB
1836 lsr w9, wINST, #8 // w9<- AA
1837 FETCH_B w3, 1, 1 // w3<- CC
1838 GET_VREG w0, w2 // w0<- vBB (array object)
1839 GET_VREG w1, w3 // w1<- vCC (requested index)
1840 cbz x0, common_errNullObject // bail if null array object.
1841 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1842 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1843 cmp w1, w3 // compare unsigned index, length
1844 bcs common_errArrayIndex // index >= length, bail
1845 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1846 ldrh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1847 GET_INST_OPCODE ip // extract opcode from rINST
1848 SET_VREG w2, w9 // vAA<- w2
1849 GOTO_OPCODE ip // jump to next instruction
1850
1851
1852/* ------------------------------ */
1853 .balign 128
1854.L_op_aget_short: /* 0x4a */
1855/* File: arm64/op_aget_short.S */
1856/* File: arm64/op_aget.S */
1857 /*
1858 * Array get, 32 bits or less. vAA <- vBB[vCC].
1859 *
1860 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1861 * instructions. We use a pair of FETCH_Bs instead.
1862 *
1863 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1864 *
1865 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1866 * If this changes, specialize.
1867 */
1868 /* op vAA, vBB, vCC */
1869 FETCH_B w2, 1, 0 // w2<- BB
1870 lsr w9, wINST, #8 // w9<- AA
1871 FETCH_B w3, 1, 1 // w3<- CC
1872 GET_VREG w0, w2 // w0<- vBB (array object)
1873 GET_VREG w1, w3 // w1<- vCC (requested index)
1874 cbz x0, common_errNullObject // bail if null array object.
1875 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1876 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1877 cmp w1, w3 // compare unsigned index, length
1878 bcs common_errArrayIndex // index >= length, bail
1879 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1880 ldrsh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1881 GET_INST_OPCODE ip // extract opcode from rINST
1882 SET_VREG w2, w9 // vAA<- w2
1883 GOTO_OPCODE ip // jump to next instruction
1884
1885
1886/* ------------------------------ */
1887 .balign 128
1888.L_op_aput: /* 0x4b */
1889/* File: arm64/op_aput.S */
1890 /*
1891 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1892 *
1893 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1894 * instructions. We use a pair of FETCH_Bs instead.
1895 *
1896 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1897 *
1898 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1899 * If this changes, specialize.
1900 */
1901 /* op vAA, vBB, vCC */
1902 FETCH_B w2, 1, 0 // w2<- BB
1903 lsr w9, wINST, #8 // w9<- AA
1904 FETCH_B w3, 1, 1 // w3<- CC
1905 GET_VREG w0, w2 // w0<- vBB (array object)
1906 GET_VREG w1, w3 // w1<- vCC (requested index)
1907 cbz w0, common_errNullObject // bail if null
1908 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1909 add x0, x0, w1, lsl #2 // w0<- arrayObj + index*width
1910 cmp w1, w3 // compare unsigned index, length
1911 bcs common_errArrayIndex // index >= length, bail
1912 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1913 GET_VREG w2, w9 // w2<- vAA
1914 GET_INST_OPCODE ip // extract opcode from rINST
1915 str w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
1916 GOTO_OPCODE ip // jump to next instruction
1917
1918/* ------------------------------ */
1919 .balign 128
1920.L_op_aput_wide: /* 0x4c */
1921/* File: arm64/op_aput_wide.S */
1922 /*
1923 * Array put, 64 bits. vBB[vCC] <- vAA.
1924 *
1925 */
1926 /* aput-wide vAA, vBB, vCC */
1927 FETCH w0, 1 // w0<- CCBB
1928 lsr w4, wINST, #8 // w4<- AA
1929 and w2, w0, #255 // w2<- BB
1930 lsr w3, w0, #8 // w3<- CC
1931 GET_VREG w0, w2 // w0<- vBB (array object)
1932 GET_VREG w1, w3 // w1<- vCC (requested index)
1933 cbz w0, common_errNullObject // bail if null
1934 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1935 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1936 cmp w1, w3 // compare unsigned index, length
1937 bcs common_errArrayIndex // index >= length, bail
1938 GET_VREG_WIDE x1, w4
1939 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1940 GET_INST_OPCODE ip // extract opcode from wINST
1941 str x1, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]
1942 GOTO_OPCODE ip // jump to next instruction
1943
1944/* ------------------------------ */
1945 .balign 128
1946.L_op_aput_object: /* 0x4d */
1947/* File: arm64/op_aput_object.S */
1948 /*
1949 * Store an object into an array. vBB[vCC] <- vAA.
1950 */
1951 /* op vAA, vBB, vCC */
1952 EXPORT_PC
1953 add x0, xFP, #OFF_FP_SHADOWFRAME
1954 mov x1, xPC
1955 mov w2, wINST
1956 bl MterpAputObject
1957 cbz w0, MterpPossibleException
1958 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1959 GET_INST_OPCODE ip // extract opcode from rINST
1960 GOTO_OPCODE ip // jump to next instruction
1961
1962/* ------------------------------ */
1963 .balign 128
1964.L_op_aput_boolean: /* 0x4e */
1965/* File: arm64/op_aput_boolean.S */
1966/* File: arm64/op_aput.S */
1967 /*
1968 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1969 *
1970 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1971 * instructions. We use a pair of FETCH_Bs instead.
1972 *
1973 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1974 *
1975 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1976 * If this changes, specialize.
1977 */
1978 /* op vAA, vBB, vCC */
1979 FETCH_B w2, 1, 0 // w2<- BB
1980 lsr w9, wINST, #8 // w9<- AA
1981 FETCH_B w3, 1, 1 // w3<- CC
1982 GET_VREG w0, w2 // w0<- vBB (array object)
1983 GET_VREG w1, w3 // w1<- vCC (requested index)
1984 cbz w0, common_errNullObject // bail if null
1985 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1986 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
1987 cmp w1, w3 // compare unsigned index, length
1988 bcs common_errArrayIndex // index >= length, bail
1989 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1990 GET_VREG w2, w9 // w2<- vAA
1991 GET_INST_OPCODE ip // extract opcode from rINST
1992 strb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
1993 GOTO_OPCODE ip // jump to next instruction
1994
1995
1996/* ------------------------------ */
1997 .balign 128
1998.L_op_aput_byte: /* 0x4f */
1999/* File: arm64/op_aput_byte.S */
2000/* File: arm64/op_aput.S */
2001 /*
2002 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2003 *
2004 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2005 * instructions. We use a pair of FETCH_Bs instead.
2006 *
2007 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2008 *
2009 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2010 * If this changes, specialize.
2011 */
2012 /* op vAA, vBB, vCC */
2013 FETCH_B w2, 1, 0 // w2<- BB
2014 lsr w9, wINST, #8 // w9<- AA
2015 FETCH_B w3, 1, 1 // w3<- CC
2016 GET_VREG w0, w2 // w0<- vBB (array object)
2017 GET_VREG w1, w3 // w1<- vCC (requested index)
2018 cbz w0, common_errNullObject // bail if null
2019 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2020 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2021 cmp w1, w3 // compare unsigned index, length
2022 bcs common_errArrayIndex // index >= length, bail
2023 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2024 GET_VREG w2, w9 // w2<- vAA
2025 GET_INST_OPCODE ip // extract opcode from rINST
2026 strb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2027 GOTO_OPCODE ip // jump to next instruction
2028
2029
2030/* ------------------------------ */
2031 .balign 128
2032.L_op_aput_char: /* 0x50 */
2033/* File: arm64/op_aput_char.S */
2034/* File: arm64/op_aput.S */
2035 /*
2036 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2037 *
2038 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2039 * instructions. We use a pair of FETCH_Bs instead.
2040 *
2041 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2042 *
2043 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2044 * If this changes, specialize.
2045 */
2046 /* op vAA, vBB, vCC */
2047 FETCH_B w2, 1, 0 // w2<- BB
2048 lsr w9, wINST, #8 // w9<- AA
2049 FETCH_B w3, 1, 1 // w3<- CC
2050 GET_VREG w0, w2 // w0<- vBB (array object)
2051 GET_VREG w1, w3 // w1<- vCC (requested index)
2052 cbz w0, common_errNullObject // bail if null
2053 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2054 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2055 cmp w1, w3 // compare unsigned index, length
2056 bcs common_errArrayIndex // index >= length, bail
2057 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2058 GET_VREG w2, w9 // w2<- vAA
2059 GET_INST_OPCODE ip // extract opcode from rINST
2060 strh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2061 GOTO_OPCODE ip // jump to next instruction
2062
2063
2064/* ------------------------------ */
2065 .balign 128
2066.L_op_aput_short: /* 0x51 */
2067/* File: arm64/op_aput_short.S */
2068/* File: arm64/op_aput.S */
2069 /*
2070 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2071 *
2072 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2073 * instructions. We use a pair of FETCH_Bs instead.
2074 *
2075 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2076 *
2077 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2078 * If this changes, specialize.
2079 */
2080 /* op vAA, vBB, vCC */
2081 FETCH_B w2, 1, 0 // w2<- BB
2082 lsr w9, wINST, #8 // w9<- AA
2083 FETCH_B w3, 1, 1 // w3<- CC
2084 GET_VREG w0, w2 // w0<- vBB (array object)
2085 GET_VREG w1, w3 // w1<- vCC (requested index)
2086 cbz w0, common_errNullObject // bail if null
2087 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2088 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2089 cmp w1, w3 // compare unsigned index, length
2090 bcs common_errArrayIndex // index >= length, bail
2091 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2092 GET_VREG w2, w9 // w2<- vAA
2093 GET_INST_OPCODE ip // extract opcode from rINST
2094 strh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2095 GOTO_OPCODE ip // jump to next instruction
2096
2097
2098/* ------------------------------ */
2099 .balign 128
2100.L_op_iget: /* 0x52 */
2101/* File: arm64/op_iget.S */
2102 /*
2103 * General instance field get.
2104 *
2105 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2106 */
2107 EXPORT_PC
2108 FETCH w0, 1 // w0<- field ref CCCC
2109 lsr w1, wINST, #12 // w1<- B
2110 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2111 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2112 mov x3, xSELF // w3<- self
2113 bl artGet32InstanceFromCode
2114 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002115
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002116 ubfx w2, wINST, #8, #4 // w2<- A
2117 PREFETCH_INST 2
2118 cbnz x3, MterpPossibleException // bail out
2119 .if 0
2120 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2121 .else
2122 SET_VREG w0, w2 // fp[A]<- w0
2123 .endif
2124 ADVANCE 2
2125 GET_INST_OPCODE ip // extract opcode from rINST
2126 GOTO_OPCODE ip // jump to next instruction
2127
2128/* ------------------------------ */
2129 .balign 128
2130.L_op_iget_wide: /* 0x53 */
2131/* File: arm64/op_iget_wide.S */
2132 /*
2133 * 64-bit instance field get.
2134 *
2135 * for: iget-wide
2136 */
2137 EXPORT_PC
2138 FETCH w0, 1 // w0<- field ref CCCC
2139 lsr w1, wINST, #12 // w1<- B
2140 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2141 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2142 mov x3, xSELF // w3<- self
2143 bl artGet64InstanceFromCode
2144 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2145 ubfx w2, wINST, #8, #4 // w2<- A
2146 PREFETCH_INST 2
2147 cmp w3, #0
2148 cbnz w3, MterpException // bail out
2149 SET_VREG_WIDE x0, w2
2150 ADVANCE 2
2151 GET_INST_OPCODE ip // extract opcode from wINST
2152 GOTO_OPCODE ip // jump to next instruction
2153
2154/* ------------------------------ */
2155 .balign 128
2156.L_op_iget_object: /* 0x54 */
2157/* File: arm64/op_iget_object.S */
2158/* File: arm64/op_iget.S */
2159 /*
2160 * General instance field get.
2161 *
2162 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2163 */
2164 EXPORT_PC
2165 FETCH w0, 1 // w0<- field ref CCCC
2166 lsr w1, wINST, #12 // w1<- B
2167 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2168 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2169 mov x3, xSELF // w3<- self
2170 bl artGetObjInstanceFromCode
2171 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002172
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002173 ubfx w2, wINST, #8, #4 // w2<- A
2174 PREFETCH_INST 2
2175 cbnz x3, MterpPossibleException // bail out
2176 .if 1
2177 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2178 .else
2179 SET_VREG w0, w2 // fp[A]<- w0
2180 .endif
2181 ADVANCE 2
2182 GET_INST_OPCODE ip // extract opcode from rINST
2183 GOTO_OPCODE ip // jump to next instruction
2184
2185
2186/* ------------------------------ */
2187 .balign 128
2188.L_op_iget_boolean: /* 0x55 */
2189/* File: arm64/op_iget_boolean.S */
2190/* File: arm64/op_iget.S */
2191 /*
2192 * General instance field get.
2193 *
2194 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2195 */
2196 EXPORT_PC
2197 FETCH w0, 1 // w0<- field ref CCCC
2198 lsr w1, wINST, #12 // w1<- B
2199 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2200 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2201 mov x3, xSELF // w3<- self
2202 bl artGetBooleanInstanceFromCode
2203 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002204 uxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002205 ubfx w2, wINST, #8, #4 // w2<- A
2206 PREFETCH_INST 2
2207 cbnz x3, MterpPossibleException // bail out
2208 .if 0
2209 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2210 .else
2211 SET_VREG w0, w2 // fp[A]<- w0
2212 .endif
2213 ADVANCE 2
2214 GET_INST_OPCODE ip // extract opcode from rINST
2215 GOTO_OPCODE ip // jump to next instruction
2216
2217
2218/* ------------------------------ */
2219 .balign 128
2220.L_op_iget_byte: /* 0x56 */
2221/* File: arm64/op_iget_byte.S */
2222/* File: arm64/op_iget.S */
2223 /*
2224 * General instance field get.
2225 *
2226 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2227 */
2228 EXPORT_PC
2229 FETCH w0, 1 // w0<- field ref CCCC
2230 lsr w1, wINST, #12 // w1<- B
2231 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2232 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2233 mov x3, xSELF // w3<- self
2234 bl artGetByteInstanceFromCode
2235 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002236 sxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002237 ubfx w2, wINST, #8, #4 // w2<- A
2238 PREFETCH_INST 2
2239 cbnz x3, MterpPossibleException // bail out
2240 .if 0
2241 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2242 .else
2243 SET_VREG w0, w2 // fp[A]<- w0
2244 .endif
2245 ADVANCE 2
2246 GET_INST_OPCODE ip // extract opcode from rINST
2247 GOTO_OPCODE ip // jump to next instruction
2248
2249
2250/* ------------------------------ */
2251 .balign 128
2252.L_op_iget_char: /* 0x57 */
2253/* File: arm64/op_iget_char.S */
2254/* File: arm64/op_iget.S */
2255 /*
2256 * General instance field get.
2257 *
2258 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2259 */
2260 EXPORT_PC
2261 FETCH w0, 1 // w0<- field ref CCCC
2262 lsr w1, wINST, #12 // w1<- B
2263 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2264 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2265 mov x3, xSELF // w3<- self
2266 bl artGetCharInstanceFromCode
2267 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002268 uxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002269 ubfx w2, wINST, #8, #4 // w2<- A
2270 PREFETCH_INST 2
2271 cbnz x3, MterpPossibleException // bail out
2272 .if 0
2273 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2274 .else
2275 SET_VREG w0, w2 // fp[A]<- w0
2276 .endif
2277 ADVANCE 2
2278 GET_INST_OPCODE ip // extract opcode from rINST
2279 GOTO_OPCODE ip // jump to next instruction
2280
2281
2282/* ------------------------------ */
2283 .balign 128
2284.L_op_iget_short: /* 0x58 */
2285/* File: arm64/op_iget_short.S */
2286/* File: arm64/op_iget.S */
2287 /*
2288 * General instance field get.
2289 *
2290 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2291 */
2292 EXPORT_PC
2293 FETCH w0, 1 // w0<- field ref CCCC
2294 lsr w1, wINST, #12 // w1<- B
2295 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2296 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2297 mov x3, xSELF // w3<- self
2298 bl artGetShortInstanceFromCode
2299 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002300 sxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002301 ubfx w2, wINST, #8, #4 // w2<- A
2302 PREFETCH_INST 2
2303 cbnz x3, MterpPossibleException // bail out
2304 .if 0
2305 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2306 .else
2307 SET_VREG w0, w2 // fp[A]<- w0
2308 .endif
2309 ADVANCE 2
2310 GET_INST_OPCODE ip // extract opcode from rINST
2311 GOTO_OPCODE ip // jump to next instruction
2312
2313
2314/* ------------------------------ */
2315 .balign 128
2316.L_op_iput: /* 0x59 */
2317/* File: arm64/op_iput.S */
2318 /*
2319 * General 32-bit instance field put.
2320 *
2321 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2322 */
2323 /* op vA, vB, field//CCCC */
2324 .extern artSet32InstanceFromMterp
2325 EXPORT_PC
2326 FETCH w0, 1 // w0<- field ref CCCC
2327 lsr w1, wINST, #12 // w1<- B
2328 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2329 ubfx w2, wINST, #8, #4 // w2<- A
2330 GET_VREG w2, w2 // w2<- fp[A]
2331 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2332 PREFETCH_INST 2
2333 bl artSet32InstanceFromMterp
2334 cbnz w0, MterpPossibleException
2335 ADVANCE 2 // advance rPC
2336 GET_INST_OPCODE ip // extract opcode from rINST
2337 GOTO_OPCODE ip // jump to next instruction
2338
2339/* ------------------------------ */
2340 .balign 128
2341.L_op_iput_wide: /* 0x5a */
2342/* File: arm64/op_iput_wide.S */
2343 /* iput-wide vA, vB, field//CCCC */
2344 .extern artSet64InstanceFromMterp
2345 EXPORT_PC
2346 FETCH w0, 1 // w0<- field ref CCCC
2347 lsr w1, wINST, #12 // w1<- B
2348 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2349 ubfx w2, wINST, #8, #4 // w2<- A
buzbeeace690f2016-03-11 09:51:11 -08002350 VREG_INDEX_TO_ADDR x2, x2 // w2<- &fp[A]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002351 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2352 PREFETCH_INST 2
2353 bl artSet64InstanceFromMterp
2354 cbnz w0, MterpPossibleException
2355 ADVANCE 2 // advance rPC
2356 GET_INST_OPCODE ip // extract opcode from wINST
2357 GOTO_OPCODE ip // jump to next instruction
2358
2359/* ------------------------------ */
2360 .balign 128
2361.L_op_iput_object: /* 0x5b */
2362/* File: arm64/op_iput_object.S */
2363 EXPORT_PC
2364 add x0, xFP, #OFF_FP_SHADOWFRAME
2365 mov x1, xPC
2366 mov w2, wINST
2367 mov x3, xSELF
2368 bl MterpIputObject
2369 cbz w0, MterpException
2370 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2371 GET_INST_OPCODE ip // extract opcode from rINST
2372 GOTO_OPCODE ip // jump to next instruction
2373
2374/* ------------------------------ */
2375 .balign 128
2376.L_op_iput_boolean: /* 0x5c */
2377/* File: arm64/op_iput_boolean.S */
2378/* File: arm64/op_iput.S */
2379 /*
2380 * General 32-bit instance field put.
2381 *
2382 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2383 */
2384 /* op vA, vB, field//CCCC */
2385 .extern artSet8InstanceFromMterp
2386 EXPORT_PC
2387 FETCH w0, 1 // w0<- field ref CCCC
2388 lsr w1, wINST, #12 // w1<- B
2389 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2390 ubfx w2, wINST, #8, #4 // w2<- A
2391 GET_VREG w2, w2 // w2<- fp[A]
2392 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2393 PREFETCH_INST 2
2394 bl artSet8InstanceFromMterp
2395 cbnz w0, MterpPossibleException
2396 ADVANCE 2 // advance rPC
2397 GET_INST_OPCODE ip // extract opcode from rINST
2398 GOTO_OPCODE ip // jump to next instruction
2399
2400
2401/* ------------------------------ */
2402 .balign 128
2403.L_op_iput_byte: /* 0x5d */
2404/* File: arm64/op_iput_byte.S */
2405/* File: arm64/op_iput.S */
2406 /*
2407 * General 32-bit instance field put.
2408 *
2409 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2410 */
2411 /* op vA, vB, field//CCCC */
2412 .extern artSet8InstanceFromMterp
2413 EXPORT_PC
2414 FETCH w0, 1 // w0<- field ref CCCC
2415 lsr w1, wINST, #12 // w1<- B
2416 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2417 ubfx w2, wINST, #8, #4 // w2<- A
2418 GET_VREG w2, w2 // w2<- fp[A]
2419 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2420 PREFETCH_INST 2
2421 bl artSet8InstanceFromMterp
2422 cbnz w0, MterpPossibleException
2423 ADVANCE 2 // advance rPC
2424 GET_INST_OPCODE ip // extract opcode from rINST
2425 GOTO_OPCODE ip // jump to next instruction
2426
2427
2428/* ------------------------------ */
2429 .balign 128
2430.L_op_iput_char: /* 0x5e */
2431/* File: arm64/op_iput_char.S */
2432/* File: arm64/op_iput.S */
2433 /*
2434 * General 32-bit instance field put.
2435 *
2436 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2437 */
2438 /* op vA, vB, field//CCCC */
2439 .extern artSet16InstanceFromMterp
2440 EXPORT_PC
2441 FETCH w0, 1 // w0<- field ref CCCC
2442 lsr w1, wINST, #12 // w1<- B
2443 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2444 ubfx w2, wINST, #8, #4 // w2<- A
2445 GET_VREG w2, w2 // w2<- fp[A]
2446 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2447 PREFETCH_INST 2
2448 bl artSet16InstanceFromMterp
2449 cbnz w0, MterpPossibleException
2450 ADVANCE 2 // advance rPC
2451 GET_INST_OPCODE ip // extract opcode from rINST
2452 GOTO_OPCODE ip // jump to next instruction
2453
2454
2455/* ------------------------------ */
2456 .balign 128
2457.L_op_iput_short: /* 0x5f */
2458/* File: arm64/op_iput_short.S */
2459/* File: arm64/op_iput.S */
2460 /*
2461 * General 32-bit instance field put.
2462 *
2463 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2464 */
2465 /* op vA, vB, field//CCCC */
2466 .extern artSet16InstanceFromMterp
2467 EXPORT_PC
2468 FETCH w0, 1 // w0<- field ref CCCC
2469 lsr w1, wINST, #12 // w1<- B
2470 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2471 ubfx w2, wINST, #8, #4 // w2<- A
2472 GET_VREG w2, w2 // w2<- fp[A]
2473 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2474 PREFETCH_INST 2
2475 bl artSet16InstanceFromMterp
2476 cbnz w0, MterpPossibleException
2477 ADVANCE 2 // advance rPC
2478 GET_INST_OPCODE ip // extract opcode from rINST
2479 GOTO_OPCODE ip // jump to next instruction
2480
2481
2482/* ------------------------------ */
2483 .balign 128
2484.L_op_sget: /* 0x60 */
2485/* File: arm64/op_sget.S */
2486 /*
2487 * General SGET handler wrapper.
2488 *
2489 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2490 */
2491 /* op vAA, field//BBBB */
2492
2493 .extern artGet32StaticFromCode
2494 EXPORT_PC
2495 FETCH w0, 1 // w0<- field ref BBBB
2496 ldr x1, [xFP, #OFF_FP_METHOD]
2497 mov x2, xSELF
2498 bl artGet32StaticFromCode
2499 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2500 lsr w2, wINST, #8 // w2<- AA
2501
2502 PREFETCH_INST 2
2503 cbnz x3, MterpException // bail out
2504.if 0
2505 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2506.else
2507 SET_VREG w0, w2 // fp[AA]<- w0
2508.endif
2509 ADVANCE 2
2510 GET_INST_OPCODE ip // extract opcode from rINST
2511 GOTO_OPCODE ip
2512
2513/* ------------------------------ */
2514 .balign 128
2515.L_op_sget_wide: /* 0x61 */
2516/* File: arm64/op_sget_wide.S */
2517 /*
2518 * SGET_WIDE handler wrapper.
2519 *
2520 */
2521 /* sget-wide vAA, field//BBBB */
2522
2523 .extern artGet64StaticFromCode
2524 EXPORT_PC
2525 FETCH w0, 1 // w0<- field ref BBBB
2526 ldr x1, [xFP, #OFF_FP_METHOD]
2527 mov x2, xSELF
2528 bl artGet64StaticFromCode
2529 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2530 lsr w4, wINST, #8 // w4<- AA
2531 cbnz x3, MterpException // bail out
2532 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2533 SET_VREG_WIDE x0, w4
2534 GET_INST_OPCODE ip // extract opcode from wINST
2535 GOTO_OPCODE ip // jump to next instruction
2536
2537/* ------------------------------ */
2538 .balign 128
2539.L_op_sget_object: /* 0x62 */
2540/* File: arm64/op_sget_object.S */
2541/* File: arm64/op_sget.S */
2542 /*
2543 * General SGET handler wrapper.
2544 *
2545 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2546 */
2547 /* op vAA, field//BBBB */
2548
2549 .extern artGetObjStaticFromCode
2550 EXPORT_PC
2551 FETCH w0, 1 // w0<- field ref BBBB
2552 ldr x1, [xFP, #OFF_FP_METHOD]
2553 mov x2, xSELF
2554 bl artGetObjStaticFromCode
2555 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2556 lsr w2, wINST, #8 // w2<- AA
2557
2558 PREFETCH_INST 2
2559 cbnz x3, MterpException // bail out
2560.if 1
2561 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2562.else
2563 SET_VREG w0, w2 // fp[AA]<- w0
2564.endif
2565 ADVANCE 2
2566 GET_INST_OPCODE ip // extract opcode from rINST
2567 GOTO_OPCODE ip
2568
2569
2570/* ------------------------------ */
2571 .balign 128
2572.L_op_sget_boolean: /* 0x63 */
2573/* File: arm64/op_sget_boolean.S */
2574/* File: arm64/op_sget.S */
2575 /*
2576 * General SGET handler wrapper.
2577 *
2578 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2579 */
2580 /* op vAA, field//BBBB */
2581
2582 .extern artGetBooleanStaticFromCode
2583 EXPORT_PC
2584 FETCH w0, 1 // w0<- field ref BBBB
2585 ldr x1, [xFP, #OFF_FP_METHOD]
2586 mov x2, xSELF
2587 bl artGetBooleanStaticFromCode
2588 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2589 lsr w2, wINST, #8 // w2<- AA
2590 uxtb w0, w0
2591 PREFETCH_INST 2
2592 cbnz x3, MterpException // bail out
2593.if 0
2594 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2595.else
2596 SET_VREG w0, w2 // fp[AA]<- w0
2597.endif
2598 ADVANCE 2
2599 GET_INST_OPCODE ip // extract opcode from rINST
2600 GOTO_OPCODE ip
2601
2602
2603/* ------------------------------ */
2604 .balign 128
2605.L_op_sget_byte: /* 0x64 */
2606/* File: arm64/op_sget_byte.S */
2607/* File: arm64/op_sget.S */
2608 /*
2609 * General SGET handler wrapper.
2610 *
2611 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2612 */
2613 /* op vAA, field//BBBB */
2614
2615 .extern artGetByteStaticFromCode
2616 EXPORT_PC
2617 FETCH w0, 1 // w0<- field ref BBBB
2618 ldr x1, [xFP, #OFF_FP_METHOD]
2619 mov x2, xSELF
2620 bl artGetByteStaticFromCode
2621 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2622 lsr w2, wINST, #8 // w2<- AA
2623 sxtb w0, w0
2624 PREFETCH_INST 2
2625 cbnz x3, MterpException // bail out
2626.if 0
2627 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2628.else
2629 SET_VREG w0, w2 // fp[AA]<- w0
2630.endif
2631 ADVANCE 2
2632 GET_INST_OPCODE ip // extract opcode from rINST
2633 GOTO_OPCODE ip
2634
2635
2636/* ------------------------------ */
2637 .balign 128
2638.L_op_sget_char: /* 0x65 */
2639/* File: arm64/op_sget_char.S */
2640/* File: arm64/op_sget.S */
2641 /*
2642 * General SGET handler wrapper.
2643 *
2644 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2645 */
2646 /* op vAA, field//BBBB */
2647
2648 .extern artGetCharStaticFromCode
2649 EXPORT_PC
2650 FETCH w0, 1 // w0<- field ref BBBB
2651 ldr x1, [xFP, #OFF_FP_METHOD]
2652 mov x2, xSELF
2653 bl artGetCharStaticFromCode
2654 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2655 lsr w2, wINST, #8 // w2<- AA
2656 uxth w0, w0
2657 PREFETCH_INST 2
2658 cbnz x3, MterpException // bail out
2659.if 0
2660 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2661.else
2662 SET_VREG w0, w2 // fp[AA]<- w0
2663.endif
2664 ADVANCE 2
2665 GET_INST_OPCODE ip // extract opcode from rINST
2666 GOTO_OPCODE ip
2667
2668
2669/* ------------------------------ */
2670 .balign 128
2671.L_op_sget_short: /* 0x66 */
2672/* File: arm64/op_sget_short.S */
2673/* File: arm64/op_sget.S */
2674 /*
2675 * General SGET handler wrapper.
2676 *
2677 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2678 */
2679 /* op vAA, field//BBBB */
2680
2681 .extern artGetShortStaticFromCode
2682 EXPORT_PC
2683 FETCH w0, 1 // w0<- field ref BBBB
2684 ldr x1, [xFP, #OFF_FP_METHOD]
2685 mov x2, xSELF
2686 bl artGetShortStaticFromCode
2687 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2688 lsr w2, wINST, #8 // w2<- AA
2689 sxth w0, w0
2690 PREFETCH_INST 2
2691 cbnz x3, MterpException // bail out
2692.if 0
2693 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2694.else
2695 SET_VREG w0, w2 // fp[AA]<- w0
2696.endif
2697 ADVANCE 2
2698 GET_INST_OPCODE ip // extract opcode from rINST
2699 GOTO_OPCODE ip
2700
2701
2702/* ------------------------------ */
2703 .balign 128
2704.L_op_sput: /* 0x67 */
2705/* File: arm64/op_sput.S */
2706 /*
2707 * General SPUT handler wrapper.
2708 *
2709 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2710 */
2711 /* op vAA, field//BBBB */
2712 EXPORT_PC
2713 FETCH w0, 1 // r0<- field ref BBBB
2714 lsr w3, wINST, #8 // r3<- AA
2715 GET_VREG w1, w3 // r1<= fp[AA]
2716 ldr x2, [xFP, #OFF_FP_METHOD]
2717 mov x3, xSELF
2718 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2719 bl artSet32StaticFromCode
2720 cbnz w0, MterpException // 0 on success
2721 ADVANCE 2 // Past exception point - now advance rPC
2722 GET_INST_OPCODE ip // extract opcode from rINST
2723 GOTO_OPCODE ip // jump to next instruction
2724
2725/* ------------------------------ */
2726 .balign 128
2727.L_op_sput_wide: /* 0x68 */
2728/* File: arm64/op_sput_wide.S */
2729 /*
2730 * SPUT_WIDE handler wrapper.
2731 *
2732 */
2733 /* sput-wide vAA, field//BBBB */
2734 .extern artSet64IndirectStaticFromMterp
2735 EXPORT_PC
2736 FETCH w0, 1 // w0<- field ref BBBB
2737 ldr x1, [xFP, #OFF_FP_METHOD]
2738 lsr w2, wINST, #8 // w3<- AA
buzbeeace690f2016-03-11 09:51:11 -08002739 VREG_INDEX_TO_ADDR x2, w2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002740 mov x3, xSELF
2741 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2742 bl artSet64IndirectStaticFromMterp
2743 cbnz w0, MterpException // 0 on success, -1 on failure
2744 ADVANCE 2 // Past exception point - now advance rPC
2745 GET_INST_OPCODE ip // extract opcode from wINST
2746 GOTO_OPCODE ip // jump to next instruction
2747
2748/* ------------------------------ */
2749 .balign 128
2750.L_op_sput_object: /* 0x69 */
2751/* File: arm64/op_sput_object.S */
2752 EXPORT_PC
2753 add x0, xFP, #OFF_FP_SHADOWFRAME
2754 mov x1, xPC
2755 mov x2, xINST
2756 mov x3, xSELF
2757 bl MterpSputObject
2758 cbz w0, MterpException
2759 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2760 GET_INST_OPCODE ip // extract opcode from rINST
2761 GOTO_OPCODE ip // jump to next instruction
2762
2763/* ------------------------------ */
2764 .balign 128
2765.L_op_sput_boolean: /* 0x6a */
2766/* File: arm64/op_sput_boolean.S */
2767/* File: arm64/op_sput.S */
2768 /*
2769 * General SPUT handler wrapper.
2770 *
2771 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2772 */
2773 /* op vAA, field//BBBB */
2774 EXPORT_PC
2775 FETCH w0, 1 // r0<- field ref BBBB
2776 lsr w3, wINST, #8 // r3<- AA
2777 GET_VREG w1, w3 // r1<= fp[AA]
2778 ldr x2, [xFP, #OFF_FP_METHOD]
2779 mov x3, xSELF
2780 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2781 bl artSet8StaticFromCode
2782 cbnz w0, MterpException // 0 on success
2783 ADVANCE 2 // Past exception point - now advance rPC
2784 GET_INST_OPCODE ip // extract opcode from rINST
2785 GOTO_OPCODE ip // jump to next instruction
2786
2787
2788/* ------------------------------ */
2789 .balign 128
2790.L_op_sput_byte: /* 0x6b */
2791/* File: arm64/op_sput_byte.S */
2792/* File: arm64/op_sput.S */
2793 /*
2794 * General SPUT handler wrapper.
2795 *
2796 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2797 */
2798 /* op vAA, field//BBBB */
2799 EXPORT_PC
2800 FETCH w0, 1 // r0<- field ref BBBB
2801 lsr w3, wINST, #8 // r3<- AA
2802 GET_VREG w1, w3 // r1<= fp[AA]
2803 ldr x2, [xFP, #OFF_FP_METHOD]
2804 mov x3, xSELF
2805 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2806 bl artSet8StaticFromCode
2807 cbnz w0, MterpException // 0 on success
2808 ADVANCE 2 // Past exception point - now advance rPC
2809 GET_INST_OPCODE ip // extract opcode from rINST
2810 GOTO_OPCODE ip // jump to next instruction
2811
2812
2813/* ------------------------------ */
2814 .balign 128
2815.L_op_sput_char: /* 0x6c */
2816/* File: arm64/op_sput_char.S */
2817/* File: arm64/op_sput.S */
2818 /*
2819 * General SPUT handler wrapper.
2820 *
2821 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2822 */
2823 /* op vAA, field//BBBB */
2824 EXPORT_PC
2825 FETCH w0, 1 // r0<- field ref BBBB
2826 lsr w3, wINST, #8 // r3<- AA
2827 GET_VREG w1, w3 // r1<= fp[AA]
2828 ldr x2, [xFP, #OFF_FP_METHOD]
2829 mov x3, xSELF
2830 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2831 bl artSet16StaticFromCode
2832 cbnz w0, MterpException // 0 on success
2833 ADVANCE 2 // Past exception point - now advance rPC
2834 GET_INST_OPCODE ip // extract opcode from rINST
2835 GOTO_OPCODE ip // jump to next instruction
2836
2837
2838/* ------------------------------ */
2839 .balign 128
2840.L_op_sput_short: /* 0x6d */
2841/* File: arm64/op_sput_short.S */
2842/* File: arm64/op_sput.S */
2843 /*
2844 * General SPUT handler wrapper.
2845 *
2846 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2847 */
2848 /* op vAA, field//BBBB */
2849 EXPORT_PC
2850 FETCH w0, 1 // r0<- field ref BBBB
2851 lsr w3, wINST, #8 // r3<- AA
2852 GET_VREG w1, w3 // r1<= fp[AA]
2853 ldr x2, [xFP, #OFF_FP_METHOD]
2854 mov x3, xSELF
2855 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2856 bl artSet16StaticFromCode
2857 cbnz w0, MterpException // 0 on success
2858 ADVANCE 2 // Past exception point - now advance rPC
2859 GET_INST_OPCODE ip // extract opcode from rINST
2860 GOTO_OPCODE ip // jump to next instruction
2861
2862
2863/* ------------------------------ */
2864 .balign 128
2865.L_op_invoke_virtual: /* 0x6e */
2866/* File: arm64/op_invoke_virtual.S */
2867/* File: arm64/invoke.S */
2868 /*
2869 * Generic invoke handler wrapper.
2870 */
2871 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2872 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2873 .extern MterpInvokeVirtual
2874 EXPORT_PC
2875 mov x0, xSELF
2876 add x1, xFP, #OFF_FP_SHADOWFRAME
2877 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002878 mov x3, xINST
2879 bl MterpInvokeVirtual
2880 cbz w0, MterpException
2881 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002882 bl MterpShouldSwitchInterpreters
2883 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002884 GET_INST_OPCODE ip
2885 GOTO_OPCODE ip
2886
2887
2888 /*
2889 * Handle a virtual method call.
2890 *
2891 * for: invoke-virtual, invoke-virtual/range
2892 */
2893 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2894 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2895
2896/* ------------------------------ */
2897 .balign 128
2898.L_op_invoke_super: /* 0x6f */
2899/* File: arm64/op_invoke_super.S */
2900/* File: arm64/invoke.S */
2901 /*
2902 * Generic invoke handler wrapper.
2903 */
2904 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2905 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2906 .extern MterpInvokeSuper
2907 EXPORT_PC
2908 mov x0, xSELF
2909 add x1, xFP, #OFF_FP_SHADOWFRAME
2910 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002911 mov x3, xINST
2912 bl MterpInvokeSuper
2913 cbz w0, MterpException
2914 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002915 bl MterpShouldSwitchInterpreters
2916 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002917 GET_INST_OPCODE ip
2918 GOTO_OPCODE ip
2919
2920
2921 /*
2922 * Handle a "super" method call.
2923 *
2924 * for: invoke-super, invoke-super/range
2925 */
2926 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2927 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2928
2929/* ------------------------------ */
2930 .balign 128
2931.L_op_invoke_direct: /* 0x70 */
2932/* File: arm64/op_invoke_direct.S */
2933/* File: arm64/invoke.S */
2934 /*
2935 * Generic invoke handler wrapper.
2936 */
2937 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2938 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2939 .extern MterpInvokeDirect
2940 EXPORT_PC
2941 mov x0, xSELF
2942 add x1, xFP, #OFF_FP_SHADOWFRAME
2943 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002944 mov x3, xINST
2945 bl MterpInvokeDirect
2946 cbz w0, MterpException
2947 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002948 bl MterpShouldSwitchInterpreters
2949 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002950 GET_INST_OPCODE ip
2951 GOTO_OPCODE ip
2952
2953
2954
2955/* ------------------------------ */
2956 .balign 128
2957.L_op_invoke_static: /* 0x71 */
2958/* File: arm64/op_invoke_static.S */
2959/* File: arm64/invoke.S */
2960 /*
2961 * Generic invoke handler wrapper.
2962 */
2963 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2964 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2965 .extern MterpInvokeStatic
2966 EXPORT_PC
2967 mov x0, xSELF
2968 add x1, xFP, #OFF_FP_SHADOWFRAME
2969 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002970 mov x3, xINST
2971 bl MterpInvokeStatic
2972 cbz w0, MterpException
2973 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002974 bl MterpShouldSwitchInterpreters
2975 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002976 GET_INST_OPCODE ip
2977 GOTO_OPCODE ip
2978
2979
2980
2981
2982/* ------------------------------ */
2983 .balign 128
2984.L_op_invoke_interface: /* 0x72 */
2985/* File: arm64/op_invoke_interface.S */
2986/* File: arm64/invoke.S */
2987 /*
2988 * Generic invoke handler wrapper.
2989 */
2990 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2991 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2992 .extern MterpInvokeInterface
2993 EXPORT_PC
2994 mov x0, xSELF
2995 add x1, xFP, #OFF_FP_SHADOWFRAME
2996 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002997 mov x3, xINST
2998 bl MterpInvokeInterface
2999 cbz w0, MterpException
3000 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003001 bl MterpShouldSwitchInterpreters
3002 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003003 GET_INST_OPCODE ip
3004 GOTO_OPCODE ip
3005
3006
3007 /*
3008 * Handle an interface method call.
3009 *
3010 * for: invoke-interface, invoke-interface/range
3011 */
3012 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3013 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3014
3015/* ------------------------------ */
3016 .balign 128
3017.L_op_return_void_no_barrier: /* 0x73 */
3018/* File: arm64/op_return_void_no_barrier.S */
3019 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
3020 mov x0, xSELF
3021 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3022 b.ne .Lop_return_void_no_barrier_check
3023.Lop_return_void_no_barrier_return:
3024 mov x0, #0
3025 b MterpReturn
3026.Lop_return_void_no_barrier_check:
3027 bl MterpSuspendCheck // (self)
3028 b .Lop_return_void_no_barrier_return
3029
3030/* ------------------------------ */
3031 .balign 128
3032.L_op_invoke_virtual_range: /* 0x74 */
3033/* File: arm64/op_invoke_virtual_range.S */
3034/* File: arm64/invoke.S */
3035 /*
3036 * Generic invoke handler wrapper.
3037 */
3038 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3039 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3040 .extern MterpInvokeVirtualRange
3041 EXPORT_PC
3042 mov x0, xSELF
3043 add x1, xFP, #OFF_FP_SHADOWFRAME
3044 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003045 mov x3, xINST
3046 bl MterpInvokeVirtualRange
3047 cbz w0, MterpException
3048 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003049 bl MterpShouldSwitchInterpreters
3050 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003051 GET_INST_OPCODE ip
3052 GOTO_OPCODE ip
3053
3054
3055
3056/* ------------------------------ */
3057 .balign 128
3058.L_op_invoke_super_range: /* 0x75 */
3059/* File: arm64/op_invoke_super_range.S */
3060/* File: arm64/invoke.S */
3061 /*
3062 * Generic invoke handler wrapper.
3063 */
3064 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3065 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3066 .extern MterpInvokeSuperRange
3067 EXPORT_PC
3068 mov x0, xSELF
3069 add x1, xFP, #OFF_FP_SHADOWFRAME
3070 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003071 mov x3, xINST
3072 bl MterpInvokeSuperRange
3073 cbz w0, MterpException
3074 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003075 bl MterpShouldSwitchInterpreters
3076 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003077 GET_INST_OPCODE ip
3078 GOTO_OPCODE ip
3079
3080
3081
3082/* ------------------------------ */
3083 .balign 128
3084.L_op_invoke_direct_range: /* 0x76 */
3085/* File: arm64/op_invoke_direct_range.S */
3086/* File: arm64/invoke.S */
3087 /*
3088 * Generic invoke handler wrapper.
3089 */
3090 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3091 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3092 .extern MterpInvokeDirectRange
3093 EXPORT_PC
3094 mov x0, xSELF
3095 add x1, xFP, #OFF_FP_SHADOWFRAME
3096 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003097 mov x3, xINST
3098 bl MterpInvokeDirectRange
3099 cbz w0, MterpException
3100 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003101 bl MterpShouldSwitchInterpreters
3102 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003103 GET_INST_OPCODE ip
3104 GOTO_OPCODE ip
3105
3106
3107
3108/* ------------------------------ */
3109 .balign 128
3110.L_op_invoke_static_range: /* 0x77 */
3111/* File: arm64/op_invoke_static_range.S */
3112/* File: arm64/invoke.S */
3113 /*
3114 * Generic invoke handler wrapper.
3115 */
3116 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3117 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3118 .extern MterpInvokeStaticRange
3119 EXPORT_PC
3120 mov x0, xSELF
3121 add x1, xFP, #OFF_FP_SHADOWFRAME
3122 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003123 mov x3, xINST
3124 bl MterpInvokeStaticRange
3125 cbz w0, MterpException
3126 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003127 bl MterpShouldSwitchInterpreters
3128 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003129 GET_INST_OPCODE ip
3130 GOTO_OPCODE ip
3131
3132
3133
3134/* ------------------------------ */
3135 .balign 128
3136.L_op_invoke_interface_range: /* 0x78 */
3137/* File: arm64/op_invoke_interface_range.S */
3138/* File: arm64/invoke.S */
3139 /*
3140 * Generic invoke handler wrapper.
3141 */
3142 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3143 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3144 .extern MterpInvokeInterfaceRange
3145 EXPORT_PC
3146 mov x0, xSELF
3147 add x1, xFP, #OFF_FP_SHADOWFRAME
3148 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003149 mov x3, xINST
3150 bl MterpInvokeInterfaceRange
3151 cbz w0, MterpException
3152 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003153 bl MterpShouldSwitchInterpreters
3154 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003155 GET_INST_OPCODE ip
3156 GOTO_OPCODE ip
3157
3158
3159
3160/* ------------------------------ */
3161 .balign 128
3162.L_op_unused_79: /* 0x79 */
3163/* File: arm64/op_unused_79.S */
3164/* File: arm64/unused.S */
3165/*
3166 * Bail to reference interpreter to throw.
3167 */
3168 b MterpFallback
3169
3170
3171/* ------------------------------ */
3172 .balign 128
3173.L_op_unused_7a: /* 0x7a */
3174/* File: arm64/op_unused_7a.S */
3175/* File: arm64/unused.S */
3176/*
3177 * Bail to reference interpreter to throw.
3178 */
3179 b MterpFallback
3180
3181
3182/* ------------------------------ */
3183 .balign 128
3184.L_op_neg_int: /* 0x7b */
3185/* File: arm64/op_neg_int.S */
3186/* File: arm64/unop.S */
3187 /*
3188 * Generic 32-bit unary operation. Provide an "instr" line that
3189 * specifies an instruction that performs "result = op w0".
3190 * This could be an ARM instruction or a function call.
3191 *
3192 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3193 * int-to-byte, int-to-char, int-to-short
3194 */
3195 /* unop vA, vB */
3196 lsr w3, wINST, #12 // w3<- B
3197 GET_VREG w0, w3 // w0<- vB
3198 ubfx w9, wINST, #8, #4 // w9<- A
3199 // optional op; may set condition codes
3200 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3201 sub w0, wzr, w0 // w0<- op, w0-w3 changed
3202 GET_INST_OPCODE ip // extract opcode from rINST
3203 SET_VREG w0, w9 // vAA<- w0
3204 GOTO_OPCODE ip // jump to next instruction
3205 /* 8-9 instructions */
3206
3207
3208/* ------------------------------ */
3209 .balign 128
3210.L_op_not_int: /* 0x7c */
3211/* File: arm64/op_not_int.S */
3212/* File: arm64/unop.S */
3213 /*
3214 * Generic 32-bit unary operation. Provide an "instr" line that
3215 * specifies an instruction that performs "result = op w0".
3216 * This could be an ARM instruction or a function call.
3217 *
3218 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3219 * int-to-byte, int-to-char, int-to-short
3220 */
3221 /* unop vA, vB */
3222 lsr w3, wINST, #12 // w3<- B
3223 GET_VREG w0, w3 // w0<- vB
3224 ubfx w9, wINST, #8, #4 // w9<- A
3225 // optional op; may set condition codes
3226 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3227 mvn w0, w0 // w0<- op, w0-w3 changed
3228 GET_INST_OPCODE ip // extract opcode from rINST
3229 SET_VREG w0, w9 // vAA<- w0
3230 GOTO_OPCODE ip // jump to next instruction
3231 /* 8-9 instructions */
3232
3233
3234/* ------------------------------ */
3235 .balign 128
3236.L_op_neg_long: /* 0x7d */
3237/* File: arm64/op_neg_long.S */
3238/* File: arm64/unopWide.S */
3239 /*
3240 * Generic 64-bit unary operation. Provide an "instr" line that
3241 * specifies an instruction that performs "result = op x0".
3242 *
3243 * For: neg-long, not-long
3244 */
3245 /* unop vA, vB */
3246 lsr w3, wINST, #12 // w3<- B
3247 ubfx w4, wINST, #8, #4 // w4<- A
3248 GET_VREG_WIDE x0, w3
3249 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3250
3251 sub x0, xzr, x0
3252 GET_INST_OPCODE ip // extract opcode from wINST
3253 SET_VREG_WIDE x0, w4
3254 GOTO_OPCODE ip // jump to next instruction
3255 /* 10-11 instructions */
3256
3257
3258/* ------------------------------ */
3259 .balign 128
3260.L_op_not_long: /* 0x7e */
3261/* File: arm64/op_not_long.S */
3262/* File: arm64/unopWide.S */
3263 /*
3264 * Generic 64-bit unary operation. Provide an "instr" line that
3265 * specifies an instruction that performs "result = op x0".
3266 *
3267 * For: neg-long, not-long
3268 */
3269 /* unop vA, vB */
3270 lsr w3, wINST, #12 // w3<- B
3271 ubfx w4, wINST, #8, #4 // w4<- A
3272 GET_VREG_WIDE x0, w3
3273 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3274
3275 mvn x0, x0
3276 GET_INST_OPCODE ip // extract opcode from wINST
3277 SET_VREG_WIDE x0, w4
3278 GOTO_OPCODE ip // jump to next instruction
3279 /* 10-11 instructions */
3280
3281
3282/* ------------------------------ */
3283 .balign 128
3284.L_op_neg_float: /* 0x7f */
3285/* File: arm64/op_neg_float.S */
3286/* File: arm64/unop.S */
3287 /*
3288 * Generic 32-bit unary operation. Provide an "instr" line that
3289 * specifies an instruction that performs "result = op w0".
3290 * This could be an ARM instruction or a function call.
3291 *
3292 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3293 * int-to-byte, int-to-char, int-to-short
3294 */
3295 /* unop vA, vB */
3296 lsr w3, wINST, #12 // w3<- B
3297 GET_VREG w0, w3 // w0<- vB
3298 ubfx w9, wINST, #8, #4 // w9<- A
3299 mov w4, #0x80000000 // optional op; may set condition codes
3300 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3301 add w0, w0, w4 // w0<- op, w0-w3 changed
3302 GET_INST_OPCODE ip // extract opcode from rINST
3303 SET_VREG w0, w9 // vAA<- w0
3304 GOTO_OPCODE ip // jump to next instruction
3305 /* 8-9 instructions */
3306
3307
3308/* ------------------------------ */
3309 .balign 128
3310.L_op_neg_double: /* 0x80 */
3311/* File: arm64/op_neg_double.S */
3312/* File: arm64/unopWide.S */
3313 /*
3314 * Generic 64-bit unary operation. Provide an "instr" line that
3315 * specifies an instruction that performs "result = op x0".
3316 *
3317 * For: neg-long, not-long
3318 */
3319 /* unop vA, vB */
3320 lsr w3, wINST, #12 // w3<- B
3321 ubfx w4, wINST, #8, #4 // w4<- A
3322 GET_VREG_WIDE x0, w3
3323 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
3324 mov x1, #0x8000000000000000
3325 add x0, x0, x1
3326 GET_INST_OPCODE ip // extract opcode from wINST
3327 SET_VREG_WIDE x0, w4
3328 GOTO_OPCODE ip // jump to next instruction
3329 /* 10-11 instructions */
3330
3331
3332/* ------------------------------ */
3333 .balign 128
3334.L_op_int_to_long: /* 0x81 */
3335/* File: arm64/op_int_to_long.S */
3336/* File: arm64/funopWider.S */
3337 /*
3338 * Generic 32bit-to-64bit floating point unary operation. Provide an
3339 * "instr" line that specifies an instruction that performs "x0 = op w0".
3340 *
3341 * For: int-to-double, float-to-double, float-to-long
3342 */
3343 /* unop vA, vB */
3344 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003345 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003346 GET_VREG w0, w3
3347 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Markoe6220222016-07-20 14:25:30 +01003348 sxtw x0, w0 // d0<- op
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003349 GET_INST_OPCODE ip // extract opcode from wINST
3350 SET_VREG_WIDE x0, w4 // vA<- d0
3351 GOTO_OPCODE ip // jump to next instruction
3352
3353
3354/* ------------------------------ */
3355 .balign 128
3356.L_op_int_to_float: /* 0x82 */
3357/* File: arm64/op_int_to_float.S */
3358/* File: arm64/funopNarrow.S */
3359 /*
3360 * Generic 32bit-to-32bit floating point unary operation. Provide an
3361 * "instr" line that specifies an instruction that performs "s0 = op w0".
3362 *
3363 * For: int-to-float, float-to-int
3364 * TODO: refactor all of the conversions - parameterize width and use same template.
3365 */
3366 /* unop vA, vB */
3367 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003368 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003369 GET_VREG w0, w3
3370 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003371 scvtf s0, w0 // d0<- op
3372 GET_INST_OPCODE ip // extract opcode from wINST
3373 SET_VREG s0, w4 // vA<- d0
3374 GOTO_OPCODE ip // jump to next instruction
3375
3376
3377/* ------------------------------ */
3378 .balign 128
3379.L_op_int_to_double: /* 0x83 */
3380/* File: arm64/op_int_to_double.S */
3381/* File: arm64/funopWider.S */
3382 /*
3383 * Generic 32bit-to-64bit floating point unary operation. Provide an
3384 * "instr" line that specifies an instruction that performs "d0 = op w0".
3385 *
3386 * For: int-to-double, float-to-double, float-to-long
3387 */
3388 /* unop vA, vB */
3389 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003390 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003391 GET_VREG w0, w3
3392 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003393 scvtf d0, w0 // d0<- op
3394 GET_INST_OPCODE ip // extract opcode from wINST
3395 SET_VREG_WIDE d0, w4 // vA<- d0
3396 GOTO_OPCODE ip // jump to next instruction
3397
3398
3399/* ------------------------------ */
3400 .balign 128
3401.L_op_long_to_int: /* 0x84 */
3402/* File: arm64/op_long_to_int.S */
3403/* File: arm64/funopNarrower.S */
3404 /*
3405 * Generic 64bit-to-32bit floating point unary operation. Provide an
3406 * "instr" line that specifies an instruction that performs "w0 = op x0".
3407 *
3408 * For: int-to-double, float-to-double, float-to-long
3409 */
3410 /* unop vA, vB */
3411 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003412 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003413 GET_VREG_WIDE x0, w3
3414 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003415 // d0<- op
3416 GET_INST_OPCODE ip // extract opcode from wINST
3417 SET_VREG w0, w4 // vA<- d0
3418 GOTO_OPCODE ip // jump to next instruction
3419
3420
3421/* ------------------------------ */
3422 .balign 128
3423.L_op_long_to_float: /* 0x85 */
3424/* File: arm64/op_long_to_float.S */
3425/* File: arm64/funopNarrower.S */
3426 /*
3427 * Generic 64bit-to-32bit floating point unary operation. Provide an
3428 * "instr" line that specifies an instruction that performs "s0 = op x0".
3429 *
3430 * For: int-to-double, float-to-double, float-to-long
3431 */
3432 /* unop vA, vB */
3433 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003434 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003435 GET_VREG_WIDE x0, w3
3436 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003437 scvtf s0, x0 // d0<- op
3438 GET_INST_OPCODE ip // extract opcode from wINST
3439 SET_VREG s0, w4 // vA<- d0
3440 GOTO_OPCODE ip // jump to next instruction
3441
3442
3443/* ------------------------------ */
3444 .balign 128
3445.L_op_long_to_double: /* 0x86 */
3446/* File: arm64/op_long_to_double.S */
3447/* File: arm64/funopWide.S */
3448 /*
3449 * Generic 64bit-to-64bit floating point unary operation. Provide an
3450 * "instr" line that specifies an instruction that performs "d0 = op x0".
3451 *
3452 * For: long-to-double, double-to-long
3453 */
3454 /* unop vA, vB */
3455 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003456 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003457 GET_VREG_WIDE x0, w3
3458 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003459 scvtf d0, x0 // d0<- op
3460 GET_INST_OPCODE ip // extract opcode from wINST
3461 SET_VREG_WIDE d0, w4 // vA<- d0
3462 GOTO_OPCODE ip // jump to next instruction
3463
3464
3465/* ------------------------------ */
3466 .balign 128
3467.L_op_float_to_int: /* 0x87 */
3468/* File: arm64/op_float_to_int.S */
3469/* File: arm64/funopNarrow.S */
3470 /*
3471 * Generic 32bit-to-32bit floating point unary operation. Provide an
3472 * "instr" line that specifies an instruction that performs "w0 = op s0".
3473 *
3474 * For: int-to-float, float-to-int
3475 * TODO: refactor all of the conversions - parameterize width and use same template.
3476 */
3477 /* unop vA, vB */
3478 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003479 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003480 GET_VREG s0, w3
3481 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003482 fcvtzs w0, s0 // d0<- op
3483 GET_INST_OPCODE ip // extract opcode from wINST
3484 SET_VREG w0, w4 // vA<- d0
3485 GOTO_OPCODE ip // jump to next instruction
3486
3487
3488/* ------------------------------ */
3489 .balign 128
3490.L_op_float_to_long: /* 0x88 */
3491/* File: arm64/op_float_to_long.S */
3492/* File: arm64/funopWider.S */
3493 /*
3494 * Generic 32bit-to-64bit floating point unary operation. Provide an
3495 * "instr" line that specifies an instruction that performs "x0 = op s0".
3496 *
3497 * For: int-to-double, float-to-double, float-to-long
3498 */
3499 /* unop vA, vB */
3500 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003501 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003502 GET_VREG s0, w3
3503 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003504 fcvtzs x0, s0 // d0<- op
3505 GET_INST_OPCODE ip // extract opcode from wINST
3506 SET_VREG_WIDE x0, w4 // vA<- d0
3507 GOTO_OPCODE ip // jump to next instruction
3508
3509
3510/* ------------------------------ */
3511 .balign 128
3512.L_op_float_to_double: /* 0x89 */
3513/* File: arm64/op_float_to_double.S */
3514/* File: arm64/funopWider.S */
3515 /*
3516 * Generic 32bit-to-64bit floating point unary operation. Provide an
3517 * "instr" line that specifies an instruction that performs "d0 = op s0".
3518 *
3519 * For: int-to-double, float-to-double, float-to-long
3520 */
3521 /* unop vA, vB */
3522 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003523 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003524 GET_VREG s0, w3
3525 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003526 fcvt d0, s0 // d0<- op
3527 GET_INST_OPCODE ip // extract opcode from wINST
3528 SET_VREG_WIDE d0, w4 // vA<- d0
3529 GOTO_OPCODE ip // jump to next instruction
3530
3531
3532/* ------------------------------ */
3533 .balign 128
3534.L_op_double_to_int: /* 0x8a */
3535/* File: arm64/op_double_to_int.S */
3536/* File: arm64/funopNarrower.S */
3537 /*
3538 * Generic 64bit-to-32bit floating point unary operation. Provide an
3539 * "instr" line that specifies an instruction that performs "w0 = op d0".
3540 *
3541 * For: int-to-double, float-to-double, float-to-long
3542 */
3543 /* unop vA, vB */
3544 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003545 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003546 GET_VREG_WIDE d0, w3
3547 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003548 fcvtzs w0, d0 // d0<- op
3549 GET_INST_OPCODE ip // extract opcode from wINST
3550 SET_VREG w0, w4 // vA<- d0
3551 GOTO_OPCODE ip // jump to next instruction
3552
3553
3554/* ------------------------------ */
3555 .balign 128
3556.L_op_double_to_long: /* 0x8b */
3557/* File: arm64/op_double_to_long.S */
3558/* File: arm64/funopWide.S */
3559 /*
3560 * Generic 64bit-to-64bit floating point unary operation. Provide an
3561 * "instr" line that specifies an instruction that performs "x0 = op d0".
3562 *
3563 * For: long-to-double, double-to-long
3564 */
3565 /* unop vA, vB */
3566 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003567 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003568 GET_VREG_WIDE d0, w3
3569 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003570 fcvtzs x0, d0 // d0<- op
3571 GET_INST_OPCODE ip // extract opcode from wINST
3572 SET_VREG_WIDE x0, w4 // vA<- d0
3573 GOTO_OPCODE ip // jump to next instruction
3574
3575
3576/* ------------------------------ */
3577 .balign 128
3578.L_op_double_to_float: /* 0x8c */
3579/* File: arm64/op_double_to_float.S */
3580/* File: arm64/funopNarrower.S */
3581 /*
3582 * Generic 64bit-to-32bit floating point unary operation. Provide an
3583 * "instr" line that specifies an instruction that performs "s0 = op d0".
3584 *
3585 * For: int-to-double, float-to-double, float-to-long
3586 */
3587 /* unop vA, vB */
3588 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003589 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003590 GET_VREG_WIDE d0, w3
3591 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003592 fcvt s0, d0 // d0<- op
3593 GET_INST_OPCODE ip // extract opcode from wINST
3594 SET_VREG s0, w4 // vA<- d0
3595 GOTO_OPCODE ip // jump to next instruction
3596
3597
3598/* ------------------------------ */
3599 .balign 128
3600.L_op_int_to_byte: /* 0x8d */
3601/* File: arm64/op_int_to_byte.S */
3602/* File: arm64/unop.S */
3603 /*
3604 * Generic 32-bit unary operation. Provide an "instr" line that
3605 * specifies an instruction that performs "result = op w0".
3606 * This could be an ARM instruction or a function call.
3607 *
3608 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3609 * int-to-byte, int-to-char, int-to-short
3610 */
3611 /* unop vA, vB */
3612 lsr w3, wINST, #12 // w3<- B
3613 GET_VREG w0, w3 // w0<- vB
3614 ubfx w9, wINST, #8, #4 // w9<- A
3615 // optional op; may set condition codes
3616 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3617 sxtb w0, w0 // w0<- op, w0-w3 changed
3618 GET_INST_OPCODE ip // extract opcode from rINST
3619 SET_VREG w0, w9 // vAA<- w0
3620 GOTO_OPCODE ip // jump to next instruction
3621 /* 8-9 instructions */
3622
3623
3624/* ------------------------------ */
3625 .balign 128
3626.L_op_int_to_char: /* 0x8e */
3627/* File: arm64/op_int_to_char.S */
3628/* File: arm64/unop.S */
3629 /*
3630 * Generic 32-bit unary operation. Provide an "instr" line that
3631 * specifies an instruction that performs "result = op w0".
3632 * This could be an ARM instruction or a function call.
3633 *
3634 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3635 * int-to-byte, int-to-char, int-to-short
3636 */
3637 /* unop vA, vB */
3638 lsr w3, wINST, #12 // w3<- B
3639 GET_VREG w0, w3 // w0<- vB
3640 ubfx w9, wINST, #8, #4 // w9<- A
3641 // optional op; may set condition codes
3642 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3643 uxth w0, w0 // w0<- op, w0-w3 changed
3644 GET_INST_OPCODE ip // extract opcode from rINST
3645 SET_VREG w0, w9 // vAA<- w0
3646 GOTO_OPCODE ip // jump to next instruction
3647 /* 8-9 instructions */
3648
3649
3650/* ------------------------------ */
3651 .balign 128
3652.L_op_int_to_short: /* 0x8f */
3653/* File: arm64/op_int_to_short.S */
3654/* File: arm64/unop.S */
3655 /*
3656 * Generic 32-bit unary operation. Provide an "instr" line that
3657 * specifies an instruction that performs "result = op w0".
3658 * This could be an ARM instruction or a function call.
3659 *
3660 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3661 * int-to-byte, int-to-char, int-to-short
3662 */
3663 /* unop vA, vB */
3664 lsr w3, wINST, #12 // w3<- B
3665 GET_VREG w0, w3 // w0<- vB
3666 ubfx w9, wINST, #8, #4 // w9<- A
3667 // optional op; may set condition codes
3668 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3669 sxth w0, w0 // w0<- op, w0-w3 changed
3670 GET_INST_OPCODE ip // extract opcode from rINST
3671 SET_VREG w0, w9 // vAA<- w0
3672 GOTO_OPCODE ip // jump to next instruction
3673 /* 8-9 instructions */
3674
3675
3676/* ------------------------------ */
3677 .balign 128
3678.L_op_add_int: /* 0x90 */
3679/* File: arm64/op_add_int.S */
3680/* File: arm64/binop.S */
3681 /*
3682 * Generic 32-bit binary operation. Provide an "instr" line that
3683 * specifies an instruction that performs "result = w0 op w1".
3684 * This could be an ARM instruction or a function call. (If the result
3685 * comes back in a register other than w0, you can override "result".)
3686 *
3687 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3688 * vCC (w1). Useful for integer division and modulus. Note that we
3689 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3690 * handles it correctly.
3691 *
3692 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3693 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3694 * mul-float, div-float, rem-float
3695 */
3696 /* binop vAA, vBB, vCC */
3697 FETCH w0, 1 // w0<- CCBB
3698 lsr w9, wINST, #8 // w9<- AA
3699 lsr w3, w0, #8 // w3<- CC
3700 and w2, w0, #255 // w2<- BB
3701 GET_VREG w1, w3 // w1<- vCC
3702 GET_VREG w0, w2 // w0<- vBB
3703 .if 0
3704 cbz w1, common_errDivideByZero // is second operand zero?
3705 .endif
3706 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3707 // optional op; may set condition codes
3708 add w0, w0, w1 // w0<- op, w0-w3 changed
3709 GET_INST_OPCODE ip // extract opcode from rINST
3710 SET_VREG w0, w9 // vAA<- w0
3711 GOTO_OPCODE ip // jump to next instruction
3712 /* 11-14 instructions */
3713
3714
3715/* ------------------------------ */
3716 .balign 128
3717.L_op_sub_int: /* 0x91 */
3718/* File: arm64/op_sub_int.S */
3719/* File: arm64/binop.S */
3720 /*
3721 * Generic 32-bit binary operation. Provide an "instr" line that
3722 * specifies an instruction that performs "result = w0 op w1".
3723 * This could be an ARM instruction or a function call. (If the result
3724 * comes back in a register other than w0, you can override "result".)
3725 *
3726 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3727 * vCC (w1). Useful for integer division and modulus. Note that we
3728 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3729 * handles it correctly.
3730 *
3731 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3732 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3733 * mul-float, div-float, rem-float
3734 */
3735 /* binop vAA, vBB, vCC */
3736 FETCH w0, 1 // w0<- CCBB
3737 lsr w9, wINST, #8 // w9<- AA
3738 lsr w3, w0, #8 // w3<- CC
3739 and w2, w0, #255 // w2<- BB
3740 GET_VREG w1, w3 // w1<- vCC
3741 GET_VREG w0, w2 // w0<- vBB
3742 .if 0
3743 cbz w1, common_errDivideByZero // is second operand zero?
3744 .endif
3745 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3746 // optional op; may set condition codes
3747 sub w0, w0, w1 // w0<- op, w0-w3 changed
3748 GET_INST_OPCODE ip // extract opcode from rINST
3749 SET_VREG w0, w9 // vAA<- w0
3750 GOTO_OPCODE ip // jump to next instruction
3751 /* 11-14 instructions */
3752
3753
3754/* ------------------------------ */
3755 .balign 128
3756.L_op_mul_int: /* 0x92 */
3757/* File: arm64/op_mul_int.S */
3758/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
3759/* File: arm64/binop.S */
3760 /*
3761 * Generic 32-bit binary operation. Provide an "instr" line that
3762 * specifies an instruction that performs "result = w0 op w1".
3763 * This could be an ARM instruction or a function call. (If the result
3764 * comes back in a register other than w0, you can override "result".)
3765 *
3766 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3767 * vCC (w1). Useful for integer division and modulus. Note that we
3768 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3769 * handles it correctly.
3770 *
3771 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3772 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3773 * mul-float, div-float, rem-float
3774 */
3775 /* binop vAA, vBB, vCC */
3776 FETCH w0, 1 // w0<- CCBB
3777 lsr w9, wINST, #8 // w9<- AA
3778 lsr w3, w0, #8 // w3<- CC
3779 and w2, w0, #255 // w2<- BB
3780 GET_VREG w1, w3 // w1<- vCC
3781 GET_VREG w0, w2 // w0<- vBB
3782 .if 0
3783 cbz w1, common_errDivideByZero // is second operand zero?
3784 .endif
3785 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3786 // optional op; may set condition codes
3787 mul w0, w1, w0 // w0<- op, w0-w3 changed
3788 GET_INST_OPCODE ip // extract opcode from rINST
3789 SET_VREG w0, w9 // vAA<- w0
3790 GOTO_OPCODE ip // jump to next instruction
3791 /* 11-14 instructions */
3792
3793
3794/* ------------------------------ */
3795 .balign 128
3796.L_op_div_int: /* 0x93 */
3797/* File: arm64/op_div_int.S */
3798/* File: arm64/binop.S */
3799 /*
3800 * Generic 32-bit binary operation. Provide an "instr" line that
3801 * specifies an instruction that performs "result = w0 op w1".
3802 * This could be an ARM instruction or a function call. (If the result
3803 * comes back in a register other than w0, you can override "result".)
3804 *
3805 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3806 * vCC (w1). Useful for integer division and modulus. Note that we
3807 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3808 * handles it correctly.
3809 *
3810 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3811 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3812 * mul-float, div-float, rem-float
3813 */
3814 /* binop vAA, vBB, vCC */
3815 FETCH w0, 1 // w0<- CCBB
3816 lsr w9, wINST, #8 // w9<- AA
3817 lsr w3, w0, #8 // w3<- CC
3818 and w2, w0, #255 // w2<- BB
3819 GET_VREG w1, w3 // w1<- vCC
3820 GET_VREG w0, w2 // w0<- vBB
3821 .if 1
3822 cbz w1, common_errDivideByZero // is second operand zero?
3823 .endif
3824 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3825 // optional op; may set condition codes
3826 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
3827 GET_INST_OPCODE ip // extract opcode from rINST
3828 SET_VREG w0, w9 // vAA<- w0
3829 GOTO_OPCODE ip // jump to next instruction
3830 /* 11-14 instructions */
3831
3832
3833/* ------------------------------ */
3834 .balign 128
3835.L_op_rem_int: /* 0x94 */
3836/* File: arm64/op_rem_int.S */
3837/* File: arm64/binop.S */
3838 /*
3839 * Generic 32-bit binary operation. Provide an "instr" line that
3840 * specifies an instruction that performs "result = w0 op w1".
3841 * This could be an ARM instruction or a function call. (If the result
3842 * comes back in a register other than w0, you can override "result".)
3843 *
3844 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3845 * vCC (w1). Useful for integer division and modulus. Note that we
3846 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3847 * handles it correctly.
3848 *
3849 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3850 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3851 * mul-float, div-float, rem-float
3852 */
3853 /* binop vAA, vBB, vCC */
3854 FETCH w0, 1 // w0<- CCBB
3855 lsr w9, wINST, #8 // w9<- AA
3856 lsr w3, w0, #8 // w3<- CC
3857 and w2, w0, #255 // w2<- BB
3858 GET_VREG w1, w3 // w1<- vCC
3859 GET_VREG w0, w2 // w0<- vBB
3860 .if 1
3861 cbz w1, common_errDivideByZero // is second operand zero?
3862 .endif
3863 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3864 sdiv w2, w0, w1 // optional op; may set condition codes
3865 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
3866 GET_INST_OPCODE ip // extract opcode from rINST
3867 SET_VREG w0, w9 // vAA<- w0
3868 GOTO_OPCODE ip // jump to next instruction
3869 /* 11-14 instructions */
3870
3871
3872/* ------------------------------ */
3873 .balign 128
3874.L_op_and_int: /* 0x95 */
3875/* File: arm64/op_and_int.S */
3876/* File: arm64/binop.S */
3877 /*
3878 * Generic 32-bit binary operation. Provide an "instr" line that
3879 * specifies an instruction that performs "result = w0 op w1".
3880 * This could be an ARM instruction or a function call. (If the result
3881 * comes back in a register other than w0, you can override "result".)
3882 *
3883 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3884 * vCC (w1). Useful for integer division and modulus. Note that we
3885 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3886 * handles it correctly.
3887 *
3888 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3889 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3890 * mul-float, div-float, rem-float
3891 */
3892 /* binop vAA, vBB, vCC */
3893 FETCH w0, 1 // w0<- CCBB
3894 lsr w9, wINST, #8 // w9<- AA
3895 lsr w3, w0, #8 // w3<- CC
3896 and w2, w0, #255 // w2<- BB
3897 GET_VREG w1, w3 // w1<- vCC
3898 GET_VREG w0, w2 // w0<- vBB
3899 .if 0
3900 cbz w1, common_errDivideByZero // is second operand zero?
3901 .endif
3902 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3903 // optional op; may set condition codes
3904 and w0, w0, w1 // w0<- op, w0-w3 changed
3905 GET_INST_OPCODE ip // extract opcode from rINST
3906 SET_VREG w0, w9 // vAA<- w0
3907 GOTO_OPCODE ip // jump to next instruction
3908 /* 11-14 instructions */
3909
3910
3911/* ------------------------------ */
3912 .balign 128
3913.L_op_or_int: /* 0x96 */
3914/* File: arm64/op_or_int.S */
3915/* File: arm64/binop.S */
3916 /*
3917 * Generic 32-bit binary operation. Provide an "instr" line that
3918 * specifies an instruction that performs "result = w0 op w1".
3919 * This could be an ARM instruction or a function call. (If the result
3920 * comes back in a register other than w0, you can override "result".)
3921 *
3922 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3923 * vCC (w1). Useful for integer division and modulus. Note that we
3924 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3925 * handles it correctly.
3926 *
3927 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3928 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3929 * mul-float, div-float, rem-float
3930 */
3931 /* binop vAA, vBB, vCC */
3932 FETCH w0, 1 // w0<- CCBB
3933 lsr w9, wINST, #8 // w9<- AA
3934 lsr w3, w0, #8 // w3<- CC
3935 and w2, w0, #255 // w2<- BB
3936 GET_VREG w1, w3 // w1<- vCC
3937 GET_VREG w0, w2 // w0<- vBB
3938 .if 0
3939 cbz w1, common_errDivideByZero // is second operand zero?
3940 .endif
3941 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3942 // optional op; may set condition codes
3943 orr w0, w0, w1 // w0<- op, w0-w3 changed
3944 GET_INST_OPCODE ip // extract opcode from rINST
3945 SET_VREG w0, w9 // vAA<- w0
3946 GOTO_OPCODE ip // jump to next instruction
3947 /* 11-14 instructions */
3948
3949
3950/* ------------------------------ */
3951 .balign 128
3952.L_op_xor_int: /* 0x97 */
3953/* File: arm64/op_xor_int.S */
3954/* File: arm64/binop.S */
3955 /*
3956 * Generic 32-bit binary operation. Provide an "instr" line that
3957 * specifies an instruction that performs "result = w0 op w1".
3958 * This could be an ARM instruction or a function call. (If the result
3959 * comes back in a register other than w0, you can override "result".)
3960 *
3961 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3962 * vCC (w1). Useful for integer division and modulus. Note that we
3963 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3964 * handles it correctly.
3965 *
3966 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3967 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3968 * mul-float, div-float, rem-float
3969 */
3970 /* binop vAA, vBB, vCC */
3971 FETCH w0, 1 // w0<- CCBB
3972 lsr w9, wINST, #8 // w9<- AA
3973 lsr w3, w0, #8 // w3<- CC
3974 and w2, w0, #255 // w2<- BB
3975 GET_VREG w1, w3 // w1<- vCC
3976 GET_VREG w0, w2 // w0<- vBB
3977 .if 0
3978 cbz w1, common_errDivideByZero // is second operand zero?
3979 .endif
3980 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3981 // optional op; may set condition codes
3982 eor w0, w0, w1 // w0<- op, w0-w3 changed
3983 GET_INST_OPCODE ip // extract opcode from rINST
3984 SET_VREG w0, w9 // vAA<- w0
3985 GOTO_OPCODE ip // jump to next instruction
3986 /* 11-14 instructions */
3987
3988
3989/* ------------------------------ */
3990 .balign 128
3991.L_op_shl_int: /* 0x98 */
3992/* File: arm64/op_shl_int.S */
3993/* File: arm64/binop.S */
3994 /*
3995 * Generic 32-bit binary operation. Provide an "instr" line that
3996 * specifies an instruction that performs "result = w0 op w1".
3997 * This could be an ARM instruction or a function call. (If the result
3998 * comes back in a register other than w0, you can override "result".)
3999 *
4000 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4001 * vCC (w1). Useful for integer division and modulus. Note that we
4002 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4003 * handles it correctly.
4004 *
4005 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4006 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4007 * mul-float, div-float, rem-float
4008 */
4009 /* binop vAA, vBB, vCC */
4010 FETCH w0, 1 // w0<- CCBB
4011 lsr w9, wINST, #8 // w9<- AA
4012 lsr w3, w0, #8 // w3<- CC
4013 and w2, w0, #255 // w2<- BB
4014 GET_VREG w1, w3 // w1<- vCC
4015 GET_VREG w0, w2 // w0<- vBB
4016 .if 0
4017 cbz w1, common_errDivideByZero // is second operand zero?
4018 .endif
4019 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004020 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004021 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4022 GET_INST_OPCODE ip // extract opcode from rINST
4023 SET_VREG w0, w9 // vAA<- w0
4024 GOTO_OPCODE ip // jump to next instruction
4025 /* 11-14 instructions */
4026
4027
4028/* ------------------------------ */
4029 .balign 128
4030.L_op_shr_int: /* 0x99 */
4031/* File: arm64/op_shr_int.S */
4032/* File: arm64/binop.S */
4033 /*
4034 * Generic 32-bit binary operation. Provide an "instr" line that
4035 * specifies an instruction that performs "result = w0 op w1".
4036 * This could be an ARM instruction or a function call. (If the result
4037 * comes back in a register other than w0, you can override "result".)
4038 *
4039 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4040 * vCC (w1). Useful for integer division and modulus. Note that we
4041 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4042 * handles it correctly.
4043 *
4044 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4045 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4046 * mul-float, div-float, rem-float
4047 */
4048 /* binop vAA, vBB, vCC */
4049 FETCH w0, 1 // w0<- CCBB
4050 lsr w9, wINST, #8 // w9<- AA
4051 lsr w3, w0, #8 // w3<- CC
4052 and w2, w0, #255 // w2<- BB
4053 GET_VREG w1, w3 // w1<- vCC
4054 GET_VREG w0, w2 // w0<- vBB
4055 .if 0
4056 cbz w1, common_errDivideByZero // is second operand zero?
4057 .endif
4058 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004059 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004060 asr w0, w0, w1 // w0<- op, w0-w3 changed
4061 GET_INST_OPCODE ip // extract opcode from rINST
4062 SET_VREG w0, w9 // vAA<- w0
4063 GOTO_OPCODE ip // jump to next instruction
4064 /* 11-14 instructions */
4065
4066
4067/* ------------------------------ */
4068 .balign 128
4069.L_op_ushr_int: /* 0x9a */
4070/* File: arm64/op_ushr_int.S */
4071/* File: arm64/binop.S */
4072 /*
4073 * Generic 32-bit binary operation. Provide an "instr" line that
4074 * specifies an instruction that performs "result = w0 op w1".
4075 * This could be an ARM instruction or a function call. (If the result
4076 * comes back in a register other than w0, you can override "result".)
4077 *
4078 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4079 * vCC (w1). Useful for integer division and modulus. Note that we
4080 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4081 * handles it correctly.
4082 *
4083 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4084 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4085 * mul-float, div-float, rem-float
4086 */
4087 /* binop vAA, vBB, vCC */
4088 FETCH w0, 1 // w0<- CCBB
4089 lsr w9, wINST, #8 // w9<- AA
4090 lsr w3, w0, #8 // w3<- CC
4091 and w2, w0, #255 // w2<- BB
4092 GET_VREG w1, w3 // w1<- vCC
4093 GET_VREG w0, w2 // w0<- vBB
4094 .if 0
4095 cbz w1, common_errDivideByZero // is second operand zero?
4096 .endif
4097 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004098 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004099 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4100 GET_INST_OPCODE ip // extract opcode from rINST
4101 SET_VREG w0, w9 // vAA<- w0
4102 GOTO_OPCODE ip // jump to next instruction
4103 /* 11-14 instructions */
4104
4105
4106/* ------------------------------ */
4107 .balign 128
4108.L_op_add_long: /* 0x9b */
4109/* File: arm64/op_add_long.S */
4110/* File: arm64/binopWide.S */
4111 /*
4112 * Generic 64-bit binary operation. Provide an "instr" line that
4113 * specifies an instruction that performs "result = x1 op x2".
4114 * This could be an ARM instruction or a function call. (If the result
4115 * comes back in a register other than x0, you can override "result".)
4116 *
4117 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4118 * vCC (w1). Useful for integer division and modulus.
4119 *
4120 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4121 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4122 */
4123 /* binop vAA, vBB, vCC */
4124 FETCH w0, 1 // w0<- CCBB
4125 lsr w4, wINST, #8 // w4<- AA
4126 lsr w2, w0, #8 // w2<- CC
4127 and w1, w0, #255 // w1<- BB
4128 GET_VREG_WIDE x2, w2 // w2<- vCC
4129 GET_VREG_WIDE x1, w1 // w1<- vBB
4130 .if 0
4131 cbz x2, common_errDivideByZero // is second operand zero?
4132 .endif
4133 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4134
4135 add x0, x1, x2 // x0<- op, w0-w4 changed
4136 GET_INST_OPCODE ip // extract opcode from rINST
4137 SET_VREG_WIDE x0, w4 // vAA<- x0
4138 GOTO_OPCODE ip // jump to next instruction
4139 /* 11-14 instructions */
4140
4141
4142/* ------------------------------ */
4143 .balign 128
4144.L_op_sub_long: /* 0x9c */
4145/* File: arm64/op_sub_long.S */
4146/* File: arm64/binopWide.S */
4147 /*
4148 * Generic 64-bit binary operation. Provide an "instr" line that
4149 * specifies an instruction that performs "result = x1 op x2".
4150 * This could be an ARM instruction or a function call. (If the result
4151 * comes back in a register other than x0, you can override "result".)
4152 *
4153 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4154 * vCC (w1). Useful for integer division and modulus.
4155 *
4156 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4157 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4158 */
4159 /* binop vAA, vBB, vCC */
4160 FETCH w0, 1 // w0<- CCBB
4161 lsr w4, wINST, #8 // w4<- AA
4162 lsr w2, w0, #8 // w2<- CC
4163 and w1, w0, #255 // w1<- BB
4164 GET_VREG_WIDE x2, w2 // w2<- vCC
4165 GET_VREG_WIDE x1, w1 // w1<- vBB
4166 .if 0
4167 cbz x2, common_errDivideByZero // is second operand zero?
4168 .endif
4169 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4170
4171 sub x0, x1, x2 // x0<- op, w0-w4 changed
4172 GET_INST_OPCODE ip // extract opcode from rINST
4173 SET_VREG_WIDE x0, w4 // vAA<- x0
4174 GOTO_OPCODE ip // jump to next instruction
4175 /* 11-14 instructions */
4176
4177
4178/* ------------------------------ */
4179 .balign 128
4180.L_op_mul_long: /* 0x9d */
4181/* File: arm64/op_mul_long.S */
4182/* File: arm64/binopWide.S */
4183 /*
4184 * Generic 64-bit binary operation. Provide an "instr" line that
4185 * specifies an instruction that performs "result = x1 op x2".
4186 * This could be an ARM instruction or a function call. (If the result
4187 * comes back in a register other than x0, you can override "result".)
4188 *
4189 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4190 * vCC (w1). Useful for integer division and modulus.
4191 *
4192 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4193 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4194 */
4195 /* binop vAA, vBB, vCC */
4196 FETCH w0, 1 // w0<- CCBB
4197 lsr w4, wINST, #8 // w4<- AA
4198 lsr w2, w0, #8 // w2<- CC
4199 and w1, w0, #255 // w1<- BB
4200 GET_VREG_WIDE x2, w2 // w2<- vCC
4201 GET_VREG_WIDE x1, w1 // w1<- vBB
4202 .if 0
4203 cbz x2, common_errDivideByZero // is second operand zero?
4204 .endif
4205 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4206
4207 mul x0, x1, x2 // x0<- op, w0-w4 changed
4208 GET_INST_OPCODE ip // extract opcode from rINST
4209 SET_VREG_WIDE x0, w4 // vAA<- x0
4210 GOTO_OPCODE ip // jump to next instruction
4211 /* 11-14 instructions */
4212
4213
4214/* ------------------------------ */
4215 .balign 128
4216.L_op_div_long: /* 0x9e */
4217/* File: arm64/op_div_long.S */
4218/* File: arm64/binopWide.S */
4219 /*
4220 * Generic 64-bit binary operation. Provide an "instr" line that
4221 * specifies an instruction that performs "result = x1 op x2".
4222 * This could be an ARM instruction or a function call. (If the result
4223 * comes back in a register other than x0, you can override "result".)
4224 *
4225 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4226 * vCC (w1). Useful for integer division and modulus.
4227 *
4228 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4229 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4230 */
4231 /* binop vAA, vBB, vCC */
4232 FETCH w0, 1 // w0<- CCBB
4233 lsr w4, wINST, #8 // w4<- AA
4234 lsr w2, w0, #8 // w2<- CC
4235 and w1, w0, #255 // w1<- BB
4236 GET_VREG_WIDE x2, w2 // w2<- vCC
4237 GET_VREG_WIDE x1, w1 // w1<- vBB
4238 .if 1
4239 cbz x2, common_errDivideByZero // is second operand zero?
4240 .endif
4241 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4242
4243 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4244 GET_INST_OPCODE ip // extract opcode from rINST
4245 SET_VREG_WIDE x0, w4 // vAA<- x0
4246 GOTO_OPCODE ip // jump to next instruction
4247 /* 11-14 instructions */
4248
4249
4250/* ------------------------------ */
4251 .balign 128
4252.L_op_rem_long: /* 0x9f */
4253/* File: arm64/op_rem_long.S */
4254/* File: arm64/binopWide.S */
4255 /*
4256 * Generic 64-bit binary operation. Provide an "instr" line that
4257 * specifies an instruction that performs "result = x1 op x2".
4258 * This could be an ARM instruction or a function call. (If the result
4259 * comes back in a register other than x0, you can override "result".)
4260 *
4261 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4262 * vCC (w1). Useful for integer division and modulus.
4263 *
4264 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4265 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4266 */
4267 /* binop vAA, vBB, vCC */
4268 FETCH w0, 1 // w0<- CCBB
4269 lsr w4, wINST, #8 // w4<- AA
4270 lsr w2, w0, #8 // w2<- CC
4271 and w1, w0, #255 // w1<- BB
4272 GET_VREG_WIDE x2, w2 // w2<- vCC
4273 GET_VREG_WIDE x1, w1 // w1<- vBB
4274 .if 1
4275 cbz x2, common_errDivideByZero // is second operand zero?
4276 .endif
4277 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4278 sdiv x3, x1, x2
4279 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4280 GET_INST_OPCODE ip // extract opcode from rINST
4281 SET_VREG_WIDE x0, w4 // vAA<- x0
4282 GOTO_OPCODE ip // jump to next instruction
4283 /* 11-14 instructions */
4284
4285
4286/* ------------------------------ */
4287 .balign 128
4288.L_op_and_long: /* 0xa0 */
4289/* File: arm64/op_and_long.S */
4290/* File: arm64/binopWide.S */
4291 /*
4292 * Generic 64-bit binary operation. Provide an "instr" line that
4293 * specifies an instruction that performs "result = x1 op x2".
4294 * This could be an ARM instruction or a function call. (If the result
4295 * comes back in a register other than x0, you can override "result".)
4296 *
4297 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4298 * vCC (w1). Useful for integer division and modulus.
4299 *
4300 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4301 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4302 */
4303 /* binop vAA, vBB, vCC */
4304 FETCH w0, 1 // w0<- CCBB
4305 lsr w4, wINST, #8 // w4<- AA
4306 lsr w2, w0, #8 // w2<- CC
4307 and w1, w0, #255 // w1<- BB
4308 GET_VREG_WIDE x2, w2 // w2<- vCC
4309 GET_VREG_WIDE x1, w1 // w1<- vBB
4310 .if 0
4311 cbz x2, common_errDivideByZero // is second operand zero?
4312 .endif
4313 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4314
4315 and x0, x1, x2 // x0<- op, w0-w4 changed
4316 GET_INST_OPCODE ip // extract opcode from rINST
4317 SET_VREG_WIDE x0, w4 // vAA<- x0
4318 GOTO_OPCODE ip // jump to next instruction
4319 /* 11-14 instructions */
4320
4321
4322/* ------------------------------ */
4323 .balign 128
4324.L_op_or_long: /* 0xa1 */
4325/* File: arm64/op_or_long.S */
4326/* File: arm64/binopWide.S */
4327 /*
4328 * Generic 64-bit binary operation. Provide an "instr" line that
4329 * specifies an instruction that performs "result = x1 op x2".
4330 * This could be an ARM instruction or a function call. (If the result
4331 * comes back in a register other than x0, you can override "result".)
4332 *
4333 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4334 * vCC (w1). Useful for integer division and modulus.
4335 *
4336 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4337 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4338 */
4339 /* binop vAA, vBB, vCC */
4340 FETCH w0, 1 // w0<- CCBB
4341 lsr w4, wINST, #8 // w4<- AA
4342 lsr w2, w0, #8 // w2<- CC
4343 and w1, w0, #255 // w1<- BB
4344 GET_VREG_WIDE x2, w2 // w2<- vCC
4345 GET_VREG_WIDE x1, w1 // w1<- vBB
4346 .if 0
4347 cbz x2, common_errDivideByZero // is second operand zero?
4348 .endif
4349 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4350
4351 orr x0, x1, x2 // x0<- op, w0-w4 changed
4352 GET_INST_OPCODE ip // extract opcode from rINST
4353 SET_VREG_WIDE x0, w4 // vAA<- x0
4354 GOTO_OPCODE ip // jump to next instruction
4355 /* 11-14 instructions */
4356
4357
4358/* ------------------------------ */
4359 .balign 128
4360.L_op_xor_long: /* 0xa2 */
4361/* File: arm64/op_xor_long.S */
4362/* File: arm64/binopWide.S */
4363 /*
4364 * Generic 64-bit binary operation. Provide an "instr" line that
4365 * specifies an instruction that performs "result = x1 op x2".
4366 * This could be an ARM instruction or a function call. (If the result
4367 * comes back in a register other than x0, you can override "result".)
4368 *
4369 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4370 * vCC (w1). Useful for integer division and modulus.
4371 *
4372 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4373 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4374 */
4375 /* binop vAA, vBB, vCC */
4376 FETCH w0, 1 // w0<- CCBB
4377 lsr w4, wINST, #8 // w4<- AA
4378 lsr w2, w0, #8 // w2<- CC
4379 and w1, w0, #255 // w1<- BB
4380 GET_VREG_WIDE x2, w2 // w2<- vCC
4381 GET_VREG_WIDE x1, w1 // w1<- vBB
4382 .if 0
4383 cbz x2, common_errDivideByZero // is second operand zero?
4384 .endif
4385 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4386
4387 eor x0, x1, x2 // x0<- op, w0-w4 changed
4388 GET_INST_OPCODE ip // extract opcode from rINST
4389 SET_VREG_WIDE x0, w4 // vAA<- x0
4390 GOTO_OPCODE ip // jump to next instruction
4391 /* 11-14 instructions */
4392
4393
4394/* ------------------------------ */
4395 .balign 128
4396.L_op_shl_long: /* 0xa3 */
4397/* File: arm64/op_shl_long.S */
4398/* File: arm64/shiftWide.S */
4399 /*
4400 * 64-bit shift operation.
4401 *
4402 * For: shl-long, shr-long, ushr-long
4403 */
4404 /* binop vAA, vBB, vCC */
4405 FETCH w0, 1 // w0<- CCBB
4406 lsr w3, wINST, #8 // w3<- AA
4407 lsr w2, w0, #8 // w2<- CC
4408 GET_VREG w2, w2 // w2<- vCC (shift count)
4409 and w1, w0, #255 // w1<- BB
4410 GET_VREG_WIDE x1, w1 // x1<- vBB
4411 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004412 lsl x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004413 GET_INST_OPCODE ip // extract opcode from rINST
4414 SET_VREG_WIDE x0, w3 // vAA<- x0
4415 GOTO_OPCODE ip // jump to next instruction
4416 /* 11-14 instructions */
4417
4418
4419/* ------------------------------ */
4420 .balign 128
4421.L_op_shr_long: /* 0xa4 */
4422/* File: arm64/op_shr_long.S */
4423/* File: arm64/shiftWide.S */
4424 /*
4425 * 64-bit shift operation.
4426 *
4427 * For: shl-long, shr-long, ushr-long
4428 */
4429 /* binop vAA, vBB, vCC */
4430 FETCH w0, 1 // w0<- CCBB
4431 lsr w3, wINST, #8 // w3<- AA
4432 lsr w2, w0, #8 // w2<- CC
4433 GET_VREG w2, w2 // w2<- vCC (shift count)
4434 and w1, w0, #255 // w1<- BB
4435 GET_VREG_WIDE x1, w1 // x1<- vBB
4436 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004437 asr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004438 GET_INST_OPCODE ip // extract opcode from rINST
4439 SET_VREG_WIDE x0, w3 // vAA<- x0
4440 GOTO_OPCODE ip // jump to next instruction
4441 /* 11-14 instructions */
4442
4443
4444/* ------------------------------ */
4445 .balign 128
4446.L_op_ushr_long: /* 0xa5 */
4447/* File: arm64/op_ushr_long.S */
4448/* File: arm64/shiftWide.S */
4449 /*
4450 * 64-bit shift operation.
4451 *
4452 * For: shl-long, shr-long, ushr-long
4453 */
4454 /* binop vAA, vBB, vCC */
4455 FETCH w0, 1 // w0<- CCBB
4456 lsr w3, wINST, #8 // w3<- AA
4457 lsr w2, w0, #8 // w2<- CC
4458 GET_VREG w2, w2 // w2<- vCC (shift count)
4459 and w1, w0, #255 // w1<- BB
4460 GET_VREG_WIDE x1, w1 // x1<- vBB
4461 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004462 lsr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004463 GET_INST_OPCODE ip // extract opcode from rINST
4464 SET_VREG_WIDE x0, w3 // vAA<- x0
4465 GOTO_OPCODE ip // jump to next instruction
4466 /* 11-14 instructions */
4467
4468
4469/* ------------------------------ */
4470 .balign 128
4471.L_op_add_float: /* 0xa6 */
4472/* File: arm64/op_add_float.S */
4473/* File: arm64/fbinop.S */
4474 /*:
4475 * Generic 32-bit floating-point operation.
4476 *
4477 * For: add-float, sub-float, mul-float, div-float
4478 * form: <op> s0, s0, s1
4479 */
4480 /* floatop vAA, vBB, vCC */
4481 FETCH w0, 1 // r0<- CCBB
4482 lsr w1, w0, #8 // r2<- CC
4483 and w0, w0, #255 // r1<- BB
4484 GET_VREG s1, w1
4485 GET_VREG s0, w0
4486 fadd s0, s0, s1 // s0<- op
4487 lsr w1, wINST, #8 // r1<- AA
4488 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4489 GET_INST_OPCODE ip // extract opcode from rINST
4490 SET_VREG s0, w1
4491 GOTO_OPCODE ip // jump to next instruction
4492
4493
4494/* ------------------------------ */
4495 .balign 128
4496.L_op_sub_float: /* 0xa7 */
4497/* File: arm64/op_sub_float.S */
4498/* File: arm64/fbinop.S */
4499 /*:
4500 * Generic 32-bit floating-point operation.
4501 *
4502 * For: add-float, sub-float, mul-float, div-float
4503 * form: <op> s0, s0, s1
4504 */
4505 /* floatop vAA, vBB, vCC */
4506 FETCH w0, 1 // r0<- CCBB
4507 lsr w1, w0, #8 // r2<- CC
4508 and w0, w0, #255 // r1<- BB
4509 GET_VREG s1, w1
4510 GET_VREG s0, w0
4511 fsub s0, s0, s1 // s0<- op
4512 lsr w1, wINST, #8 // r1<- AA
4513 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4514 GET_INST_OPCODE ip // extract opcode from rINST
4515 SET_VREG s0, w1
4516 GOTO_OPCODE ip // jump to next instruction
4517
4518
4519/* ------------------------------ */
4520 .balign 128
4521.L_op_mul_float: /* 0xa8 */
4522/* File: arm64/op_mul_float.S */
4523/* File: arm64/fbinop.S */
4524 /*:
4525 * Generic 32-bit floating-point operation.
4526 *
4527 * For: add-float, sub-float, mul-float, div-float
4528 * form: <op> s0, s0, s1
4529 */
4530 /* floatop vAA, vBB, vCC */
4531 FETCH w0, 1 // r0<- CCBB
4532 lsr w1, w0, #8 // r2<- CC
4533 and w0, w0, #255 // r1<- BB
4534 GET_VREG s1, w1
4535 GET_VREG s0, w0
4536 fmul s0, s0, s1 // s0<- op
4537 lsr w1, wINST, #8 // r1<- AA
4538 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4539 GET_INST_OPCODE ip // extract opcode from rINST
4540 SET_VREG s0, w1
4541 GOTO_OPCODE ip // jump to next instruction
4542
4543
4544/* ------------------------------ */
4545 .balign 128
4546.L_op_div_float: /* 0xa9 */
4547/* File: arm64/op_div_float.S */
4548/* File: arm64/fbinop.S */
4549 /*:
4550 * Generic 32-bit floating-point operation.
4551 *
4552 * For: add-float, sub-float, mul-float, div-float
4553 * form: <op> s0, s0, s1
4554 */
4555 /* floatop vAA, vBB, vCC */
4556 FETCH w0, 1 // r0<- CCBB
4557 lsr w1, w0, #8 // r2<- CC
4558 and w0, w0, #255 // r1<- BB
4559 GET_VREG s1, w1
4560 GET_VREG s0, w0
4561 fdiv s0, s0, s1 // s0<- op
4562 lsr w1, wINST, #8 // r1<- AA
4563 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4564 GET_INST_OPCODE ip // extract opcode from rINST
4565 SET_VREG s0, w1
4566 GOTO_OPCODE ip // jump to next instruction
4567
4568
4569/* ------------------------------ */
4570 .balign 128
4571.L_op_rem_float: /* 0xaa */
4572/* File: arm64/op_rem_float.S */
4573/* EABI doesn't define a float remainder function, but libm does */
4574/* File: arm64/fbinop.S */
4575 /*:
4576 * Generic 32-bit floating-point operation.
4577 *
4578 * For: add-float, sub-float, mul-float, div-float
4579 * form: <op> s0, s0, s1
4580 */
4581 /* floatop vAA, vBB, vCC */
4582 FETCH w0, 1 // r0<- CCBB
4583 lsr w1, w0, #8 // r2<- CC
4584 and w0, w0, #255 // r1<- BB
4585 GET_VREG s1, w1
4586 GET_VREG s0, w0
4587 bl fmodf // s0<- op
4588 lsr w1, wINST, #8 // r1<- AA
4589 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4590 GET_INST_OPCODE ip // extract opcode from rINST
4591 SET_VREG s0, w1
4592 GOTO_OPCODE ip // jump to next instruction
4593
4594
4595/* ------------------------------ */
4596 .balign 128
4597.L_op_add_double: /* 0xab */
4598/* File: arm64/op_add_double.S */
4599/* File: arm64/binopWide.S */
4600 /*
4601 * Generic 64-bit binary operation. Provide an "instr" line that
4602 * specifies an instruction that performs "result = x1 op x2".
4603 * This could be an ARM instruction or a function call. (If the result
4604 * comes back in a register other than x0, you can override "result".)
4605 *
4606 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4607 * vCC (w1). Useful for integer division and modulus.
4608 *
4609 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4610 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4611 */
4612 /* binop vAA, vBB, vCC */
4613 FETCH w0, 1 // w0<- CCBB
4614 lsr w4, wINST, #8 // w4<- AA
4615 lsr w2, w0, #8 // w2<- CC
4616 and w1, w0, #255 // w1<- BB
4617 GET_VREG_WIDE d2, w2 // w2<- vCC
4618 GET_VREG_WIDE d1, w1 // w1<- vBB
4619 .if 0
4620 cbz d2, common_errDivideByZero // is second operand zero?
4621 .endif
4622 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4623
4624 fadd d0, d1, d2 // d0<- op, w0-w4 changed
4625 GET_INST_OPCODE ip // extract opcode from rINST
4626 SET_VREG_WIDE d0, w4 // vAA<- d0
4627 GOTO_OPCODE ip // jump to next instruction
4628 /* 11-14 instructions */
4629
4630
4631/* ------------------------------ */
4632 .balign 128
4633.L_op_sub_double: /* 0xac */
4634/* File: arm64/op_sub_double.S */
4635/* File: arm64/binopWide.S */
4636 /*
4637 * Generic 64-bit binary operation. Provide an "instr" line that
4638 * specifies an instruction that performs "result = x1 op x2".
4639 * This could be an ARM instruction or a function call. (If the result
4640 * comes back in a register other than x0, you can override "result".)
4641 *
4642 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4643 * vCC (w1). Useful for integer division and modulus.
4644 *
4645 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4646 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4647 */
4648 /* binop vAA, vBB, vCC */
4649 FETCH w0, 1 // w0<- CCBB
4650 lsr w4, wINST, #8 // w4<- AA
4651 lsr w2, w0, #8 // w2<- CC
4652 and w1, w0, #255 // w1<- BB
4653 GET_VREG_WIDE d2, w2 // w2<- vCC
4654 GET_VREG_WIDE d1, w1 // w1<- vBB
4655 .if 0
4656 cbz d2, common_errDivideByZero // is second operand zero?
4657 .endif
4658 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4659
4660 fsub d0, d1, d2 // d0<- op, w0-w4 changed
4661 GET_INST_OPCODE ip // extract opcode from rINST
4662 SET_VREG_WIDE d0, w4 // vAA<- d0
4663 GOTO_OPCODE ip // jump to next instruction
4664 /* 11-14 instructions */
4665
4666
4667/* ------------------------------ */
4668 .balign 128
4669.L_op_mul_double: /* 0xad */
4670/* File: arm64/op_mul_double.S */
4671/* File: arm64/binopWide.S */
4672 /*
4673 * Generic 64-bit binary operation. Provide an "instr" line that
4674 * specifies an instruction that performs "result = x1 op x2".
4675 * This could be an ARM instruction or a function call. (If the result
4676 * comes back in a register other than x0, you can override "result".)
4677 *
4678 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4679 * vCC (w1). Useful for integer division and modulus.
4680 *
4681 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4682 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4683 */
4684 /* binop vAA, vBB, vCC */
4685 FETCH w0, 1 // w0<- CCBB
4686 lsr w4, wINST, #8 // w4<- AA
4687 lsr w2, w0, #8 // w2<- CC
4688 and w1, w0, #255 // w1<- BB
4689 GET_VREG_WIDE d2, w2 // w2<- vCC
4690 GET_VREG_WIDE d1, w1 // w1<- vBB
4691 .if 0
4692 cbz d2, common_errDivideByZero // is second operand zero?
4693 .endif
4694 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4695
4696 fmul d0, d1, d2 // d0<- op, w0-w4 changed
4697 GET_INST_OPCODE ip // extract opcode from rINST
4698 SET_VREG_WIDE d0, w4 // vAA<- d0
4699 GOTO_OPCODE ip // jump to next instruction
4700 /* 11-14 instructions */
4701
4702
4703/* ------------------------------ */
4704 .balign 128
4705.L_op_div_double: /* 0xae */
4706/* File: arm64/op_div_double.S */
4707/* File: arm64/binopWide.S */
4708 /*
4709 * Generic 64-bit binary operation. Provide an "instr" line that
4710 * specifies an instruction that performs "result = x1 op x2".
4711 * This could be an ARM instruction or a function call. (If the result
4712 * comes back in a register other than x0, you can override "result".)
4713 *
4714 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4715 * vCC (w1). Useful for integer division and modulus.
4716 *
4717 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4718 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4719 */
4720 /* binop vAA, vBB, vCC */
4721 FETCH w0, 1 // w0<- CCBB
4722 lsr w4, wINST, #8 // w4<- AA
4723 lsr w2, w0, #8 // w2<- CC
4724 and w1, w0, #255 // w1<- BB
4725 GET_VREG_WIDE d2, w2 // w2<- vCC
4726 GET_VREG_WIDE d1, w1 // w1<- vBB
4727 .if 0
4728 cbz d2, common_errDivideByZero // is second operand zero?
4729 .endif
4730 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4731
4732 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
4733 GET_INST_OPCODE ip // extract opcode from rINST
4734 SET_VREG_WIDE d0, w4 // vAA<- d0
4735 GOTO_OPCODE ip // jump to next instruction
4736 /* 11-14 instructions */
4737
4738
4739/* ------------------------------ */
4740 .balign 128
4741.L_op_rem_double: /* 0xaf */
4742/* File: arm64/op_rem_double.S */
4743 /* rem vAA, vBB, vCC */
4744 FETCH w0, 1 // w0<- CCBB
4745 lsr w2, w0, #8 // w2<- CC
4746 and w1, w0, #255 // w1<- BB
4747 GET_VREG_WIDE d1, w2 // d1<- vCC
4748 GET_VREG_WIDE d0, w1 // d0<- vBB
4749 bl fmod
4750 lsr w4, wINST, #8 // w4<- AA
4751 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4752 GET_INST_OPCODE ip // extract opcode from rINST
4753 SET_VREG_WIDE d0, w4 // vAA<- result
4754 GOTO_OPCODE ip // jump to next instruction
4755 /* 11-14 instructions */
4756
4757/* ------------------------------ */
4758 .balign 128
4759.L_op_add_int_2addr: /* 0xb0 */
4760/* File: arm64/op_add_int_2addr.S */
4761/* File: arm64/binop2addr.S */
4762 /*
4763 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4764 * that specifies an instruction that performs "result = w0 op w1".
4765 * This could be an ARM instruction or a function call. (If the result
4766 * comes back in a register other than w0, you can override "result".)
4767 *
4768 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4769 * vCC (w1). Useful for integer division and modulus.
4770 *
4771 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4772 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4773 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4774 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4775 */
4776 /* binop/2addr vA, vB */
4777 lsr w3, wINST, #12 // w3<- B
4778 ubfx w9, wINST, #8, #4 // w9<- A
4779 GET_VREG w1, w3 // w1<- vB
4780 GET_VREG w0, w9 // w0<- vA
4781 .if 0
4782 cbz w1, common_errDivideByZero
4783 .endif
4784 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4785 // optional op; may set condition codes
4786 add w0, w0, w1 // w0<- op, w0-w3 changed
4787 GET_INST_OPCODE ip // extract opcode from rINST
4788 SET_VREG w0, w9 // vAA<- w0
4789 GOTO_OPCODE ip // jump to next instruction
4790 /* 10-13 instructions */
4791
4792
4793/* ------------------------------ */
4794 .balign 128
4795.L_op_sub_int_2addr: /* 0xb1 */
4796/* File: arm64/op_sub_int_2addr.S */
4797/* File: arm64/binop2addr.S */
4798 /*
4799 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4800 * that specifies an instruction that performs "result = w0 op w1".
4801 * This could be an ARM instruction or a function call. (If the result
4802 * comes back in a register other than w0, you can override "result".)
4803 *
4804 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4805 * vCC (w1). Useful for integer division and modulus.
4806 *
4807 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4808 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4809 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4810 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4811 */
4812 /* binop/2addr vA, vB */
4813 lsr w3, wINST, #12 // w3<- B
4814 ubfx w9, wINST, #8, #4 // w9<- A
4815 GET_VREG w1, w3 // w1<- vB
4816 GET_VREG w0, w9 // w0<- vA
4817 .if 0
4818 cbz w1, common_errDivideByZero
4819 .endif
4820 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4821 // optional op; may set condition codes
4822 sub w0, w0, w1 // w0<- op, w0-w3 changed
4823 GET_INST_OPCODE ip // extract opcode from rINST
4824 SET_VREG w0, w9 // vAA<- w0
4825 GOTO_OPCODE ip // jump to next instruction
4826 /* 10-13 instructions */
4827
4828
4829/* ------------------------------ */
4830 .balign 128
4831.L_op_mul_int_2addr: /* 0xb2 */
4832/* File: arm64/op_mul_int_2addr.S */
4833/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
4834/* File: arm64/binop2addr.S */
4835 /*
4836 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4837 * that specifies an instruction that performs "result = w0 op w1".
4838 * This could be an ARM instruction or a function call. (If the result
4839 * comes back in a register other than w0, you can override "result".)
4840 *
4841 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4842 * vCC (w1). Useful for integer division and modulus.
4843 *
4844 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4845 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4846 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4847 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4848 */
4849 /* binop/2addr vA, vB */
4850 lsr w3, wINST, #12 // w3<- B
4851 ubfx w9, wINST, #8, #4 // w9<- A
4852 GET_VREG w1, w3 // w1<- vB
4853 GET_VREG w0, w9 // w0<- vA
4854 .if 0
4855 cbz w1, common_errDivideByZero
4856 .endif
4857 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4858 // optional op; may set condition codes
4859 mul w0, w1, w0 // w0<- op, w0-w3 changed
4860 GET_INST_OPCODE ip // extract opcode from rINST
4861 SET_VREG w0, w9 // vAA<- w0
4862 GOTO_OPCODE ip // jump to next instruction
4863 /* 10-13 instructions */
4864
4865
4866/* ------------------------------ */
4867 .balign 128
4868.L_op_div_int_2addr: /* 0xb3 */
4869/* File: arm64/op_div_int_2addr.S */
4870/* File: arm64/binop2addr.S */
4871 /*
4872 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4873 * that specifies an instruction that performs "result = w0 op w1".
4874 * This could be an ARM instruction or a function call. (If the result
4875 * comes back in a register other than w0, you can override "result".)
4876 *
4877 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4878 * vCC (w1). Useful for integer division and modulus.
4879 *
4880 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4881 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4882 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4883 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4884 */
4885 /* binop/2addr vA, vB */
4886 lsr w3, wINST, #12 // w3<- B
4887 ubfx w9, wINST, #8, #4 // w9<- A
4888 GET_VREG w1, w3 // w1<- vB
4889 GET_VREG w0, w9 // w0<- vA
4890 .if 1
4891 cbz w1, common_errDivideByZero
4892 .endif
4893 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4894 // optional op; may set condition codes
4895 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4896 GET_INST_OPCODE ip // extract opcode from rINST
4897 SET_VREG w0, w9 // vAA<- w0
4898 GOTO_OPCODE ip // jump to next instruction
4899 /* 10-13 instructions */
4900
4901
4902/* ------------------------------ */
4903 .balign 128
4904.L_op_rem_int_2addr: /* 0xb4 */
4905/* File: arm64/op_rem_int_2addr.S */
4906/* File: arm64/binop2addr.S */
4907 /*
4908 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4909 * that specifies an instruction that performs "result = w0 op w1".
4910 * This could be an ARM instruction or a function call. (If the result
4911 * comes back in a register other than w0, you can override "result".)
4912 *
4913 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4914 * vCC (w1). Useful for integer division and modulus.
4915 *
4916 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4917 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4918 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4919 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4920 */
4921 /* binop/2addr vA, vB */
4922 lsr w3, wINST, #12 // w3<- B
4923 ubfx w9, wINST, #8, #4 // w9<- A
4924 GET_VREG w1, w3 // w1<- vB
4925 GET_VREG w0, w9 // w0<- vA
4926 .if 1
4927 cbz w1, common_errDivideByZero
4928 .endif
4929 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4930 sdiv w2, w0, w1 // optional op; may set condition codes
4931 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4932 GET_INST_OPCODE ip // extract opcode from rINST
4933 SET_VREG w0, w9 // vAA<- w0
4934 GOTO_OPCODE ip // jump to next instruction
4935 /* 10-13 instructions */
4936
4937
4938/* ------------------------------ */
4939 .balign 128
4940.L_op_and_int_2addr: /* 0xb5 */
4941/* File: arm64/op_and_int_2addr.S */
4942/* File: arm64/binop2addr.S */
4943 /*
4944 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4945 * that specifies an instruction that performs "result = w0 op w1".
4946 * This could be an ARM instruction or a function call. (If the result
4947 * comes back in a register other than w0, you can override "result".)
4948 *
4949 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4950 * vCC (w1). Useful for integer division and modulus.
4951 *
4952 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4953 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4954 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4955 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4956 */
4957 /* binop/2addr vA, vB */
4958 lsr w3, wINST, #12 // w3<- B
4959 ubfx w9, wINST, #8, #4 // w9<- A
4960 GET_VREG w1, w3 // w1<- vB
4961 GET_VREG w0, w9 // w0<- vA
4962 .if 0
4963 cbz w1, common_errDivideByZero
4964 .endif
4965 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4966 // optional op; may set condition codes
4967 and w0, w0, w1 // w0<- op, w0-w3 changed
4968 GET_INST_OPCODE ip // extract opcode from rINST
4969 SET_VREG w0, w9 // vAA<- w0
4970 GOTO_OPCODE ip // jump to next instruction
4971 /* 10-13 instructions */
4972
4973
4974/* ------------------------------ */
4975 .balign 128
4976.L_op_or_int_2addr: /* 0xb6 */
4977/* File: arm64/op_or_int_2addr.S */
4978/* File: arm64/binop2addr.S */
4979 /*
4980 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4981 * that specifies an instruction that performs "result = w0 op w1".
4982 * This could be an ARM instruction or a function call. (If the result
4983 * comes back in a register other than w0, you can override "result".)
4984 *
4985 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4986 * vCC (w1). Useful for integer division and modulus.
4987 *
4988 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4989 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4990 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4991 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4992 */
4993 /* binop/2addr vA, vB */
4994 lsr w3, wINST, #12 // w3<- B
4995 ubfx w9, wINST, #8, #4 // w9<- A
4996 GET_VREG w1, w3 // w1<- vB
4997 GET_VREG w0, w9 // w0<- vA
4998 .if 0
4999 cbz w1, common_errDivideByZero
5000 .endif
5001 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5002 // optional op; may set condition codes
5003 orr w0, w0, w1 // w0<- op, w0-w3 changed
5004 GET_INST_OPCODE ip // extract opcode from rINST
5005 SET_VREG w0, w9 // vAA<- w0
5006 GOTO_OPCODE ip // jump to next instruction
5007 /* 10-13 instructions */
5008
5009
5010/* ------------------------------ */
5011 .balign 128
5012.L_op_xor_int_2addr: /* 0xb7 */
5013/* File: arm64/op_xor_int_2addr.S */
5014/* File: arm64/binop2addr.S */
5015 /*
5016 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5017 * that specifies an instruction that performs "result = w0 op w1".
5018 * This could be an ARM instruction or a function call. (If the result
5019 * comes back in a register other than w0, you can override "result".)
5020 *
5021 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5022 * vCC (w1). Useful for integer division and modulus.
5023 *
5024 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5025 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5026 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5027 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5028 */
5029 /* binop/2addr vA, vB */
5030 lsr w3, wINST, #12 // w3<- B
5031 ubfx w9, wINST, #8, #4 // w9<- A
5032 GET_VREG w1, w3 // w1<- vB
5033 GET_VREG w0, w9 // w0<- vA
5034 .if 0
5035 cbz w1, common_errDivideByZero
5036 .endif
5037 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5038 // optional op; may set condition codes
5039 eor w0, w0, w1 // w0<- op, w0-w3 changed
5040 GET_INST_OPCODE ip // extract opcode from rINST
5041 SET_VREG w0, w9 // vAA<- w0
5042 GOTO_OPCODE ip // jump to next instruction
5043 /* 10-13 instructions */
5044
5045
5046/* ------------------------------ */
5047 .balign 128
5048.L_op_shl_int_2addr: /* 0xb8 */
5049/* File: arm64/op_shl_int_2addr.S */
5050/* File: arm64/binop2addr.S */
5051 /*
5052 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5053 * that specifies an instruction that performs "result = w0 op w1".
5054 * This could be an ARM instruction or a function call. (If the result
5055 * comes back in a register other than w0, you can override "result".)
5056 *
5057 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5058 * vCC (w1). Useful for integer division and modulus.
5059 *
5060 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5061 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5062 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5063 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5064 */
5065 /* binop/2addr vA, vB */
5066 lsr w3, wINST, #12 // w3<- B
5067 ubfx w9, wINST, #8, #4 // w9<- A
5068 GET_VREG w1, w3 // w1<- vB
5069 GET_VREG w0, w9 // w0<- vA
5070 .if 0
5071 cbz w1, common_errDivideByZero
5072 .endif
5073 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005074 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005075 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5076 GET_INST_OPCODE ip // extract opcode from rINST
5077 SET_VREG w0, w9 // vAA<- w0
5078 GOTO_OPCODE ip // jump to next instruction
5079 /* 10-13 instructions */
5080
5081
5082/* ------------------------------ */
5083 .balign 128
5084.L_op_shr_int_2addr: /* 0xb9 */
5085/* File: arm64/op_shr_int_2addr.S */
5086/* File: arm64/binop2addr.S */
5087 /*
5088 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5089 * that specifies an instruction that performs "result = w0 op w1".
5090 * This could be an ARM instruction or a function call. (If the result
5091 * comes back in a register other than w0, you can override "result".)
5092 *
5093 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5094 * vCC (w1). Useful for integer division and modulus.
5095 *
5096 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5097 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5098 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5099 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5100 */
5101 /* binop/2addr vA, vB */
5102 lsr w3, wINST, #12 // w3<- B
5103 ubfx w9, wINST, #8, #4 // w9<- A
5104 GET_VREG w1, w3 // w1<- vB
5105 GET_VREG w0, w9 // w0<- vA
5106 .if 0
5107 cbz w1, common_errDivideByZero
5108 .endif
5109 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005110 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005111 asr w0, w0, w1 // w0<- op, w0-w3 changed
5112 GET_INST_OPCODE ip // extract opcode from rINST
5113 SET_VREG w0, w9 // vAA<- w0
5114 GOTO_OPCODE ip // jump to next instruction
5115 /* 10-13 instructions */
5116
5117
5118/* ------------------------------ */
5119 .balign 128
5120.L_op_ushr_int_2addr: /* 0xba */
5121/* File: arm64/op_ushr_int_2addr.S */
5122/* File: arm64/binop2addr.S */
5123 /*
5124 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5125 * that specifies an instruction that performs "result = w0 op w1".
5126 * This could be an ARM instruction or a function call. (If the result
5127 * comes back in a register other than w0, you can override "result".)
5128 *
5129 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5130 * vCC (w1). Useful for integer division and modulus.
5131 *
5132 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5133 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5134 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5135 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5136 */
5137 /* binop/2addr vA, vB */
5138 lsr w3, wINST, #12 // w3<- B
5139 ubfx w9, wINST, #8, #4 // w9<- A
5140 GET_VREG w1, w3 // w1<- vB
5141 GET_VREG w0, w9 // w0<- vA
5142 .if 0
5143 cbz w1, common_errDivideByZero
5144 .endif
5145 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005146 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005147 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5148 GET_INST_OPCODE ip // extract opcode from rINST
5149 SET_VREG w0, w9 // vAA<- w0
5150 GOTO_OPCODE ip // jump to next instruction
5151 /* 10-13 instructions */
5152
5153
5154/* ------------------------------ */
5155 .balign 128
5156.L_op_add_long_2addr: /* 0xbb */
5157/* File: arm64/op_add_long_2addr.S */
5158/* File: arm64/binopWide2addr.S */
5159 /*
5160 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5161 * that specifies an instruction that performs "x0 = x0 op x1".
5162 * This must not be a function call, as we keep w2 live across it.
5163 *
5164 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5165 * vCC (w1). Useful for integer division and modulus.
5166 *
5167 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5168 * and-long/2addr, or-long/2addr, xor-long/2addr,
5169 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5170 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5171 */
5172 /* binop/2addr vA, vB */
5173 lsr w1, wINST, #12 // w1<- B
5174 ubfx w2, wINST, #8, #4 // w2<- A
5175 GET_VREG_WIDE x1, w1 // x1<- vB
5176 GET_VREG_WIDE x0, w2 // x0<- vA
5177 .if 0
5178 cbz x1, common_errDivideByZero
5179 .endif
5180 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5181
5182 add x0, x0, x1 // result<- op
5183 GET_INST_OPCODE ip // extract opcode from rINST
5184 SET_VREG_WIDE x0, w2 // vAA<- result
5185 GOTO_OPCODE ip // jump to next instruction
5186 /* 10-13 instructions */
5187
5188
5189/* ------------------------------ */
5190 .balign 128
5191.L_op_sub_long_2addr: /* 0xbc */
5192/* File: arm64/op_sub_long_2addr.S */
5193/* File: arm64/binopWide2addr.S */
5194 /*
5195 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5196 * that specifies an instruction that performs "x0 = x0 op x1".
5197 * This must not be a function call, as we keep w2 live across it.
5198 *
5199 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5200 * vCC (w1). Useful for integer division and modulus.
5201 *
5202 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5203 * and-long/2addr, or-long/2addr, xor-long/2addr,
5204 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5205 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5206 */
5207 /* binop/2addr vA, vB */
5208 lsr w1, wINST, #12 // w1<- B
5209 ubfx w2, wINST, #8, #4 // w2<- A
5210 GET_VREG_WIDE x1, w1 // x1<- vB
5211 GET_VREG_WIDE x0, w2 // x0<- vA
5212 .if 0
5213 cbz x1, common_errDivideByZero
5214 .endif
5215 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5216
5217 sub x0, x0, x1 // result<- op
5218 GET_INST_OPCODE ip // extract opcode from rINST
5219 SET_VREG_WIDE x0, w2 // vAA<- result
5220 GOTO_OPCODE ip // jump to next instruction
5221 /* 10-13 instructions */
5222
5223
5224/* ------------------------------ */
5225 .balign 128
5226.L_op_mul_long_2addr: /* 0xbd */
5227/* File: arm64/op_mul_long_2addr.S */
5228/* File: arm64/binopWide2addr.S */
5229 /*
5230 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5231 * that specifies an instruction that performs "x0 = x0 op x1".
5232 * This must not be a function call, as we keep w2 live across it.
5233 *
5234 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5235 * vCC (w1). Useful for integer division and modulus.
5236 *
5237 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5238 * and-long/2addr, or-long/2addr, xor-long/2addr,
5239 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5240 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5241 */
5242 /* binop/2addr vA, vB */
5243 lsr w1, wINST, #12 // w1<- B
5244 ubfx w2, wINST, #8, #4 // w2<- A
5245 GET_VREG_WIDE x1, w1 // x1<- vB
5246 GET_VREG_WIDE x0, w2 // x0<- vA
5247 .if 0
5248 cbz x1, common_errDivideByZero
5249 .endif
5250 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5251
5252 mul x0, x0, x1 // result<- op
5253 GET_INST_OPCODE ip // extract opcode from rINST
5254 SET_VREG_WIDE x0, w2 // vAA<- result
5255 GOTO_OPCODE ip // jump to next instruction
5256 /* 10-13 instructions */
5257
5258
5259/* ------------------------------ */
5260 .balign 128
5261.L_op_div_long_2addr: /* 0xbe */
5262/* File: arm64/op_div_long_2addr.S */
5263/* File: arm64/binopWide2addr.S */
5264 /*
5265 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5266 * that specifies an instruction that performs "x0 = x0 op x1".
5267 * This must not be a function call, as we keep w2 live across it.
5268 *
5269 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5270 * vCC (w1). Useful for integer division and modulus.
5271 *
5272 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5273 * and-long/2addr, or-long/2addr, xor-long/2addr,
5274 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5275 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5276 */
5277 /* binop/2addr vA, vB */
5278 lsr w1, wINST, #12 // w1<- B
5279 ubfx w2, wINST, #8, #4 // w2<- A
5280 GET_VREG_WIDE x1, w1 // x1<- vB
5281 GET_VREG_WIDE x0, w2 // x0<- vA
5282 .if 1
5283 cbz x1, common_errDivideByZero
5284 .endif
5285 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5286
5287 sdiv x0, x0, x1 // result<- op
5288 GET_INST_OPCODE ip // extract opcode from rINST
5289 SET_VREG_WIDE x0, w2 // vAA<- result
5290 GOTO_OPCODE ip // jump to next instruction
5291 /* 10-13 instructions */
5292
5293
5294/* ------------------------------ */
5295 .balign 128
5296.L_op_rem_long_2addr: /* 0xbf */
5297/* File: arm64/op_rem_long_2addr.S */
5298/* File: arm64/binopWide2addr.S */
5299 /*
5300 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5301 * that specifies an instruction that performs "x0 = x0 op x1".
5302 * This must not be a function call, as we keep w2 live across it.
5303 *
5304 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5305 * vCC (w1). Useful for integer division and modulus.
5306 *
5307 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5308 * and-long/2addr, or-long/2addr, xor-long/2addr,
5309 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5310 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5311 */
5312 /* binop/2addr vA, vB */
5313 lsr w1, wINST, #12 // w1<- B
5314 ubfx w2, wINST, #8, #4 // w2<- A
5315 GET_VREG_WIDE x1, w1 // x1<- vB
5316 GET_VREG_WIDE x0, w2 // x0<- vA
5317 .if 1
5318 cbz x1, common_errDivideByZero
5319 .endif
5320 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5321 sdiv x3, x0, x1
5322 msub x0, x3, x1, x0 // result<- op
5323 GET_INST_OPCODE ip // extract opcode from rINST
5324 SET_VREG_WIDE x0, w2 // vAA<- result
5325 GOTO_OPCODE ip // jump to next instruction
5326 /* 10-13 instructions */
5327
5328
5329/* ------------------------------ */
5330 .balign 128
5331.L_op_and_long_2addr: /* 0xc0 */
5332/* File: arm64/op_and_long_2addr.S */
5333/* File: arm64/binopWide2addr.S */
5334 /*
5335 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5336 * that specifies an instruction that performs "x0 = x0 op x1".
5337 * This must not be a function call, as we keep w2 live across it.
5338 *
5339 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5340 * vCC (w1). Useful for integer division and modulus.
5341 *
5342 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5343 * and-long/2addr, or-long/2addr, xor-long/2addr,
5344 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5345 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5346 */
5347 /* binop/2addr vA, vB */
5348 lsr w1, wINST, #12 // w1<- B
5349 ubfx w2, wINST, #8, #4 // w2<- A
5350 GET_VREG_WIDE x1, w1 // x1<- vB
5351 GET_VREG_WIDE x0, w2 // x0<- vA
5352 .if 0
5353 cbz x1, common_errDivideByZero
5354 .endif
5355 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5356
5357 and x0, x0, x1 // result<- op
5358 GET_INST_OPCODE ip // extract opcode from rINST
5359 SET_VREG_WIDE x0, w2 // vAA<- result
5360 GOTO_OPCODE ip // jump to next instruction
5361 /* 10-13 instructions */
5362
5363
5364/* ------------------------------ */
5365 .balign 128
5366.L_op_or_long_2addr: /* 0xc1 */
5367/* File: arm64/op_or_long_2addr.S */
5368/* File: arm64/binopWide2addr.S */
5369 /*
5370 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5371 * that specifies an instruction that performs "x0 = x0 op x1".
5372 * This must not be a function call, as we keep w2 live across it.
5373 *
5374 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5375 * vCC (w1). Useful for integer division and modulus.
5376 *
5377 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5378 * and-long/2addr, or-long/2addr, xor-long/2addr,
5379 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5380 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5381 */
5382 /* binop/2addr vA, vB */
5383 lsr w1, wINST, #12 // w1<- B
5384 ubfx w2, wINST, #8, #4 // w2<- A
5385 GET_VREG_WIDE x1, w1 // x1<- vB
5386 GET_VREG_WIDE x0, w2 // x0<- vA
5387 .if 0
5388 cbz x1, common_errDivideByZero
5389 .endif
5390 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5391
5392 orr x0, x0, x1 // result<- op
5393 GET_INST_OPCODE ip // extract opcode from rINST
5394 SET_VREG_WIDE x0, w2 // vAA<- result
5395 GOTO_OPCODE ip // jump to next instruction
5396 /* 10-13 instructions */
5397
5398
5399/* ------------------------------ */
5400 .balign 128
5401.L_op_xor_long_2addr: /* 0xc2 */
5402/* File: arm64/op_xor_long_2addr.S */
5403/* File: arm64/binopWide2addr.S */
5404 /*
5405 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5406 * that specifies an instruction that performs "x0 = x0 op x1".
5407 * This must not be a function call, as we keep w2 live across it.
5408 *
5409 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5410 * vCC (w1). Useful for integer division and modulus.
5411 *
5412 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5413 * and-long/2addr, or-long/2addr, xor-long/2addr,
5414 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5415 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5416 */
5417 /* binop/2addr vA, vB */
5418 lsr w1, wINST, #12 // w1<- B
5419 ubfx w2, wINST, #8, #4 // w2<- A
5420 GET_VREG_WIDE x1, w1 // x1<- vB
5421 GET_VREG_WIDE x0, w2 // x0<- vA
5422 .if 0
5423 cbz x1, common_errDivideByZero
5424 .endif
5425 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5426
5427 eor x0, x0, x1 // result<- op
5428 GET_INST_OPCODE ip // extract opcode from rINST
5429 SET_VREG_WIDE x0, w2 // vAA<- result
5430 GOTO_OPCODE ip // jump to next instruction
5431 /* 10-13 instructions */
5432
5433
5434/* ------------------------------ */
5435 .balign 128
5436.L_op_shl_long_2addr: /* 0xc3 */
5437/* File: arm64/op_shl_long_2addr.S */
5438/* File: arm64/shiftWide2addr.S */
5439 /*
5440 * Generic 64-bit shift operation.
5441 */
5442 /* binop/2addr vA, vB */
5443 lsr w1, wINST, #12 // w1<- B
5444 ubfx w2, wINST, #8, #4 // w2<- A
5445 GET_VREG w1, w1 // x1<- vB
5446 GET_VREG_WIDE x0, w2 // x0<- vA
5447 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005448 lsl x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005449 GET_INST_OPCODE ip // extract opcode from rINST
5450 SET_VREG_WIDE x0, w2 // vAA<- result
5451 GOTO_OPCODE ip // jump to next instruction
5452 /* 10-13 instructions */
5453
5454
5455/* ------------------------------ */
5456 .balign 128
5457.L_op_shr_long_2addr: /* 0xc4 */
5458/* File: arm64/op_shr_long_2addr.S */
5459/* File: arm64/shiftWide2addr.S */
5460 /*
5461 * Generic 64-bit shift operation.
5462 */
5463 /* binop/2addr vA, vB */
5464 lsr w1, wINST, #12 // w1<- B
5465 ubfx w2, wINST, #8, #4 // w2<- A
5466 GET_VREG w1, w1 // x1<- vB
5467 GET_VREG_WIDE x0, w2 // x0<- vA
5468 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005469 asr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005470 GET_INST_OPCODE ip // extract opcode from rINST
5471 SET_VREG_WIDE x0, w2 // vAA<- result
5472 GOTO_OPCODE ip // jump to next instruction
5473 /* 10-13 instructions */
5474
5475
5476/* ------------------------------ */
5477 .balign 128
5478.L_op_ushr_long_2addr: /* 0xc5 */
5479/* File: arm64/op_ushr_long_2addr.S */
5480/* File: arm64/shiftWide2addr.S */
5481 /*
5482 * Generic 64-bit shift operation.
5483 */
5484 /* binop/2addr vA, vB */
5485 lsr w1, wINST, #12 // w1<- B
5486 ubfx w2, wINST, #8, #4 // w2<- A
5487 GET_VREG w1, w1 // x1<- vB
5488 GET_VREG_WIDE x0, w2 // x0<- vA
5489 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005490 lsr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005491 GET_INST_OPCODE ip // extract opcode from rINST
5492 SET_VREG_WIDE x0, w2 // vAA<- result
5493 GOTO_OPCODE ip // jump to next instruction
5494 /* 10-13 instructions */
5495
5496
5497/* ------------------------------ */
5498 .balign 128
5499.L_op_add_float_2addr: /* 0xc6 */
5500/* File: arm64/op_add_float_2addr.S */
5501/* File: arm64/fbinop2addr.S */
5502 /*
5503 * Generic 32-bit floating point "/2addr" binary operation. Provide
5504 * an "instr" line that specifies an instruction that performs
5505 * "s2 = s0 op s1".
5506 *
5507 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5508 */
5509 /* binop/2addr vA, vB */
5510 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005511 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005512 GET_VREG s1, w3
5513 GET_VREG s0, w9
5514 fadd s2, s0, s1 // s2<- op
5515 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5516 GET_INST_OPCODE ip // extract opcode from rINST
5517 SET_VREG s2, w9
5518 GOTO_OPCODE ip // jump to next instruction
5519
5520
5521/* ------------------------------ */
5522 .balign 128
5523.L_op_sub_float_2addr: /* 0xc7 */
5524/* File: arm64/op_sub_float_2addr.S */
5525/* File: arm64/fbinop2addr.S */
5526 /*
5527 * Generic 32-bit floating point "/2addr" binary operation. Provide
5528 * an "instr" line that specifies an instruction that performs
5529 * "s2 = s0 op s1".
5530 *
5531 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5532 */
5533 /* binop/2addr vA, vB */
5534 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005535 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005536 GET_VREG s1, w3
5537 GET_VREG s0, w9
5538 fsub s2, s0, s1 // s2<- op
5539 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5540 GET_INST_OPCODE ip // extract opcode from rINST
5541 SET_VREG s2, w9
5542 GOTO_OPCODE ip // jump to next instruction
5543
5544
5545/* ------------------------------ */
5546 .balign 128
5547.L_op_mul_float_2addr: /* 0xc8 */
5548/* File: arm64/op_mul_float_2addr.S */
5549/* File: arm64/fbinop2addr.S */
5550 /*
5551 * Generic 32-bit floating point "/2addr" binary operation. Provide
5552 * an "instr" line that specifies an instruction that performs
5553 * "s2 = s0 op s1".
5554 *
5555 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5556 */
5557 /* binop/2addr vA, vB */
5558 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005559 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005560 GET_VREG s1, w3
5561 GET_VREG s0, w9
5562 fmul s2, s0, s1 // s2<- op
5563 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5564 GET_INST_OPCODE ip // extract opcode from rINST
5565 SET_VREG s2, w9
5566 GOTO_OPCODE ip // jump to next instruction
5567
5568
5569/* ------------------------------ */
5570 .balign 128
5571.L_op_div_float_2addr: /* 0xc9 */
5572/* File: arm64/op_div_float_2addr.S */
5573/* File: arm64/fbinop2addr.S */
5574 /*
5575 * Generic 32-bit floating point "/2addr" binary operation. Provide
5576 * an "instr" line that specifies an instruction that performs
5577 * "s2 = s0 op s1".
5578 *
5579 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5580 */
5581 /* binop/2addr vA, vB */
5582 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005583 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005584 GET_VREG s1, w3
5585 GET_VREG s0, w9
5586 fdiv 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_rem_float_2addr: /* 0xca */
5596/* File: arm64/op_rem_float_2addr.S */
5597 /* rem vA, vB */
5598 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005599 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005600 GET_VREG s1, w3
5601 GET_VREG s0, w9
5602 bl fmodf
Vladimir Markoe6220222016-07-20 14:25:30 +01005603 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005604 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5605 GET_INST_OPCODE ip // extract opcode from rINST
5606 SET_VREG s0, w9
5607 GOTO_OPCODE ip // jump to next instruction
5608
5609/* ------------------------------ */
5610 .balign 128
5611.L_op_add_double_2addr: /* 0xcb */
5612/* File: arm64/op_add_double_2addr.S */
5613/* File: arm64/binopWide2addr.S */
5614 /*
5615 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5616 * that specifies an instruction that performs "x0 = x0 op x1".
5617 * This must not be a function call, as we keep w2 live across it.
5618 *
5619 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5620 * vCC (w1). Useful for integer division and modulus.
5621 *
5622 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5623 * and-long/2addr, or-long/2addr, xor-long/2addr,
5624 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5625 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5626 */
5627 /* binop/2addr vA, vB */
5628 lsr w1, wINST, #12 // w1<- B
5629 ubfx w2, wINST, #8, #4 // w2<- A
5630 GET_VREG_WIDE d1, w1 // x1<- vB
5631 GET_VREG_WIDE d0, w2 // x0<- vA
5632 .if 0
5633 cbz d1, common_errDivideByZero
5634 .endif
5635 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5636
5637 fadd d0, d0, d1 // result<- op
5638 GET_INST_OPCODE ip // extract opcode from rINST
5639 SET_VREG_WIDE d0, w2 // vAA<- result
5640 GOTO_OPCODE ip // jump to next instruction
5641 /* 10-13 instructions */
5642
5643
5644/* ------------------------------ */
5645 .balign 128
5646.L_op_sub_double_2addr: /* 0xcc */
5647/* File: arm64/op_sub_double_2addr.S */
5648/* File: arm64/binopWide2addr.S */
5649 /*
5650 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5651 * that specifies an instruction that performs "x0 = x0 op x1".
5652 * This must not be a function call, as we keep w2 live across it.
5653 *
5654 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5655 * vCC (w1). Useful for integer division and modulus.
5656 *
5657 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5658 * and-long/2addr, or-long/2addr, xor-long/2addr,
5659 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5660 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5661 */
5662 /* binop/2addr vA, vB */
5663 lsr w1, wINST, #12 // w1<- B
5664 ubfx w2, wINST, #8, #4 // w2<- A
5665 GET_VREG_WIDE d1, w1 // x1<- vB
5666 GET_VREG_WIDE d0, w2 // x0<- vA
5667 .if 0
5668 cbz d1, common_errDivideByZero
5669 .endif
5670 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5671
5672 fsub d0, d0, d1 // result<- op
5673 GET_INST_OPCODE ip // extract opcode from rINST
5674 SET_VREG_WIDE d0, w2 // vAA<- result
5675 GOTO_OPCODE ip // jump to next instruction
5676 /* 10-13 instructions */
5677
5678
5679/* ------------------------------ */
5680 .balign 128
5681.L_op_mul_double_2addr: /* 0xcd */
5682/* File: arm64/op_mul_double_2addr.S */
5683/* File: arm64/binopWide2addr.S */
5684 /*
5685 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5686 * that specifies an instruction that performs "x0 = x0 op x1".
5687 * This must not be a function call, as we keep w2 live across it.
5688 *
5689 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5690 * vCC (w1). Useful for integer division and modulus.
5691 *
5692 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5693 * and-long/2addr, or-long/2addr, xor-long/2addr,
5694 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5695 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5696 */
5697 /* binop/2addr vA, vB */
5698 lsr w1, wINST, #12 // w1<- B
5699 ubfx w2, wINST, #8, #4 // w2<- A
5700 GET_VREG_WIDE d1, w1 // x1<- vB
5701 GET_VREG_WIDE d0, w2 // x0<- vA
5702 .if 0
5703 cbz d1, common_errDivideByZero
5704 .endif
5705 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5706
5707 fmul d0, d0, d1 // result<- op
5708 GET_INST_OPCODE ip // extract opcode from rINST
5709 SET_VREG_WIDE d0, w2 // vAA<- result
5710 GOTO_OPCODE ip // jump to next instruction
5711 /* 10-13 instructions */
5712
5713
5714/* ------------------------------ */
5715 .balign 128
5716.L_op_div_double_2addr: /* 0xce */
5717/* File: arm64/op_div_double_2addr.S */
5718/* File: arm64/binopWide2addr.S */
5719 /*
5720 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5721 * that specifies an instruction that performs "x0 = x0 op x1".
5722 * This must not be a function call, as we keep w2 live across it.
5723 *
5724 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5725 * vCC (w1). Useful for integer division and modulus.
5726 *
5727 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5728 * and-long/2addr, or-long/2addr, xor-long/2addr,
5729 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5730 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5731 */
5732 /* binop/2addr vA, vB */
5733 lsr w1, wINST, #12 // w1<- B
5734 ubfx w2, wINST, #8, #4 // w2<- A
5735 GET_VREG_WIDE d1, w1 // x1<- vB
5736 GET_VREG_WIDE d0, w2 // x0<- vA
5737 .if 0
5738 cbz d1, common_errDivideByZero
5739 .endif
5740 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5741
5742 fdiv d0, d0, d1 // result<- op
5743 GET_INST_OPCODE ip // extract opcode from rINST
5744 SET_VREG_WIDE d0, w2 // vAA<- result
5745 GOTO_OPCODE ip // jump to next instruction
5746 /* 10-13 instructions */
5747
5748
5749/* ------------------------------ */
5750 .balign 128
5751.L_op_rem_double_2addr: /* 0xcf */
5752/* File: arm64/op_rem_double_2addr.S */
5753 /* rem vA, vB */
5754 lsr w1, wINST, #12 // w1<- B
5755 ubfx w2, wINST, #8, #4 // w2<- A
5756 GET_VREG_WIDE d1, w1 // d1<- vB
5757 GET_VREG_WIDE d0, w2 // d0<- vA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005758 bl fmod
5759 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
buzbee908c0b22016-03-16 14:39:50 -07005760 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005761 GET_INST_OPCODE ip // extract opcode from rINST
5762 SET_VREG_WIDE d0, w2 // vAA<- result
5763 GOTO_OPCODE ip // jump to next instruction
5764 /* 10-13 instructions */
5765
5766/* ------------------------------ */
5767 .balign 128
5768.L_op_add_int_lit16: /* 0xd0 */
5769/* File: arm64/op_add_int_lit16.S */
5770/* File: arm64/binopLit16.S */
5771 /*
5772 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5773 * that specifies an instruction that performs "result = w0 op w1".
5774 * This could be an ARM instruction or a function call. (If the result
5775 * comes back in a register other than w0, you can override "result".)
5776 *
5777 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5778 * vCC (w1). Useful for integer division and modulus.
5779 *
5780 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5781 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5782 */
5783 /* binop/lit16 vA, vB, #+CCCC */
5784 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5785 lsr w2, wINST, #12 // w2<- B
5786 ubfx w9, wINST, #8, #4 // w9<- A
5787 GET_VREG w0, w2 // w0<- vB
5788 .if 0
5789 cbz w1, common_errDivideByZero
5790 .endif
5791 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5792
5793 add w0, w0, w1 // w0<- op, w0-w3 changed
5794 GET_INST_OPCODE ip // extract opcode from rINST
5795 SET_VREG w0, w9 // vAA<- w0
5796 GOTO_OPCODE ip // jump to next instruction
5797 /* 10-13 instructions */
5798
5799
5800/* ------------------------------ */
5801 .balign 128
5802.L_op_rsub_int: /* 0xd1 */
5803/* File: arm64/op_rsub_int.S */
5804/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5805/* File: arm64/binopLit16.S */
5806 /*
5807 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5808 * that specifies an instruction that performs "result = w0 op w1".
5809 * This could be an ARM instruction or a function call. (If the result
5810 * comes back in a register other than w0, you can override "result".)
5811 *
5812 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5813 * vCC (w1). Useful for integer division and modulus.
5814 *
5815 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5816 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5817 */
5818 /* binop/lit16 vA, vB, #+CCCC */
5819 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5820 lsr w2, wINST, #12 // w2<- B
5821 ubfx w9, wINST, #8, #4 // w9<- A
5822 GET_VREG w0, w2 // w0<- vB
5823 .if 0
5824 cbz w1, common_errDivideByZero
5825 .endif
5826 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5827
5828 sub w0, w1, w0 // w0<- op, w0-w3 changed
5829 GET_INST_OPCODE ip // extract opcode from rINST
5830 SET_VREG w0, w9 // vAA<- w0
5831 GOTO_OPCODE ip // jump to next instruction
5832 /* 10-13 instructions */
5833
5834
5835/* ------------------------------ */
5836 .balign 128
5837.L_op_mul_int_lit16: /* 0xd2 */
5838/* File: arm64/op_mul_int_lit16.S */
5839/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5840/* File: arm64/binopLit16.S */
5841 /*
5842 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5843 * that specifies an instruction that performs "result = w0 op w1".
5844 * This could be an ARM instruction or a function call. (If the result
5845 * comes back in a register other than w0, you can override "result".)
5846 *
5847 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5848 * vCC (w1). Useful for integer division and modulus.
5849 *
5850 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5851 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5852 */
5853 /* binop/lit16 vA, vB, #+CCCC */
5854 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5855 lsr w2, wINST, #12 // w2<- B
5856 ubfx w9, wINST, #8, #4 // w9<- A
5857 GET_VREG w0, w2 // w0<- vB
5858 .if 0
5859 cbz w1, common_errDivideByZero
5860 .endif
5861 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5862
5863 mul w0, w1, w0 // w0<- op, w0-w3 changed
5864 GET_INST_OPCODE ip // extract opcode from rINST
5865 SET_VREG w0, w9 // vAA<- w0
5866 GOTO_OPCODE ip // jump to next instruction
5867 /* 10-13 instructions */
5868
5869
5870/* ------------------------------ */
5871 .balign 128
5872.L_op_div_int_lit16: /* 0xd3 */
5873/* File: arm64/op_div_int_lit16.S */
5874/* File: arm64/binopLit16.S */
5875 /*
5876 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5877 * that specifies an instruction that performs "result = w0 op w1".
5878 * This could be an ARM instruction or a function call. (If the result
5879 * comes back in a register other than w0, you can override "result".)
5880 *
5881 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5882 * vCC (w1). Useful for integer division and modulus.
5883 *
5884 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5885 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5886 */
5887 /* binop/lit16 vA, vB, #+CCCC */
5888 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5889 lsr w2, wINST, #12 // w2<- B
5890 ubfx w9, wINST, #8, #4 // w9<- A
5891 GET_VREG w0, w2 // w0<- vB
5892 .if 1
5893 cbz w1, common_errDivideByZero
5894 .endif
5895 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5896
5897 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5898 GET_INST_OPCODE ip // extract opcode from rINST
5899 SET_VREG w0, w9 // vAA<- w0
5900 GOTO_OPCODE ip // jump to next instruction
5901 /* 10-13 instructions */
5902
5903
5904/* ------------------------------ */
5905 .balign 128
5906.L_op_rem_int_lit16: /* 0xd4 */
5907/* File: arm64/op_rem_int_lit16.S */
5908/* File: arm64/binopLit16.S */
5909 /*
5910 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5911 * that specifies an instruction that performs "result = w0 op w1".
5912 * This could be an ARM instruction or a function call. (If the result
5913 * comes back in a register other than w0, you can override "result".)
5914 *
5915 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5916 * vCC (w1). Useful for integer division and modulus.
5917 *
5918 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5919 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5920 */
5921 /* binop/lit16 vA, vB, #+CCCC */
5922 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5923 lsr w2, wINST, #12 // w2<- B
5924 ubfx w9, wINST, #8, #4 // w9<- A
5925 GET_VREG w0, w2 // w0<- vB
5926 .if 1
5927 cbz w1, common_errDivideByZero
5928 .endif
5929 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5930 sdiv w3, w0, w1
5931 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
5932 GET_INST_OPCODE ip // extract opcode from rINST
5933 SET_VREG w0, w9 // vAA<- w0
5934 GOTO_OPCODE ip // jump to next instruction
5935 /* 10-13 instructions */
5936
5937
5938/* ------------------------------ */
5939 .balign 128
5940.L_op_and_int_lit16: /* 0xd5 */
5941/* File: arm64/op_and_int_lit16.S */
5942/* File: arm64/binopLit16.S */
5943 /*
5944 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5945 * that specifies an instruction that performs "result = w0 op w1".
5946 * This could be an ARM instruction or a function call. (If the result
5947 * comes back in a register other than w0, you can override "result".)
5948 *
5949 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5950 * vCC (w1). Useful for integer division and modulus.
5951 *
5952 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5953 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5954 */
5955 /* binop/lit16 vA, vB, #+CCCC */
5956 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5957 lsr w2, wINST, #12 // w2<- B
5958 ubfx w9, wINST, #8, #4 // w9<- A
5959 GET_VREG w0, w2 // w0<- vB
5960 .if 0
5961 cbz w1, common_errDivideByZero
5962 .endif
5963 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5964
5965 and w0, w0, w1 // w0<- op, w0-w3 changed
5966 GET_INST_OPCODE ip // extract opcode from rINST
5967 SET_VREG w0, w9 // vAA<- w0
5968 GOTO_OPCODE ip // jump to next instruction
5969 /* 10-13 instructions */
5970
5971
5972/* ------------------------------ */
5973 .balign 128
5974.L_op_or_int_lit16: /* 0xd6 */
5975/* File: arm64/op_or_int_lit16.S */
5976/* File: arm64/binopLit16.S */
5977 /*
5978 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5979 * that specifies an instruction that performs "result = w0 op w1".
5980 * This could be an ARM instruction or a function call. (If the result
5981 * comes back in a register other than w0, you can override "result".)
5982 *
5983 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5984 * vCC (w1). Useful for integer division and modulus.
5985 *
5986 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5987 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5988 */
5989 /* binop/lit16 vA, vB, #+CCCC */
5990 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5991 lsr w2, wINST, #12 // w2<- B
5992 ubfx w9, wINST, #8, #4 // w9<- A
5993 GET_VREG w0, w2 // w0<- vB
5994 .if 0
5995 cbz w1, common_errDivideByZero
5996 .endif
5997 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5998
5999 orr w0, w0, w1 // w0<- op, w0-w3 changed
6000 GET_INST_OPCODE ip // extract opcode from rINST
6001 SET_VREG w0, w9 // vAA<- w0
6002 GOTO_OPCODE ip // jump to next instruction
6003 /* 10-13 instructions */
6004
6005
6006/* ------------------------------ */
6007 .balign 128
6008.L_op_xor_int_lit16: /* 0xd7 */
6009/* File: arm64/op_xor_int_lit16.S */
6010/* File: arm64/binopLit16.S */
6011 /*
6012 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6013 * that specifies an instruction that performs "result = w0 op w1".
6014 * This could be an ARM instruction or a function call. (If the result
6015 * comes back in a register other than w0, you can override "result".)
6016 *
6017 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6018 * vCC (w1). Useful for integer division and modulus.
6019 *
6020 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6021 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6022 */
6023 /* binop/lit16 vA, vB, #+CCCC */
6024 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6025 lsr w2, wINST, #12 // w2<- B
6026 ubfx w9, wINST, #8, #4 // w9<- A
6027 GET_VREG w0, w2 // w0<- vB
6028 .if 0
6029 cbz w1, common_errDivideByZero
6030 .endif
6031 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6032
6033 eor w0, w0, w1 // w0<- op, w0-w3 changed
6034 GET_INST_OPCODE ip // extract opcode from rINST
6035 SET_VREG w0, w9 // vAA<- w0
6036 GOTO_OPCODE ip // jump to next instruction
6037 /* 10-13 instructions */
6038
6039
6040/* ------------------------------ */
6041 .balign 128
6042.L_op_add_int_lit8: /* 0xd8 */
6043/* File: arm64/op_add_int_lit8.S */
6044/* File: arm64/binopLit8.S */
6045 /*
6046 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6047 * that specifies an instruction that performs "result = w0 op w1".
6048 * This could be an ARM instruction or a function call. (If the result
6049 * comes back in a register other than w0, you can override "result".)
6050 *
6051 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6052 * vCC (w1). Useful for integer division and modulus.
6053 *
6054 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6055 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6056 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6057 */
6058 /* binop/lit8 vAA, vBB, #+CC */
6059 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6060 lsr w9, wINST, #8 // w9<- AA
6061 and w2, w3, #255 // w2<- BB
6062 GET_VREG w0, w2 // w0<- vBB
6063 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6064 .if 0
6065 cbz w1, common_errDivideByZero
6066 .endif
6067 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6068 // optional op; may set condition codes
6069 add w0, w0, w1 // w0<- op, w0-w3 changed
6070 GET_INST_OPCODE ip // extract opcode from rINST
6071 SET_VREG w0, w9 // vAA<- w0
6072 GOTO_OPCODE ip // jump to next instruction
6073 /* 10-12 instructions */
6074
6075
6076/* ------------------------------ */
6077 .balign 128
6078.L_op_rsub_int_lit8: /* 0xd9 */
6079/* File: arm64/op_rsub_int_lit8.S */
6080/* File: arm64/binopLit8.S */
6081 /*
6082 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6083 * that specifies an instruction that performs "result = w0 op w1".
6084 * This could be an ARM instruction or a function call. (If the result
6085 * comes back in a register other than w0, you can override "result".)
6086 *
6087 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6088 * vCC (w1). Useful for integer division and modulus.
6089 *
6090 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6091 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6092 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6093 */
6094 /* binop/lit8 vAA, vBB, #+CC */
6095 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6096 lsr w9, wINST, #8 // w9<- AA
6097 and w2, w3, #255 // w2<- BB
6098 GET_VREG w0, w2 // w0<- vBB
6099 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6100 .if 0
6101 cbz w1, common_errDivideByZero
6102 .endif
6103 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6104 // optional op; may set condition codes
6105 sub w0, w1, w0 // w0<- op, w0-w3 changed
6106 GET_INST_OPCODE ip // extract opcode from rINST
6107 SET_VREG w0, w9 // vAA<- w0
6108 GOTO_OPCODE ip // jump to next instruction
6109 /* 10-12 instructions */
6110
6111
6112/* ------------------------------ */
6113 .balign 128
6114.L_op_mul_int_lit8: /* 0xda */
6115/* File: arm64/op_mul_int_lit8.S */
6116/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6117/* File: arm64/binopLit8.S */
6118 /*
6119 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6120 * that specifies an instruction that performs "result = w0 op w1".
6121 * This could be an ARM instruction or a function call. (If the result
6122 * comes back in a register other than w0, you can override "result".)
6123 *
6124 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6125 * vCC (w1). Useful for integer division and modulus.
6126 *
6127 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6128 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6129 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6130 */
6131 /* binop/lit8 vAA, vBB, #+CC */
6132 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6133 lsr w9, wINST, #8 // w9<- AA
6134 and w2, w3, #255 // w2<- BB
6135 GET_VREG w0, w2 // w0<- vBB
6136 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6137 .if 0
6138 cbz w1, common_errDivideByZero
6139 .endif
6140 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6141 // optional op; may set condition codes
6142 mul w0, w1, w0 // w0<- op, w0-w3 changed
6143 GET_INST_OPCODE ip // extract opcode from rINST
6144 SET_VREG w0, w9 // vAA<- w0
6145 GOTO_OPCODE ip // jump to next instruction
6146 /* 10-12 instructions */
6147
6148
6149/* ------------------------------ */
6150 .balign 128
6151.L_op_div_int_lit8: /* 0xdb */
6152/* File: arm64/op_div_int_lit8.S */
6153/* File: arm64/binopLit8.S */
6154 /*
6155 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6156 * that specifies an instruction that performs "result = w0 op w1".
6157 * This could be an ARM instruction or a function call. (If the result
6158 * comes back in a register other than w0, you can override "result".)
6159 *
6160 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6161 * vCC (w1). Useful for integer division and modulus.
6162 *
6163 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6164 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6165 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6166 */
6167 /* binop/lit8 vAA, vBB, #+CC */
6168 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6169 lsr w9, wINST, #8 // w9<- AA
6170 and w2, w3, #255 // w2<- BB
6171 GET_VREG w0, w2 // w0<- vBB
6172 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6173 .if 1
6174 cbz w1, common_errDivideByZero
6175 .endif
6176 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6177 // optional op; may set condition codes
6178 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6179 GET_INST_OPCODE ip // extract opcode from rINST
6180 SET_VREG w0, w9 // vAA<- w0
6181 GOTO_OPCODE ip // jump to next instruction
6182 /* 10-12 instructions */
6183
6184
6185/* ------------------------------ */
6186 .balign 128
6187.L_op_rem_int_lit8: /* 0xdc */
6188/* File: arm64/op_rem_int_lit8.S */
6189/* File: arm64/binopLit8.S */
6190 /*
6191 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6192 * that specifies an instruction that performs "result = w0 op w1".
6193 * This could be an ARM instruction or a function call. (If the result
6194 * comes back in a register other than w0, you can override "result".)
6195 *
6196 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6197 * vCC (w1). Useful for integer division and modulus.
6198 *
6199 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6200 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6201 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6202 */
6203 /* binop/lit8 vAA, vBB, #+CC */
6204 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6205 lsr w9, wINST, #8 // w9<- AA
6206 and w2, w3, #255 // w2<- BB
6207 GET_VREG w0, w2 // w0<- vBB
6208 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6209 .if 1
6210 cbz w1, common_errDivideByZero
6211 .endif
6212 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6213 sdiv w3, w0, w1 // optional op; may set condition codes
6214 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6215 GET_INST_OPCODE ip // extract opcode from rINST
6216 SET_VREG w0, w9 // vAA<- w0
6217 GOTO_OPCODE ip // jump to next instruction
6218 /* 10-12 instructions */
6219
6220
6221/* ------------------------------ */
6222 .balign 128
6223.L_op_and_int_lit8: /* 0xdd */
6224/* File: arm64/op_and_int_lit8.S */
6225/* File: arm64/binopLit8.S */
6226 /*
6227 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6228 * that specifies an instruction that performs "result = w0 op w1".
6229 * This could be an ARM instruction or a function call. (If the result
6230 * comes back in a register other than w0, you can override "result".)
6231 *
6232 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6233 * vCC (w1). Useful for integer division and modulus.
6234 *
6235 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6236 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6237 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6238 */
6239 /* binop/lit8 vAA, vBB, #+CC */
6240 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6241 lsr w9, wINST, #8 // w9<- AA
6242 and w2, w3, #255 // w2<- BB
6243 GET_VREG w0, w2 // w0<- vBB
6244 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6245 .if 0
6246 cbz w1, common_errDivideByZero
6247 .endif
6248 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6249 // optional op; may set condition codes
6250 and w0, w0, w1 // w0<- op, w0-w3 changed
6251 GET_INST_OPCODE ip // extract opcode from rINST
6252 SET_VREG w0, w9 // vAA<- w0
6253 GOTO_OPCODE ip // jump to next instruction
6254 /* 10-12 instructions */
6255
6256
6257/* ------------------------------ */
6258 .balign 128
6259.L_op_or_int_lit8: /* 0xde */
6260/* File: arm64/op_or_int_lit8.S */
6261/* File: arm64/binopLit8.S */
6262 /*
6263 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6264 * that specifies an instruction that performs "result = w0 op w1".
6265 * This could be an ARM instruction or a function call. (If the result
6266 * comes back in a register other than w0, you can override "result".)
6267 *
6268 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6269 * vCC (w1). Useful for integer division and modulus.
6270 *
6271 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6272 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6273 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6274 */
6275 /* binop/lit8 vAA, vBB, #+CC */
6276 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6277 lsr w9, wINST, #8 // w9<- AA
6278 and w2, w3, #255 // w2<- BB
6279 GET_VREG w0, w2 // w0<- vBB
6280 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6281 .if 0
6282 cbz w1, common_errDivideByZero
6283 .endif
6284 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6285 // optional op; may set condition codes
6286 orr w0, w0, w1 // w0<- op, w0-w3 changed
6287 GET_INST_OPCODE ip // extract opcode from rINST
6288 SET_VREG w0, w9 // vAA<- w0
6289 GOTO_OPCODE ip // jump to next instruction
6290 /* 10-12 instructions */
6291
6292
6293/* ------------------------------ */
6294 .balign 128
6295.L_op_xor_int_lit8: /* 0xdf */
6296/* File: arm64/op_xor_int_lit8.S */
6297/* File: arm64/binopLit8.S */
6298 /*
6299 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6300 * that specifies an instruction that performs "result = w0 op w1".
6301 * This could be an ARM instruction or a function call. (If the result
6302 * comes back in a register other than w0, you can override "result".)
6303 *
6304 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6305 * vCC (w1). Useful for integer division and modulus.
6306 *
6307 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6308 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6309 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6310 */
6311 /* binop/lit8 vAA, vBB, #+CC */
6312 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6313 lsr w9, wINST, #8 // w9<- AA
6314 and w2, w3, #255 // w2<- BB
6315 GET_VREG w0, w2 // w0<- vBB
6316 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6317 .if 0
6318 cbz w1, common_errDivideByZero
6319 .endif
6320 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6321 // optional op; may set condition codes
6322 eor w0, w0, w1 // w0<- op, w0-w3 changed
6323 GET_INST_OPCODE ip // extract opcode from rINST
6324 SET_VREG w0, w9 // vAA<- w0
6325 GOTO_OPCODE ip // jump to next instruction
6326 /* 10-12 instructions */
6327
6328
6329/* ------------------------------ */
6330 .balign 128
6331.L_op_shl_int_lit8: /* 0xe0 */
6332/* File: arm64/op_shl_int_lit8.S */
6333/* File: arm64/binopLit8.S */
6334 /*
6335 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6336 * that specifies an instruction that performs "result = w0 op w1".
6337 * This could be an ARM instruction or a function call. (If the result
6338 * comes back in a register other than w0, you can override "result".)
6339 *
6340 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6341 * vCC (w1). Useful for integer division and modulus.
6342 *
6343 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6344 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6345 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6346 */
6347 /* binop/lit8 vAA, vBB, #+CC */
6348 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6349 lsr w9, wINST, #8 // w9<- AA
6350 and w2, w3, #255 // w2<- BB
6351 GET_VREG w0, w2 // w0<- vBB
6352 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6353 .if 0
6354 cbz w1, common_errDivideByZero
6355 .endif
6356 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006357 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006358 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6359 GET_INST_OPCODE ip // extract opcode from rINST
6360 SET_VREG w0, w9 // vAA<- w0
6361 GOTO_OPCODE ip // jump to next instruction
6362 /* 10-12 instructions */
6363
6364
6365/* ------------------------------ */
6366 .balign 128
6367.L_op_shr_int_lit8: /* 0xe1 */
6368/* File: arm64/op_shr_int_lit8.S */
6369/* File: arm64/binopLit8.S */
6370 /*
6371 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6372 * that specifies an instruction that performs "result = w0 op w1".
6373 * This could be an ARM instruction or a function call. (If the result
6374 * comes back in a register other than w0, you can override "result".)
6375 *
6376 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6377 * vCC (w1). Useful for integer division and modulus.
6378 *
6379 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6380 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6381 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6382 */
6383 /* binop/lit8 vAA, vBB, #+CC */
6384 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6385 lsr w9, wINST, #8 // w9<- AA
6386 and w2, w3, #255 // w2<- BB
6387 GET_VREG w0, w2 // w0<- vBB
6388 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6389 .if 0
6390 cbz w1, common_errDivideByZero
6391 .endif
6392 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006393 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006394 asr w0, w0, w1 // w0<- op, w0-w3 changed
6395 GET_INST_OPCODE ip // extract opcode from rINST
6396 SET_VREG w0, w9 // vAA<- w0
6397 GOTO_OPCODE ip // jump to next instruction
6398 /* 10-12 instructions */
6399
6400
6401/* ------------------------------ */
6402 .balign 128
6403.L_op_ushr_int_lit8: /* 0xe2 */
6404/* File: arm64/op_ushr_int_lit8.S */
6405/* File: arm64/binopLit8.S */
6406 /*
6407 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6408 * that specifies an instruction that performs "result = w0 op w1".
6409 * This could be an ARM instruction or a function call. (If the result
6410 * comes back in a register other than w0, you can override "result".)
6411 *
6412 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6413 * vCC (w1). Useful for integer division and modulus.
6414 *
6415 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6416 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6417 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6418 */
6419 /* binop/lit8 vAA, vBB, #+CC */
6420 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC
6421 lsr w9, wINST, #8 // w9<- AA
6422 and w2, w3, #255 // w2<- BB
6423 GET_VREG w0, w2 // w0<- vBB
6424 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6425 .if 0
6426 cbz w1, common_errDivideByZero
6427 .endif
6428 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006429 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006430 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6431 GET_INST_OPCODE ip // extract opcode from rINST
6432 SET_VREG w0, w9 // vAA<- w0
6433 GOTO_OPCODE ip // jump to next instruction
6434 /* 10-12 instructions */
6435
6436
6437/* ------------------------------ */
6438 .balign 128
6439.L_op_iget_quick: /* 0xe3 */
6440/* File: arm64/op_iget_quick.S */
6441 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6442 /* op vA, vB, offset//CCCC */
6443 lsr w2, wINST, #12 // w2<- B
6444 FETCH w1, 1 // w1<- field byte offset
6445 GET_VREG w3, w2 // w3<- object we're operating on
6446 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006447 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006448 ldr w0, [x3, x1] // w0<- obj.field
6449 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6450
6451 SET_VREG w0, w2 // fp[A]<- w0
6452 GET_INST_OPCODE ip // extract opcode from rINST
6453 GOTO_OPCODE ip // jump to next instruction
6454
6455/* ------------------------------ */
6456 .balign 128
6457.L_op_iget_wide_quick: /* 0xe4 */
6458/* File: arm64/op_iget_wide_quick.S */
6459 /* iget-wide-quick vA, vB, offset//CCCC */
6460 lsr w2, wINST, #12 // w2<- B
6461 FETCH w4, 1 // w4<- field byte offset
6462 GET_VREG w3, w2 // w3<- object we're operating on
6463 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006464 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006465 add x4, x3, x4 // create direct pointer
6466 ldr x0, [x4]
6467 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6468 SET_VREG_WIDE x0, w2
6469 GET_INST_OPCODE ip // extract opcode from wINST
6470 GOTO_OPCODE ip // jump to next instruction
6471
6472/* ------------------------------ */
6473 .balign 128
6474.L_op_iget_object_quick: /* 0xe5 */
6475/* File: arm64/op_iget_object_quick.S */
6476 /* For: iget-object-quick */
6477 /* op vA, vB, offset//CCCC */
6478 lsr w2, wINST, #12 // w2<- B
6479 FETCH w1, 1 // w1<- field byte offset
6480 EXPORT_PC
6481 GET_VREG w0, w2 // w0<- object we're operating on
6482 bl artIGetObjectFromMterp // (obj, offset)
6483 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6484 ubfx w2, wINST, #8, #4 // w2<- A
6485 PREFETCH_INST 2
6486 cbnz w3, MterpPossibleException // bail out
6487 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6488 ADVANCE 2 // advance rPC
6489 GET_INST_OPCODE ip // extract opcode from wINST
6490 GOTO_OPCODE ip // jump to next instruction
6491
6492/* ------------------------------ */
6493 .balign 128
6494.L_op_iput_quick: /* 0xe6 */
6495/* File: arm64/op_iput_quick.S */
6496 /* For: iput-quick, iput-object-quick */
6497 /* op vA, vB, offset//CCCC */
6498 lsr w2, wINST, #12 // w2<- B
6499 FETCH w1, 1 // w1<- field byte offset
6500 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6501 ubfx w2, wINST, #8, #4 // w2<- A
6502 cmp w3, #0 // check object for null
6503 cbz w3, common_errNullObject // object was null
6504 GET_VREG w0, w2 // w0<- fp[A]
6505 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6506 str w0, [x3, x1] // obj.field<- w0
6507 GET_INST_OPCODE ip // extract opcode from rINST
6508 GOTO_OPCODE ip // jump to next instruction
6509
6510/* ------------------------------ */
6511 .balign 128
6512.L_op_iput_wide_quick: /* 0xe7 */
6513/* File: arm64/op_iput_wide_quick.S */
6514 /* iput-wide-quick vA, vB, offset//CCCC */
6515 lsr w2, wINST, #12 // w2<- B
6516 FETCH w3, 1 // w3<- field byte offset
6517 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6518 ubfx w0, wINST, #8, #4 // w0<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006519 cbz w2, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006520 GET_VREG_WIDE x0, w0 // x0-< fp[A]
6521 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6522 add x1, x2, x3 // create a direct pointer
6523 str x0, [x1]
6524 GET_INST_OPCODE ip // extract opcode from wINST
6525 GOTO_OPCODE ip // jump to next instruction
6526
6527/* ------------------------------ */
6528 .balign 128
6529.L_op_iput_object_quick: /* 0xe8 */
6530/* File: arm64/op_iput_object_quick.S */
6531 EXPORT_PC
6532 add x0, xFP, #OFF_FP_SHADOWFRAME
6533 mov x1, xPC
6534 mov w2, wINST
6535 bl MterpIputObjectQuick
6536 cbz w0, MterpException
6537 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6538 GET_INST_OPCODE ip // extract opcode from rINST
6539 GOTO_OPCODE ip // jump to next instruction
6540
6541/* ------------------------------ */
6542 .balign 128
6543.L_op_invoke_virtual_quick: /* 0xe9 */
6544/* File: arm64/op_invoke_virtual_quick.S */
6545/* File: arm64/invoke.S */
6546 /*
6547 * Generic invoke handler wrapper.
6548 */
6549 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6550 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6551 .extern MterpInvokeVirtualQuick
6552 EXPORT_PC
6553 mov x0, xSELF
6554 add x1, xFP, #OFF_FP_SHADOWFRAME
6555 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006556 mov x3, xINST
6557 bl MterpInvokeVirtualQuick
6558 cbz w0, MterpException
6559 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006560 bl MterpShouldSwitchInterpreters
6561 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006562 GET_INST_OPCODE ip
6563 GOTO_OPCODE ip
6564
6565
6566
6567/* ------------------------------ */
6568 .balign 128
6569.L_op_invoke_virtual_range_quick: /* 0xea */
6570/* File: arm64/op_invoke_virtual_range_quick.S */
6571/* File: arm64/invoke.S */
6572 /*
6573 * Generic invoke handler wrapper.
6574 */
6575 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6576 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6577 .extern MterpInvokeVirtualQuickRange
6578 EXPORT_PC
6579 mov x0, xSELF
6580 add x1, xFP, #OFF_FP_SHADOWFRAME
6581 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006582 mov x3, xINST
6583 bl MterpInvokeVirtualQuickRange
6584 cbz w0, MterpException
6585 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006586 bl MterpShouldSwitchInterpreters
6587 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006588 GET_INST_OPCODE ip
6589 GOTO_OPCODE ip
6590
6591
6592
6593/* ------------------------------ */
6594 .balign 128
6595.L_op_iput_boolean_quick: /* 0xeb */
6596/* File: arm64/op_iput_boolean_quick.S */
6597/* File: arm64/op_iput_quick.S */
6598 /* For: iput-quick, iput-object-quick */
6599 /* op vA, vB, offset//CCCC */
6600 lsr w2, wINST, #12 // w2<- B
6601 FETCH w1, 1 // w1<- field byte offset
6602 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6603 ubfx w2, wINST, #8, #4 // w2<- A
6604 cmp w3, #0 // check object for null
6605 cbz w3, common_errNullObject // object was null
6606 GET_VREG w0, w2 // w0<- fp[A]
6607 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6608 strb w0, [x3, x1] // obj.field<- w0
6609 GET_INST_OPCODE ip // extract opcode from rINST
6610 GOTO_OPCODE ip // jump to next instruction
6611
6612
6613/* ------------------------------ */
6614 .balign 128
6615.L_op_iput_byte_quick: /* 0xec */
6616/* File: arm64/op_iput_byte_quick.S */
6617/* File: arm64/op_iput_quick.S */
6618 /* For: iput-quick, iput-object-quick */
6619 /* op vA, vB, offset//CCCC */
6620 lsr w2, wINST, #12 // w2<- B
6621 FETCH w1, 1 // w1<- field byte offset
6622 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6623 ubfx w2, wINST, #8, #4 // w2<- A
6624 cmp w3, #0 // check object for null
6625 cbz w3, common_errNullObject // object was null
6626 GET_VREG w0, w2 // w0<- fp[A]
6627 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6628 strb w0, [x3, x1] // obj.field<- w0
6629 GET_INST_OPCODE ip // extract opcode from rINST
6630 GOTO_OPCODE ip // jump to next instruction
6631
6632
6633/* ------------------------------ */
6634 .balign 128
6635.L_op_iput_char_quick: /* 0xed */
6636/* File: arm64/op_iput_char_quick.S */
6637/* File: arm64/op_iput_quick.S */
6638 /* For: iput-quick, iput-object-quick */
6639 /* op vA, vB, offset//CCCC */
6640 lsr w2, wINST, #12 // w2<- B
6641 FETCH w1, 1 // w1<- field byte offset
6642 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6643 ubfx w2, wINST, #8, #4 // w2<- A
6644 cmp w3, #0 // check object for null
6645 cbz w3, common_errNullObject // object was null
6646 GET_VREG w0, w2 // w0<- fp[A]
6647 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6648 strh w0, [x3, x1] // obj.field<- w0
6649 GET_INST_OPCODE ip // extract opcode from rINST
6650 GOTO_OPCODE ip // jump to next instruction
6651
6652
6653/* ------------------------------ */
6654 .balign 128
6655.L_op_iput_short_quick: /* 0xee */
6656/* File: arm64/op_iput_short_quick.S */
6657/* File: arm64/op_iput_quick.S */
6658 /* For: iput-quick, iput-object-quick */
6659 /* op vA, vB, offset//CCCC */
6660 lsr w2, wINST, #12 // w2<- B
6661 FETCH w1, 1 // w1<- field byte offset
6662 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6663 ubfx w2, wINST, #8, #4 // w2<- A
6664 cmp w3, #0 // check object for null
6665 cbz w3, common_errNullObject // object was null
6666 GET_VREG w0, w2 // w0<- fp[A]
6667 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6668 strh w0, [x3, x1] // obj.field<- w0
6669 GET_INST_OPCODE ip // extract opcode from rINST
6670 GOTO_OPCODE ip // jump to next instruction
6671
6672
6673/* ------------------------------ */
6674 .balign 128
6675.L_op_iget_boolean_quick: /* 0xef */
6676/* File: arm64/op_iget_boolean_quick.S */
6677/* File: arm64/op_iget_quick.S */
6678 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6679 /* op vA, vB, offset//CCCC */
6680 lsr w2, wINST, #12 // w2<- B
6681 FETCH w1, 1 // w1<- field byte offset
6682 GET_VREG w3, w2 // w3<- object we're operating on
6683 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006684 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006685 ldrb w0, [x3, x1] // w0<- obj.field
6686 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6687
6688 SET_VREG w0, w2 // fp[A]<- w0
6689 GET_INST_OPCODE ip // extract opcode from rINST
6690 GOTO_OPCODE ip // jump to next instruction
6691
6692
6693/* ------------------------------ */
6694 .balign 128
6695.L_op_iget_byte_quick: /* 0xf0 */
6696/* File: arm64/op_iget_byte_quick.S */
6697/* File: arm64/op_iget_quick.S */
6698 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6699 /* op vA, vB, offset//CCCC */
6700 lsr w2, wINST, #12 // w2<- B
6701 FETCH w1, 1 // w1<- field byte offset
6702 GET_VREG w3, w2 // w3<- object we're operating on
6703 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006704 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006705 ldrsb w0, [x3, x1] // w0<- obj.field
6706 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6707
6708 SET_VREG w0, w2 // fp[A]<- w0
6709 GET_INST_OPCODE ip // extract opcode from rINST
6710 GOTO_OPCODE ip // jump to next instruction
6711
6712
6713/* ------------------------------ */
6714 .balign 128
6715.L_op_iget_char_quick: /* 0xf1 */
6716/* File: arm64/op_iget_char_quick.S */
6717/* File: arm64/op_iget_quick.S */
6718 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6719 /* op vA, vB, offset//CCCC */
6720 lsr w2, wINST, #12 // w2<- B
6721 FETCH w1, 1 // w1<- field byte offset
6722 GET_VREG w3, w2 // w3<- object we're operating on
6723 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006724 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006725 ldrh w0, [x3, x1] // w0<- obj.field
6726 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6727
6728 SET_VREG w0, w2 // fp[A]<- w0
6729 GET_INST_OPCODE ip // extract opcode from rINST
6730 GOTO_OPCODE ip // jump to next instruction
6731
6732
6733/* ------------------------------ */
6734 .balign 128
6735.L_op_iget_short_quick: /* 0xf2 */
6736/* File: arm64/op_iget_short_quick.S */
6737/* File: arm64/op_iget_quick.S */
6738 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6739 /* op vA, vB, offset//CCCC */
6740 lsr w2, wINST, #12 // w2<- B
6741 FETCH w1, 1 // w1<- field byte offset
6742 GET_VREG w3, w2 // w3<- object we're operating on
6743 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006744 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006745 ldrsh w0, [x3, x1] // w0<- obj.field
6746 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6747
6748 SET_VREG w0, w2 // fp[A]<- w0
6749 GET_INST_OPCODE ip // extract opcode from rINST
6750 GOTO_OPCODE ip // jump to next instruction
6751
6752
6753/* ------------------------------ */
6754 .balign 128
6755.L_op_invoke_lambda: /* 0xf3 */
6756/* Transfer stub to alternate interpreter */
6757 b MterpFallback
6758
6759
6760/* ------------------------------ */
6761 .balign 128
6762.L_op_unused_f4: /* 0xf4 */
6763/* File: arm64/op_unused_f4.S */
6764/* File: arm64/unused.S */
6765/*
6766 * Bail to reference interpreter to throw.
6767 */
6768 b MterpFallback
6769
6770
6771/* ------------------------------ */
6772 .balign 128
6773.L_op_capture_variable: /* 0xf5 */
6774/* Transfer stub to alternate interpreter */
6775 b MterpFallback
6776
6777
6778/* ------------------------------ */
6779 .balign 128
6780.L_op_create_lambda: /* 0xf6 */
6781/* Transfer stub to alternate interpreter */
6782 b MterpFallback
6783
6784
6785/* ------------------------------ */
6786 .balign 128
6787.L_op_liberate_variable: /* 0xf7 */
6788/* Transfer stub to alternate interpreter */
6789 b MterpFallback
6790
6791
6792/* ------------------------------ */
6793 .balign 128
6794.L_op_box_lambda: /* 0xf8 */
6795/* Transfer stub to alternate interpreter */
6796 b MterpFallback
6797
6798
6799/* ------------------------------ */
6800 .balign 128
6801.L_op_unbox_lambda: /* 0xf9 */
6802/* Transfer stub to alternate interpreter */
6803 b MterpFallback
6804
6805
6806/* ------------------------------ */
6807 .balign 128
6808.L_op_unused_fa: /* 0xfa */
6809/* File: arm64/op_unused_fa.S */
6810/* File: arm64/unused.S */
6811/*
6812 * Bail to reference interpreter to throw.
6813 */
6814 b MterpFallback
6815
6816
6817/* ------------------------------ */
6818 .balign 128
6819.L_op_unused_fb: /* 0xfb */
6820/* File: arm64/op_unused_fb.S */
6821/* File: arm64/unused.S */
6822/*
6823 * Bail to reference interpreter to throw.
6824 */
6825 b MterpFallback
6826
6827
6828/* ------------------------------ */
6829 .balign 128
6830.L_op_unused_fc: /* 0xfc */
6831/* File: arm64/op_unused_fc.S */
6832/* File: arm64/unused.S */
6833/*
6834 * Bail to reference interpreter to throw.
6835 */
6836 b MterpFallback
6837
6838
6839/* ------------------------------ */
6840 .balign 128
6841.L_op_unused_fd: /* 0xfd */
6842/* File: arm64/op_unused_fd.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_fe: /* 0xfe */
6853/* File: arm64/op_unused_fe.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_ff: /* 0xff */
6864/* File: arm64/op_unused_ff.S */
6865/* File: arm64/unused.S */
6866/*
6867 * Bail to reference interpreter to throw.
6868 */
6869 b MterpFallback
6870
6871
6872 .balign 128
6873 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
6874 .global artMterpAsmInstructionEnd
6875artMterpAsmInstructionEnd:
6876
6877/*
6878 * ===========================================================================
6879 * Sister implementations
6880 * ===========================================================================
6881 */
6882 .global artMterpAsmSisterStart
6883 .type artMterpAsmSisterStart, %function
6884 .text
6885 .balign 4
6886artMterpAsmSisterStart:
6887
6888 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
6889 .global artMterpAsmSisterEnd
6890artMterpAsmSisterEnd:
6891
6892
6893 .global artMterpAsmAltInstructionStart
6894 .type artMterpAsmAltInstructionStart, %function
6895 .text
6896
6897artMterpAsmAltInstructionStart = .L_ALT_op_nop
6898/* ------------------------------ */
6899 .balign 128
6900.L_ALT_op_nop: /* 0x00 */
6901/* File: arm64/alt_stub.S */
6902/*
6903 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6904 * any interesting requests and then jump to the real instruction
6905 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6906 */
6907 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006908 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6909 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
6910 mov x0, xSELF
6911 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006912 mov x2, xPC
6913 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006914
6915/* ------------------------------ */
6916 .balign 128
6917.L_ALT_op_move: /* 0x01 */
6918/* File: arm64/alt_stub.S */
6919/*
6920 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6921 * any interesting requests and then jump to the real instruction
6922 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6923 */
6924 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006925 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6926 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
6927 mov x0, xSELF
6928 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006929 mov x2, xPC
6930 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006931
6932/* ------------------------------ */
6933 .balign 128
6934.L_ALT_op_move_from16: /* 0x02 */
6935/* File: arm64/alt_stub.S */
6936/*
6937 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6938 * any interesting requests and then jump to the real instruction
6939 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6940 */
6941 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006942 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6943 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
6944 mov x0, xSELF
6945 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006946 mov x2, xPC
6947 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006948
6949/* ------------------------------ */
6950 .balign 128
6951.L_ALT_op_move_16: /* 0x03 */
6952/* File: arm64/alt_stub.S */
6953/*
6954 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6955 * any interesting requests and then jump to the real instruction
6956 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6957 */
6958 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006959 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6960 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
6961 mov x0, xSELF
6962 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006963 mov x2, xPC
6964 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006965
6966/* ------------------------------ */
6967 .balign 128
6968.L_ALT_op_move_wide: /* 0x04 */
6969/* File: arm64/alt_stub.S */
6970/*
6971 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6972 * any interesting requests and then jump to the real instruction
6973 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6974 */
6975 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006976 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6977 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
6978 mov x0, xSELF
6979 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006980 mov x2, xPC
6981 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006982
6983/* ------------------------------ */
6984 .balign 128
6985.L_ALT_op_move_wide_from16: /* 0x05 */
6986/* File: arm64/alt_stub.S */
6987/*
6988 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
6989 * any interesting requests and then jump to the real instruction
6990 * handler. Note that the call to MterpCheckBefore is done as a tail call.
6991 */
6992 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006993 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
6994 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
6995 mov x0, xSELF
6996 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00006997 mov x2, xPC
6998 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006999
7000/* ------------------------------ */
7001 .balign 128
7002.L_ALT_op_move_wide_16: /* 0x06 */
7003/* File: arm64/alt_stub.S */
7004/*
7005 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7006 * any interesting requests and then jump to the real instruction
7007 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7008 */
7009 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007010 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7011 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7012 mov x0, xSELF
7013 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007014 mov x2, xPC
7015 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007016
7017/* ------------------------------ */
7018 .balign 128
7019.L_ALT_op_move_object: /* 0x07 */
7020/* File: arm64/alt_stub.S */
7021/*
7022 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7023 * any interesting requests and then jump to the real instruction
7024 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7025 */
7026 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007027 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7028 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7029 mov x0, xSELF
7030 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007031 mov x2, xPC
7032 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007033
7034/* ------------------------------ */
7035 .balign 128
7036.L_ALT_op_move_object_from16: /* 0x08 */
7037/* File: arm64/alt_stub.S */
7038/*
7039 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7040 * any interesting requests and then jump to the real instruction
7041 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7042 */
7043 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007044 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7045 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7046 mov x0, xSELF
7047 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007048 mov x2, xPC
7049 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007050
7051/* ------------------------------ */
7052 .balign 128
7053.L_ALT_op_move_object_16: /* 0x09 */
7054/* File: arm64/alt_stub.S */
7055/*
7056 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7057 * any interesting requests and then jump to the real instruction
7058 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7059 */
7060 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007061 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7062 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7063 mov x0, xSELF
7064 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007065 mov x2, xPC
7066 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007067
7068/* ------------------------------ */
7069 .balign 128
7070.L_ALT_op_move_result: /* 0x0a */
7071/* File: arm64/alt_stub.S */
7072/*
7073 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7074 * any interesting requests and then jump to the real instruction
7075 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7076 */
7077 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007078 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7079 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7080 mov x0, xSELF
7081 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007082 mov x2, xPC
7083 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007084
7085/* ------------------------------ */
7086 .balign 128
7087.L_ALT_op_move_result_wide: /* 0x0b */
7088/* File: arm64/alt_stub.S */
7089/*
7090 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7091 * any interesting requests and then jump to the real instruction
7092 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7093 */
7094 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007095 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7096 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7097 mov x0, xSELF
7098 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007099 mov x2, xPC
7100 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007101
7102/* ------------------------------ */
7103 .balign 128
7104.L_ALT_op_move_result_object: /* 0x0c */
7105/* File: arm64/alt_stub.S */
7106/*
7107 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7108 * any interesting requests and then jump to the real instruction
7109 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7110 */
7111 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007112 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7113 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7114 mov x0, xSELF
7115 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007116 mov x2, xPC
7117 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007118
7119/* ------------------------------ */
7120 .balign 128
7121.L_ALT_op_move_exception: /* 0x0d */
7122/* File: arm64/alt_stub.S */
7123/*
7124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7125 * any interesting requests and then jump to the real instruction
7126 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7127 */
7128 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007129 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7130 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7131 mov x0, xSELF
7132 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007133 mov x2, xPC
7134 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007135
7136/* ------------------------------ */
7137 .balign 128
7138.L_ALT_op_return_void: /* 0x0e */
7139/* File: arm64/alt_stub.S */
7140/*
7141 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7142 * any interesting requests and then jump to the real instruction
7143 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7144 */
7145 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007146 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7147 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7148 mov x0, xSELF
7149 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007150 mov x2, xPC
7151 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007152
7153/* ------------------------------ */
7154 .balign 128
7155.L_ALT_op_return: /* 0x0f */
7156/* File: arm64/alt_stub.S */
7157/*
7158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7159 * any interesting requests and then jump to the real instruction
7160 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7161 */
7162 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007163 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7164 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7165 mov x0, xSELF
7166 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007167 mov x2, xPC
7168 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007169
7170/* ------------------------------ */
7171 .balign 128
7172.L_ALT_op_return_wide: /* 0x10 */
7173/* File: arm64/alt_stub.S */
7174/*
7175 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7176 * any interesting requests and then jump to the real instruction
7177 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7178 */
7179 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007180 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7181 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7182 mov x0, xSELF
7183 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007184 mov x2, xPC
7185 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007186
7187/* ------------------------------ */
7188 .balign 128
7189.L_ALT_op_return_object: /* 0x11 */
7190/* File: arm64/alt_stub.S */
7191/*
7192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7193 * any interesting requests and then jump to the real instruction
7194 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7195 */
7196 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007197 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7198 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7199 mov x0, xSELF
7200 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007201 mov x2, xPC
7202 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007203
7204/* ------------------------------ */
7205 .balign 128
7206.L_ALT_op_const_4: /* 0x12 */
7207/* File: arm64/alt_stub.S */
7208/*
7209 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7210 * any interesting requests and then jump to the real instruction
7211 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7212 */
7213 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007214 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7215 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7216 mov x0, xSELF
7217 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007218 mov x2, xPC
7219 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007220
7221/* ------------------------------ */
7222 .balign 128
7223.L_ALT_op_const_16: /* 0x13 */
7224/* File: arm64/alt_stub.S */
7225/*
7226 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7227 * any interesting requests and then jump to the real instruction
7228 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7229 */
7230 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007231 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7232 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7233 mov x0, xSELF
7234 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007235 mov x2, xPC
7236 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007237
7238/* ------------------------------ */
7239 .balign 128
7240.L_ALT_op_const: /* 0x14 */
7241/* File: arm64/alt_stub.S */
7242/*
7243 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7244 * any interesting requests and then jump to the real instruction
7245 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7246 */
7247 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007248 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7249 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7250 mov x0, xSELF
7251 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007252 mov x2, xPC
7253 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007254
7255/* ------------------------------ */
7256 .balign 128
7257.L_ALT_op_const_high16: /* 0x15 */
7258/* File: arm64/alt_stub.S */
7259/*
7260 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7261 * any interesting requests and then jump to the real instruction
7262 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7263 */
7264 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007265 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7266 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7267 mov x0, xSELF
7268 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007269 mov x2, xPC
7270 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007271
7272/* ------------------------------ */
7273 .balign 128
7274.L_ALT_op_const_wide_16: /* 0x16 */
7275/* File: arm64/alt_stub.S */
7276/*
7277 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7278 * any interesting requests and then jump to the real instruction
7279 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7280 */
7281 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007282 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7283 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7284 mov x0, xSELF
7285 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007286 mov x2, xPC
7287 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007288
7289/* ------------------------------ */
7290 .balign 128
7291.L_ALT_op_const_wide_32: /* 0x17 */
7292/* File: arm64/alt_stub.S */
7293/*
7294 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7295 * any interesting requests and then jump to the real instruction
7296 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7297 */
7298 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007299 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7300 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7301 mov x0, xSELF
7302 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007303 mov x2, xPC
7304 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007305
7306/* ------------------------------ */
7307 .balign 128
7308.L_ALT_op_const_wide: /* 0x18 */
7309/* File: arm64/alt_stub.S */
7310/*
7311 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7312 * any interesting requests and then jump to the real instruction
7313 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7314 */
7315 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007316 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7317 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7318 mov x0, xSELF
7319 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007320 mov x2, xPC
7321 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007322
7323/* ------------------------------ */
7324 .balign 128
7325.L_ALT_op_const_wide_high16: /* 0x19 */
7326/* File: arm64/alt_stub.S */
7327/*
7328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7329 * any interesting requests and then jump to the real instruction
7330 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7331 */
7332 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007333 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7334 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7335 mov x0, xSELF
7336 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007337 mov x2, xPC
7338 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007339
7340/* ------------------------------ */
7341 .balign 128
7342.L_ALT_op_const_string: /* 0x1a */
7343/* File: arm64/alt_stub.S */
7344/*
7345 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7346 * any interesting requests and then jump to the real instruction
7347 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7348 */
7349 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007350 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7351 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7352 mov x0, xSELF
7353 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007354 mov x2, xPC
7355 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007356
7357/* ------------------------------ */
7358 .balign 128
7359.L_ALT_op_const_string_jumbo: /* 0x1b */
7360/* File: arm64/alt_stub.S */
7361/*
7362 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7363 * any interesting requests and then jump to the real instruction
7364 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7365 */
7366 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007367 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7368 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7369 mov x0, xSELF
7370 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007371 mov x2, xPC
7372 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007373
7374/* ------------------------------ */
7375 .balign 128
7376.L_ALT_op_const_class: /* 0x1c */
7377/* File: arm64/alt_stub.S */
7378/*
7379 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7380 * any interesting requests and then jump to the real instruction
7381 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7382 */
7383 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007384 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7385 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7386 mov x0, xSELF
7387 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007388 mov x2, xPC
7389 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007390
7391/* ------------------------------ */
7392 .balign 128
7393.L_ALT_op_monitor_enter: /* 0x1d */
7394/* File: arm64/alt_stub.S */
7395/*
7396 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7397 * any interesting requests and then jump to the real instruction
7398 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7399 */
7400 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007401 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7402 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7403 mov x0, xSELF
7404 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007405 mov x2, xPC
7406 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007407
7408/* ------------------------------ */
7409 .balign 128
7410.L_ALT_op_monitor_exit: /* 0x1e */
7411/* File: arm64/alt_stub.S */
7412/*
7413 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7414 * any interesting requests and then jump to the real instruction
7415 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7416 */
7417 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007418 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7419 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7420 mov x0, xSELF
7421 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007422 mov x2, xPC
7423 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007424
7425/* ------------------------------ */
7426 .balign 128
7427.L_ALT_op_check_cast: /* 0x1f */
7428/* File: arm64/alt_stub.S */
7429/*
7430 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7431 * any interesting requests and then jump to the real instruction
7432 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7433 */
7434 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007435 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7436 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7437 mov x0, xSELF
7438 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007439 mov x2, xPC
7440 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007441
7442/* ------------------------------ */
7443 .balign 128
7444.L_ALT_op_instance_of: /* 0x20 */
7445/* File: arm64/alt_stub.S */
7446/*
7447 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7448 * any interesting requests and then jump to the real instruction
7449 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7450 */
7451 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007452 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7453 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7454 mov x0, xSELF
7455 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007456 mov x2, xPC
7457 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007458
7459/* ------------------------------ */
7460 .balign 128
7461.L_ALT_op_array_length: /* 0x21 */
7462/* File: arm64/alt_stub.S */
7463/*
7464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7465 * any interesting requests and then jump to the real instruction
7466 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7467 */
7468 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007469 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7470 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7471 mov x0, xSELF
7472 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007473 mov x2, xPC
7474 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007475
7476/* ------------------------------ */
7477 .balign 128
7478.L_ALT_op_new_instance: /* 0x22 */
7479/* File: arm64/alt_stub.S */
7480/*
7481 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7482 * any interesting requests and then jump to the real instruction
7483 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7484 */
7485 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007486 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7487 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7488 mov x0, xSELF
7489 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007490 mov x2, xPC
7491 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007492
7493/* ------------------------------ */
7494 .balign 128
7495.L_ALT_op_new_array: /* 0x23 */
7496/* File: arm64/alt_stub.S */
7497/*
7498 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7499 * any interesting requests and then jump to the real instruction
7500 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7501 */
7502 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007503 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7504 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7505 mov x0, xSELF
7506 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007507 mov x2, xPC
7508 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007509
7510/* ------------------------------ */
7511 .balign 128
7512.L_ALT_op_filled_new_array: /* 0x24 */
7513/* File: arm64/alt_stub.S */
7514/*
7515 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7516 * any interesting requests and then jump to the real instruction
7517 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7518 */
7519 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007520 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7521 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7522 mov x0, xSELF
7523 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007524 mov x2, xPC
7525 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007526
7527/* ------------------------------ */
7528 .balign 128
7529.L_ALT_op_filled_new_array_range: /* 0x25 */
7530/* File: arm64/alt_stub.S */
7531/*
7532 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7533 * any interesting requests and then jump to the real instruction
7534 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7535 */
7536 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007537 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7538 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7539 mov x0, xSELF
7540 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007541 mov x2, xPC
7542 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007543
7544/* ------------------------------ */
7545 .balign 128
7546.L_ALT_op_fill_array_data: /* 0x26 */
7547/* File: arm64/alt_stub.S */
7548/*
7549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7550 * any interesting requests and then jump to the real instruction
7551 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7552 */
7553 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007554 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7555 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7556 mov x0, xSELF
7557 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007558 mov x2, xPC
7559 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007560
7561/* ------------------------------ */
7562 .balign 128
7563.L_ALT_op_throw: /* 0x27 */
7564/* File: arm64/alt_stub.S */
7565/*
7566 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7567 * any interesting requests and then jump to the real instruction
7568 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7569 */
7570 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007571 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7572 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
7573 mov x0, xSELF
7574 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007575 mov x2, xPC
7576 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007577
7578/* ------------------------------ */
7579 .balign 128
7580.L_ALT_op_goto: /* 0x28 */
7581/* File: arm64/alt_stub.S */
7582/*
7583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7584 * any interesting requests and then jump to the real instruction
7585 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7586 */
7587 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007588 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7589 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
7590 mov x0, xSELF
7591 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007592 mov x2, xPC
7593 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007594
7595/* ------------------------------ */
7596 .balign 128
7597.L_ALT_op_goto_16: /* 0x29 */
7598/* File: arm64/alt_stub.S */
7599/*
7600 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7601 * any interesting requests and then jump to the real instruction
7602 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7603 */
7604 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007605 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7606 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
7607 mov x0, xSELF
7608 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007609 mov x2, xPC
7610 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007611
7612/* ------------------------------ */
7613 .balign 128
7614.L_ALT_op_goto_32: /* 0x2a */
7615/* File: arm64/alt_stub.S */
7616/*
7617 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7618 * any interesting requests and then jump to the real instruction
7619 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7620 */
7621 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007622 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7623 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
7624 mov x0, xSELF
7625 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007626 mov x2, xPC
7627 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007628
7629/* ------------------------------ */
7630 .balign 128
7631.L_ALT_op_packed_switch: /* 0x2b */
7632/* File: arm64/alt_stub.S */
7633/*
7634 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7635 * any interesting requests and then jump to the real instruction
7636 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7637 */
7638 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007639 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7640 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
7641 mov x0, xSELF
7642 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007643 mov x2, xPC
7644 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007645
7646/* ------------------------------ */
7647 .balign 128
7648.L_ALT_op_sparse_switch: /* 0x2c */
7649/* File: arm64/alt_stub.S */
7650/*
7651 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7652 * any interesting requests and then jump to the real instruction
7653 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7654 */
7655 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007656 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7657 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
7658 mov x0, xSELF
7659 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007660 mov x2, xPC
7661 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007662
7663/* ------------------------------ */
7664 .balign 128
7665.L_ALT_op_cmpl_float: /* 0x2d */
7666/* File: arm64/alt_stub.S */
7667/*
7668 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7669 * any interesting requests and then jump to the real instruction
7670 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7671 */
7672 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007673 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7674 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
7675 mov x0, xSELF
7676 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007677 mov x2, xPC
7678 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007679
7680/* ------------------------------ */
7681 .balign 128
7682.L_ALT_op_cmpg_float: /* 0x2e */
7683/* File: arm64/alt_stub.S */
7684/*
7685 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7686 * any interesting requests and then jump to the real instruction
7687 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7688 */
7689 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007690 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7691 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
7692 mov x0, xSELF
7693 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007694 mov x2, xPC
7695 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007696
7697/* ------------------------------ */
7698 .balign 128
7699.L_ALT_op_cmpl_double: /* 0x2f */
7700/* File: arm64/alt_stub.S */
7701/*
7702 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7703 * any interesting requests and then jump to the real instruction
7704 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7705 */
7706 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007707 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7708 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
7709 mov x0, xSELF
7710 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007711 mov x2, xPC
7712 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007713
7714/* ------------------------------ */
7715 .balign 128
7716.L_ALT_op_cmpg_double: /* 0x30 */
7717/* File: arm64/alt_stub.S */
7718/*
7719 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7720 * any interesting requests and then jump to the real instruction
7721 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7722 */
7723 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007724 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7725 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
7726 mov x0, xSELF
7727 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007728 mov x2, xPC
7729 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007730
7731/* ------------------------------ */
7732 .balign 128
7733.L_ALT_op_cmp_long: /* 0x31 */
7734/* File: arm64/alt_stub.S */
7735/*
7736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7737 * any interesting requests and then jump to the real instruction
7738 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7739 */
7740 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007741 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7742 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
7743 mov x0, xSELF
7744 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007745 mov x2, xPC
7746 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007747
7748/* ------------------------------ */
7749 .balign 128
7750.L_ALT_op_if_eq: /* 0x32 */
7751/* File: arm64/alt_stub.S */
7752/*
7753 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7754 * any interesting requests and then jump to the real instruction
7755 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7756 */
7757 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007758 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7759 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
7760 mov x0, xSELF
7761 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007762 mov x2, xPC
7763 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007764
7765/* ------------------------------ */
7766 .balign 128
7767.L_ALT_op_if_ne: /* 0x33 */
7768/* File: arm64/alt_stub.S */
7769/*
7770 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7771 * any interesting requests and then jump to the real instruction
7772 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7773 */
7774 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007775 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7776 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
7777 mov x0, xSELF
7778 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007779 mov x2, xPC
7780 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007781
7782/* ------------------------------ */
7783 .balign 128
7784.L_ALT_op_if_lt: /* 0x34 */
7785/* File: arm64/alt_stub.S */
7786/*
7787 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7788 * any interesting requests and then jump to the real instruction
7789 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7790 */
7791 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007792 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7793 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
7794 mov x0, xSELF
7795 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007796 mov x2, xPC
7797 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007798
7799/* ------------------------------ */
7800 .balign 128
7801.L_ALT_op_if_ge: /* 0x35 */
7802/* File: arm64/alt_stub.S */
7803/*
7804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7805 * any interesting requests and then jump to the real instruction
7806 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7807 */
7808 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007809 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7810 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
7811 mov x0, xSELF
7812 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007813 mov x2, xPC
7814 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007815
7816/* ------------------------------ */
7817 .balign 128
7818.L_ALT_op_if_gt: /* 0x36 */
7819/* File: arm64/alt_stub.S */
7820/*
7821 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7822 * any interesting requests and then jump to the real instruction
7823 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7824 */
7825 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007826 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7827 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
7828 mov x0, xSELF
7829 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007830 mov x2, xPC
7831 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007832
7833/* ------------------------------ */
7834 .balign 128
7835.L_ALT_op_if_le: /* 0x37 */
7836/* File: arm64/alt_stub.S */
7837/*
7838 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7839 * any interesting requests and then jump to the real instruction
7840 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7841 */
7842 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007843 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7844 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
7845 mov x0, xSELF
7846 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007847 mov x2, xPC
7848 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007849
7850/* ------------------------------ */
7851 .balign 128
7852.L_ALT_op_if_eqz: /* 0x38 */
7853/* File: arm64/alt_stub.S */
7854/*
7855 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7856 * any interesting requests and then jump to the real instruction
7857 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7858 */
7859 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007860 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7861 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
7862 mov x0, xSELF
7863 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007864 mov x2, xPC
7865 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007866
7867/* ------------------------------ */
7868 .balign 128
7869.L_ALT_op_if_nez: /* 0x39 */
7870/* File: arm64/alt_stub.S */
7871/*
7872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7873 * any interesting requests and then jump to the real instruction
7874 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7875 */
7876 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007877 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7878 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
7879 mov x0, xSELF
7880 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007881 mov x2, xPC
7882 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007883
7884/* ------------------------------ */
7885 .balign 128
7886.L_ALT_op_if_ltz: /* 0x3a */
7887/* File: arm64/alt_stub.S */
7888/*
7889 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7890 * any interesting requests and then jump to the real instruction
7891 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7892 */
7893 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007894 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7895 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
7896 mov x0, xSELF
7897 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007898 mov x2, xPC
7899 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007900
7901/* ------------------------------ */
7902 .balign 128
7903.L_ALT_op_if_gez: /* 0x3b */
7904/* File: arm64/alt_stub.S */
7905/*
7906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7907 * any interesting requests and then jump to the real instruction
7908 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7909 */
7910 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007911 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7912 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
7913 mov x0, xSELF
7914 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007915 mov x2, xPC
7916 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007917
7918/* ------------------------------ */
7919 .balign 128
7920.L_ALT_op_if_gtz: /* 0x3c */
7921/* File: arm64/alt_stub.S */
7922/*
7923 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7924 * any interesting requests and then jump to the real instruction
7925 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7926 */
7927 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007928 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7929 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
7930 mov x0, xSELF
7931 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007932 mov x2, xPC
7933 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007934
7935/* ------------------------------ */
7936 .balign 128
7937.L_ALT_op_if_lez: /* 0x3d */
7938/* File: arm64/alt_stub.S */
7939/*
7940 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7941 * any interesting requests and then jump to the real instruction
7942 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7943 */
7944 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007945 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7946 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
7947 mov x0, xSELF
7948 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007949 mov x2, xPC
7950 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007951
7952/* ------------------------------ */
7953 .balign 128
7954.L_ALT_op_unused_3e: /* 0x3e */
7955/* File: arm64/alt_stub.S */
7956/*
7957 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7958 * any interesting requests and then jump to the real instruction
7959 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7960 */
7961 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007962 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7963 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
7964 mov x0, xSELF
7965 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007966 mov x2, xPC
7967 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007968
7969/* ------------------------------ */
7970 .balign 128
7971.L_ALT_op_unused_3f: /* 0x3f */
7972/* File: arm64/alt_stub.S */
7973/*
7974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7975 * any interesting requests and then jump to the real instruction
7976 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7977 */
7978 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007979 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7980 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
7981 mov x0, xSELF
7982 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007983 mov x2, xPC
7984 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007985
7986/* ------------------------------ */
7987 .balign 128
7988.L_ALT_op_unused_40: /* 0x40 */
7989/* File: arm64/alt_stub.S */
7990/*
7991 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7992 * any interesting requests and then jump to the real instruction
7993 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7994 */
7995 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007996 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7997 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
7998 mov x0, xSELF
7999 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008000 mov x2, xPC
8001 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008002
8003/* ------------------------------ */
8004 .balign 128
8005.L_ALT_op_unused_41: /* 0x41 */
8006/* File: arm64/alt_stub.S */
8007/*
8008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8009 * any interesting requests and then jump to the real instruction
8010 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8011 */
8012 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008013 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8014 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8015 mov x0, xSELF
8016 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008017 mov x2, xPC
8018 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008019
8020/* ------------------------------ */
8021 .balign 128
8022.L_ALT_op_unused_42: /* 0x42 */
8023/* File: arm64/alt_stub.S */
8024/*
8025 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8026 * any interesting requests and then jump to the real instruction
8027 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8028 */
8029 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008030 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8031 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8032 mov x0, xSELF
8033 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008034 mov x2, xPC
8035 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008036
8037/* ------------------------------ */
8038 .balign 128
8039.L_ALT_op_unused_43: /* 0x43 */
8040/* File: arm64/alt_stub.S */
8041/*
8042 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8043 * any interesting requests and then jump to the real instruction
8044 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8045 */
8046 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008047 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8048 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8049 mov x0, xSELF
8050 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008051 mov x2, xPC
8052 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008053
8054/* ------------------------------ */
8055 .balign 128
8056.L_ALT_op_aget: /* 0x44 */
8057/* File: arm64/alt_stub.S */
8058/*
8059 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8060 * any interesting requests and then jump to the real instruction
8061 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8062 */
8063 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008064 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8065 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8066 mov x0, xSELF
8067 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008068 mov x2, xPC
8069 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008070
8071/* ------------------------------ */
8072 .balign 128
8073.L_ALT_op_aget_wide: /* 0x45 */
8074/* File: arm64/alt_stub.S */
8075/*
8076 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8077 * any interesting requests and then jump to the real instruction
8078 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8079 */
8080 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008081 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8082 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8083 mov x0, xSELF
8084 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008085 mov x2, xPC
8086 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008087
8088/* ------------------------------ */
8089 .balign 128
8090.L_ALT_op_aget_object: /* 0x46 */
8091/* File: arm64/alt_stub.S */
8092/*
8093 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8094 * any interesting requests and then jump to the real instruction
8095 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8096 */
8097 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008098 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8099 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8100 mov x0, xSELF
8101 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008102 mov x2, xPC
8103 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008104
8105/* ------------------------------ */
8106 .balign 128
8107.L_ALT_op_aget_boolean: /* 0x47 */
8108/* File: arm64/alt_stub.S */
8109/*
8110 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8111 * any interesting requests and then jump to the real instruction
8112 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8113 */
8114 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008115 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8116 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8117 mov x0, xSELF
8118 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008119 mov x2, xPC
8120 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008121
8122/* ------------------------------ */
8123 .balign 128
8124.L_ALT_op_aget_byte: /* 0x48 */
8125/* File: arm64/alt_stub.S */
8126/*
8127 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8128 * any interesting requests and then jump to the real instruction
8129 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8130 */
8131 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008132 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8133 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8134 mov x0, xSELF
8135 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008136 mov x2, xPC
8137 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008138
8139/* ------------------------------ */
8140 .balign 128
8141.L_ALT_op_aget_char: /* 0x49 */
8142/* File: arm64/alt_stub.S */
8143/*
8144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8145 * any interesting requests and then jump to the real instruction
8146 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8147 */
8148 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008149 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8150 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8151 mov x0, xSELF
8152 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008153 mov x2, xPC
8154 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008155
8156/* ------------------------------ */
8157 .balign 128
8158.L_ALT_op_aget_short: /* 0x4a */
8159/* File: arm64/alt_stub.S */
8160/*
8161 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8162 * any interesting requests and then jump to the real instruction
8163 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8164 */
8165 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008166 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8167 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8168 mov x0, xSELF
8169 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008170 mov x2, xPC
8171 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008172
8173/* ------------------------------ */
8174 .balign 128
8175.L_ALT_op_aput: /* 0x4b */
8176/* File: arm64/alt_stub.S */
8177/*
8178 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8179 * any interesting requests and then jump to the real instruction
8180 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8181 */
8182 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008183 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8184 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8185 mov x0, xSELF
8186 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008187 mov x2, xPC
8188 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008189
8190/* ------------------------------ */
8191 .balign 128
8192.L_ALT_op_aput_wide: /* 0x4c */
8193/* File: arm64/alt_stub.S */
8194/*
8195 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8196 * any interesting requests and then jump to the real instruction
8197 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8198 */
8199 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008200 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8201 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8202 mov x0, xSELF
8203 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008204 mov x2, xPC
8205 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008206
8207/* ------------------------------ */
8208 .balign 128
8209.L_ALT_op_aput_object: /* 0x4d */
8210/* File: arm64/alt_stub.S */
8211/*
8212 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8213 * any interesting requests and then jump to the real instruction
8214 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8215 */
8216 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008217 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8218 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8219 mov x0, xSELF
8220 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008221 mov x2, xPC
8222 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008223
8224/* ------------------------------ */
8225 .balign 128
8226.L_ALT_op_aput_boolean: /* 0x4e */
8227/* File: arm64/alt_stub.S */
8228/*
8229 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8230 * any interesting requests and then jump to the real instruction
8231 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8232 */
8233 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008234 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8235 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8236 mov x0, xSELF
8237 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008238 mov x2, xPC
8239 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008240
8241/* ------------------------------ */
8242 .balign 128
8243.L_ALT_op_aput_byte: /* 0x4f */
8244/* File: arm64/alt_stub.S */
8245/*
8246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8247 * any interesting requests and then jump to the real instruction
8248 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8249 */
8250 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008251 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8252 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8253 mov x0, xSELF
8254 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008255 mov x2, xPC
8256 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008257
8258/* ------------------------------ */
8259 .balign 128
8260.L_ALT_op_aput_char: /* 0x50 */
8261/* File: arm64/alt_stub.S */
8262/*
8263 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8264 * any interesting requests and then jump to the real instruction
8265 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8266 */
8267 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008268 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8269 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8270 mov x0, xSELF
8271 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008272 mov x2, xPC
8273 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008274
8275/* ------------------------------ */
8276 .balign 128
8277.L_ALT_op_aput_short: /* 0x51 */
8278/* File: arm64/alt_stub.S */
8279/*
8280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8281 * any interesting requests and then jump to the real instruction
8282 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8283 */
8284 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008285 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8286 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8287 mov x0, xSELF
8288 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008289 mov x2, xPC
8290 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008291
8292/* ------------------------------ */
8293 .balign 128
8294.L_ALT_op_iget: /* 0x52 */
8295/* File: arm64/alt_stub.S */
8296/*
8297 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8298 * any interesting requests and then jump to the real instruction
8299 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8300 */
8301 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008302 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8303 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8304 mov x0, xSELF
8305 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008306 mov x2, xPC
8307 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008308
8309/* ------------------------------ */
8310 .balign 128
8311.L_ALT_op_iget_wide: /* 0x53 */
8312/* File: arm64/alt_stub.S */
8313/*
8314 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8315 * any interesting requests and then jump to the real instruction
8316 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8317 */
8318 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008319 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8320 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8321 mov x0, xSELF
8322 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008323 mov x2, xPC
8324 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008325
8326/* ------------------------------ */
8327 .balign 128
8328.L_ALT_op_iget_object: /* 0x54 */
8329/* File: arm64/alt_stub.S */
8330/*
8331 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8332 * any interesting requests and then jump to the real instruction
8333 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8334 */
8335 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008336 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8337 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8338 mov x0, xSELF
8339 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008340 mov x2, xPC
8341 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008342
8343/* ------------------------------ */
8344 .balign 128
8345.L_ALT_op_iget_boolean: /* 0x55 */
8346/* File: arm64/alt_stub.S */
8347/*
8348 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8349 * any interesting requests and then jump to the real instruction
8350 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8351 */
8352 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008353 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8354 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8355 mov x0, xSELF
8356 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008357 mov x2, xPC
8358 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008359
8360/* ------------------------------ */
8361 .balign 128
8362.L_ALT_op_iget_byte: /* 0x56 */
8363/* File: arm64/alt_stub.S */
8364/*
8365 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8366 * any interesting requests and then jump to the real instruction
8367 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8368 */
8369 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008370 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8371 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8372 mov x0, xSELF
8373 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008374 mov x2, xPC
8375 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008376
8377/* ------------------------------ */
8378 .balign 128
8379.L_ALT_op_iget_char: /* 0x57 */
8380/* File: arm64/alt_stub.S */
8381/*
8382 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8383 * any interesting requests and then jump to the real instruction
8384 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8385 */
8386 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008387 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8388 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8389 mov x0, xSELF
8390 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008391 mov x2, xPC
8392 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008393
8394/* ------------------------------ */
8395 .balign 128
8396.L_ALT_op_iget_short: /* 0x58 */
8397/* File: arm64/alt_stub.S */
8398/*
8399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8400 * any interesting requests and then jump to the real instruction
8401 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8402 */
8403 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008404 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8405 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8406 mov x0, xSELF
8407 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008408 mov x2, xPC
8409 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008410
8411/* ------------------------------ */
8412 .balign 128
8413.L_ALT_op_iput: /* 0x59 */
8414/* File: arm64/alt_stub.S */
8415/*
8416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8417 * any interesting requests and then jump to the real instruction
8418 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8419 */
8420 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008421 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8422 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8423 mov x0, xSELF
8424 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008425 mov x2, xPC
8426 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008427
8428/* ------------------------------ */
8429 .balign 128
8430.L_ALT_op_iput_wide: /* 0x5a */
8431/* File: arm64/alt_stub.S */
8432/*
8433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8434 * any interesting requests and then jump to the real instruction
8435 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8436 */
8437 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008438 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8439 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8440 mov x0, xSELF
8441 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008442 mov x2, xPC
8443 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008444
8445/* ------------------------------ */
8446 .balign 128
8447.L_ALT_op_iput_object: /* 0x5b */
8448/* File: arm64/alt_stub.S */
8449/*
8450 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8451 * any interesting requests and then jump to the real instruction
8452 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8453 */
8454 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008455 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8456 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8457 mov x0, xSELF
8458 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008459 mov x2, xPC
8460 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008461
8462/* ------------------------------ */
8463 .balign 128
8464.L_ALT_op_iput_boolean: /* 0x5c */
8465/* File: arm64/alt_stub.S */
8466/*
8467 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8468 * any interesting requests and then jump to the real instruction
8469 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8470 */
8471 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008472 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8473 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8474 mov x0, xSELF
8475 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008476 mov x2, xPC
8477 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008478
8479/* ------------------------------ */
8480 .balign 128
8481.L_ALT_op_iput_byte: /* 0x5d */
8482/* File: arm64/alt_stub.S */
8483/*
8484 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8485 * any interesting requests and then jump to the real instruction
8486 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8487 */
8488 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008489 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8490 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8491 mov x0, xSELF
8492 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008493 mov x2, xPC
8494 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008495
8496/* ------------------------------ */
8497 .balign 128
8498.L_ALT_op_iput_char: /* 0x5e */
8499/* File: arm64/alt_stub.S */
8500/*
8501 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8502 * any interesting requests and then jump to the real instruction
8503 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8504 */
8505 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008506 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8507 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8508 mov x0, xSELF
8509 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008510 mov x2, xPC
8511 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008512
8513/* ------------------------------ */
8514 .balign 128
8515.L_ALT_op_iput_short: /* 0x5f */
8516/* File: arm64/alt_stub.S */
8517/*
8518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8519 * any interesting requests and then jump to the real instruction
8520 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8521 */
8522 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008523 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8524 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8525 mov x0, xSELF
8526 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008527 mov x2, xPC
8528 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008529
8530/* ------------------------------ */
8531 .balign 128
8532.L_ALT_op_sget: /* 0x60 */
8533/* File: arm64/alt_stub.S */
8534/*
8535 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8536 * any interesting requests and then jump to the real instruction
8537 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8538 */
8539 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008540 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8541 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8542 mov x0, xSELF
8543 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008544 mov x2, xPC
8545 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008546
8547/* ------------------------------ */
8548 .balign 128
8549.L_ALT_op_sget_wide: /* 0x61 */
8550/* File: arm64/alt_stub.S */
8551/*
8552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8553 * any interesting requests and then jump to the real instruction
8554 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8555 */
8556 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008557 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8558 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8559 mov x0, xSELF
8560 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008561 mov x2, xPC
8562 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008563
8564/* ------------------------------ */
8565 .balign 128
8566.L_ALT_op_sget_object: /* 0x62 */
8567/* File: arm64/alt_stub.S */
8568/*
8569 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8570 * any interesting requests and then jump to the real instruction
8571 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8572 */
8573 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008574 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8575 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
8576 mov x0, xSELF
8577 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008578 mov x2, xPC
8579 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008580
8581/* ------------------------------ */
8582 .balign 128
8583.L_ALT_op_sget_boolean: /* 0x63 */
8584/* File: arm64/alt_stub.S */
8585/*
8586 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8587 * any interesting requests and then jump to the real instruction
8588 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8589 */
8590 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008591 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8592 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
8593 mov x0, xSELF
8594 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008595 mov x2, xPC
8596 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008597
8598/* ------------------------------ */
8599 .balign 128
8600.L_ALT_op_sget_byte: /* 0x64 */
8601/* File: arm64/alt_stub.S */
8602/*
8603 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8604 * any interesting requests and then jump to the real instruction
8605 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8606 */
8607 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008608 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8609 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
8610 mov x0, xSELF
8611 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008612 mov x2, xPC
8613 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008614
8615/* ------------------------------ */
8616 .balign 128
8617.L_ALT_op_sget_char: /* 0x65 */
8618/* File: arm64/alt_stub.S */
8619/*
8620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8621 * any interesting requests and then jump to the real instruction
8622 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8623 */
8624 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008625 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8626 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
8627 mov x0, xSELF
8628 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008629 mov x2, xPC
8630 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008631
8632/* ------------------------------ */
8633 .balign 128
8634.L_ALT_op_sget_short: /* 0x66 */
8635/* File: arm64/alt_stub.S */
8636/*
8637 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8638 * any interesting requests and then jump to the real instruction
8639 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8640 */
8641 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008642 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8643 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
8644 mov x0, xSELF
8645 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008646 mov x2, xPC
8647 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008648
8649/* ------------------------------ */
8650 .balign 128
8651.L_ALT_op_sput: /* 0x67 */
8652/* File: arm64/alt_stub.S */
8653/*
8654 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8655 * any interesting requests and then jump to the real instruction
8656 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8657 */
8658 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008659 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8660 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
8661 mov x0, xSELF
8662 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008663 mov x2, xPC
8664 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008665
8666/* ------------------------------ */
8667 .balign 128
8668.L_ALT_op_sput_wide: /* 0x68 */
8669/* File: arm64/alt_stub.S */
8670/*
8671 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8672 * any interesting requests and then jump to the real instruction
8673 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8674 */
8675 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008676 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8677 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
8678 mov x0, xSELF
8679 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008680 mov x2, xPC
8681 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008682
8683/* ------------------------------ */
8684 .balign 128
8685.L_ALT_op_sput_object: /* 0x69 */
8686/* File: arm64/alt_stub.S */
8687/*
8688 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8689 * any interesting requests and then jump to the real instruction
8690 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8691 */
8692 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008693 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8694 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
8695 mov x0, xSELF
8696 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008697 mov x2, xPC
8698 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008699
8700/* ------------------------------ */
8701 .balign 128
8702.L_ALT_op_sput_boolean: /* 0x6a */
8703/* File: arm64/alt_stub.S */
8704/*
8705 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8706 * any interesting requests and then jump to the real instruction
8707 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8708 */
8709 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008710 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8711 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
8712 mov x0, xSELF
8713 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008714 mov x2, xPC
8715 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008716
8717/* ------------------------------ */
8718 .balign 128
8719.L_ALT_op_sput_byte: /* 0x6b */
8720/* File: arm64/alt_stub.S */
8721/*
8722 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8723 * any interesting requests and then jump to the real instruction
8724 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8725 */
8726 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008727 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8728 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
8729 mov x0, xSELF
8730 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008731 mov x2, xPC
8732 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008733
8734/* ------------------------------ */
8735 .balign 128
8736.L_ALT_op_sput_char: /* 0x6c */
8737/* File: arm64/alt_stub.S */
8738/*
8739 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8740 * any interesting requests and then jump to the real instruction
8741 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8742 */
8743 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008744 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8745 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
8746 mov x0, xSELF
8747 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008748 mov x2, xPC
8749 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008750
8751/* ------------------------------ */
8752 .balign 128
8753.L_ALT_op_sput_short: /* 0x6d */
8754/* File: arm64/alt_stub.S */
8755/*
8756 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8757 * any interesting requests and then jump to the real instruction
8758 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8759 */
8760 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008761 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8762 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
8763 mov x0, xSELF
8764 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008765 mov x2, xPC
8766 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008767
8768/* ------------------------------ */
8769 .balign 128
8770.L_ALT_op_invoke_virtual: /* 0x6e */
8771/* File: arm64/alt_stub.S */
8772/*
8773 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8774 * any interesting requests and then jump to the real instruction
8775 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8776 */
8777 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008778 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8779 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
8780 mov x0, xSELF
8781 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008782 mov x2, xPC
8783 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008784
8785/* ------------------------------ */
8786 .balign 128
8787.L_ALT_op_invoke_super: /* 0x6f */
8788/* File: arm64/alt_stub.S */
8789/*
8790 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8791 * any interesting requests and then jump to the real instruction
8792 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8793 */
8794 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008795 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8796 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
8797 mov x0, xSELF
8798 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008799 mov x2, xPC
8800 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008801
8802/* ------------------------------ */
8803 .balign 128
8804.L_ALT_op_invoke_direct: /* 0x70 */
8805/* File: arm64/alt_stub.S */
8806/*
8807 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8808 * any interesting requests and then jump to the real instruction
8809 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8810 */
8811 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008812 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8813 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
8814 mov x0, xSELF
8815 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008816 mov x2, xPC
8817 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008818
8819/* ------------------------------ */
8820 .balign 128
8821.L_ALT_op_invoke_static: /* 0x71 */
8822/* File: arm64/alt_stub.S */
8823/*
8824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8825 * any interesting requests and then jump to the real instruction
8826 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8827 */
8828 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008829 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8830 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
8831 mov x0, xSELF
8832 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008833 mov x2, xPC
8834 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008835
8836/* ------------------------------ */
8837 .balign 128
8838.L_ALT_op_invoke_interface: /* 0x72 */
8839/* File: arm64/alt_stub.S */
8840/*
8841 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8842 * any interesting requests and then jump to the real instruction
8843 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8844 */
8845 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008846 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8847 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
8848 mov x0, xSELF
8849 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008850 mov x2, xPC
8851 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008852
8853/* ------------------------------ */
8854 .balign 128
8855.L_ALT_op_return_void_no_barrier: /* 0x73 */
8856/* File: arm64/alt_stub.S */
8857/*
8858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8859 * any interesting requests and then jump to the real instruction
8860 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8861 */
8862 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008863 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8864 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
8865 mov x0, xSELF
8866 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008867 mov x2, xPC
8868 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008869
8870/* ------------------------------ */
8871 .balign 128
8872.L_ALT_op_invoke_virtual_range: /* 0x74 */
8873/* File: arm64/alt_stub.S */
8874/*
8875 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8876 * any interesting requests and then jump to the real instruction
8877 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8878 */
8879 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008880 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8881 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
8882 mov x0, xSELF
8883 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008884 mov x2, xPC
8885 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008886
8887/* ------------------------------ */
8888 .balign 128
8889.L_ALT_op_invoke_super_range: /* 0x75 */
8890/* File: arm64/alt_stub.S */
8891/*
8892 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8893 * any interesting requests and then jump to the real instruction
8894 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8895 */
8896 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008897 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8898 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
8899 mov x0, xSELF
8900 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008901 mov x2, xPC
8902 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008903
8904/* ------------------------------ */
8905 .balign 128
8906.L_ALT_op_invoke_direct_range: /* 0x76 */
8907/* File: arm64/alt_stub.S */
8908/*
8909 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8910 * any interesting requests and then jump to the real instruction
8911 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8912 */
8913 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008914 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8915 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
8916 mov x0, xSELF
8917 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008918 mov x2, xPC
8919 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008920
8921/* ------------------------------ */
8922 .balign 128
8923.L_ALT_op_invoke_static_range: /* 0x77 */
8924/* File: arm64/alt_stub.S */
8925/*
8926 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8927 * any interesting requests and then jump to the real instruction
8928 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8929 */
8930 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008931 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8932 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
8933 mov x0, xSELF
8934 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008935 mov x2, xPC
8936 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008937
8938/* ------------------------------ */
8939 .balign 128
8940.L_ALT_op_invoke_interface_range: /* 0x78 */
8941/* File: arm64/alt_stub.S */
8942/*
8943 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8944 * any interesting requests and then jump to the real instruction
8945 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8946 */
8947 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008948 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8949 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
8950 mov x0, xSELF
8951 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008952 mov x2, xPC
8953 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008954
8955/* ------------------------------ */
8956 .balign 128
8957.L_ALT_op_unused_79: /* 0x79 */
8958/* File: arm64/alt_stub.S */
8959/*
8960 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8961 * any interesting requests and then jump to the real instruction
8962 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8963 */
8964 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008965 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8966 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
8967 mov x0, xSELF
8968 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008969 mov x2, xPC
8970 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008971
8972/* ------------------------------ */
8973 .balign 128
8974.L_ALT_op_unused_7a: /* 0x7a */
8975/* File: arm64/alt_stub.S */
8976/*
8977 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8978 * any interesting requests and then jump to the real instruction
8979 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8980 */
8981 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008982 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8983 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
8984 mov x0, xSELF
8985 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008986 mov x2, xPC
8987 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008988
8989/* ------------------------------ */
8990 .balign 128
8991.L_ALT_op_neg_int: /* 0x7b */
8992/* File: arm64/alt_stub.S */
8993/*
8994 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8995 * any interesting requests and then jump to the real instruction
8996 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8997 */
8998 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008999 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9000 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
9001 mov x0, xSELF
9002 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009003 mov x2, xPC
9004 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009005
9006/* ------------------------------ */
9007 .balign 128
9008.L_ALT_op_not_int: /* 0x7c */
9009/* File: arm64/alt_stub.S */
9010/*
9011 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9012 * any interesting requests and then jump to the real instruction
9013 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9014 */
9015 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009016 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9017 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9018 mov x0, xSELF
9019 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009020 mov x2, xPC
9021 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009022
9023/* ------------------------------ */
9024 .balign 128
9025.L_ALT_op_neg_long: /* 0x7d */
9026/* File: arm64/alt_stub.S */
9027/*
9028 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9029 * any interesting requests and then jump to the real instruction
9030 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9031 */
9032 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009033 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9034 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9035 mov x0, xSELF
9036 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009037 mov x2, xPC
9038 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009039
9040/* ------------------------------ */
9041 .balign 128
9042.L_ALT_op_not_long: /* 0x7e */
9043/* File: arm64/alt_stub.S */
9044/*
9045 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9046 * any interesting requests and then jump to the real instruction
9047 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9048 */
9049 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009050 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9051 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9052 mov x0, xSELF
9053 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009054 mov x2, xPC
9055 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009056
9057/* ------------------------------ */
9058 .balign 128
9059.L_ALT_op_neg_float: /* 0x7f */
9060/* File: arm64/alt_stub.S */
9061/*
9062 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9063 * any interesting requests and then jump to the real instruction
9064 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9065 */
9066 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009067 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9068 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9069 mov x0, xSELF
9070 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009071 mov x2, xPC
9072 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009073
9074/* ------------------------------ */
9075 .balign 128
9076.L_ALT_op_neg_double: /* 0x80 */
9077/* File: arm64/alt_stub.S */
9078/*
9079 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9080 * any interesting requests and then jump to the real instruction
9081 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9082 */
9083 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009084 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9085 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9086 mov x0, xSELF
9087 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009088 mov x2, xPC
9089 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009090
9091/* ------------------------------ */
9092 .balign 128
9093.L_ALT_op_int_to_long: /* 0x81 */
9094/* File: arm64/alt_stub.S */
9095/*
9096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9097 * any interesting requests and then jump to the real instruction
9098 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9099 */
9100 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009101 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9102 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9103 mov x0, xSELF
9104 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009105 mov x2, xPC
9106 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009107
9108/* ------------------------------ */
9109 .balign 128
9110.L_ALT_op_int_to_float: /* 0x82 */
9111/* File: arm64/alt_stub.S */
9112/*
9113 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9114 * any interesting requests and then jump to the real instruction
9115 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9116 */
9117 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009118 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9119 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9120 mov x0, xSELF
9121 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009122 mov x2, xPC
9123 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009124
9125/* ------------------------------ */
9126 .balign 128
9127.L_ALT_op_int_to_double: /* 0x83 */
9128/* File: arm64/alt_stub.S */
9129/*
9130 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9131 * any interesting requests and then jump to the real instruction
9132 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9133 */
9134 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009135 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9136 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9137 mov x0, xSELF
9138 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009139 mov x2, xPC
9140 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009141
9142/* ------------------------------ */
9143 .balign 128
9144.L_ALT_op_long_to_int: /* 0x84 */
9145/* File: arm64/alt_stub.S */
9146/*
9147 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9148 * any interesting requests and then jump to the real instruction
9149 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9150 */
9151 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009152 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9153 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9154 mov x0, xSELF
9155 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009156 mov x2, xPC
9157 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009158
9159/* ------------------------------ */
9160 .balign 128
9161.L_ALT_op_long_to_float: /* 0x85 */
9162/* File: arm64/alt_stub.S */
9163/*
9164 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9165 * any interesting requests and then jump to the real instruction
9166 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9167 */
9168 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009169 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9170 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9171 mov x0, xSELF
9172 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009173 mov x2, xPC
9174 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009175
9176/* ------------------------------ */
9177 .balign 128
9178.L_ALT_op_long_to_double: /* 0x86 */
9179/* File: arm64/alt_stub.S */
9180/*
9181 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9182 * any interesting requests and then jump to the real instruction
9183 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9184 */
9185 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009186 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9187 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9188 mov x0, xSELF
9189 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009190 mov x2, xPC
9191 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009192
9193/* ------------------------------ */
9194 .balign 128
9195.L_ALT_op_float_to_int: /* 0x87 */
9196/* File: arm64/alt_stub.S */
9197/*
9198 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9199 * any interesting requests and then jump to the real instruction
9200 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9201 */
9202 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009203 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9204 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9205 mov x0, xSELF
9206 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009207 mov x2, xPC
9208 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009209
9210/* ------------------------------ */
9211 .balign 128
9212.L_ALT_op_float_to_long: /* 0x88 */
9213/* File: arm64/alt_stub.S */
9214/*
9215 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9216 * any interesting requests and then jump to the real instruction
9217 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9218 */
9219 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009220 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9221 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9222 mov x0, xSELF
9223 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009224 mov x2, xPC
9225 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009226
9227/* ------------------------------ */
9228 .balign 128
9229.L_ALT_op_float_to_double: /* 0x89 */
9230/* File: arm64/alt_stub.S */
9231/*
9232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9233 * any interesting requests and then jump to the real instruction
9234 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9235 */
9236 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009237 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9238 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9239 mov x0, xSELF
9240 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009241 mov x2, xPC
9242 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009243
9244/* ------------------------------ */
9245 .balign 128
9246.L_ALT_op_double_to_int: /* 0x8a */
9247/* File: arm64/alt_stub.S */
9248/*
9249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9250 * any interesting requests and then jump to the real instruction
9251 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9252 */
9253 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009254 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9255 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9256 mov x0, xSELF
9257 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009258 mov x2, xPC
9259 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009260
9261/* ------------------------------ */
9262 .balign 128
9263.L_ALT_op_double_to_long: /* 0x8b */
9264/* File: arm64/alt_stub.S */
9265/*
9266 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9267 * any interesting requests and then jump to the real instruction
9268 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9269 */
9270 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009271 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9272 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9273 mov x0, xSELF
9274 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009275 mov x2, xPC
9276 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009277
9278/* ------------------------------ */
9279 .balign 128
9280.L_ALT_op_double_to_float: /* 0x8c */
9281/* File: arm64/alt_stub.S */
9282/*
9283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9284 * any interesting requests and then jump to the real instruction
9285 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9286 */
9287 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009288 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9289 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9290 mov x0, xSELF
9291 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009292 mov x2, xPC
9293 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009294
9295/* ------------------------------ */
9296 .balign 128
9297.L_ALT_op_int_to_byte: /* 0x8d */
9298/* File: arm64/alt_stub.S */
9299/*
9300 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9301 * any interesting requests and then jump to the real instruction
9302 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9303 */
9304 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009305 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9306 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9307 mov x0, xSELF
9308 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009309 mov x2, xPC
9310 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009311
9312/* ------------------------------ */
9313 .balign 128
9314.L_ALT_op_int_to_char: /* 0x8e */
9315/* File: arm64/alt_stub.S */
9316/*
9317 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9318 * any interesting requests and then jump to the real instruction
9319 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9320 */
9321 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009322 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9323 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9324 mov x0, xSELF
9325 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009326 mov x2, xPC
9327 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009328
9329/* ------------------------------ */
9330 .balign 128
9331.L_ALT_op_int_to_short: /* 0x8f */
9332/* File: arm64/alt_stub.S */
9333/*
9334 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9335 * any interesting requests and then jump to the real instruction
9336 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9337 */
9338 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009339 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9340 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9341 mov x0, xSELF
9342 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009343 mov x2, xPC
9344 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009345
9346/* ------------------------------ */
9347 .balign 128
9348.L_ALT_op_add_int: /* 0x90 */
9349/* File: arm64/alt_stub.S */
9350/*
9351 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9352 * any interesting requests and then jump to the real instruction
9353 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9354 */
9355 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009356 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9357 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9358 mov x0, xSELF
9359 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009360 mov x2, xPC
9361 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009362
9363/* ------------------------------ */
9364 .balign 128
9365.L_ALT_op_sub_int: /* 0x91 */
9366/* File: arm64/alt_stub.S */
9367/*
9368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9369 * any interesting requests and then jump to the real instruction
9370 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9371 */
9372 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009373 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9374 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9375 mov x0, xSELF
9376 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009377 mov x2, xPC
9378 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009379
9380/* ------------------------------ */
9381 .balign 128
9382.L_ALT_op_mul_int: /* 0x92 */
9383/* File: arm64/alt_stub.S */
9384/*
9385 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9386 * any interesting requests and then jump to the real instruction
9387 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9388 */
9389 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009390 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9391 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9392 mov x0, xSELF
9393 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009394 mov x2, xPC
9395 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009396
9397/* ------------------------------ */
9398 .balign 128
9399.L_ALT_op_div_int: /* 0x93 */
9400/* File: arm64/alt_stub.S */
9401/*
9402 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9403 * any interesting requests and then jump to the real instruction
9404 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9405 */
9406 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009407 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9408 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9409 mov x0, xSELF
9410 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009411 mov x2, xPC
9412 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009413
9414/* ------------------------------ */
9415 .balign 128
9416.L_ALT_op_rem_int: /* 0x94 */
9417/* File: arm64/alt_stub.S */
9418/*
9419 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9420 * any interesting requests and then jump to the real instruction
9421 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9422 */
9423 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009424 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9425 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9426 mov x0, xSELF
9427 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009428 mov x2, xPC
9429 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009430
9431/* ------------------------------ */
9432 .balign 128
9433.L_ALT_op_and_int: /* 0x95 */
9434/* File: arm64/alt_stub.S */
9435/*
9436 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9437 * any interesting requests and then jump to the real instruction
9438 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9439 */
9440 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009441 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9442 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9443 mov x0, xSELF
9444 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009445 mov x2, xPC
9446 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009447
9448/* ------------------------------ */
9449 .balign 128
9450.L_ALT_op_or_int: /* 0x96 */
9451/* File: arm64/alt_stub.S */
9452/*
9453 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9454 * any interesting requests and then jump to the real instruction
9455 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9456 */
9457 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009458 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9459 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9460 mov x0, xSELF
9461 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009462 mov x2, xPC
9463 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009464
9465/* ------------------------------ */
9466 .balign 128
9467.L_ALT_op_xor_int: /* 0x97 */
9468/* File: arm64/alt_stub.S */
9469/*
9470 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9471 * any interesting requests and then jump to the real instruction
9472 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9473 */
9474 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009475 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9476 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9477 mov x0, xSELF
9478 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009479 mov x2, xPC
9480 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009481
9482/* ------------------------------ */
9483 .balign 128
9484.L_ALT_op_shl_int: /* 0x98 */
9485/* File: arm64/alt_stub.S */
9486/*
9487 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9488 * any interesting requests and then jump to the real instruction
9489 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9490 */
9491 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009492 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9493 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9494 mov x0, xSELF
9495 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009496 mov x2, xPC
9497 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009498
9499/* ------------------------------ */
9500 .balign 128
9501.L_ALT_op_shr_int: /* 0x99 */
9502/* File: arm64/alt_stub.S */
9503/*
9504 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9505 * any interesting requests and then jump to the real instruction
9506 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9507 */
9508 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009509 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9510 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9511 mov x0, xSELF
9512 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009513 mov x2, xPC
9514 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009515
9516/* ------------------------------ */
9517 .balign 128
9518.L_ALT_op_ushr_int: /* 0x9a */
9519/* File: arm64/alt_stub.S */
9520/*
9521 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9522 * any interesting requests and then jump to the real instruction
9523 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9524 */
9525 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009526 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9527 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9528 mov x0, xSELF
9529 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009530 mov x2, xPC
9531 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009532
9533/* ------------------------------ */
9534 .balign 128
9535.L_ALT_op_add_long: /* 0x9b */
9536/* File: arm64/alt_stub.S */
9537/*
9538 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9539 * any interesting requests and then jump to the real instruction
9540 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9541 */
9542 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009543 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9544 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9545 mov x0, xSELF
9546 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009547 mov x2, xPC
9548 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009549
9550/* ------------------------------ */
9551 .balign 128
9552.L_ALT_op_sub_long: /* 0x9c */
9553/* File: arm64/alt_stub.S */
9554/*
9555 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9556 * any interesting requests and then jump to the real instruction
9557 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9558 */
9559 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009560 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9561 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9562 mov x0, xSELF
9563 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009564 mov x2, xPC
9565 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009566
9567/* ------------------------------ */
9568 .balign 128
9569.L_ALT_op_mul_long: /* 0x9d */
9570/* File: arm64/alt_stub.S */
9571/*
9572 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9573 * any interesting requests and then jump to the real instruction
9574 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9575 */
9576 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009577 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9578 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
9579 mov x0, xSELF
9580 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009581 mov x2, xPC
9582 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009583
9584/* ------------------------------ */
9585 .balign 128
9586.L_ALT_op_div_long: /* 0x9e */
9587/* File: arm64/alt_stub.S */
9588/*
9589 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9590 * any interesting requests and then jump to the real instruction
9591 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9592 */
9593 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009594 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9595 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
9596 mov x0, xSELF
9597 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009598 mov x2, xPC
9599 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009600
9601/* ------------------------------ */
9602 .balign 128
9603.L_ALT_op_rem_long: /* 0x9f */
9604/* File: arm64/alt_stub.S */
9605/*
9606 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9607 * any interesting requests and then jump to the real instruction
9608 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9609 */
9610 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009611 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9612 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
9613 mov x0, xSELF
9614 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009615 mov x2, xPC
9616 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009617
9618/* ------------------------------ */
9619 .balign 128
9620.L_ALT_op_and_long: /* 0xa0 */
9621/* File: arm64/alt_stub.S */
9622/*
9623 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9624 * any interesting requests and then jump to the real instruction
9625 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9626 */
9627 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009628 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9629 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
9630 mov x0, xSELF
9631 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009632 mov x2, xPC
9633 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009634
9635/* ------------------------------ */
9636 .balign 128
9637.L_ALT_op_or_long: /* 0xa1 */
9638/* File: arm64/alt_stub.S */
9639/*
9640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9641 * any interesting requests and then jump to the real instruction
9642 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9643 */
9644 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009645 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9646 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
9647 mov x0, xSELF
9648 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009649 mov x2, xPC
9650 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009651
9652/* ------------------------------ */
9653 .balign 128
9654.L_ALT_op_xor_long: /* 0xa2 */
9655/* File: arm64/alt_stub.S */
9656/*
9657 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9658 * any interesting requests and then jump to the real instruction
9659 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9660 */
9661 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009662 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9663 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
9664 mov x0, xSELF
9665 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009666 mov x2, xPC
9667 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009668
9669/* ------------------------------ */
9670 .balign 128
9671.L_ALT_op_shl_long: /* 0xa3 */
9672/* File: arm64/alt_stub.S */
9673/*
9674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9675 * any interesting requests and then jump to the real instruction
9676 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9677 */
9678 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009679 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9680 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
9681 mov x0, xSELF
9682 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009683 mov x2, xPC
9684 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009685
9686/* ------------------------------ */
9687 .balign 128
9688.L_ALT_op_shr_long: /* 0xa4 */
9689/* File: arm64/alt_stub.S */
9690/*
9691 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9692 * any interesting requests and then jump to the real instruction
9693 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9694 */
9695 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009696 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9697 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
9698 mov x0, xSELF
9699 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009700 mov x2, xPC
9701 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009702
9703/* ------------------------------ */
9704 .balign 128
9705.L_ALT_op_ushr_long: /* 0xa5 */
9706/* File: arm64/alt_stub.S */
9707/*
9708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9709 * any interesting requests and then jump to the real instruction
9710 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9711 */
9712 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009713 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9714 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
9715 mov x0, xSELF
9716 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009717 mov x2, xPC
9718 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009719
9720/* ------------------------------ */
9721 .balign 128
9722.L_ALT_op_add_float: /* 0xa6 */
9723/* File: arm64/alt_stub.S */
9724/*
9725 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9726 * any interesting requests and then jump to the real instruction
9727 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9728 */
9729 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009730 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9731 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
9732 mov x0, xSELF
9733 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009734 mov x2, xPC
9735 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009736
9737/* ------------------------------ */
9738 .balign 128
9739.L_ALT_op_sub_float: /* 0xa7 */
9740/* File: arm64/alt_stub.S */
9741/*
9742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9743 * any interesting requests and then jump to the real instruction
9744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9745 */
9746 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009747 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9748 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
9749 mov x0, xSELF
9750 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009751 mov x2, xPC
9752 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009753
9754/* ------------------------------ */
9755 .balign 128
9756.L_ALT_op_mul_float: /* 0xa8 */
9757/* File: arm64/alt_stub.S */
9758/*
9759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9760 * any interesting requests and then jump to the real instruction
9761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9762 */
9763 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009764 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9765 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
9766 mov x0, xSELF
9767 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009768 mov x2, xPC
9769 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009770
9771/* ------------------------------ */
9772 .balign 128
9773.L_ALT_op_div_float: /* 0xa9 */
9774/* File: arm64/alt_stub.S */
9775/*
9776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9777 * any interesting requests and then jump to the real instruction
9778 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9779 */
9780 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009781 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9782 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
9783 mov x0, xSELF
9784 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009785 mov x2, xPC
9786 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009787
9788/* ------------------------------ */
9789 .balign 128
9790.L_ALT_op_rem_float: /* 0xaa */
9791/* File: arm64/alt_stub.S */
9792/*
9793 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9794 * any interesting requests and then jump to the real instruction
9795 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9796 */
9797 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009798 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9799 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
9800 mov x0, xSELF
9801 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009802 mov x2, xPC
9803 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009804
9805/* ------------------------------ */
9806 .balign 128
9807.L_ALT_op_add_double: /* 0xab */
9808/* File: arm64/alt_stub.S */
9809/*
9810 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9811 * any interesting requests and then jump to the real instruction
9812 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9813 */
9814 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009815 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9816 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
9817 mov x0, xSELF
9818 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009819 mov x2, xPC
9820 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009821
9822/* ------------------------------ */
9823 .balign 128
9824.L_ALT_op_sub_double: /* 0xac */
9825/* File: arm64/alt_stub.S */
9826/*
9827 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9828 * any interesting requests and then jump to the real instruction
9829 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9830 */
9831 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009832 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9833 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
9834 mov x0, xSELF
9835 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009836 mov x2, xPC
9837 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009838
9839/* ------------------------------ */
9840 .balign 128
9841.L_ALT_op_mul_double: /* 0xad */
9842/* File: arm64/alt_stub.S */
9843/*
9844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9845 * any interesting requests and then jump to the real instruction
9846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9847 */
9848 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009849 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9850 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
9851 mov x0, xSELF
9852 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009853 mov x2, xPC
9854 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009855
9856/* ------------------------------ */
9857 .balign 128
9858.L_ALT_op_div_double: /* 0xae */
9859/* File: arm64/alt_stub.S */
9860/*
9861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9862 * any interesting requests and then jump to the real instruction
9863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9864 */
9865 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009866 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9867 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
9868 mov x0, xSELF
9869 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009870 mov x2, xPC
9871 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009872
9873/* ------------------------------ */
9874 .balign 128
9875.L_ALT_op_rem_double: /* 0xaf */
9876/* File: arm64/alt_stub.S */
9877/*
9878 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9879 * any interesting requests and then jump to the real instruction
9880 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9881 */
9882 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009883 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9884 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
9885 mov x0, xSELF
9886 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009887 mov x2, xPC
9888 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009889
9890/* ------------------------------ */
9891 .balign 128
9892.L_ALT_op_add_int_2addr: /* 0xb0 */
9893/* File: arm64/alt_stub.S */
9894/*
9895 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9896 * any interesting requests and then jump to the real instruction
9897 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9898 */
9899 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009900 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9901 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
9902 mov x0, xSELF
9903 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009904 mov x2, xPC
9905 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009906
9907/* ------------------------------ */
9908 .balign 128
9909.L_ALT_op_sub_int_2addr: /* 0xb1 */
9910/* File: arm64/alt_stub.S */
9911/*
9912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9913 * any interesting requests and then jump to the real instruction
9914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9915 */
9916 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009917 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9918 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
9919 mov x0, xSELF
9920 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009921 mov x2, xPC
9922 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009923
9924/* ------------------------------ */
9925 .balign 128
9926.L_ALT_op_mul_int_2addr: /* 0xb2 */
9927/* File: arm64/alt_stub.S */
9928/*
9929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9930 * any interesting requests and then jump to the real instruction
9931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9932 */
9933 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009934 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9935 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
9936 mov x0, xSELF
9937 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009938 mov x2, xPC
9939 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009940
9941/* ------------------------------ */
9942 .balign 128
9943.L_ALT_op_div_int_2addr: /* 0xb3 */
9944/* File: arm64/alt_stub.S */
9945/*
9946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9947 * any interesting requests and then jump to the real instruction
9948 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9949 */
9950 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009951 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9952 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
9953 mov x0, xSELF
9954 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009955 mov x2, xPC
9956 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009957
9958/* ------------------------------ */
9959 .balign 128
9960.L_ALT_op_rem_int_2addr: /* 0xb4 */
9961/* File: arm64/alt_stub.S */
9962/*
9963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9964 * any interesting requests and then jump to the real instruction
9965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9966 */
9967 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009968 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9969 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
9970 mov x0, xSELF
9971 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009972 mov x2, xPC
9973 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009974
9975/* ------------------------------ */
9976 .balign 128
9977.L_ALT_op_and_int_2addr: /* 0xb5 */
9978/* File: arm64/alt_stub.S */
9979/*
9980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9981 * any interesting requests and then jump to the real instruction
9982 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9983 */
9984 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009985 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9986 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
9987 mov x0, xSELF
9988 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009989 mov x2, xPC
9990 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009991
9992/* ------------------------------ */
9993 .balign 128
9994.L_ALT_op_or_int_2addr: /* 0xb6 */
9995/* File: arm64/alt_stub.S */
9996/*
9997 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9998 * any interesting requests and then jump to the real instruction
9999 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10000 */
10001 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010002 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10003 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10004 mov x0, xSELF
10005 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010006 mov x2, xPC
10007 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010008
10009/* ------------------------------ */
10010 .balign 128
10011.L_ALT_op_xor_int_2addr: /* 0xb7 */
10012/* File: arm64/alt_stub.S */
10013/*
10014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10015 * any interesting requests and then jump to the real instruction
10016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10017 */
10018 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010019 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10020 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10021 mov x0, xSELF
10022 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010023 mov x2, xPC
10024 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010025
10026/* ------------------------------ */
10027 .balign 128
10028.L_ALT_op_shl_int_2addr: /* 0xb8 */
10029/* File: arm64/alt_stub.S */
10030/*
10031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10032 * any interesting requests and then jump to the real instruction
10033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10034 */
10035 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010036 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10037 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10038 mov x0, xSELF
10039 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010040 mov x2, xPC
10041 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010042
10043/* ------------------------------ */
10044 .balign 128
10045.L_ALT_op_shr_int_2addr: /* 0xb9 */
10046/* File: arm64/alt_stub.S */
10047/*
10048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10049 * any interesting requests and then jump to the real instruction
10050 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10051 */
10052 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010053 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10054 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10055 mov x0, xSELF
10056 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010057 mov x2, xPC
10058 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010059
10060/* ------------------------------ */
10061 .balign 128
10062.L_ALT_op_ushr_int_2addr: /* 0xba */
10063/* File: arm64/alt_stub.S */
10064/*
10065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10066 * any interesting requests and then jump to the real instruction
10067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10068 */
10069 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010070 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10071 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10072 mov x0, xSELF
10073 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010074 mov x2, xPC
10075 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010076
10077/* ------------------------------ */
10078 .balign 128
10079.L_ALT_op_add_long_2addr: /* 0xbb */
10080/* File: arm64/alt_stub.S */
10081/*
10082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10083 * any interesting requests and then jump to the real instruction
10084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10085 */
10086 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010087 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10088 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10089 mov x0, xSELF
10090 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010091 mov x2, xPC
10092 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010093
10094/* ------------------------------ */
10095 .balign 128
10096.L_ALT_op_sub_long_2addr: /* 0xbc */
10097/* File: arm64/alt_stub.S */
10098/*
10099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10100 * any interesting requests and then jump to the real instruction
10101 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10102 */
10103 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010104 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10105 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10106 mov x0, xSELF
10107 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010108 mov x2, xPC
10109 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010110
10111/* ------------------------------ */
10112 .balign 128
10113.L_ALT_op_mul_long_2addr: /* 0xbd */
10114/* File: arm64/alt_stub.S */
10115/*
10116 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10117 * any interesting requests and then jump to the real instruction
10118 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10119 */
10120 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010121 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10122 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10123 mov x0, xSELF
10124 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010125 mov x2, xPC
10126 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010127
10128/* ------------------------------ */
10129 .balign 128
10130.L_ALT_op_div_long_2addr: /* 0xbe */
10131/* File: arm64/alt_stub.S */
10132/*
10133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10134 * any interesting requests and then jump to the real instruction
10135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10136 */
10137 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010138 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10139 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10140 mov x0, xSELF
10141 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010142 mov x2, xPC
10143 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010144
10145/* ------------------------------ */
10146 .balign 128
10147.L_ALT_op_rem_long_2addr: /* 0xbf */
10148/* File: arm64/alt_stub.S */
10149/*
10150 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10151 * any interesting requests and then jump to the real instruction
10152 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10153 */
10154 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010155 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10156 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10157 mov x0, xSELF
10158 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010159 mov x2, xPC
10160 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010161
10162/* ------------------------------ */
10163 .balign 128
10164.L_ALT_op_and_long_2addr: /* 0xc0 */
10165/* File: arm64/alt_stub.S */
10166/*
10167 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10168 * any interesting requests and then jump to the real instruction
10169 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10170 */
10171 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010172 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10173 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10174 mov x0, xSELF
10175 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010176 mov x2, xPC
10177 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010178
10179/* ------------------------------ */
10180 .balign 128
10181.L_ALT_op_or_long_2addr: /* 0xc1 */
10182/* File: arm64/alt_stub.S */
10183/*
10184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10185 * any interesting requests and then jump to the real instruction
10186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10187 */
10188 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010189 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10190 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10191 mov x0, xSELF
10192 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010193 mov x2, xPC
10194 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010195
10196/* ------------------------------ */
10197 .balign 128
10198.L_ALT_op_xor_long_2addr: /* 0xc2 */
10199/* File: arm64/alt_stub.S */
10200/*
10201 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10202 * any interesting requests and then jump to the real instruction
10203 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10204 */
10205 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010206 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10207 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10208 mov x0, xSELF
10209 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010210 mov x2, xPC
10211 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010212
10213/* ------------------------------ */
10214 .balign 128
10215.L_ALT_op_shl_long_2addr: /* 0xc3 */
10216/* File: arm64/alt_stub.S */
10217/*
10218 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10219 * any interesting requests and then jump to the real instruction
10220 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10221 */
10222 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010223 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10224 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10225 mov x0, xSELF
10226 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010227 mov x2, xPC
10228 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010229
10230/* ------------------------------ */
10231 .balign 128
10232.L_ALT_op_shr_long_2addr: /* 0xc4 */
10233/* File: arm64/alt_stub.S */
10234/*
10235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10236 * any interesting requests and then jump to the real instruction
10237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10238 */
10239 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010240 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10241 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10242 mov x0, xSELF
10243 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010244 mov x2, xPC
10245 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010246
10247/* ------------------------------ */
10248 .balign 128
10249.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10250/* File: arm64/alt_stub.S */
10251/*
10252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10253 * any interesting requests and then jump to the real instruction
10254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10255 */
10256 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010257 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10258 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10259 mov x0, xSELF
10260 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010261 mov x2, xPC
10262 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010263
10264/* ------------------------------ */
10265 .balign 128
10266.L_ALT_op_add_float_2addr: /* 0xc6 */
10267/* File: arm64/alt_stub.S */
10268/*
10269 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10270 * any interesting requests and then jump to the real instruction
10271 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10272 */
10273 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010274 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10275 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10276 mov x0, xSELF
10277 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010278 mov x2, xPC
10279 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010280
10281/* ------------------------------ */
10282 .balign 128
10283.L_ALT_op_sub_float_2addr: /* 0xc7 */
10284/* File: arm64/alt_stub.S */
10285/*
10286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10287 * any interesting requests and then jump to the real instruction
10288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10289 */
10290 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010291 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10292 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10293 mov x0, xSELF
10294 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010295 mov x2, xPC
10296 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010297
10298/* ------------------------------ */
10299 .balign 128
10300.L_ALT_op_mul_float_2addr: /* 0xc8 */
10301/* File: arm64/alt_stub.S */
10302/*
10303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10304 * any interesting requests and then jump to the real instruction
10305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10306 */
10307 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010308 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10309 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10310 mov x0, xSELF
10311 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010312 mov x2, xPC
10313 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010314
10315/* ------------------------------ */
10316 .balign 128
10317.L_ALT_op_div_float_2addr: /* 0xc9 */
10318/* File: arm64/alt_stub.S */
10319/*
10320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10321 * any interesting requests and then jump to the real instruction
10322 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10323 */
10324 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010325 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10326 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10327 mov x0, xSELF
10328 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010329 mov x2, xPC
10330 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010331
10332/* ------------------------------ */
10333 .balign 128
10334.L_ALT_op_rem_float_2addr: /* 0xca */
10335/* File: arm64/alt_stub.S */
10336/*
10337 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10338 * any interesting requests and then jump to the real instruction
10339 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10340 */
10341 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010342 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10343 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10344 mov x0, xSELF
10345 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010346 mov x2, xPC
10347 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010348
10349/* ------------------------------ */
10350 .balign 128
10351.L_ALT_op_add_double_2addr: /* 0xcb */
10352/* File: arm64/alt_stub.S */
10353/*
10354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10355 * any interesting requests and then jump to the real instruction
10356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10357 */
10358 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010359 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10360 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10361 mov x0, xSELF
10362 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010363 mov x2, xPC
10364 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010365
10366/* ------------------------------ */
10367 .balign 128
10368.L_ALT_op_sub_double_2addr: /* 0xcc */
10369/* File: arm64/alt_stub.S */
10370/*
10371 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10372 * any interesting requests and then jump to the real instruction
10373 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10374 */
10375 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010376 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10377 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10378 mov x0, xSELF
10379 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010380 mov x2, xPC
10381 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010382
10383/* ------------------------------ */
10384 .balign 128
10385.L_ALT_op_mul_double_2addr: /* 0xcd */
10386/* File: arm64/alt_stub.S */
10387/*
10388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10389 * any interesting requests and then jump to the real instruction
10390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10391 */
10392 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010393 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10394 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10395 mov x0, xSELF
10396 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010397 mov x2, xPC
10398 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010399
10400/* ------------------------------ */
10401 .balign 128
10402.L_ALT_op_div_double_2addr: /* 0xce */
10403/* File: arm64/alt_stub.S */
10404/*
10405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10406 * any interesting requests and then jump to the real instruction
10407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10408 */
10409 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010410 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10411 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10412 mov x0, xSELF
10413 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010414 mov x2, xPC
10415 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010416
10417/* ------------------------------ */
10418 .balign 128
10419.L_ALT_op_rem_double_2addr: /* 0xcf */
10420/* File: arm64/alt_stub.S */
10421/*
10422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10423 * any interesting requests and then jump to the real instruction
10424 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10425 */
10426 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010427 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10428 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10429 mov x0, xSELF
10430 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010431 mov x2, xPC
10432 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010433
10434/* ------------------------------ */
10435 .balign 128
10436.L_ALT_op_add_int_lit16: /* 0xd0 */
10437/* File: arm64/alt_stub.S */
10438/*
10439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10440 * any interesting requests and then jump to the real instruction
10441 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10442 */
10443 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010444 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10445 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10446 mov x0, xSELF
10447 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010448 mov x2, xPC
10449 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010450
10451/* ------------------------------ */
10452 .balign 128
10453.L_ALT_op_rsub_int: /* 0xd1 */
10454/* File: arm64/alt_stub.S */
10455/*
10456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10457 * any interesting requests and then jump to the real instruction
10458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10459 */
10460 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010461 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10462 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10463 mov x0, xSELF
10464 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010465 mov x2, xPC
10466 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010467
10468/* ------------------------------ */
10469 .balign 128
10470.L_ALT_op_mul_int_lit16: /* 0xd2 */
10471/* File: arm64/alt_stub.S */
10472/*
10473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10474 * any interesting requests and then jump to the real instruction
10475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10476 */
10477 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010478 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10479 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10480 mov x0, xSELF
10481 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010482 mov x2, xPC
10483 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010484
10485/* ------------------------------ */
10486 .balign 128
10487.L_ALT_op_div_int_lit16: /* 0xd3 */
10488/* File: arm64/alt_stub.S */
10489/*
10490 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10491 * any interesting requests and then jump to the real instruction
10492 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10493 */
10494 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010495 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10496 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10497 mov x0, xSELF
10498 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010499 mov x2, xPC
10500 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010501
10502/* ------------------------------ */
10503 .balign 128
10504.L_ALT_op_rem_int_lit16: /* 0xd4 */
10505/* File: arm64/alt_stub.S */
10506/*
10507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10508 * any interesting requests and then jump to the real instruction
10509 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10510 */
10511 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010512 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10513 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10514 mov x0, xSELF
10515 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010516 mov x2, xPC
10517 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010518
10519/* ------------------------------ */
10520 .balign 128
10521.L_ALT_op_and_int_lit16: /* 0xd5 */
10522/* File: arm64/alt_stub.S */
10523/*
10524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10525 * any interesting requests and then jump to the real instruction
10526 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10527 */
10528 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010529 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10530 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10531 mov x0, xSELF
10532 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010533 mov x2, xPC
10534 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010535
10536/* ------------------------------ */
10537 .balign 128
10538.L_ALT_op_or_int_lit16: /* 0xd6 */
10539/* File: arm64/alt_stub.S */
10540/*
10541 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10542 * any interesting requests and then jump to the real instruction
10543 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10544 */
10545 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010546 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10547 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10548 mov x0, xSELF
10549 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010550 mov x2, xPC
10551 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010552
10553/* ------------------------------ */
10554 .balign 128
10555.L_ALT_op_xor_int_lit16: /* 0xd7 */
10556/* File: arm64/alt_stub.S */
10557/*
10558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10559 * any interesting requests and then jump to the real instruction
10560 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10561 */
10562 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010563 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10564 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10565 mov x0, xSELF
10566 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010567 mov x2, xPC
10568 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010569
10570/* ------------------------------ */
10571 .balign 128
10572.L_ALT_op_add_int_lit8: /* 0xd8 */
10573/* File: arm64/alt_stub.S */
10574/*
10575 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10576 * any interesting requests and then jump to the real instruction
10577 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10578 */
10579 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010580 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10581 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
10582 mov x0, xSELF
10583 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010584 mov x2, xPC
10585 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010586
10587/* ------------------------------ */
10588 .balign 128
10589.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10590/* File: arm64/alt_stub.S */
10591/*
10592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10593 * any interesting requests and then jump to the real instruction
10594 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10595 */
10596 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010597 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10598 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
10599 mov x0, xSELF
10600 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010601 mov x2, xPC
10602 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010603
10604/* ------------------------------ */
10605 .balign 128
10606.L_ALT_op_mul_int_lit8: /* 0xda */
10607/* File: arm64/alt_stub.S */
10608/*
10609 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10610 * any interesting requests and then jump to the real instruction
10611 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10612 */
10613 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010614 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10615 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
10616 mov x0, xSELF
10617 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010618 mov x2, xPC
10619 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010620
10621/* ------------------------------ */
10622 .balign 128
10623.L_ALT_op_div_int_lit8: /* 0xdb */
10624/* File: arm64/alt_stub.S */
10625/*
10626 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10627 * any interesting requests and then jump to the real instruction
10628 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10629 */
10630 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010631 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10632 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
10633 mov x0, xSELF
10634 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010635 mov x2, xPC
10636 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010637
10638/* ------------------------------ */
10639 .balign 128
10640.L_ALT_op_rem_int_lit8: /* 0xdc */
10641/* File: arm64/alt_stub.S */
10642/*
10643 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10644 * any interesting requests and then jump to the real instruction
10645 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10646 */
10647 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010648 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10649 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
10650 mov x0, xSELF
10651 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010652 mov x2, xPC
10653 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010654
10655/* ------------------------------ */
10656 .balign 128
10657.L_ALT_op_and_int_lit8: /* 0xdd */
10658/* File: arm64/alt_stub.S */
10659/*
10660 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10661 * any interesting requests and then jump to the real instruction
10662 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10663 */
10664 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010665 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10666 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
10667 mov x0, xSELF
10668 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010669 mov x2, xPC
10670 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010671
10672/* ------------------------------ */
10673 .balign 128
10674.L_ALT_op_or_int_lit8: /* 0xde */
10675/* File: arm64/alt_stub.S */
10676/*
10677 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10678 * any interesting requests and then jump to the real instruction
10679 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10680 */
10681 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010682 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10683 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
10684 mov x0, xSELF
10685 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010686 mov x2, xPC
10687 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010688
10689/* ------------------------------ */
10690 .balign 128
10691.L_ALT_op_xor_int_lit8: /* 0xdf */
10692/* File: arm64/alt_stub.S */
10693/*
10694 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10695 * any interesting requests and then jump to the real instruction
10696 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10697 */
10698 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010699 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10700 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
10701 mov x0, xSELF
10702 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010703 mov x2, xPC
10704 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010705
10706/* ------------------------------ */
10707 .balign 128
10708.L_ALT_op_shl_int_lit8: /* 0xe0 */
10709/* File: arm64/alt_stub.S */
10710/*
10711 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10712 * any interesting requests and then jump to the real instruction
10713 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10714 */
10715 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010716 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10717 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
10718 mov x0, xSELF
10719 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010720 mov x2, xPC
10721 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010722
10723/* ------------------------------ */
10724 .balign 128
10725.L_ALT_op_shr_int_lit8: /* 0xe1 */
10726/* File: arm64/alt_stub.S */
10727/*
10728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10729 * any interesting requests and then jump to the real instruction
10730 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10731 */
10732 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010733 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10734 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
10735 mov x0, xSELF
10736 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010737 mov x2, xPC
10738 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010739
10740/* ------------------------------ */
10741 .balign 128
10742.L_ALT_op_ushr_int_lit8: /* 0xe2 */
10743/* File: arm64/alt_stub.S */
10744/*
10745 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10746 * any interesting requests and then jump to the real instruction
10747 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10748 */
10749 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010750 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10751 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
10752 mov x0, xSELF
10753 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010754 mov x2, xPC
10755 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010756
10757/* ------------------------------ */
10758 .balign 128
10759.L_ALT_op_iget_quick: /* 0xe3 */
10760/* File: arm64/alt_stub.S */
10761/*
10762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10763 * any interesting requests and then jump to the real instruction
10764 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10765 */
10766 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010767 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10768 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
10769 mov x0, xSELF
10770 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010771 mov x2, xPC
10772 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010773
10774/* ------------------------------ */
10775 .balign 128
10776.L_ALT_op_iget_wide_quick: /* 0xe4 */
10777/* File: arm64/alt_stub.S */
10778/*
10779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10780 * any interesting requests and then jump to the real instruction
10781 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10782 */
10783 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010784 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10785 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
10786 mov x0, xSELF
10787 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010788 mov x2, xPC
10789 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010790
10791/* ------------------------------ */
10792 .balign 128
10793.L_ALT_op_iget_object_quick: /* 0xe5 */
10794/* File: arm64/alt_stub.S */
10795/*
10796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10797 * any interesting requests and then jump to the real instruction
10798 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10799 */
10800 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010801 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10802 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
10803 mov x0, xSELF
10804 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010805 mov x2, xPC
10806 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010807
10808/* ------------------------------ */
10809 .balign 128
10810.L_ALT_op_iput_quick: /* 0xe6 */
10811/* File: arm64/alt_stub.S */
10812/*
10813 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10814 * any interesting requests and then jump to the real instruction
10815 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10816 */
10817 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010818 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10819 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
10820 mov x0, xSELF
10821 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010822 mov x2, xPC
10823 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010824
10825/* ------------------------------ */
10826 .balign 128
10827.L_ALT_op_iput_wide_quick: /* 0xe7 */
10828/* File: arm64/alt_stub.S */
10829/*
10830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10831 * any interesting requests and then jump to the real instruction
10832 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10833 */
10834 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010835 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10836 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
10837 mov x0, xSELF
10838 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010839 mov x2, xPC
10840 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010841
10842/* ------------------------------ */
10843 .balign 128
10844.L_ALT_op_iput_object_quick: /* 0xe8 */
10845/* File: arm64/alt_stub.S */
10846/*
10847 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10848 * any interesting requests and then jump to the real instruction
10849 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10850 */
10851 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010852 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10853 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
10854 mov x0, xSELF
10855 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010856 mov x2, xPC
10857 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010858
10859/* ------------------------------ */
10860 .balign 128
10861.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
10862/* File: arm64/alt_stub.S */
10863/*
10864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10865 * any interesting requests and then jump to the real instruction
10866 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10867 */
10868 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010869 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10870 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
10871 mov x0, xSELF
10872 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010873 mov x2, xPC
10874 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010875
10876/* ------------------------------ */
10877 .balign 128
10878.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
10879/* File: arm64/alt_stub.S */
10880/*
10881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10882 * any interesting requests and then jump to the real instruction
10883 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10884 */
10885 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010886 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10887 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
10888 mov x0, xSELF
10889 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010890 mov x2, xPC
10891 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010892
10893/* ------------------------------ */
10894 .balign 128
10895.L_ALT_op_iput_boolean_quick: /* 0xeb */
10896/* File: arm64/alt_stub.S */
10897/*
10898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10899 * any interesting requests and then jump to the real instruction
10900 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10901 */
10902 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010903 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10904 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
10905 mov x0, xSELF
10906 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010907 mov x2, xPC
10908 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010909
10910/* ------------------------------ */
10911 .balign 128
10912.L_ALT_op_iput_byte_quick: /* 0xec */
10913/* File: arm64/alt_stub.S */
10914/*
10915 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10916 * any interesting requests and then jump to the real instruction
10917 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10918 */
10919 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010920 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10921 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
10922 mov x0, xSELF
10923 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010924 mov x2, xPC
10925 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010926
10927/* ------------------------------ */
10928 .balign 128
10929.L_ALT_op_iput_char_quick: /* 0xed */
10930/* File: arm64/alt_stub.S */
10931/*
10932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10933 * any interesting requests and then jump to the real instruction
10934 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10935 */
10936 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010937 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10938 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
10939 mov x0, xSELF
10940 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010941 mov x2, xPC
10942 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010943
10944/* ------------------------------ */
10945 .balign 128
10946.L_ALT_op_iput_short_quick: /* 0xee */
10947/* File: arm64/alt_stub.S */
10948/*
10949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10950 * any interesting requests and then jump to the real instruction
10951 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10952 */
10953 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010954 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10955 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
10956 mov x0, xSELF
10957 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010958 mov x2, xPC
10959 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010960
10961/* ------------------------------ */
10962 .balign 128
10963.L_ALT_op_iget_boolean_quick: /* 0xef */
10964/* File: arm64/alt_stub.S */
10965/*
10966 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10967 * any interesting requests and then jump to the real instruction
10968 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10969 */
10970 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010971 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10972 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
10973 mov x0, xSELF
10974 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010975 mov x2, xPC
10976 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010977
10978/* ------------------------------ */
10979 .balign 128
10980.L_ALT_op_iget_byte_quick: /* 0xf0 */
10981/* File: arm64/alt_stub.S */
10982/*
10983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10984 * any interesting requests and then jump to the real instruction
10985 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10986 */
10987 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010988 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10989 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
10990 mov x0, xSELF
10991 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010992 mov x2, xPC
10993 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010994
10995/* ------------------------------ */
10996 .balign 128
10997.L_ALT_op_iget_char_quick: /* 0xf1 */
10998/* File: arm64/alt_stub.S */
10999/*
11000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11001 * any interesting requests and then jump to the real instruction
11002 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11003 */
11004 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011005 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11006 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11007 mov x0, xSELF
11008 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011009 mov x2, xPC
11010 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011011
11012/* ------------------------------ */
11013 .balign 128
11014.L_ALT_op_iget_short_quick: /* 0xf2 */
11015/* File: arm64/alt_stub.S */
11016/*
11017 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11018 * any interesting requests and then jump to the real instruction
11019 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11020 */
11021 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011022 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11023 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11024 mov x0, xSELF
11025 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011026 mov x2, xPC
11027 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011028
11029/* ------------------------------ */
11030 .balign 128
11031.L_ALT_op_invoke_lambda: /* 0xf3 */
11032/* File: arm64/alt_stub.S */
11033/*
11034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11035 * any interesting requests and then jump to the real instruction
11036 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11037 */
11038 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011039 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11040 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11041 mov x0, xSELF
11042 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011043 mov x2, xPC
11044 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011045
11046/* ------------------------------ */
11047 .balign 128
11048.L_ALT_op_unused_f4: /* 0xf4 */
11049/* File: arm64/alt_stub.S */
11050/*
11051 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11052 * any interesting requests and then jump to the real instruction
11053 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11054 */
11055 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011056 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11057 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11058 mov x0, xSELF
11059 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011060 mov x2, xPC
11061 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011062
11063/* ------------------------------ */
11064 .balign 128
11065.L_ALT_op_capture_variable: /* 0xf5 */
11066/* File: arm64/alt_stub.S */
11067/*
11068 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11069 * any interesting requests and then jump to the real instruction
11070 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11071 */
11072 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011073 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11074 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11075 mov x0, xSELF
11076 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011077 mov x2, xPC
11078 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011079
11080/* ------------------------------ */
11081 .balign 128
11082.L_ALT_op_create_lambda: /* 0xf6 */
11083/* File: arm64/alt_stub.S */
11084/*
11085 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11086 * any interesting requests and then jump to the real instruction
11087 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11088 */
11089 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011090 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11091 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11092 mov x0, xSELF
11093 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011094 mov x2, xPC
11095 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011096
11097/* ------------------------------ */
11098 .balign 128
11099.L_ALT_op_liberate_variable: /* 0xf7 */
11100/* File: arm64/alt_stub.S */
11101/*
11102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11103 * any interesting requests and then jump to the real instruction
11104 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11105 */
11106 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011107 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11108 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11109 mov x0, xSELF
11110 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011111 mov x2, xPC
11112 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011113
11114/* ------------------------------ */
11115 .balign 128
11116.L_ALT_op_box_lambda: /* 0xf8 */
11117/* File: arm64/alt_stub.S */
11118/*
11119 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11120 * any interesting requests and then jump to the real instruction
11121 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11122 */
11123 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011124 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11125 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11126 mov x0, xSELF
11127 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011128 mov x2, xPC
11129 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011130
11131/* ------------------------------ */
11132 .balign 128
11133.L_ALT_op_unbox_lambda: /* 0xf9 */
11134/* File: arm64/alt_stub.S */
11135/*
11136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11137 * any interesting requests and then jump to the real instruction
11138 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11139 */
11140 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011141 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11142 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11143 mov x0, xSELF
11144 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011145 mov x2, xPC
11146 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011147
11148/* ------------------------------ */
11149 .balign 128
11150.L_ALT_op_unused_fa: /* 0xfa */
11151/* File: arm64/alt_stub.S */
11152/*
11153 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11154 * any interesting requests and then jump to the real instruction
11155 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11156 */
11157 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011158 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11159 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11160 mov x0, xSELF
11161 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011162 mov x2, xPC
11163 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011164
11165/* ------------------------------ */
11166 .balign 128
11167.L_ALT_op_unused_fb: /* 0xfb */
11168/* File: arm64/alt_stub.S */
11169/*
11170 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11171 * any interesting requests and then jump to the real instruction
11172 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11173 */
11174 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011175 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11176 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11177 mov x0, xSELF
11178 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011179 mov x2, xPC
11180 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011181
11182/* ------------------------------ */
11183 .balign 128
11184.L_ALT_op_unused_fc: /* 0xfc */
11185/* File: arm64/alt_stub.S */
11186/*
11187 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11188 * any interesting requests and then jump to the real instruction
11189 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11190 */
11191 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011192 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11193 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11194 mov x0, xSELF
11195 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011196 mov x2, xPC
11197 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011198
11199/* ------------------------------ */
11200 .balign 128
11201.L_ALT_op_unused_fd: /* 0xfd */
11202/* File: arm64/alt_stub.S */
11203/*
11204 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11205 * any interesting requests and then jump to the real instruction
11206 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11207 */
11208 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011209 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11210 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11211 mov x0, xSELF
11212 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011213 mov x2, xPC
11214 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011215
11216/* ------------------------------ */
11217 .balign 128
11218.L_ALT_op_unused_fe: /* 0xfe */
11219/* File: arm64/alt_stub.S */
11220/*
11221 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11222 * any interesting requests and then jump to the real instruction
11223 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11224 */
11225 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011226 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11227 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11228 mov x0, xSELF
11229 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011230 mov x2, xPC
11231 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011232
11233/* ------------------------------ */
11234 .balign 128
11235.L_ALT_op_unused_ff: /* 0xff */
11236/* File: arm64/alt_stub.S */
11237/*
11238 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11239 * any interesting requests and then jump to the real instruction
11240 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11241 */
11242 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011243 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11244 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11245 mov x0, xSELF
11246 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011247 mov x2, xPC
11248 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011249
11250 .balign 128
11251 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11252 .global artMterpAsmAltInstructionEnd
11253artMterpAsmAltInstructionEnd:
11254/* File: arm64/footer.S */
11255/*
11256 * ===========================================================================
11257 * Common subroutines and data
11258 * ===========================================================================
11259 */
11260
11261
11262/*
11263 * We've detected a condition that will result in an exception, but the exception
11264 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
11265 * TUNING: for consistency, we may want to just go ahead and handle these here.
11266 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011267common_errDivideByZero:
11268 EXPORT_PC
11269#if MTERP_LOGGING
11270 mov x0, xSELF
11271 add x1, xFP, #OFF_FP_SHADOWFRAME
11272 bl MterpLogDivideByZeroException
11273#endif
11274 b MterpCommonFallback
11275
11276common_errArrayIndex:
11277 EXPORT_PC
11278#if MTERP_LOGGING
11279 mov x0, xSELF
11280 add x1, xFP, #OFF_FP_SHADOWFRAME
11281 bl MterpLogArrayIndexException
11282#endif
11283 b MterpCommonFallback
11284
11285common_errNegativeArraySize:
11286 EXPORT_PC
11287#if MTERP_LOGGING
11288 mov x0, xSELF
11289 add x1, xFP, #OFF_FP_SHADOWFRAME
11290 bl MterpLogNegativeArraySizeException
11291#endif
11292 b MterpCommonFallback
11293
11294common_errNoSuchMethod:
11295 EXPORT_PC
11296#if MTERP_LOGGING
11297 mov x0, xSELF
11298 add x1, xFP, #OFF_FP_SHADOWFRAME
11299 bl MterpLogNoSuchMethodException
11300#endif
11301 b MterpCommonFallback
11302
11303common_errNullObject:
11304 EXPORT_PC
11305#if MTERP_LOGGING
11306 mov x0, xSELF
11307 add x1, xFP, #OFF_FP_SHADOWFRAME
11308 bl MterpLogNullObjectException
11309#endif
11310 b MterpCommonFallback
11311
11312common_exceptionThrown:
11313 EXPORT_PC
11314#if MTERP_LOGGING
11315 mov x0, xSELF
11316 add x1, xFP, #OFF_FP_SHADOWFRAME
11317 bl MterpLogExceptionThrownException
11318#endif
11319 b MterpCommonFallback
11320
11321MterpSuspendFallback:
11322 EXPORT_PC
11323#if MTERP_LOGGING
11324 mov x0, xSELF
11325 add x1, xFP, #OFF_FP_SHADOWFRAME
11326 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
11327 bl MterpLogSuspendFallback
11328#endif
11329 b MterpCommonFallback
11330
11331/*
11332 * If we're here, something is out of the ordinary. If there is a pending
11333 * exception, handle it. Otherwise, roll back and retry with the reference
11334 * interpreter.
11335 */
11336MterpPossibleException:
11337 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
11338 cbz x0, MterpFallback // If not, fall back to reference interpreter.
11339 /* intentional fallthrough - handle pending exception. */
11340/*
11341 * On return from a runtime helper routine, we've found a pending exception.
11342 * Can we handle it here - or need to bail out to caller?
11343 *
11344 */
11345MterpException:
11346 mov x0, xSELF
11347 add x1, xFP, #OFF_FP_SHADOWFRAME
11348 bl MterpHandleException // (self, shadow_frame)
11349 cbz w0, MterpExceptionReturn // no local catch, back to caller.
11350 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
11351 ldr w1, [xFP, #OFF_FP_DEX_PC]
11352 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
11353 add xPC, x0, #CODEITEM_INSNS_OFFSET
11354 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
Bill Buzbeefd522f92016-02-11 22:37:42 +000011355 /* Do we need to switch interpreters? */
11356 bl MterpShouldSwitchInterpreters
11357 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011358 /* resume execution at catch block */
Bill Buzbeefd522f92016-02-11 22:37:42 +000011359 EXPORT_PC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011360 FETCH_INST
11361 GET_INST_OPCODE ip
11362 GOTO_OPCODE ip
11363 /* NOTE: no fallthrough */
Bill Buzbee1d011d92016-04-04 16:59:29 +000011364/*
11365 * Common handling for branches with support for Jit profiling.
11366 * On entry:
11367 * wINST <= signed offset
11368 * wPROFILE <= signed hotness countdown (expanded to 32 bits)
11369 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
11370 *
11371 * We have quite a few different cases for branch profiling, OSR detection and
11372 * suspend check support here.
11373 *
11374 * Taken backward branches:
11375 * If profiling active, do hotness countdown and report if we hit zero.
11376 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11377 * Is there a pending suspend request? If so, suspend.
11378 *
11379 * Taken forward branches and not-taken backward branches:
11380 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
11381 *
11382 * Our most common case is expected to be a taken backward branch with active jit profiling,
11383 * but no full OSR check and no pending suspend request.
11384 * Next most common case is not-taken branch with no full OSR check.
11385 *
11386 */
11387MterpCommonTakenBranchNoFlags:
11388 cmp wINST, #0
11389 b.gt .L_forward_branch // don't add forward branches to hotness
11390 tbnz wPROFILE, #31, .L_no_count_backwards // go if negative
11391 subs wPROFILE, wPROFILE, #1 // countdown
11392 b.eq .L_add_batch // counted down to zero - report
11393.L_resume_backward_branch:
11394 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
11395 add w2, wINST, wINST // w2<- byte offset
11396 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
11397 REFRESH_IBASE
11398 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11399 b.ne .L_suspend_request_pending
11400 GET_INST_OPCODE ip // extract opcode from wINST
11401 GOTO_OPCODE ip // jump to next instruction
11402
11403.L_suspend_request_pending:
11404 EXPORT_PC
11405 mov x0, xSELF
11406 bl MterpSuspendCheck // (self)
11407 cbnz x0, MterpFallback
11408 REFRESH_IBASE // might have changed during suspend
11409 GET_INST_OPCODE ip // extract opcode from wINST
11410 GOTO_OPCODE ip // jump to next instruction
11411
11412.L_no_count_backwards:
11413 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
11414 b.ne .L_resume_backward_branch
11415 mov x0, xSELF
11416 add x1, xFP, #OFF_FP_SHADOWFRAME
11417 mov x2, xINST
11418 EXPORT_PC
11419 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11420 cbnz x0, MterpOnStackReplacement
11421 b .L_resume_backward_branch
11422
11423.L_forward_branch:
11424 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
11425 b.eq .L_check_osr_forward
11426.L_resume_forward_branch:
11427 add w2, wINST, wINST // w2<- byte offset
11428 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
11429 GET_INST_OPCODE ip // extract opcode from wINST
11430 GOTO_OPCODE ip // jump to next instruction
11431
11432.L_check_osr_forward:
11433 mov x0, xSELF
11434 add x1, xFP, #OFF_FP_SHADOWFRAME
11435 mov x2, xINST
11436 EXPORT_PC
11437 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11438 cbnz x0, MterpOnStackReplacement
11439 b .L_resume_forward_branch
11440
11441.L_add_batch:
11442 add x1, xFP, #OFF_FP_SHADOWFRAME
11443 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
11444 ldr x0, [xFP, #OFF_FP_METHOD]
11445 mov x2, xSELF
11446 bl MterpAddHotnessBatch // (method, shadow_frame, self)
11447 mov wPROFILE, w0 // restore new hotness countdown to wPROFILE
11448 b .L_no_count_backwards
11449
11450/*
11451 * Entered from the conditional branch handlers when OSR check request active on
11452 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
11453 */
11454.L_check_not_taken_osr:
11455 mov x0, xSELF
11456 add x1, xFP, #OFF_FP_SHADOWFRAME
11457 mov x2, #2
11458 EXPORT_PC
11459 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
11460 cbnz x0, MterpOnStackReplacement
11461 FETCH_ADVANCE_INST 2
11462 GET_INST_OPCODE ip // extract opcode from wINST
11463 GOTO_OPCODE ip // jump to next instruction
11464
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011465
11466/*
11467 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
11468 * still needs to get the opcode and branch to it, and flags are in lr.
11469 */
11470MterpCheckSuspendAndContinue:
11471 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
11472 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11473 b.ne check1
11474 GET_INST_OPCODE ip // extract opcode from wINST
11475 GOTO_OPCODE ip // jump to next instruction
11476check1:
11477 EXPORT_PC
11478 mov x0, xSELF
11479 bl MterpSuspendCheck // (self)
Bill Buzbeefd522f92016-02-11 22:37:42 +000011480 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011481 GET_INST_OPCODE ip // extract opcode from wINST
11482 GOTO_OPCODE ip // jump to next instruction
11483
11484/*
Bill Buzbeefd522f92016-02-11 22:37:42 +000011485 * On-stack replacement has happened, and now we've returned from the compiled method.
11486 */
11487MterpOnStackReplacement:
11488#if MTERP_LOGGING
11489 mov x0, xSELF
11490 add x1, xFP, #OFF_FP_SHADOWFRAME
Vladimir Markoe6220222016-07-20 14:25:30 +010011491 sxtw x2, wINST
Bill Buzbeefd522f92016-02-11 22:37:42 +000011492 bl MterpLogOSR
11493#endif
11494 mov x0, #1 // Signal normal return
11495 b MterpDone
11496
11497/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011498 * Bail out to reference interpreter.
11499 */
11500MterpFallback:
11501 EXPORT_PC
11502#if MTERP_LOGGING
11503 mov x0, xSELF
11504 add x1, xFP, #OFF_FP_SHADOWFRAME
11505 bl MterpLogFallback
11506#endif
11507MterpCommonFallback:
11508 mov x0, #0 // signal retry with reference interpreter.
11509 b MterpDone
11510
11511/*
11512 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
11513 * SP and LR. Here we restore SP, restore the registers, and then restore
11514 * LR to PC.
11515 *
11516 * On entry:
11517 * uint32_t* xFP (should still be live, pointer to base of vregs)
11518 */
11519MterpExceptionReturn:
11520 mov x0, #1 // signal return to caller.
11521 b MterpDone
11522MterpReturn:
11523 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
11524 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
11525 str x0, [x2]
11526 mov x0, xSELF
11527 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
11528 b.eq check2
11529 bl MterpSuspendCheck // (self)
11530check2:
11531 mov x0, #1 // signal return to caller.
11532MterpDone:
Bill Buzbee1d011d92016-04-04 16:59:29 +000011533/*
11534 * At this point, we expect wPROFILE to be non-zero. If negative, hotness is disabled or we're
11535 * checking for OSR. If greater than zero, we might have unreported hotness to register
11536 * (the difference between the ending wPROFILE and the cached hotness counter). wPROFILE
11537 * should only reach zero immediately after a hotness decrement, and is then reset to either
11538 * a negative special state or the new non-zero countdown value.
11539 */
11540 cmp wPROFILE, #0
11541 bgt MterpProfileActive // if > 0, we may have some counts to report.
11542 ldp fp, lr, [sp, #64]
11543 ldp xPC, xFP, [sp, #48]
11544 ldp xSELF, xINST, [sp, #32]
11545 ldp xIBASE, xREFS, [sp, #16]
11546 ldp xPROFILE, x27, [sp], #80
11547 ret
11548
11549MterpProfileActive:
11550 mov xINST, x0 // stash return value
11551 /* Report cached hotness counts */
11552 ldr x0, [xFP, #OFF_FP_METHOD]
11553 add x1, xFP, #OFF_FP_SHADOWFRAME
11554 mov x2, xSELF
11555 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
11556 bl MterpAddHotnessBatch // (method, shadow_frame, self)
11557 mov x0, xINST // restore return value
11558 ldp fp, lr, [sp, #64]
11559 ldp xPC, xFP, [sp, #48]
11560 ldp xSELF, xINST, [sp, #32]
11561 ldp xIBASE, xREFS, [sp, #16]
11562 ldp xPROFILE, x27, [sp], #80
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011563 ret
11564
11565 .cfi_endproc
11566 .size ExecuteMterpImpl, .-ExecuteMterpImpl
11567
11568