blob: de37e07e311c3558ae8ab2e1263df6dbc8bf60c4 [file] [log] [blame]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001/*
2 * This file was generated automatically by gen-mterp.py for 'arm64'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: arm64/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 Art assembly interpreter notes:
26
27 First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28 handle invoke, allows higher-level code to create frame & shadow frame.
29
30 Once that's working, support direct entry code & eliminate shadow frame (and
31 excess locals allocation.
32
33 Some (hopefully) temporary ugliness. We'll treat xFP as pointing to the
34 base of the vreg array within the shadow frame. Access the other fields,
35 dex_pc_, method_ and number_of_vregs_ via negative offsets. For now, we'll continue
36 the shadow frame mechanism of double-storing object references - via xFP &
37 number_of_vregs_.
38
39 */
40
41/*
42ARM64 Runtime register usage conventions.
43
44 r0 : w0 is 32-bit return register and x0 is 64-bit.
45 r0-r7 : Argument registers.
46 r8-r15 : Caller save registers (used as temporary registers).
47 r16-r17: Also known as ip0-ip1, respectively. Used as scratch registers by
48 the linker, by the trampolines and other stubs (the backend uses
49 these as temporary registers).
50 r18 : Caller save register (used as temporary register).
51 r19 : Pointer to thread-local storage.
52 r20-r29: Callee save registers.
53 r30 : (lr) is reserved (the link register).
54 rsp : (sp) is reserved (the stack pointer).
55 rzr : (zr) is reserved (the zero register).
56
57 Floating-point registers
58 v0-v31
59
60 v0 : s0 is return register for singles (32-bit) and d0 for doubles (64-bit).
61 This is analogous to the C/C++ (hard-float) calling convention.
62 v0-v7 : Floating-point argument registers in both Dalvik and C/C++ conventions.
63 Also used as temporary and codegen scratch registers.
64
65 v0-v7 and v16-v31 : trashed across C calls.
66 v8-v15 : bottom 64-bits preserved across C calls (d8-d15 are preserved).
67
68 v16-v31: Used as codegen temp/scratch.
69 v8-v15 : Can be used for promotion.
70
71 Must maintain 16-byte stack alignment.
72
73Mterp notes:
74
75The following registers have fixed assignments:
76
77 reg nick purpose
78 x20 xPC interpreted program counter, used for fetching instructions
79 x21 xFP interpreted frame pointer, used for accessing locals and args
80 x22 xSELF self (Thread) pointer
81 x23 xINST first 16-bit code unit of current instruction
82 x24 xIBASE interpreted instruction base pointer, used for computed goto
83 x25 xREFS base of object references in shadow frame (ideally, we'll get rid of this later).
Bill Buzbee1d011d92016-04-04 16:59:29 +000084 x26 wPROFILE jit profile hotness countdown
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000085 x16 ip scratch reg
86 x17 ip2 scratch reg (used by macros)
87
88Macros are provided for common operations. They MUST NOT alter unspecified registers or condition
89codes.
90*/
91
92/*
93 * This is a #include, not a %include, because we want the C pre-processor
94 * to expand the macros into assembler assignment statements.
95 */
96#include "asm_support.h"
97
Bill Buzbeefd522f92016-02-11 22:37:42 +000098#define MTERP_PROFILE_BRANCHES 1
99#define MTERP_LOGGING 0
100
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000101/* During bringup, we'll use the shadow frame model instead of xFP */
102/* single-purpose registers, given names for clarity */
Bill Buzbee1d011d92016-04-04 16:59:29 +0000103#define xPC x20
104#define xFP x21
105#define xSELF x22
106#define xINST x23
107#define wINST w23
108#define xIBASE x24
109#define xREFS x25
110#define wPROFILE w26
111#define xPROFILE x26
112#define ip x16
113#define ip2 x17
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000114
115/*
116 * Instead of holding a pointer to the shadow frame, we keep xFP at the base of the vregs. So,
117 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
118 */
119#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
120#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
121#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
122#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
123#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
124#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
125#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
126#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
Bill Buzbee1d011d92016-04-04 16:59:29 +0000127#define OFF_FP_SHADOWFRAME OFF_FP(0)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000128
129/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000130 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
131 * be done *before* something throws.
132 *
133 * It's okay to do this more than once.
134 *
135 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
136 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
137 * offset into the code_items_[] array. For effiency, we will "export" the
138 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
139 * to convert to a dex pc when needed.
140 */
141.macro EXPORT_PC
142 str xPC, [xFP, #OFF_FP_DEX_PC_PTR]
143.endm
144
145/*
146 * Fetch the next instruction from xPC into wINST. Does not advance xPC.
147 */
148.macro FETCH_INST
149 ldrh wINST, [xPC]
150.endm
151
152/*
153 * Fetch the next instruction from the specified offset. Advances xPC
154 * to point to the next instruction. "_count" is in 16-bit code units.
155 *
156 * Because of the limited size of immediate constants on ARM, this is only
157 * suitable for small forward movements (i.e. don't try to implement "goto"
158 * with this).
159 *
160 * This must come AFTER anything that can throw an exception, or the
161 * exception catch may miss. (This also implies that it must come after
162 * EXPORT_PC.)
163 */
164.macro FETCH_ADVANCE_INST count
165 ldrh wINST, [xPC, #((\count)*2)]!
166.endm
167
168/*
169 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
170 * src and dest registers are parameterized (not hard-wired to xPC and xINST).
171 */
172.macro PREFETCH_ADVANCE_INST dreg, sreg, count
173 ldrh \dreg, [\sreg, #((\count)*2)]!
174.endm
175
176/*
177 * Similar to FETCH_ADVANCE_INST, but does not update xPC. Used to load
178 * xINST ahead of possible exception point. Be sure to manually advance xPC
179 * later.
180 */
181.macro PREFETCH_INST count
182 ldrh wINST, [xPC, #((\count)*2)]
183.endm
184
185/* Advance xPC by some number of code units. */
186.macro ADVANCE count
187 add xPC, xPC, #((\count)*2)
188.endm
189
190/*
191 * Fetch the next instruction from an offset specified by _reg and advance xPC.
192 * xPC to point to the next instruction. "_reg" must specify the distance
193 * in bytes, *not* 16-bit code units, and may be a signed value. Must not set flags.
194 *
195 */
196.macro FETCH_ADVANCE_INST_RB reg
197 add xPC, xPC, \reg, sxtw
198 ldrh wINST, [xPC]
199.endm
200
201/*
202 * Fetch a half-word code unit from an offset past the current PC. The
203 * "_count" value is in 16-bit code units. Does not advance xPC.
204 *
205 * The "_S" variant works the same but treats the value as signed.
206 */
207.macro FETCH reg, count
208 ldrh \reg, [xPC, #((\count)*2)]
209.endm
210
211.macro FETCH_S reg, count
212 ldrsh \reg, [xPC, #((\count)*2)]
213.endm
214
215/*
216 * Fetch one byte from an offset past the current PC. Pass in the same
217 * "_count" as you would for FETCH, and an additional 0/1 indicating which
218 * byte of the halfword you want (lo/hi).
219 */
220.macro FETCH_B reg, count, byte
221 ldrb \reg, [xPC, #((\count)*2+(\byte))]
222.endm
223
224/*
225 * Put the instruction's opcode field into the specified register.
226 */
227.macro GET_INST_OPCODE reg
228 and \reg, xINST, #255
229.endm
230
231/*
232 * Put the prefetched instruction's opcode field into the specified register.
233 */
234.macro GET_PREFETCHED_OPCODE oreg, ireg
235 and \oreg, \ireg, #255
236.endm
237
238/*
239 * Begin executing the opcode in _reg. Clobbers reg
240 */
241
242.macro GOTO_OPCODE reg
243 add \reg, xIBASE, \reg, lsl #7
244 br \reg
245.endm
246.macro GOTO_OPCODE_BASE base,reg
247 add \reg, \base, \reg, lsl #7
248 br \reg
249.endm
250
251/*
252 * Get/set the 32-bit value from a Dalvik register.
253 */
254.macro GET_VREG reg, vreg
255 ldr \reg, [xFP, \vreg, uxtw #2]
256.endm
257.macro SET_VREG reg, vreg
258 str \reg, [xFP, \vreg, uxtw #2]
259 str wzr, [xREFS, \vreg, uxtw #2]
260.endm
261.macro SET_VREG_OBJECT reg, vreg, tmpreg
262 str \reg, [xFP, \vreg, uxtw #2]
263 str \reg, [xREFS, \vreg, uxtw #2]
264.endm
265
266/*
267 * Get/set the 64-bit value from a Dalvik register.
268 * TUNING: can we do better here?
269 */
270.macro GET_VREG_WIDE reg, vreg
271 add ip2, xFP, \vreg, lsl #2
272 ldr \reg, [ip2]
273.endm
274.macro SET_VREG_WIDE reg, vreg
275 add ip2, xFP, \vreg, lsl #2
276 str \reg, [ip2]
277 add ip2, xREFS, \vreg, lsl #2
278 str xzr, [ip2]
279.endm
280
281/*
Vladimir Marko20421b92016-07-26 16:38:11 +0100282 * Get the 32-bit value from a Dalvik register and sign-extend to 64-bit.
283 * Used to avoid an extra instruction in int-to-long.
284 */
285.macro GET_VREG_S reg, vreg
286 ldrsw \reg, [xFP, \vreg, uxtw #2]
287.endm
288
289/*
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000290 * Convert a virtual register index into an address.
291 */
292.macro VREG_INDEX_TO_ADDR reg, vreg
buzbeeace690f2016-03-11 09:51:11 -0800293 add \reg, xFP, \vreg, lsl #2 /* WARNING: handle shadow frame vreg zero if store */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000294.endm
295
296/*
297 * Refresh handler table.
298 */
299.macro REFRESH_IBASE
300 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
301.endm
302
303/* File: arm64/entry.S */
304/*
305 * Copyright (C) 2016 The Android Open Source Project
306 *
307 * Licensed under the Apache License, Version 2.0 (the "License");
308 * you may not use this file except in compliance with the License.
309 * You may obtain a copy of the License at
310 *
311 * http://www.apache.org/licenses/LICENSE-2.0
312 *
313 * Unless required by applicable law or agreed to in writing, software
314 * distributed under the License is distributed on an "AS IS" BASIS,
315 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
316 * See the License for the specific language governing permissions and
317 * limitations under the License.
318 */
319
320 .text
321
322/*
323 * Interpreter entry point.
324 * On entry:
325 * x0 Thread* self/
326 * x1 code_item
327 * x2 ShadowFrame
328 * x3 JValue* result_register
329 *
330 */
331 .global ExecuteMterpImpl
332 .type ExecuteMterpImpl, %function
333 .balign 16
334
335ExecuteMterpImpl:
336 .cfi_startproc
Bill Buzbee1d011d92016-04-04 16:59:29 +0000337 stp xPROFILE, x27, [sp, #-80]!
338 stp xIBASE, xREFS, [sp, #16]
339 stp xSELF, xINST, [sp, #32]
340 stp xPC, xFP, [sp, #48]
341 stp fp, lr, [sp, #64]
342 add fp, sp, #64
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000343
344 /* Remember the return register */
345 str x3, [x2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
346
347 /* Remember the code_item */
348 str x1, [x2, #SHADOWFRAME_CODE_ITEM_OFFSET]
349
350 /* set up "named" registers */
351 mov xSELF, x0
352 ldr w0, [x2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
buzbeeace690f2016-03-11 09:51:11 -0800353 add xFP, x2, #SHADOWFRAME_VREGS_OFFSET // point to vregs.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000354 add xREFS, xFP, w0, lsl #2 // point to reference array in shadow frame
355 ldr w0, [x2, #SHADOWFRAME_DEX_PC_OFFSET] // Get starting dex_pc.
356 add xPC, x1, #CODEITEM_INSNS_OFFSET // Point to base of insns[]
357 add xPC, xPC, w0, lsl #1 // Create direct pointer to 1st dex opcode
358 EXPORT_PC
359
360 /* Starting ibase */
361 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
362
Bill Buzbee1d011d92016-04-04 16:59:29 +0000363 /* Set up for backwards branches & osr profiling */
364 ldr x0, [xFP, #OFF_FP_METHOD]
365 add x1, xFP, #OFF_FP_SHADOWFRAME
366 bl MterpSetUpHotnessCountdown
367 mov wPROFILE, w0 // Starting hotness countdown to xPROFILE
368
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000369 /* start executing the instruction at rPC */
370 FETCH_INST // load wINST from rPC
371 GET_INST_OPCODE ip // extract opcode from wINST
372 GOTO_OPCODE ip // jump to next instruction
373 /* NOTE: no fallthrough */
374
375
376 .global artMterpAsmInstructionStart
377 .type artMterpAsmInstructionStart, %function
378artMterpAsmInstructionStart = .L_op_nop
379 .text
380
381/* ------------------------------ */
382 .balign 128
383.L_op_nop: /* 0x00 */
384/* File: arm64/op_nop.S */
385 FETCH_ADVANCE_INST 1 // advance to next instr, load rINST
386 GET_INST_OPCODE ip // ip<- opcode from rINST
387 GOTO_OPCODE ip // execute it
388
389/* ------------------------------ */
390 .balign 128
391.L_op_move: /* 0x01 */
392/* File: arm64/op_move.S */
393 /* for move, move-object, long-to-int */
394 /* op vA, vB */
395 lsr w1, wINST, #12 // x1<- B from 15:12
396 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
397 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
398 GET_VREG w2, w1 // x2<- fp[B]
399 GET_INST_OPCODE ip // ip<- opcode from wINST
400 .if 0
401 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
402 .else
403 SET_VREG w2, w0 // fp[A]<- x2
404 .endif
405 GOTO_OPCODE ip // execute next instruction
406
407/* ------------------------------ */
408 .balign 128
409.L_op_move_from16: /* 0x02 */
410/* File: arm64/op_move_from16.S */
411 /* for: move/from16, move-object/from16 */
412 /* op vAA, vBBBB */
413 FETCH w1, 1 // r1<- BBBB
414 lsr w0, wINST, #8 // r0<- AA
415 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
416 GET_VREG w2, w1 // r2<- fp[BBBB]
417 GET_INST_OPCODE ip // extract opcode from wINST
418 .if 0
419 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
420 .else
421 SET_VREG w2, w0 // fp[AA]<- r2
422 .endif
423 GOTO_OPCODE ip // jump to next instruction
424
425/* ------------------------------ */
426 .balign 128
427.L_op_move_16: /* 0x03 */
428/* File: arm64/op_move_16.S */
429 /* for: move/16, move-object/16 */
430 /* op vAAAA, vBBBB */
431 FETCH w1, 2 // w1<- BBBB
432 FETCH w0, 1 // w0<- AAAA
433 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
434 GET_VREG w2, w1 // w2<- fp[BBBB]
435 GET_INST_OPCODE ip // extract opcode from xINST
436 .if 0
437 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
438 .else
439 SET_VREG w2, w0 // fp[AAAA]<- w2
440 .endif
441 GOTO_OPCODE ip // jump to next instruction
442
443/* ------------------------------ */
444 .balign 128
445.L_op_move_wide: /* 0x04 */
446/* File: arm64/op_move_wide.S */
447 /* move-wide vA, vB */
448 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
449 lsr w3, wINST, #12 // w3<- B
450 ubfx w2, wINST, #8, #4 // w2<- A
451 GET_VREG_WIDE x3, w3
452 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
453 GET_INST_OPCODE ip // extract opcode from wINST
454 SET_VREG_WIDE x3, w2
455 GOTO_OPCODE ip // jump to next instruction
456
457/* ------------------------------ */
458 .balign 128
459.L_op_move_wide_from16: /* 0x05 */
460/* File: arm64/op_move_wide_from16.S */
461 /* move-wide/from16 vAA, vBBBB */
462 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
463 FETCH w3, 1 // w3<- BBBB
464 lsr w2, wINST, #8 // w2<- AA
465 GET_VREG_WIDE x3, w3
466 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
467 GET_INST_OPCODE ip // extract opcode from wINST
468 SET_VREG_WIDE x3, w2
469 GOTO_OPCODE ip // jump to next instruction
470
471/* ------------------------------ */
472 .balign 128
473.L_op_move_wide_16: /* 0x06 */
474/* File: arm64/op_move_wide_16.S */
475 /* move-wide/16 vAAAA, vBBBB */
476 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
477 FETCH w3, 2 // w3<- BBBB
478 FETCH w2, 1 // w2<- AAAA
479 GET_VREG_WIDE x3, w3
480 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
481 SET_VREG_WIDE x3, w2
482 GET_INST_OPCODE ip // extract opcode from rINST
483 GOTO_OPCODE ip // jump to next instruction
484
485/* ------------------------------ */
486 .balign 128
487.L_op_move_object: /* 0x07 */
488/* File: arm64/op_move_object.S */
489/* File: arm64/op_move.S */
490 /* for move, move-object, long-to-int */
491 /* op vA, vB */
492 lsr w1, wINST, #12 // x1<- B from 15:12
493 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
494 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
495 GET_VREG w2, w1 // x2<- fp[B]
496 GET_INST_OPCODE ip // ip<- opcode from wINST
497 .if 1
498 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
499 .else
500 SET_VREG w2, w0 // fp[A]<- x2
501 .endif
502 GOTO_OPCODE ip // execute next instruction
503
504
505/* ------------------------------ */
506 .balign 128
507.L_op_move_object_from16: /* 0x08 */
508/* File: arm64/op_move_object_from16.S */
509/* File: arm64/op_move_from16.S */
510 /* for: move/from16, move-object/from16 */
511 /* op vAA, vBBBB */
512 FETCH w1, 1 // r1<- BBBB
513 lsr w0, wINST, #8 // r0<- AA
514 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
515 GET_VREG w2, w1 // r2<- fp[BBBB]
516 GET_INST_OPCODE ip // extract opcode from wINST
517 .if 1
518 SET_VREG_OBJECT w2, w0 // fp[AA]<- r2
519 .else
520 SET_VREG w2, w0 // fp[AA]<- r2
521 .endif
522 GOTO_OPCODE ip // jump to next instruction
523
524
525/* ------------------------------ */
526 .balign 128
527.L_op_move_object_16: /* 0x09 */
528/* File: arm64/op_move_object_16.S */
529/* File: arm64/op_move_16.S */
530 /* for: move/16, move-object/16 */
531 /* op vAAAA, vBBBB */
532 FETCH w1, 2 // w1<- BBBB
533 FETCH w0, 1 // w0<- AAAA
534 FETCH_ADVANCE_INST 3 // advance xPC, load xINST
535 GET_VREG w2, w1 // w2<- fp[BBBB]
536 GET_INST_OPCODE ip // extract opcode from xINST
537 .if 1
538 SET_VREG_OBJECT w2, w0 // fp[AAAA]<- w2
539 .else
540 SET_VREG w2, w0 // fp[AAAA]<- w2
541 .endif
542 GOTO_OPCODE ip // jump to next instruction
543
544
545/* ------------------------------ */
546 .balign 128
547.L_op_move_result: /* 0x0a */
548/* File: arm64/op_move_result.S */
549 /* for: move-result, move-result-object */
550 /* op vAA */
551 lsr w2, wINST, #8 // r2<- AA
552 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
553 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
554 ldr w0, [x0] // r0 <- result.i.
555 GET_INST_OPCODE ip // extract opcode from wINST
556 .if 0
557 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
558 .else
559 SET_VREG w0, w2 // fp[AA]<- r0
560 .endif
561 GOTO_OPCODE ip // jump to next instruction
562
563/* ------------------------------ */
564 .balign 128
565.L_op_move_result_wide: /* 0x0b */
566/* File: arm64/op_move_result_wide.S */
567 /* for: move-result-wide */
568 /* op vAA */
569 lsr w2, wINST, #8 // r2<- AA
570 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
571 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
572 ldr x0, [x0] // r0 <- result.i.
573 GET_INST_OPCODE ip // extract opcode from wINST
574 SET_VREG_WIDE x0, x2 // fp[AA]<- r0
575 GOTO_OPCODE ip // jump to next instruction
576
577/* ------------------------------ */
578 .balign 128
579.L_op_move_result_object: /* 0x0c */
580/* File: arm64/op_move_result_object.S */
581/* File: arm64/op_move_result.S */
582 /* for: move-result, move-result-object */
583 /* op vAA */
584 lsr w2, wINST, #8 // r2<- AA
585 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
586 ldr x0, [xFP, #OFF_FP_RESULT_REGISTER] // get pointer to result JType.
587 ldr w0, [x0] // r0 <- result.i.
588 GET_INST_OPCODE ip // extract opcode from wINST
589 .if 1
590 SET_VREG_OBJECT w0, w2, w1 // fp[AA]<- r0
591 .else
592 SET_VREG w0, w2 // fp[AA]<- r0
593 .endif
594 GOTO_OPCODE ip // jump to next instruction
595
596
597/* ------------------------------ */
598 .balign 128
599.L_op_move_exception: /* 0x0d */
600/* File: arm64/op_move_exception.S */
601 /* move-exception vAA */
602 lsr w2, wINST, #8 // w2<- AA
603 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
604 mov x1, #0 // w1<- 0
605 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
606 SET_VREG_OBJECT w3, w2 // fp[AA]<- exception obj
607 GET_INST_OPCODE ip // extract opcode from rINST
608 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // clear exception
609 GOTO_OPCODE ip // jump to next instruction
610
611/* ------------------------------ */
612 .balign 128
613.L_op_return_void: /* 0x0e */
614/* File: arm64/op_return_void.S */
615 .extern MterpThreadFenceForConstructor
616 bl MterpThreadFenceForConstructor
617 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
618 mov x0, xSELF
619 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
620 b.ne .Lop_return_void_check
621.Lop_return_void_return:
622 mov x0, #0
623 b MterpReturn
624.Lop_return_void_check:
625 bl MterpSuspendCheck // (self)
626 b .Lop_return_void_return
627
628/* ------------------------------ */
629 .balign 128
630.L_op_return: /* 0x0f */
631/* File: arm64/op_return.S */
632 /*
633 * Return a 32-bit value.
634 *
635 * for: return, return-object
636 */
637 /* op vAA */
638 .extern MterpThreadFenceForConstructor
639 bl MterpThreadFenceForConstructor
640 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
641 mov x0, xSELF
642 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
643 b.ne .Lop_return_check
644.Lop_return_return:
645 lsr w2, wINST, #8 // r2<- AA
646 GET_VREG w0, w2 // r0<- vAA
647 b MterpReturn
648.Lop_return_check:
649 bl MterpSuspendCheck // (self)
650 b .Lop_return_return
651
652/* ------------------------------ */
653 .balign 128
654.L_op_return_wide: /* 0x10 */
655/* File: arm64/op_return_wide.S */
656 /*
657 * Return a 64-bit value.
658 */
659 /* return-wide vAA */
660 /* op vAA */
661 .extern MterpThreadFenceForConstructor
662 bl MterpThreadFenceForConstructor
663 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
664 mov x0, xSELF
665 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
666 b.ne .Lop_return_wide_check
667.Lop_return_wide_return:
668 lsr w2, wINST, #8 // w2<- AA
669 GET_VREG_WIDE x0, w2 // x0<- vAA
670 b MterpReturn
671.Lop_return_wide_check:
672 bl MterpSuspendCheck // (self)
673 b .Lop_return_wide_return
674
675/* ------------------------------ */
676 .balign 128
677.L_op_return_object: /* 0x11 */
678/* File: arm64/op_return_object.S */
679/* File: arm64/op_return.S */
680 /*
681 * Return a 32-bit value.
682 *
683 * for: return, return-object
684 */
685 /* op vAA */
686 .extern MterpThreadFenceForConstructor
687 bl MterpThreadFenceForConstructor
688 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
689 mov x0, xSELF
690 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
691 b.ne .Lop_return_object_check
692.Lop_return_object_return:
693 lsr w2, wINST, #8 // r2<- AA
694 GET_VREG w0, w2 // r0<- vAA
695 b MterpReturn
696.Lop_return_object_check:
697 bl MterpSuspendCheck // (self)
698 b .Lop_return_object_return
699
700
701/* ------------------------------ */
702 .balign 128
703.L_op_const_4: /* 0x12 */
704/* File: arm64/op_const_4.S */
705 /* const/4 vA, #+B */
Vladimir Marko20421b92016-07-26 16:38:11 +0100706 sbfx w1, wINST, #12, #4 // w1<- sssssssB
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000707 ubfx w0, wINST, #8, #4 // w0<- A
708 FETCH_ADVANCE_INST 1 // advance xPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000709 GET_INST_OPCODE ip // ip<- opcode from xINST
710 SET_VREG w1, w0 // fp[A]<- w1
711 GOTO_OPCODE ip // execute next instruction
712
713/* ------------------------------ */
714 .balign 128
715.L_op_const_16: /* 0x13 */
716/* File: arm64/op_const_16.S */
717 /* const/16 vAA, #+BBBB */
Vladimir Marko20421b92016-07-26 16:38:11 +0100718 FETCH_S w0, 1 // w0<- ssssBBBB (sign-extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000719 lsr w3, wINST, #8 // w3<- AA
720 FETCH_ADVANCE_INST 2 // advance xPC, load wINST
721 SET_VREG w0, w3 // vAA<- w0
722 GET_INST_OPCODE ip // extract opcode from wINST
723 GOTO_OPCODE ip // jump to next instruction
724
725/* ------------------------------ */
726 .balign 128
727.L_op_const: /* 0x14 */
728/* File: arm64/op_const.S */
729 /* const vAA, #+BBBBbbbb */
730 lsr w3, wINST, #8 // w3<- AA
731 FETCH w0, 1 // w0<- bbbb (low
732 FETCH w1, 2 // w1<- BBBB (high
733 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
734 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
735 GET_INST_OPCODE ip // extract opcode from wINST
736 SET_VREG w0, w3 // vAA<- w0
737 GOTO_OPCODE ip // jump to next instruction
738
739/* ------------------------------ */
740 .balign 128
741.L_op_const_high16: /* 0x15 */
742/* File: arm64/op_const_high16.S */
743 /* const/high16 vAA, #+BBBB0000 */
Vladimir Marko20421b92016-07-26 16:38:11 +0100744 FETCH w0, 1 // r0<- 0000BBBB (zero-extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000745 lsr w3, wINST, #8 // r3<- AA
746 lsl w0, w0, #16 // r0<- BBBB0000
747 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
748 SET_VREG w0, w3 // vAA<- r0
749 GET_INST_OPCODE ip // extract opcode from rINST
750 GOTO_OPCODE ip // jump to next instruction
751
752/* ------------------------------ */
753 .balign 128
754.L_op_const_wide_16: /* 0x16 */
755/* File: arm64/op_const_wide_16.S */
756 /* const-wide/16 vAA, #+BBBB */
Vladimir Markoe6220222016-07-20 14:25:30 +0100757 FETCH_S x0, 1 // x0<- ssssssssssssBBBB (sign-extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000758 lsr w3, wINST, #8 // w3<- AA
759 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000760 GET_INST_OPCODE ip // extract opcode from rINST
761 SET_VREG_WIDE x0, w3
762 GOTO_OPCODE ip // jump to next instruction
763
764/* ------------------------------ */
765 .balign 128
766.L_op_const_wide_32: /* 0x17 */
767/* File: arm64/op_const_wide_32.S */
768 /* const-wide/32 vAA, #+BBBBbbbb */
Vladimir Markoe6220222016-07-20 14:25:30 +0100769 FETCH w0, 1 // x0<- 000000000000bbbb (low)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000770 lsr w3, wINST, #8 // w3<- AA
Vladimir Markoe6220222016-07-20 14:25:30 +0100771 FETCH_S x2, 2 // x2<- ssssssssssssBBBB (high)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000772 FETCH_ADVANCE_INST 3 // advance rPC, load wINST
773 GET_INST_OPCODE ip // extract opcode from wINST
Vladimir Markoe6220222016-07-20 14:25:30 +0100774 orr x0, x0, x2, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000775 SET_VREG_WIDE x0, w3
776 GOTO_OPCODE ip // jump to next instruction
777
778/* ------------------------------ */
779 .balign 128
780.L_op_const_wide: /* 0x18 */
781/* File: arm64/op_const_wide.S */
782 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
783 FETCH w0, 1 // w0<- bbbb (low)
784 FETCH w1, 2 // w1<- BBBB (low middle)
785 FETCH w2, 3 // w2<- hhhh (high middle)
786 FETCH w3, 4 // w3<- HHHH (high)
787 lsr w4, wINST, #8 // r4<- AA
788 FETCH_ADVANCE_INST 5 // advance rPC, load wINST
789 GET_INST_OPCODE ip // extract opcode from wINST
790 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb
791 orr x0, x0, x2, lsl #32 // w0<- hhhhBBBBbbbb
792 orr x0, x0, x3, lsl #48 // w0<- HHHHhhhhBBBBbbbb
793 SET_VREG_WIDE x0, w4
794 GOTO_OPCODE ip // jump to next instruction
795
796/* ------------------------------ */
797 .balign 128
798.L_op_const_wide_high16: /* 0x19 */
799/* File: arm64/op_const_wide_high16.S */
800 /* const-wide/high16 vAA, #+BBBB000000000000 */
801 FETCH w0, 1 // w0<- 0000BBBB (zero-extended)
802 lsr w1, wINST, #8 // w1<- AA
803 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
804 lsl x0, x0, #48
805 SET_VREG_WIDE x0, w1
806 GET_INST_OPCODE ip // extract opcode from wINST
807 GOTO_OPCODE ip // jump to next instruction
808
809/* ------------------------------ */
810 .balign 128
811.L_op_const_string: /* 0x1a */
812/* File: arm64/op_const_string.S */
813 /* const/string vAA, String//BBBB */
814 EXPORT_PC
815 FETCH w0, 1 // w0<- BBBB
816 lsr w1, wINST, #8 // w1<- AA
817 add x2, xFP, #OFF_FP_SHADOWFRAME
818 mov x3, xSELF
819 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
820 PREFETCH_INST 2 // load rINST
821 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
822 ADVANCE 2 // advance rPC
823 GET_INST_OPCODE ip // extract opcode from rINST
824 GOTO_OPCODE ip // jump to next instruction
825
826/* ------------------------------ */
827 .balign 128
828.L_op_const_string_jumbo: /* 0x1b */
829/* File: arm64/op_const_string_jumbo.S */
830 /* const/string vAA, String//BBBBBBBB */
831 EXPORT_PC
832 FETCH w0, 1 // w0<- bbbb (low
833 FETCH w2, 2 // w2<- BBBB (high
834 lsr w1, wINST, #8 // w1<- AA
835 orr w0, w0, w2, lsl #16 // w1<- BBBBbbbb
836 add x2, xFP, #OFF_FP_SHADOWFRAME
837 mov x3, xSELF
838 bl MterpConstString // (index, tgt_reg, shadow_frame, self)
839 PREFETCH_INST 3 // advance rPC
840 cbnz w0, MterpPossibleException // let reference interpreter deal with it.
841 ADVANCE 3 // advance rPC
842 GET_INST_OPCODE ip // extract opcode from rINST
843 GOTO_OPCODE ip // jump to next instruction
844
845/* ------------------------------ */
846 .balign 128
847.L_op_const_class: /* 0x1c */
848/* File: arm64/op_const_class.S */
849 /* const/class vAA, Class//BBBB */
850 EXPORT_PC
851 FETCH w0, 1 // w0<- BBBB
852 lsr w1, wINST, #8 // w1<- AA
853 add x2, xFP, #OFF_FP_SHADOWFRAME
854 mov x3, xSELF
855 bl MterpConstClass // (index, tgt_reg, shadow_frame, self)
856 PREFETCH_INST 2
857 cbnz w0, MterpPossibleException
858 ADVANCE 2
859 GET_INST_OPCODE ip // extract opcode from rINST
860 GOTO_OPCODE ip // jump to next instruction
861
862/* ------------------------------ */
863 .balign 128
864.L_op_monitor_enter: /* 0x1d */
865/* File: arm64/op_monitor_enter.S */
866 /*
867 * Synchronize on an object.
868 */
869 /* monitor-enter vAA */
870 EXPORT_PC
871 lsr w2, wINST, #8 // w2<- AA
872 GET_VREG w0, w2 // w0<- vAA (object)
873 mov x1, xSELF // w1<- self
874 bl artLockObjectFromCode
875 cbnz w0, MterpException
876 FETCH_ADVANCE_INST 1
877 GET_INST_OPCODE ip // extract opcode from rINST
878 GOTO_OPCODE ip // jump to next instruction
879
880/* ------------------------------ */
881 .balign 128
882.L_op_monitor_exit: /* 0x1e */
883/* File: arm64/op_monitor_exit.S */
884 /*
885 * Unlock an object.
886 *
887 * Exceptions that occur when unlocking a monitor need to appear as
888 * if they happened at the following instruction. See the Dalvik
889 * instruction spec.
890 */
891 /* monitor-exit vAA */
892 EXPORT_PC
893 lsr w2, wINST, #8 // w2<- AA
894 GET_VREG w0, w2 // w0<- vAA (object)
895 mov x1, xSELF // w0<- self
896 bl artUnlockObjectFromCode // w0<- success for unlock(self, obj)
897 cbnz w0, MterpException
898 FETCH_ADVANCE_INST 1 // before throw: advance rPC, load rINST
899 GET_INST_OPCODE ip // extract opcode from rINST
900 GOTO_OPCODE ip // jump to next instruction
901
902/* ------------------------------ */
903 .balign 128
904.L_op_check_cast: /* 0x1f */
905/* File: arm64/op_check_cast.S */
906 /*
907 * Check to see if a cast from one class to another is allowed.
908 */
909 /* check-cast vAA, class//BBBB */
910 EXPORT_PC
911 FETCH w0, 1 // w0<- BBBB
912 lsr w1, wINST, #8 // w1<- AA
913 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
914 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
915 mov x3, xSELF // w3<- self
916 bl MterpCheckCast // (index, &obj, method, self)
917 PREFETCH_INST 2
918 cbnz w0, MterpPossibleException
919 ADVANCE 2
920 GET_INST_OPCODE ip // extract opcode from rINST
921 GOTO_OPCODE ip // jump to next instruction
922
923/* ------------------------------ */
924 .balign 128
925.L_op_instance_of: /* 0x20 */
926/* File: arm64/op_instance_of.S */
927 /*
928 * Check to see if an object reference is an instance of a class.
929 *
930 * Most common situation is a non-null object, being compared against
931 * an already-resolved class.
932 */
933 /* instance-of vA, vB, class//CCCC */
934 EXPORT_PC
935 FETCH w0, 1 // w0<- CCCC
936 lsr w1, wINST, #12 // w1<- B
937 VREG_INDEX_TO_ADDR x1, w1 // w1<- &object
938 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- method
939 mov x3, xSELF // w3<- self
940 bl MterpInstanceOf // (index, &obj, method, self)
941 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
Vladimir Markoe6220222016-07-20 14:25:30 +0100942 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000943 PREFETCH_INST 2
944 cbnz x1, MterpException
945 ADVANCE 2 // advance rPC
946 SET_VREG w0, w2 // vA<- w0
947 GET_INST_OPCODE ip // extract opcode from rINST
948 GOTO_OPCODE ip // jump to next instruction
949
950/* ------------------------------ */
951 .balign 128
952.L_op_array_length: /* 0x21 */
953/* File: arm64/op_array_length.S */
954 /*
955 * Return the length of an array.
956 */
957 lsr w1, wINST, #12 // w1<- B
958 ubfx w2, wINST, #8, #4 // w2<- A
959 GET_VREG w0, w1 // w0<- vB (object ref)
960 cbz w0, common_errNullObject // yup, fail
961 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
962 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- array length
963 GET_INST_OPCODE ip // extract opcode from rINST
964 SET_VREG w3, w2 // vB<- length
965 GOTO_OPCODE ip // jump to next instruction
966
967/* ------------------------------ */
968 .balign 128
969.L_op_new_instance: /* 0x22 */
970/* File: arm64/op_new_instance.S */
971 /*
972 * Create a new instance of a class.
973 */
974 /* new-instance vAA, class//BBBB */
975 EXPORT_PC
976 add x0, xFP, #OFF_FP_SHADOWFRAME
977 mov x1, xSELF
978 mov w2, wINST
979 bl MterpNewInstance // (shadow_frame, self, inst_data)
980 cbz w0, MterpPossibleException
981 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
982 GET_INST_OPCODE ip // extract opcode from rINST
983 GOTO_OPCODE ip // jump to next instruction
984
985/* ------------------------------ */
986 .balign 128
987.L_op_new_array: /* 0x23 */
988/* File: arm64/op_new_array.S */
989 /*
990 * Allocate an array of objects, specified with the array class
991 * and a count.
992 *
993 * The verifier guarantees that this is an array class, so we don't
994 * check for it here.
995 */
996 /* new-array vA, vB, class//CCCC */
997 EXPORT_PC
998 add x0, xFP, #OFF_FP_SHADOWFRAME
999 mov x1, xPC
1000 mov w2, wINST
1001 mov x3, xSELF
1002 bl MterpNewArray
1003 cbz w0, MterpPossibleException
1004 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1005 GET_INST_OPCODE ip // extract opcode from rINST
1006 GOTO_OPCODE ip // jump to next instruction
1007
1008/* ------------------------------ */
1009 .balign 128
1010.L_op_filled_new_array: /* 0x24 */
1011/* File: arm64/op_filled_new_array.S */
1012 /*
1013 * Create a new array with elements filled from registers.
1014 *
1015 * for: filled-new-array, filled-new-array/range
1016 */
1017 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1018 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1019 .extern MterpFilledNewArray
1020 EXPORT_PC
1021 add x0, xFP, #OFF_FP_SHADOWFRAME
1022 mov x1, xPC
1023 mov x2, xSELF
1024 bl MterpFilledNewArray
1025 cbz w0, MterpPossibleException
1026 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1027 GET_INST_OPCODE ip // extract opcode from rINST
1028 GOTO_OPCODE ip // jump to next instruction
1029
1030/* ------------------------------ */
1031 .balign 128
1032.L_op_filled_new_array_range: /* 0x25 */
1033/* File: arm64/op_filled_new_array_range.S */
1034/* File: arm64/op_filled_new_array.S */
1035 /*
1036 * Create a new array with elements filled from registers.
1037 *
1038 * for: filled-new-array, filled-new-array/range
1039 */
1040 /* op vB, {vD, vE, vF, vG, vA}, class//CCCC */
1041 /* op {vCCCC..v(CCCC+AA-1)}, type//BBBB */
1042 .extern MterpFilledNewArrayRange
1043 EXPORT_PC
1044 add x0, xFP, #OFF_FP_SHADOWFRAME
1045 mov x1, xPC
1046 mov x2, xSELF
1047 bl MterpFilledNewArrayRange
1048 cbz w0, MterpPossibleException
1049 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1050 GET_INST_OPCODE ip // extract opcode from rINST
1051 GOTO_OPCODE ip // jump to next instruction
1052
1053
1054/* ------------------------------ */
1055 .balign 128
1056.L_op_fill_array_data: /* 0x26 */
1057/* File: arm64/op_fill_array_data.S */
1058 /* fill-array-data vAA, +BBBBBBBB */
1059 EXPORT_PC
Vladimir Markod9ad3572016-07-22 10:52:24 +01001060 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1061 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001062 lsr w3, wINST, #8 // w3<- AA
Vladimir Markod9ad3572016-07-22 10:52:24 +01001063 orr x1, x0, x1, lsl #16 // x1<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001064 GET_VREG w0, w3 // w0<- vAA (array object)
Vladimir Markod9ad3572016-07-22 10:52:24 +01001065 add x1, xPC, x1, lsl #1 // x1<- PC + ssssssssBBBBbbbb*2 (array data off.)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001066 bl MterpFillArrayData // (obj, payload)
1067 cbz w0, MterpPossibleException // exception?
1068 FETCH_ADVANCE_INST 3 // advance rPC, load rINST
1069 GET_INST_OPCODE ip // extract opcode from rINST
1070 GOTO_OPCODE ip // jump to next instruction
1071
1072/* ------------------------------ */
1073 .balign 128
1074.L_op_throw: /* 0x27 */
1075/* File: arm64/op_throw.S */
1076 /*
1077 * Throw an exception object in the current thread.
1078 */
1079 /* throw vAA */
1080 EXPORT_PC
1081 lsr w2, wINST, #8 // r2<- AA
1082 GET_VREG w1, w2 // r1<- vAA (exception object)
1083 cbz w1, common_errNullObject
1084 str x1, [xSELF, #THREAD_EXCEPTION_OFFSET] // thread->exception<- obj
1085 b MterpException
1086
1087/* ------------------------------ */
1088 .balign 128
1089.L_op_goto: /* 0x28 */
1090/* File: arm64/op_goto.S */
1091 /*
1092 * Unconditional branch, 8-bit offset.
1093 *
1094 * The branch distance is a signed code-unit offset, which we need to
1095 * double to get a byte offset.
1096 */
1097 /* goto +AA */
Bill Buzbee1d011d92016-04-04 16:59:29 +00001098 sbfx wINST, wINST, #8, #8 // wINST<- ssssssAA (sign-extended)
1099 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001100
1101/* ------------------------------ */
1102 .balign 128
1103.L_op_goto_16: /* 0x29 */
1104/* File: arm64/op_goto_16.S */
1105 /*
1106 * Unconditional branch, 16-bit offset.
1107 *
1108 * The branch distance is a signed code-unit offset, which we need to
1109 * double to get a byte offset.
1110 */
1111 /* goto/16 +AAAA */
Bill Buzbeefd522f92016-02-11 22:37:42 +00001112 FETCH_S wINST, 1 // wINST<- ssssAAAA (sign-extended)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001113 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001114
1115/* ------------------------------ */
1116 .balign 128
1117.L_op_goto_32: /* 0x2a */
1118/* File: arm64/op_goto_32.S */
1119 /*
1120 * Unconditional branch, 32-bit offset.
1121 *
1122 * The branch distance is a signed code-unit offset, which we need to
1123 * double to get a byte offset.
1124 *
1125 * Unlike most opcodes, this one is allowed to branch to itself, so
1126 * our "backward branch" test must be "<=0" instead of "<0". Because
1127 * we need the V bit set, we'll use an adds to convert from Dalvik
1128 * offset to byte offset.
1129 */
1130 /* goto/32 +AAAAAAAA */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001131 FETCH w0, 1 // w0<- aaaa (lo)
1132 FETCH w1, 2 // w1<- AAAA (hi)
Bill Buzbeefd522f92016-02-11 22:37:42 +00001133 orr wINST, w0, w1, lsl #16 // wINST<- AAAAaaaa
Bill Buzbee1d011d92016-04-04 16:59:29 +00001134 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001135
1136/* ------------------------------ */
1137 .balign 128
1138.L_op_packed_switch: /* 0x2b */
1139/* File: arm64/op_packed_switch.S */
1140 /*
1141 * Handle a packed-switch or sparse-switch instruction. In both cases
1142 * we decode it and hand it off to a helper function.
1143 *
1144 * We don't really expect backward branches in a switch statement, but
1145 * they're perfectly legal, so we check for them here.
1146 *
1147 * for: packed-switch, sparse-switch
1148 */
1149 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001150 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1151 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001152 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001153 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001154 GET_VREG w1, w3 // w1<- vAA
Vladimir Markod9ad3572016-07-22 10:52:24 +01001155 add x0, xPC, x0, lsl #1 // x0<- PC + ssssssssBBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001156 bl MterpDoPackedSwitch // w0<- code-unit branch offset
Vladimir Markoe6220222016-07-20 14:25:30 +01001157 sxtw xINST, w0
Bill Buzbee1d011d92016-04-04 16:59:29 +00001158 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001159
1160/* ------------------------------ */
1161 .balign 128
1162.L_op_sparse_switch: /* 0x2c */
1163/* File: arm64/op_sparse_switch.S */
1164/* File: arm64/op_packed_switch.S */
1165 /*
1166 * Handle a packed-switch or sparse-switch instruction. In both cases
1167 * we decode it and hand it off to a helper function.
1168 *
1169 * We don't really expect backward branches in a switch statement, but
1170 * they're perfectly legal, so we check for them here.
1171 *
1172 * for: packed-switch, sparse-switch
1173 */
1174 /* op vAA, +BBBB */
Vladimir Marko5733e982016-07-20 17:52:51 +01001175 FETCH w0, 1 // x0<- 000000000000bbbb (lo)
1176 FETCH_S x1, 2 // x1<- ssssssssssssBBBB (hi)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001177 lsr w3, wINST, #8 // w3<- AA
Vladimir Marko5733e982016-07-20 17:52:51 +01001178 orr x0, x0, x1, lsl #16 // x0<- ssssssssBBBBbbbb
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001179 GET_VREG w1, w3 // w1<- vAA
Vladimir Markod9ad3572016-07-22 10:52:24 +01001180 add x0, xPC, x0, lsl #1 // x0<- PC + ssssssssBBBBbbbb*2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001181 bl MterpDoSparseSwitch // w0<- code-unit branch offset
Vladimir Markoe6220222016-07-20 14:25:30 +01001182 sxtw xINST, w0
Bill Buzbee1d011d92016-04-04 16:59:29 +00001183 b MterpCommonTakenBranchNoFlags
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001184
1185
1186/* ------------------------------ */
1187 .balign 128
1188.L_op_cmpl_float: /* 0x2d */
1189/* File: arm64/op_cmpl_float.S */
1190/* File: arm64/fcmp.S */
1191 /*
1192 * Compare two floating-point values. Puts 0, 1, or -1 into the
1193 * destination register based on the results of the comparison.
1194 */
1195 /* op vAA, vBB, vCC */
1196 FETCH w0, 1 // w0<- CCBB
1197 lsr w4, wINST, #8 // w4<- AA
1198 and w2, w0, #255 // w2<- BB
1199 lsr w3, w0, #8 // w3<- CC
1200 GET_VREG s1, w2
1201 GET_VREG s2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001202 fcmp s1, s2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001203 cset w0, ne
1204 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001205 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1206 GET_INST_OPCODE ip // extract opcode from rINST
1207 SET_VREG w0, w4 // vAA<- w0
1208 GOTO_OPCODE ip // jump to next instruction
1209
1210
1211/* ------------------------------ */
1212 .balign 128
1213.L_op_cmpg_float: /* 0x2e */
1214/* File: arm64/op_cmpg_float.S */
1215/* File: arm64/fcmp.S */
1216 /*
1217 * Compare two floating-point values. Puts 0, 1, or -1 into the
1218 * destination register based on the results of the comparison.
1219 */
1220 /* op vAA, vBB, vCC */
1221 FETCH w0, 1 // w0<- CCBB
1222 lsr w4, wINST, #8 // w4<- AA
1223 and w2, w0, #255 // w2<- BB
1224 lsr w3, w0, #8 // w3<- CC
1225 GET_VREG s1, w2
1226 GET_VREG s2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001227 fcmp s1, s2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001228 cset w0, ne
1229 cneg w0, w0, cc
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001230 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1231 GET_INST_OPCODE ip // extract opcode from rINST
1232 SET_VREG w0, w4 // vAA<- w0
1233 GOTO_OPCODE ip // jump to next instruction
1234
1235
1236/* ------------------------------ */
1237 .balign 128
1238.L_op_cmpl_double: /* 0x2f */
1239/* File: arm64/op_cmpl_double.S */
1240/* File: arm64/fcmp.S */
1241 /*
1242 * Compare two floating-point values. Puts 0, 1, or -1 into the
1243 * destination register based on the results of the comparison.
1244 */
1245 /* op vAA, vBB, vCC */
1246 FETCH w0, 1 // w0<- CCBB
1247 lsr w4, wINST, #8 // w4<- AA
1248 and w2, w0, #255 // w2<- BB
1249 lsr w3, w0, #8 // w3<- CC
1250 GET_VREG_WIDE d1, w2
1251 GET_VREG_WIDE d2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001252 fcmp d1, d2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001253 cset w0, ne
1254 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001255 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1256 GET_INST_OPCODE ip // extract opcode from rINST
1257 SET_VREG w0, w4 // vAA<- w0
1258 GOTO_OPCODE ip // jump to next instruction
1259
1260
1261/* ------------------------------ */
1262 .balign 128
1263.L_op_cmpg_double: /* 0x30 */
1264/* File: arm64/op_cmpg_double.S */
1265/* File: arm64/fcmp.S */
1266 /*
1267 * Compare two floating-point values. Puts 0, 1, or -1 into the
1268 * destination register based on the results of the comparison.
1269 */
1270 /* op vAA, vBB, vCC */
1271 FETCH w0, 1 // w0<- CCBB
1272 lsr w4, wINST, #8 // w4<- AA
1273 and w2, w0, #255 // w2<- BB
1274 lsr w3, w0, #8 // w3<- CC
1275 GET_VREG_WIDE d1, w2
1276 GET_VREG_WIDE d2, w3
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001277 fcmp d1, d2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001278 cset w0, ne
1279 cneg w0, w0, cc
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001280 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1281 GET_INST_OPCODE ip // extract opcode from rINST
1282 SET_VREG w0, w4 // vAA<- w0
1283 GOTO_OPCODE ip // jump to next instruction
1284
1285
1286/* ------------------------------ */
1287 .balign 128
1288.L_op_cmp_long: /* 0x31 */
1289/* File: arm64/op_cmp_long.S */
1290 FETCH w0, 1 // w0<- CCBB
1291 lsr w4, wINST, #8 // w4<- AA
1292 and w2, w0, #255 // w2<- BB
1293 lsr w3, w0, #8 // w3<- CC
1294 GET_VREG_WIDE x1, w2
1295 GET_VREG_WIDE x2, w3
1296 cmp x1, x2
Vladimir Markofb6db3f2016-07-21 12:59:46 +01001297 cset w0, ne
1298 cneg w0, w0, lt
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001299 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1300 SET_VREG w0, w4
1301 GET_INST_OPCODE ip // extract opcode from wINST
1302 GOTO_OPCODE ip // jump to next instruction
1303
1304/* ------------------------------ */
1305 .balign 128
1306.L_op_if_eq: /* 0x32 */
1307/* File: arm64/op_if_eq.S */
1308/* File: arm64/bincmp.S */
1309 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001310 * Generic two-operand compare-and-branch operation. Provide a "condition"
1311 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001312 *
1313 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1314 */
1315 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001316 lsr w1, wINST, #12 // w1<- B
1317 ubfx w0, wINST, #8, #4 // w0<- A
1318 GET_VREG w3, w1 // w3<- vB
1319 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001320 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001321 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001322 b.eq MterpCommonTakenBranchNoFlags
1323 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1324 b.eq .L_check_not_taken_osr
1325 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001326 GET_INST_OPCODE ip // extract opcode from wINST
1327 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001328
1329
1330/* ------------------------------ */
1331 .balign 128
1332.L_op_if_ne: /* 0x33 */
1333/* File: arm64/op_if_ne.S */
1334/* File: arm64/bincmp.S */
1335 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001336 * Generic two-operand compare-and-branch operation. Provide a "condition"
1337 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001338 *
1339 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1340 */
1341 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001342 lsr w1, wINST, #12 // w1<- B
1343 ubfx w0, wINST, #8, #4 // w0<- A
1344 GET_VREG w3, w1 // w3<- vB
1345 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001346 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001347 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001348 b.ne MterpCommonTakenBranchNoFlags
1349 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1350 b.eq .L_check_not_taken_osr
1351 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001352 GET_INST_OPCODE ip // extract opcode from wINST
1353 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001354
1355
1356/* ------------------------------ */
1357 .balign 128
1358.L_op_if_lt: /* 0x34 */
1359/* File: arm64/op_if_lt.S */
1360/* File: arm64/bincmp.S */
1361 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001362 * Generic two-operand compare-and-branch operation. Provide a "condition"
1363 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001364 *
1365 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1366 */
1367 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001368 lsr w1, wINST, #12 // w1<- B
1369 ubfx w0, wINST, #8, #4 // w0<- A
1370 GET_VREG w3, w1 // w3<- vB
1371 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001372 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001373 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001374 b.lt MterpCommonTakenBranchNoFlags
1375 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1376 b.eq .L_check_not_taken_osr
1377 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001378 GET_INST_OPCODE ip // extract opcode from wINST
1379 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001380
1381
1382/* ------------------------------ */
1383 .balign 128
1384.L_op_if_ge: /* 0x35 */
1385/* File: arm64/op_if_ge.S */
1386/* File: arm64/bincmp.S */
1387 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001388 * Generic two-operand compare-and-branch operation. Provide a "condition"
1389 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001390 *
1391 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1392 */
1393 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001394 lsr w1, wINST, #12 // w1<- B
1395 ubfx w0, wINST, #8, #4 // w0<- A
1396 GET_VREG w3, w1 // w3<- vB
1397 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001398 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001399 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001400 b.ge MterpCommonTakenBranchNoFlags
1401 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1402 b.eq .L_check_not_taken_osr
1403 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001404 GET_INST_OPCODE ip // extract opcode from wINST
1405 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001406
1407
1408/* ------------------------------ */
1409 .balign 128
1410.L_op_if_gt: /* 0x36 */
1411/* File: arm64/op_if_gt.S */
1412/* File: arm64/bincmp.S */
1413 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001414 * Generic two-operand compare-and-branch operation. Provide a "condition"
1415 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001416 *
1417 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1418 */
1419 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001420 lsr w1, wINST, #12 // w1<- B
1421 ubfx w0, wINST, #8, #4 // w0<- A
1422 GET_VREG w3, w1 // w3<- vB
1423 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001424 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001425 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001426 b.gt MterpCommonTakenBranchNoFlags
1427 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1428 b.eq .L_check_not_taken_osr
1429 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001430 GET_INST_OPCODE ip // extract opcode from wINST
1431 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001432
1433
1434/* ------------------------------ */
1435 .balign 128
1436.L_op_if_le: /* 0x37 */
1437/* File: arm64/op_if_le.S */
1438/* File: arm64/bincmp.S */
1439 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001440 * Generic two-operand compare-and-branch operation. Provide a "condition"
1441 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001442 *
1443 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1444 */
1445 /* if-cmp vA, vB, +CCCC */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001446 lsr w1, wINST, #12 // w1<- B
1447 ubfx w0, wINST, #8, #4 // w0<- A
1448 GET_VREG w3, w1 // w3<- vB
1449 GET_VREG w2, w0 // w2<- vA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001450 FETCH_S wINST, 1 // wINST<- branch offset, in code units
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001451 cmp w2, w3 // compare (vA, vB)
Bill Buzbee1d011d92016-04-04 16:59:29 +00001452 b.le MterpCommonTakenBranchNoFlags
1453 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1454 b.eq .L_check_not_taken_osr
1455 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001456 GET_INST_OPCODE ip // extract opcode from wINST
1457 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001458
1459
1460/* ------------------------------ */
1461 .balign 128
1462.L_op_if_eqz: /* 0x38 */
1463/* File: arm64/op_if_eqz.S */
1464/* File: arm64/zcmp.S */
1465 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001466 * Generic one-operand compare-and-branch operation. Provide a "condition"
1467 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001468 *
1469 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1470 */
1471 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001472 lsr w0, wINST, #8 // w0<- AA
1473 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001474 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001475 .if 0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001476 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001477 .endif
1478 cbz w2, MterpCommonTakenBranchNoFlags
Bill Buzbee1d011d92016-04-04 16:59:29 +00001479 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1480 b.eq .L_check_not_taken_osr
1481 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001482 GET_INST_OPCODE ip // extract opcode from wINST
1483 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001484
1485
1486/* ------------------------------ */
1487 .balign 128
1488.L_op_if_nez: /* 0x39 */
1489/* File: arm64/op_if_nez.S */
1490/* File: arm64/zcmp.S */
1491 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001492 * Generic one-operand compare-and-branch operation. Provide a "condition"
1493 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001494 *
1495 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1496 */
1497 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001498 lsr w0, wINST, #8 // w0<- AA
1499 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001500 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001501 .if 0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001502 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001503 .endif
1504 cbnz w2, MterpCommonTakenBranchNoFlags
Bill Buzbee1d011d92016-04-04 16:59:29 +00001505 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1506 b.eq .L_check_not_taken_osr
1507 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001508 GET_INST_OPCODE ip // extract opcode from wINST
1509 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001510
1511
1512/* ------------------------------ */
1513 .balign 128
1514.L_op_if_ltz: /* 0x3a */
1515/* File: arm64/op_if_ltz.S */
1516/* File: arm64/zcmp.S */
1517 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001518 * Generic one-operand compare-and-branch operation. Provide a "condition"
1519 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001520 *
1521 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1522 */
1523 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001524 lsr w0, wINST, #8 // w0<- AA
1525 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001526 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001527 .if 0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001528 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001529 .endif
1530 tbnz w2, #31, MterpCommonTakenBranchNoFlags
Bill Buzbee1d011d92016-04-04 16:59:29 +00001531 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1532 b.eq .L_check_not_taken_osr
1533 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001534 GET_INST_OPCODE ip // extract opcode from wINST
1535 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001536
1537
1538/* ------------------------------ */
1539 .balign 128
1540.L_op_if_gez: /* 0x3b */
1541/* File: arm64/op_if_gez.S */
1542/* File: arm64/zcmp.S */
1543 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001544 * Generic one-operand compare-and-branch operation. Provide a "condition"
1545 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001546 *
1547 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1548 */
1549 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001550 lsr w0, wINST, #8 // w0<- AA
1551 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001552 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001553 .if 0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001554 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001555 .endif
1556 tbz w2, #31, MterpCommonTakenBranchNoFlags
Bill Buzbee1d011d92016-04-04 16:59:29 +00001557 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1558 b.eq .L_check_not_taken_osr
1559 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001560 GET_INST_OPCODE ip // extract opcode from wINST
1561 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001562
1563
1564/* ------------------------------ */
1565 .balign 128
1566.L_op_if_gtz: /* 0x3c */
1567/* File: arm64/op_if_gtz.S */
1568/* File: arm64/zcmp.S */
1569 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001570 * Generic one-operand compare-and-branch operation. Provide a "condition"
1571 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001572 *
1573 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1574 */
1575 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001576 lsr w0, wINST, #8 // w0<- AA
1577 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001578 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001579 .if 1
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001580 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001581 .endif
Bill Buzbee1d011d92016-04-04 16:59:29 +00001582 b.gt MterpCommonTakenBranchNoFlags
1583 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1584 b.eq .L_check_not_taken_osr
1585 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001586 GET_INST_OPCODE ip // extract opcode from wINST
1587 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001588
1589
1590/* ------------------------------ */
1591 .balign 128
1592.L_op_if_lez: /* 0x3d */
1593/* File: arm64/op_if_lez.S */
1594/* File: arm64/zcmp.S */
1595 /*
Bill Buzbee1d011d92016-04-04 16:59:29 +00001596 * Generic one-operand compare-and-branch operation. Provide a "condition"
1597 * fragment that specifies the comparison to perform.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001598 *
1599 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1600 */
1601 /* if-cmp vAA, +BBBB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001602 lsr w0, wINST, #8 // w0<- AA
1603 GET_VREG w2, w0 // w2<- vAA
Bill Buzbee1d011d92016-04-04 16:59:29 +00001604 FETCH_S wINST, 1 // w1<- branch offset, in code units
Vladimir Marko20421b92016-07-26 16:38:11 +01001605 .if 1
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001606 cmp w2, #0 // compare (vA, 0)
Vladimir Marko20421b92016-07-26 16:38:11 +01001607 .endif
Bill Buzbee1d011d92016-04-04 16:59:29 +00001608 b.le MterpCommonTakenBranchNoFlags
1609 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
1610 b.eq .L_check_not_taken_osr
1611 FETCH_ADVANCE_INST 2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001612 GET_INST_OPCODE ip // extract opcode from wINST
1613 GOTO_OPCODE ip // jump to next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00001614
1615
1616/* ------------------------------ */
1617 .balign 128
1618.L_op_unused_3e: /* 0x3e */
1619/* File: arm64/op_unused_3e.S */
1620/* File: arm64/unused.S */
1621/*
1622 * Bail to reference interpreter to throw.
1623 */
1624 b MterpFallback
1625
1626
1627/* ------------------------------ */
1628 .balign 128
1629.L_op_unused_3f: /* 0x3f */
1630/* File: arm64/op_unused_3f.S */
1631/* File: arm64/unused.S */
1632/*
1633 * Bail to reference interpreter to throw.
1634 */
1635 b MterpFallback
1636
1637
1638/* ------------------------------ */
1639 .balign 128
1640.L_op_unused_40: /* 0x40 */
1641/* File: arm64/op_unused_40.S */
1642/* File: arm64/unused.S */
1643/*
1644 * Bail to reference interpreter to throw.
1645 */
1646 b MterpFallback
1647
1648
1649/* ------------------------------ */
1650 .balign 128
1651.L_op_unused_41: /* 0x41 */
1652/* File: arm64/op_unused_41.S */
1653/* File: arm64/unused.S */
1654/*
1655 * Bail to reference interpreter to throw.
1656 */
1657 b MterpFallback
1658
1659
1660/* ------------------------------ */
1661 .balign 128
1662.L_op_unused_42: /* 0x42 */
1663/* File: arm64/op_unused_42.S */
1664/* File: arm64/unused.S */
1665/*
1666 * Bail to reference interpreter to throw.
1667 */
1668 b MterpFallback
1669
1670
1671/* ------------------------------ */
1672 .balign 128
1673.L_op_unused_43: /* 0x43 */
1674/* File: arm64/op_unused_43.S */
1675/* File: arm64/unused.S */
1676/*
1677 * Bail to reference interpreter to throw.
1678 */
1679 b MterpFallback
1680
1681
1682/* ------------------------------ */
1683 .balign 128
1684.L_op_aget: /* 0x44 */
1685/* File: arm64/op_aget.S */
1686 /*
1687 * Array get, 32 bits or less. vAA <- vBB[vCC].
1688 *
1689 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1690 * instructions. We use a pair of FETCH_Bs instead.
1691 *
1692 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1693 *
1694 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1695 * If this changes, specialize.
1696 */
1697 /* op vAA, vBB, vCC */
1698 FETCH_B w2, 1, 0 // w2<- BB
1699 lsr w9, wINST, #8 // w9<- AA
1700 FETCH_B w3, 1, 1 // w3<- CC
1701 GET_VREG w0, w2 // w0<- vBB (array object)
1702 GET_VREG w1, w3 // w1<- vCC (requested index)
1703 cbz x0, common_errNullObject // bail if null array object.
1704 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1705 add x0, x0, w1, uxtw #2 // w0<- arrayObj + index*width
1706 cmp w1, w3 // compare unsigned index, length
1707 bcs common_errArrayIndex // index >= length, bail
1708 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1709 ldr w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1710 GET_INST_OPCODE ip // extract opcode from rINST
1711 SET_VREG w2, w9 // vAA<- w2
1712 GOTO_OPCODE ip // jump to next instruction
1713
1714/* ------------------------------ */
1715 .balign 128
1716.L_op_aget_wide: /* 0x45 */
1717/* File: arm64/op_aget_wide.S */
1718 /*
1719 * Array get, 64 bits. vAA <- vBB[vCC].
1720 *
1721 */
1722 /* aget-wide vAA, vBB, vCC */
1723 FETCH w0, 1 // w0<- CCBB
1724 lsr w4, wINST, #8 // w4<- AA
1725 and w2, w0, #255 // w2<- BB
1726 lsr w3, w0, #8 // w3<- CC
1727 GET_VREG w0, w2 // w0<- vBB (array object)
1728 GET_VREG w1, w3 // w1<- vCC (requested index)
1729 cbz w0, common_errNullObject // yes, bail
1730 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1731 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1732 cmp w1, w3 // compare unsigned index, length
1733 bcs common_errArrayIndex // index >= length, bail
1734 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1735 ldr x2, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] // x2<- vBB[vCC]
1736 GET_INST_OPCODE ip // extract opcode from wINST
1737 SET_VREG_WIDE x2, w4
1738 GOTO_OPCODE ip // jump to next instruction
1739
1740/* ------------------------------ */
1741 .balign 128
1742.L_op_aget_object: /* 0x46 */
1743/* File: arm64/op_aget_object.S */
1744 /*
1745 * Array object get. vAA <- vBB[vCC].
1746 *
1747 * for: aget-object
1748 */
1749 /* op vAA, vBB, vCC */
1750 FETCH_B w2, 1, 0 // w2<- BB
1751 FETCH_B w3, 1, 1 // w3<- CC
1752 EXPORT_PC
1753 GET_VREG w0, w2 // w0<- vBB (array object)
1754 GET_VREG w1, w3 // w1<- vCC (requested index)
1755 bl artAGetObjectFromMterp // (array, index)
1756 ldr x1, [xSELF, #THREAD_EXCEPTION_OFFSET]
1757 lsr w2, wINST, #8 // w9<- AA
1758 PREFETCH_INST 2
1759 cbnz w1, MterpException
1760 SET_VREG_OBJECT w0, w2
1761 ADVANCE 2
1762 GET_INST_OPCODE ip
1763 GOTO_OPCODE ip // jump to next instruction
1764
1765/* ------------------------------ */
1766 .balign 128
1767.L_op_aget_boolean: /* 0x47 */
1768/* File: arm64/op_aget_boolean.S */
1769/* File: arm64/op_aget.S */
1770 /*
1771 * Array get, 32 bits or less. vAA <- vBB[vCC].
1772 *
1773 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1774 * instructions. We use a pair of FETCH_Bs instead.
1775 *
1776 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1777 *
1778 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1779 * If this changes, specialize.
1780 */
1781 /* op vAA, vBB, vCC */
1782 FETCH_B w2, 1, 0 // w2<- BB
1783 lsr w9, wINST, #8 // w9<- AA
1784 FETCH_B w3, 1, 1 // w3<- CC
1785 GET_VREG w0, w2 // w0<- vBB (array object)
1786 GET_VREG w1, w3 // w1<- vCC (requested index)
1787 cbz x0, common_errNullObject // bail if null array object.
1788 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1789 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1790 cmp w1, w3 // compare unsigned index, length
1791 bcs common_errArrayIndex // index >= length, bail
1792 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1793 ldrb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1794 GET_INST_OPCODE ip // extract opcode from rINST
1795 SET_VREG w2, w9 // vAA<- w2
1796 GOTO_OPCODE ip // jump to next instruction
1797
1798
1799/* ------------------------------ */
1800 .balign 128
1801.L_op_aget_byte: /* 0x48 */
1802/* File: arm64/op_aget_byte.S */
1803/* File: arm64/op_aget.S */
1804 /*
1805 * Array get, 32 bits or less. vAA <- vBB[vCC].
1806 *
1807 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1808 * instructions. We use a pair of FETCH_Bs instead.
1809 *
1810 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1811 *
1812 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1813 * If this changes, specialize.
1814 */
1815 /* op vAA, vBB, vCC */
1816 FETCH_B w2, 1, 0 // w2<- BB
1817 lsr w9, wINST, #8 // w9<- AA
1818 FETCH_B w3, 1, 1 // w3<- CC
1819 GET_VREG w0, w2 // w0<- vBB (array object)
1820 GET_VREG w1, w3 // w1<- vCC (requested index)
1821 cbz x0, common_errNullObject // bail if null array object.
1822 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1823 add x0, x0, w1, uxtw #0 // w0<- arrayObj + index*width
1824 cmp w1, w3 // compare unsigned index, length
1825 bcs common_errArrayIndex // index >= length, bail
1826 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1827 ldrsb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1828 GET_INST_OPCODE ip // extract opcode from rINST
1829 SET_VREG w2, w9 // vAA<- w2
1830 GOTO_OPCODE ip // jump to next instruction
1831
1832
1833/* ------------------------------ */
1834 .balign 128
1835.L_op_aget_char: /* 0x49 */
1836/* File: arm64/op_aget_char.S */
1837/* File: arm64/op_aget.S */
1838 /*
1839 * Array get, 32 bits or less. vAA <- vBB[vCC].
1840 *
1841 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1842 * instructions. We use a pair of FETCH_Bs instead.
1843 *
1844 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1845 *
1846 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1847 * If this changes, specialize.
1848 */
1849 /* op vAA, vBB, vCC */
1850 FETCH_B w2, 1, 0 // w2<- BB
1851 lsr w9, wINST, #8 // w9<- AA
1852 FETCH_B w3, 1, 1 // w3<- CC
1853 GET_VREG w0, w2 // w0<- vBB (array object)
1854 GET_VREG w1, w3 // w1<- vCC (requested index)
1855 cbz x0, common_errNullObject // bail if null array object.
1856 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1857 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1858 cmp w1, w3 // compare unsigned index, length
1859 bcs common_errArrayIndex // index >= length, bail
1860 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1861 ldrh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1862 GET_INST_OPCODE ip // extract opcode from rINST
1863 SET_VREG w2, w9 // vAA<- w2
1864 GOTO_OPCODE ip // jump to next instruction
1865
1866
1867/* ------------------------------ */
1868 .balign 128
1869.L_op_aget_short: /* 0x4a */
1870/* File: arm64/op_aget_short.S */
1871/* File: arm64/op_aget.S */
1872 /*
1873 * Array get, 32 bits or less. vAA <- vBB[vCC].
1874 *
1875 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1876 * instructions. We use a pair of FETCH_Bs instead.
1877 *
1878 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
1879 *
1880 * NOTE: assumes data offset for arrays is the same for all non-wide types.
1881 * If this changes, specialize.
1882 */
1883 /* op vAA, vBB, vCC */
1884 FETCH_B w2, 1, 0 // w2<- BB
1885 lsr w9, wINST, #8 // w9<- AA
1886 FETCH_B w3, 1, 1 // w3<- CC
1887 GET_VREG w0, w2 // w0<- vBB (array object)
1888 GET_VREG w1, w3 // w1<- vCC (requested index)
1889 cbz x0, common_errNullObject // bail if null array object.
1890 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1891 add x0, x0, w1, uxtw #1 // w0<- arrayObj + index*width
1892 cmp w1, w3 // compare unsigned index, length
1893 bcs common_errArrayIndex // index >= length, bail
1894 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1895 ldrsh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // w2<- vBB[vCC]
1896 GET_INST_OPCODE ip // extract opcode from rINST
1897 SET_VREG w2, w9 // vAA<- w2
1898 GOTO_OPCODE ip // jump to next instruction
1899
1900
1901/* ------------------------------ */
1902 .balign 128
1903.L_op_aput: /* 0x4b */
1904/* File: arm64/op_aput.S */
1905 /*
1906 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1907 *
1908 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1909 * instructions. We use a pair of FETCH_Bs instead.
1910 *
1911 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1912 *
1913 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1914 * If this changes, specialize.
1915 */
1916 /* op vAA, vBB, vCC */
1917 FETCH_B w2, 1, 0 // w2<- BB
1918 lsr w9, wINST, #8 // w9<- AA
1919 FETCH_B w3, 1, 1 // w3<- CC
1920 GET_VREG w0, w2 // w0<- vBB (array object)
1921 GET_VREG w1, w3 // w1<- vCC (requested index)
1922 cbz w0, common_errNullObject // bail if null
1923 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1924 add x0, x0, w1, lsl #2 // w0<- arrayObj + index*width
1925 cmp w1, w3 // compare unsigned index, length
1926 bcs common_errArrayIndex // index >= length, bail
1927 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1928 GET_VREG w2, w9 // w2<- vAA
1929 GET_INST_OPCODE ip // extract opcode from rINST
1930 str w2, [x0, #MIRROR_INT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
1931 GOTO_OPCODE ip // jump to next instruction
1932
1933/* ------------------------------ */
1934 .balign 128
1935.L_op_aput_wide: /* 0x4c */
1936/* File: arm64/op_aput_wide.S */
1937 /*
1938 * Array put, 64 bits. vBB[vCC] <- vAA.
1939 *
1940 */
1941 /* aput-wide vAA, vBB, vCC */
1942 FETCH w0, 1 // w0<- CCBB
1943 lsr w4, wINST, #8 // w4<- AA
1944 and w2, w0, #255 // w2<- BB
1945 lsr w3, w0, #8 // w3<- CC
1946 GET_VREG w0, w2 // w0<- vBB (array object)
1947 GET_VREG w1, w3 // w1<- vCC (requested index)
1948 cbz w0, common_errNullObject // bail if null
1949 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
1950 add x0, x0, w1, lsl #3 // w0<- arrayObj + index*width
1951 cmp w1, w3 // compare unsigned index, length
1952 bcs common_errArrayIndex // index >= length, bail
1953 GET_VREG_WIDE x1, w4
1954 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
1955 GET_INST_OPCODE ip // extract opcode from wINST
1956 str x1, [x0, #MIRROR_WIDE_ARRAY_DATA_OFFSET]
1957 GOTO_OPCODE ip // jump to next instruction
1958
1959/* ------------------------------ */
1960 .balign 128
1961.L_op_aput_object: /* 0x4d */
1962/* File: arm64/op_aput_object.S */
1963 /*
1964 * Store an object into an array. vBB[vCC] <- vAA.
1965 */
1966 /* op vAA, vBB, vCC */
1967 EXPORT_PC
1968 add x0, xFP, #OFF_FP_SHADOWFRAME
1969 mov x1, xPC
1970 mov w2, wINST
1971 bl MterpAputObject
1972 cbz w0, MterpPossibleException
1973 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
1974 GET_INST_OPCODE ip // extract opcode from rINST
1975 GOTO_OPCODE ip // jump to next instruction
1976
1977/* ------------------------------ */
1978 .balign 128
1979.L_op_aput_boolean: /* 0x4e */
1980/* File: arm64/op_aput_boolean.S */
1981/* File: arm64/op_aput.S */
1982 /*
1983 * Array put, 32 bits or less. vBB[vCC] <- vAA.
1984 *
1985 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1986 * instructions. We use a pair of FETCH_Bs instead.
1987 *
1988 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
1989 *
1990 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
1991 * If this changes, specialize.
1992 */
1993 /* op vAA, vBB, vCC */
1994 FETCH_B w2, 1, 0 // w2<- BB
1995 lsr w9, wINST, #8 // w9<- AA
1996 FETCH_B w3, 1, 1 // w3<- CC
1997 GET_VREG w0, w2 // w0<- vBB (array object)
1998 GET_VREG w1, w3 // w1<- vCC (requested index)
1999 cbz w0, common_errNullObject // bail if null
2000 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2001 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2002 cmp w1, w3 // compare unsigned index, length
2003 bcs common_errArrayIndex // index >= length, bail
2004 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2005 GET_VREG w2, w9 // w2<- vAA
2006 GET_INST_OPCODE ip // extract opcode from rINST
2007 strb w2, [x0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2008 GOTO_OPCODE ip // jump to next instruction
2009
2010
2011/* ------------------------------ */
2012 .balign 128
2013.L_op_aput_byte: /* 0x4f */
2014/* File: arm64/op_aput_byte.S */
2015/* File: arm64/op_aput.S */
2016 /*
2017 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2018 *
2019 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2020 * instructions. We use a pair of FETCH_Bs instead.
2021 *
2022 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2023 *
2024 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2025 * If this changes, specialize.
2026 */
2027 /* op vAA, vBB, vCC */
2028 FETCH_B w2, 1, 0 // w2<- BB
2029 lsr w9, wINST, #8 // w9<- AA
2030 FETCH_B w3, 1, 1 // w3<- CC
2031 GET_VREG w0, w2 // w0<- vBB (array object)
2032 GET_VREG w1, w3 // w1<- vCC (requested index)
2033 cbz w0, common_errNullObject // bail if null
2034 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2035 add x0, x0, w1, lsl #0 // w0<- arrayObj + index*width
2036 cmp w1, w3 // compare unsigned index, length
2037 bcs common_errArrayIndex // index >= length, bail
2038 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2039 GET_VREG w2, w9 // w2<- vAA
2040 GET_INST_OPCODE ip // extract opcode from rINST
2041 strb w2, [x0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2042 GOTO_OPCODE ip // jump to next instruction
2043
2044
2045/* ------------------------------ */
2046 .balign 128
2047.L_op_aput_char: /* 0x50 */
2048/* File: arm64/op_aput_char.S */
2049/* File: arm64/op_aput.S */
2050 /*
2051 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2052 *
2053 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2054 * instructions. We use a pair of FETCH_Bs instead.
2055 *
2056 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2057 *
2058 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2059 * If this changes, specialize.
2060 */
2061 /* op vAA, vBB, vCC */
2062 FETCH_B w2, 1, 0 // w2<- BB
2063 lsr w9, wINST, #8 // w9<- AA
2064 FETCH_B w3, 1, 1 // w3<- CC
2065 GET_VREG w0, w2 // w0<- vBB (array object)
2066 GET_VREG w1, w3 // w1<- vCC (requested index)
2067 cbz w0, common_errNullObject // bail if null
2068 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2069 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2070 cmp w1, w3 // compare unsigned index, length
2071 bcs common_errArrayIndex // index >= length, bail
2072 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2073 GET_VREG w2, w9 // w2<- vAA
2074 GET_INST_OPCODE ip // extract opcode from rINST
2075 strh w2, [x0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2076 GOTO_OPCODE ip // jump to next instruction
2077
2078
2079/* ------------------------------ */
2080 .balign 128
2081.L_op_aput_short: /* 0x51 */
2082/* File: arm64/op_aput_short.S */
2083/* File: arm64/op_aput.S */
2084 /*
2085 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2086 *
2087 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2088 * instructions. We use a pair of FETCH_Bs instead.
2089 *
2090 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2091 *
2092 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2093 * If this changes, specialize.
2094 */
2095 /* op vAA, vBB, vCC */
2096 FETCH_B w2, 1, 0 // w2<- BB
2097 lsr w9, wINST, #8 // w9<- AA
2098 FETCH_B w3, 1, 1 // w3<- CC
2099 GET_VREG w0, w2 // w0<- vBB (array object)
2100 GET_VREG w1, w3 // w1<- vCC (requested index)
2101 cbz w0, common_errNullObject // bail if null
2102 ldr w3, [x0, #MIRROR_ARRAY_LENGTH_OFFSET] // w3<- arrayObj->length
2103 add x0, x0, w1, lsl #1 // w0<- arrayObj + index*width
2104 cmp w1, w3 // compare unsigned index, length
2105 bcs common_errArrayIndex // index >= length, bail
2106 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2107 GET_VREG w2, w9 // w2<- vAA
2108 GET_INST_OPCODE ip // extract opcode from rINST
2109 strh w2, [x0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] // vBB[vCC]<- w2
2110 GOTO_OPCODE ip // jump to next instruction
2111
2112
2113/* ------------------------------ */
2114 .balign 128
2115.L_op_iget: /* 0x52 */
2116/* File: arm64/op_iget.S */
2117 /*
2118 * General instance field get.
2119 *
2120 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2121 */
2122 EXPORT_PC
2123 FETCH w0, 1 // w0<- field ref CCCC
2124 lsr w1, wINST, #12 // w1<- B
2125 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2126 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2127 mov x3, xSELF // w3<- self
2128 bl artGet32InstanceFromCode
2129 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002130
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002131 ubfx w2, wINST, #8, #4 // w2<- A
2132 PREFETCH_INST 2
2133 cbnz x3, MterpPossibleException // bail out
2134 .if 0
2135 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2136 .else
2137 SET_VREG w0, w2 // fp[A]<- w0
2138 .endif
2139 ADVANCE 2
2140 GET_INST_OPCODE ip // extract opcode from rINST
2141 GOTO_OPCODE ip // jump to next instruction
2142
2143/* ------------------------------ */
2144 .balign 128
2145.L_op_iget_wide: /* 0x53 */
2146/* File: arm64/op_iget_wide.S */
2147 /*
2148 * 64-bit instance field get.
2149 *
2150 * for: iget-wide
2151 */
2152 EXPORT_PC
2153 FETCH w0, 1 // w0<- field ref CCCC
2154 lsr w1, wINST, #12 // w1<- B
2155 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2156 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2157 mov x3, xSELF // w3<- self
2158 bl artGet64InstanceFromCode
2159 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2160 ubfx w2, wINST, #8, #4 // w2<- A
2161 PREFETCH_INST 2
2162 cmp w3, #0
2163 cbnz w3, MterpException // bail out
2164 SET_VREG_WIDE x0, w2
2165 ADVANCE 2
2166 GET_INST_OPCODE ip // extract opcode from wINST
2167 GOTO_OPCODE ip // jump to next instruction
2168
2169/* ------------------------------ */
2170 .balign 128
2171.L_op_iget_object: /* 0x54 */
2172/* File: arm64/op_iget_object.S */
2173/* File: arm64/op_iget.S */
2174 /*
2175 * General instance field get.
2176 *
2177 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2178 */
2179 EXPORT_PC
2180 FETCH w0, 1 // w0<- field ref CCCC
2181 lsr w1, wINST, #12 // w1<- B
2182 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2183 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2184 mov x3, xSELF // w3<- self
2185 bl artGetObjInstanceFromCode
2186 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002187
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002188 ubfx w2, wINST, #8, #4 // w2<- A
2189 PREFETCH_INST 2
2190 cbnz x3, MterpPossibleException // bail out
2191 .if 1
2192 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2193 .else
2194 SET_VREG w0, w2 // fp[A]<- w0
2195 .endif
2196 ADVANCE 2
2197 GET_INST_OPCODE ip // extract opcode from rINST
2198 GOTO_OPCODE ip // jump to next instruction
2199
2200
2201/* ------------------------------ */
2202 .balign 128
2203.L_op_iget_boolean: /* 0x55 */
2204/* File: arm64/op_iget_boolean.S */
2205/* File: arm64/op_iget.S */
2206 /*
2207 * General instance field get.
2208 *
2209 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2210 */
2211 EXPORT_PC
2212 FETCH w0, 1 // w0<- field ref CCCC
2213 lsr w1, wINST, #12 // w1<- B
2214 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2215 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2216 mov x3, xSELF // w3<- self
2217 bl artGetBooleanInstanceFromCode
2218 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002219 uxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002220 ubfx w2, wINST, #8, #4 // w2<- A
2221 PREFETCH_INST 2
2222 cbnz x3, MterpPossibleException // bail out
2223 .if 0
2224 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2225 .else
2226 SET_VREG w0, w2 // fp[A]<- w0
2227 .endif
2228 ADVANCE 2
2229 GET_INST_OPCODE ip // extract opcode from rINST
2230 GOTO_OPCODE ip // jump to next instruction
2231
2232
2233/* ------------------------------ */
2234 .balign 128
2235.L_op_iget_byte: /* 0x56 */
2236/* File: arm64/op_iget_byte.S */
2237/* File: arm64/op_iget.S */
2238 /*
2239 * General instance field get.
2240 *
2241 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2242 */
2243 EXPORT_PC
2244 FETCH w0, 1 // w0<- field ref CCCC
2245 lsr w1, wINST, #12 // w1<- B
2246 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2247 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2248 mov x3, xSELF // w3<- self
2249 bl artGetByteInstanceFromCode
2250 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002251 sxtb w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002252 ubfx w2, wINST, #8, #4 // w2<- A
2253 PREFETCH_INST 2
2254 cbnz x3, MterpPossibleException // bail out
2255 .if 0
2256 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2257 .else
2258 SET_VREG w0, w2 // fp[A]<- w0
2259 .endif
2260 ADVANCE 2
2261 GET_INST_OPCODE ip // extract opcode from rINST
2262 GOTO_OPCODE ip // jump to next instruction
2263
2264
2265/* ------------------------------ */
2266 .balign 128
2267.L_op_iget_char: /* 0x57 */
2268/* File: arm64/op_iget_char.S */
2269/* File: arm64/op_iget.S */
2270 /*
2271 * General instance field get.
2272 *
2273 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2274 */
2275 EXPORT_PC
2276 FETCH w0, 1 // w0<- field ref CCCC
2277 lsr w1, wINST, #12 // w1<- B
2278 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2279 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2280 mov x3, xSELF // w3<- self
2281 bl artGetCharInstanceFromCode
2282 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002283 uxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002284 ubfx w2, wINST, #8, #4 // w2<- A
2285 PREFETCH_INST 2
2286 cbnz x3, MterpPossibleException // bail out
2287 .if 0
2288 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2289 .else
2290 SET_VREG w0, w2 // fp[A]<- w0
2291 .endif
2292 ADVANCE 2
2293 GET_INST_OPCODE ip // extract opcode from rINST
2294 GOTO_OPCODE ip // jump to next instruction
2295
2296
2297/* ------------------------------ */
2298 .balign 128
2299.L_op_iget_short: /* 0x58 */
2300/* File: arm64/op_iget_short.S */
2301/* File: arm64/op_iget.S */
2302 /*
2303 * General instance field get.
2304 *
2305 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2306 */
2307 EXPORT_PC
2308 FETCH w0, 1 // w0<- field ref CCCC
2309 lsr w1, wINST, #12 // w1<- B
2310 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2311 ldr x2, [xFP, #OFF_FP_METHOD] // w2<- referrer
2312 mov x3, xSELF // w3<- self
2313 bl artGetShortInstanceFromCode
2314 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
Bill Buzbeefd522f92016-02-11 22:37:42 +00002315 sxth w0, w0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002316 ubfx w2, wINST, #8, #4 // w2<- A
2317 PREFETCH_INST 2
2318 cbnz x3, MterpPossibleException // bail out
2319 .if 0
2320 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
2321 .else
2322 SET_VREG w0, w2 // fp[A]<- w0
2323 .endif
2324 ADVANCE 2
2325 GET_INST_OPCODE ip // extract opcode from rINST
2326 GOTO_OPCODE ip // jump to next instruction
2327
2328
2329/* ------------------------------ */
2330 .balign 128
2331.L_op_iput: /* 0x59 */
2332/* File: arm64/op_iput.S */
2333 /*
2334 * General 32-bit instance field put.
2335 *
2336 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2337 */
2338 /* op vA, vB, field//CCCC */
2339 .extern artSet32InstanceFromMterp
2340 EXPORT_PC
2341 FETCH w0, 1 // w0<- field ref CCCC
2342 lsr w1, wINST, #12 // w1<- B
2343 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2344 ubfx w2, wINST, #8, #4 // w2<- A
2345 GET_VREG w2, w2 // w2<- fp[A]
2346 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2347 PREFETCH_INST 2
2348 bl artSet32InstanceFromMterp
2349 cbnz w0, MterpPossibleException
2350 ADVANCE 2 // advance rPC
2351 GET_INST_OPCODE ip // extract opcode from rINST
2352 GOTO_OPCODE ip // jump to next instruction
2353
2354/* ------------------------------ */
2355 .balign 128
2356.L_op_iput_wide: /* 0x5a */
2357/* File: arm64/op_iput_wide.S */
2358 /* iput-wide vA, vB, field//CCCC */
2359 .extern artSet64InstanceFromMterp
2360 EXPORT_PC
2361 FETCH w0, 1 // w0<- field ref CCCC
2362 lsr w1, wINST, #12 // w1<- B
2363 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2364 ubfx w2, wINST, #8, #4 // w2<- A
buzbeeace690f2016-03-11 09:51:11 -08002365 VREG_INDEX_TO_ADDR x2, x2 // w2<- &fp[A]
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002366 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2367 PREFETCH_INST 2
2368 bl artSet64InstanceFromMterp
2369 cbnz w0, MterpPossibleException
2370 ADVANCE 2 // advance rPC
2371 GET_INST_OPCODE ip // extract opcode from wINST
2372 GOTO_OPCODE ip // jump to next instruction
2373
2374/* ------------------------------ */
2375 .balign 128
2376.L_op_iput_object: /* 0x5b */
2377/* File: arm64/op_iput_object.S */
2378 EXPORT_PC
2379 add x0, xFP, #OFF_FP_SHADOWFRAME
2380 mov x1, xPC
2381 mov w2, wINST
2382 mov x3, xSELF
2383 bl MterpIputObject
2384 cbz w0, MterpException
2385 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2386 GET_INST_OPCODE ip // extract opcode from rINST
2387 GOTO_OPCODE ip // jump to next instruction
2388
2389/* ------------------------------ */
2390 .balign 128
2391.L_op_iput_boolean: /* 0x5c */
2392/* File: arm64/op_iput_boolean.S */
2393/* File: arm64/op_iput.S */
2394 /*
2395 * General 32-bit instance field put.
2396 *
2397 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2398 */
2399 /* op vA, vB, field//CCCC */
2400 .extern artSet8InstanceFromMterp
2401 EXPORT_PC
2402 FETCH w0, 1 // w0<- field ref CCCC
2403 lsr w1, wINST, #12 // w1<- B
2404 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2405 ubfx w2, wINST, #8, #4 // w2<- A
2406 GET_VREG w2, w2 // w2<- fp[A]
2407 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2408 PREFETCH_INST 2
2409 bl artSet8InstanceFromMterp
2410 cbnz w0, MterpPossibleException
2411 ADVANCE 2 // advance rPC
2412 GET_INST_OPCODE ip // extract opcode from rINST
2413 GOTO_OPCODE ip // jump to next instruction
2414
2415
2416/* ------------------------------ */
2417 .balign 128
2418.L_op_iput_byte: /* 0x5d */
2419/* File: arm64/op_iput_byte.S */
2420/* File: arm64/op_iput.S */
2421 /*
2422 * General 32-bit instance field put.
2423 *
2424 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2425 */
2426 /* op vA, vB, field//CCCC */
2427 .extern artSet8InstanceFromMterp
2428 EXPORT_PC
2429 FETCH w0, 1 // w0<- field ref CCCC
2430 lsr w1, wINST, #12 // w1<- B
2431 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2432 ubfx w2, wINST, #8, #4 // w2<- A
2433 GET_VREG w2, w2 // w2<- fp[A]
2434 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2435 PREFETCH_INST 2
2436 bl artSet8InstanceFromMterp
2437 cbnz w0, MterpPossibleException
2438 ADVANCE 2 // advance rPC
2439 GET_INST_OPCODE ip // extract opcode from rINST
2440 GOTO_OPCODE ip // jump to next instruction
2441
2442
2443/* ------------------------------ */
2444 .balign 128
2445.L_op_iput_char: /* 0x5e */
2446/* File: arm64/op_iput_char.S */
2447/* File: arm64/op_iput.S */
2448 /*
2449 * General 32-bit instance field put.
2450 *
2451 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2452 */
2453 /* op vA, vB, field//CCCC */
2454 .extern artSet16InstanceFromMterp
2455 EXPORT_PC
2456 FETCH w0, 1 // w0<- field ref CCCC
2457 lsr w1, wINST, #12 // w1<- B
2458 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2459 ubfx w2, wINST, #8, #4 // w2<- A
2460 GET_VREG w2, w2 // w2<- fp[A]
2461 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2462 PREFETCH_INST 2
2463 bl artSet16InstanceFromMterp
2464 cbnz w0, MterpPossibleException
2465 ADVANCE 2 // advance rPC
2466 GET_INST_OPCODE ip // extract opcode from rINST
2467 GOTO_OPCODE ip // jump to next instruction
2468
2469
2470/* ------------------------------ */
2471 .balign 128
2472.L_op_iput_short: /* 0x5f */
2473/* File: arm64/op_iput_short.S */
2474/* File: arm64/op_iput.S */
2475 /*
2476 * General 32-bit instance field put.
2477 *
2478 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2479 */
2480 /* op vA, vB, field//CCCC */
2481 .extern artSet16InstanceFromMterp
2482 EXPORT_PC
2483 FETCH w0, 1 // w0<- field ref CCCC
2484 lsr w1, wINST, #12 // w1<- B
2485 GET_VREG w1, w1 // w1<- fp[B], the object pointer
2486 ubfx w2, wINST, #8, #4 // w2<- A
2487 GET_VREG w2, w2 // w2<- fp[A]
2488 ldr x3, [xFP, #OFF_FP_METHOD] // w3<- referrer
2489 PREFETCH_INST 2
2490 bl artSet16InstanceFromMterp
2491 cbnz w0, MterpPossibleException
2492 ADVANCE 2 // advance rPC
2493 GET_INST_OPCODE ip // extract opcode from rINST
2494 GOTO_OPCODE ip // jump to next instruction
2495
2496
2497/* ------------------------------ */
2498 .balign 128
2499.L_op_sget: /* 0x60 */
2500/* File: arm64/op_sget.S */
2501 /*
2502 * General SGET handler wrapper.
2503 *
2504 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2505 */
2506 /* op vAA, field//BBBB */
2507
2508 .extern artGet32StaticFromCode
2509 EXPORT_PC
2510 FETCH w0, 1 // w0<- field ref BBBB
2511 ldr x1, [xFP, #OFF_FP_METHOD]
2512 mov x2, xSELF
2513 bl artGet32StaticFromCode
2514 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2515 lsr w2, wINST, #8 // w2<- AA
2516
2517 PREFETCH_INST 2
2518 cbnz x3, MterpException // bail out
2519.if 0
2520 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2521.else
2522 SET_VREG w0, w2 // fp[AA]<- w0
2523.endif
2524 ADVANCE 2
2525 GET_INST_OPCODE ip // extract opcode from rINST
2526 GOTO_OPCODE ip
2527
2528/* ------------------------------ */
2529 .balign 128
2530.L_op_sget_wide: /* 0x61 */
2531/* File: arm64/op_sget_wide.S */
2532 /*
2533 * SGET_WIDE handler wrapper.
2534 *
2535 */
2536 /* sget-wide vAA, field//BBBB */
2537
2538 .extern artGet64StaticFromCode
2539 EXPORT_PC
2540 FETCH w0, 1 // w0<- field ref BBBB
2541 ldr x1, [xFP, #OFF_FP_METHOD]
2542 mov x2, xSELF
2543 bl artGet64StaticFromCode
2544 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2545 lsr w4, wINST, #8 // w4<- AA
2546 cbnz x3, MterpException // bail out
2547 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
2548 SET_VREG_WIDE x0, w4
2549 GET_INST_OPCODE ip // extract opcode from wINST
2550 GOTO_OPCODE ip // jump to next instruction
2551
2552/* ------------------------------ */
2553 .balign 128
2554.L_op_sget_object: /* 0x62 */
2555/* File: arm64/op_sget_object.S */
2556/* File: arm64/op_sget.S */
2557 /*
2558 * General SGET handler wrapper.
2559 *
2560 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2561 */
2562 /* op vAA, field//BBBB */
2563
2564 .extern artGetObjStaticFromCode
2565 EXPORT_PC
2566 FETCH w0, 1 // w0<- field ref BBBB
2567 ldr x1, [xFP, #OFF_FP_METHOD]
2568 mov x2, xSELF
2569 bl artGetObjStaticFromCode
2570 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2571 lsr w2, wINST, #8 // w2<- AA
2572
2573 PREFETCH_INST 2
2574 cbnz x3, MterpException // bail out
2575.if 1
2576 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2577.else
2578 SET_VREG w0, w2 // fp[AA]<- w0
2579.endif
2580 ADVANCE 2
2581 GET_INST_OPCODE ip // extract opcode from rINST
2582 GOTO_OPCODE ip
2583
2584
2585/* ------------------------------ */
2586 .balign 128
2587.L_op_sget_boolean: /* 0x63 */
2588/* File: arm64/op_sget_boolean.S */
2589/* File: arm64/op_sget.S */
2590 /*
2591 * General SGET handler wrapper.
2592 *
2593 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2594 */
2595 /* op vAA, field//BBBB */
2596
2597 .extern artGetBooleanStaticFromCode
2598 EXPORT_PC
2599 FETCH w0, 1 // w0<- field ref BBBB
2600 ldr x1, [xFP, #OFF_FP_METHOD]
2601 mov x2, xSELF
2602 bl artGetBooleanStaticFromCode
2603 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2604 lsr w2, wINST, #8 // w2<- AA
2605 uxtb w0, w0
2606 PREFETCH_INST 2
2607 cbnz x3, MterpException // bail out
2608.if 0
2609 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2610.else
2611 SET_VREG w0, w2 // fp[AA]<- w0
2612.endif
2613 ADVANCE 2
2614 GET_INST_OPCODE ip // extract opcode from rINST
2615 GOTO_OPCODE ip
2616
2617
2618/* ------------------------------ */
2619 .balign 128
2620.L_op_sget_byte: /* 0x64 */
2621/* File: arm64/op_sget_byte.S */
2622/* File: arm64/op_sget.S */
2623 /*
2624 * General SGET handler wrapper.
2625 *
2626 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2627 */
2628 /* op vAA, field//BBBB */
2629
2630 .extern artGetByteStaticFromCode
2631 EXPORT_PC
2632 FETCH w0, 1 // w0<- field ref BBBB
2633 ldr x1, [xFP, #OFF_FP_METHOD]
2634 mov x2, xSELF
2635 bl artGetByteStaticFromCode
2636 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2637 lsr w2, wINST, #8 // w2<- AA
2638 sxtb w0, w0
2639 PREFETCH_INST 2
2640 cbnz x3, MterpException // bail out
2641.if 0
2642 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2643.else
2644 SET_VREG w0, w2 // fp[AA]<- w0
2645.endif
2646 ADVANCE 2
2647 GET_INST_OPCODE ip // extract opcode from rINST
2648 GOTO_OPCODE ip
2649
2650
2651/* ------------------------------ */
2652 .balign 128
2653.L_op_sget_char: /* 0x65 */
2654/* File: arm64/op_sget_char.S */
2655/* File: arm64/op_sget.S */
2656 /*
2657 * General SGET handler wrapper.
2658 *
2659 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2660 */
2661 /* op vAA, field//BBBB */
2662
2663 .extern artGetCharStaticFromCode
2664 EXPORT_PC
2665 FETCH w0, 1 // w0<- field ref BBBB
2666 ldr x1, [xFP, #OFF_FP_METHOD]
2667 mov x2, xSELF
2668 bl artGetCharStaticFromCode
2669 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2670 lsr w2, wINST, #8 // w2<- AA
2671 uxth w0, w0
2672 PREFETCH_INST 2
2673 cbnz x3, MterpException // bail out
2674.if 0
2675 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2676.else
2677 SET_VREG w0, w2 // fp[AA]<- w0
2678.endif
2679 ADVANCE 2
2680 GET_INST_OPCODE ip // extract opcode from rINST
2681 GOTO_OPCODE ip
2682
2683
2684/* ------------------------------ */
2685 .balign 128
2686.L_op_sget_short: /* 0x66 */
2687/* File: arm64/op_sget_short.S */
2688/* File: arm64/op_sget.S */
2689 /*
2690 * General SGET handler wrapper.
2691 *
2692 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2693 */
2694 /* op vAA, field//BBBB */
2695
2696 .extern artGetShortStaticFromCode
2697 EXPORT_PC
2698 FETCH w0, 1 // w0<- field ref BBBB
2699 ldr x1, [xFP, #OFF_FP_METHOD]
2700 mov x2, xSELF
2701 bl artGetShortStaticFromCode
2702 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
2703 lsr w2, wINST, #8 // w2<- AA
2704 sxth w0, w0
2705 PREFETCH_INST 2
2706 cbnz x3, MterpException // bail out
2707.if 0
2708 SET_VREG_OBJECT w0, w2 // fp[AA]<- w0
2709.else
2710 SET_VREG w0, w2 // fp[AA]<- w0
2711.endif
2712 ADVANCE 2
2713 GET_INST_OPCODE ip // extract opcode from rINST
2714 GOTO_OPCODE ip
2715
2716
2717/* ------------------------------ */
2718 .balign 128
2719.L_op_sput: /* 0x67 */
2720/* File: arm64/op_sput.S */
2721 /*
2722 * General SPUT handler wrapper.
2723 *
2724 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2725 */
2726 /* op vAA, field//BBBB */
2727 EXPORT_PC
2728 FETCH w0, 1 // r0<- field ref BBBB
2729 lsr w3, wINST, #8 // r3<- AA
2730 GET_VREG w1, w3 // r1<= fp[AA]
2731 ldr x2, [xFP, #OFF_FP_METHOD]
2732 mov x3, xSELF
2733 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2734 bl artSet32StaticFromCode
2735 cbnz w0, MterpException // 0 on success
2736 ADVANCE 2 // Past exception point - now advance rPC
2737 GET_INST_OPCODE ip // extract opcode from rINST
2738 GOTO_OPCODE ip // jump to next instruction
2739
2740/* ------------------------------ */
2741 .balign 128
2742.L_op_sput_wide: /* 0x68 */
2743/* File: arm64/op_sput_wide.S */
2744 /*
2745 * SPUT_WIDE handler wrapper.
2746 *
2747 */
2748 /* sput-wide vAA, field//BBBB */
2749 .extern artSet64IndirectStaticFromMterp
2750 EXPORT_PC
2751 FETCH w0, 1 // w0<- field ref BBBB
2752 ldr x1, [xFP, #OFF_FP_METHOD]
2753 lsr w2, wINST, #8 // w3<- AA
buzbeeace690f2016-03-11 09:51:11 -08002754 VREG_INDEX_TO_ADDR x2, w2
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002755 mov x3, xSELF
2756 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2757 bl artSet64IndirectStaticFromMterp
2758 cbnz w0, MterpException // 0 on success, -1 on failure
2759 ADVANCE 2 // Past exception point - now advance rPC
2760 GET_INST_OPCODE ip // extract opcode from wINST
2761 GOTO_OPCODE ip // jump to next instruction
2762
2763/* ------------------------------ */
2764 .balign 128
2765.L_op_sput_object: /* 0x69 */
2766/* File: arm64/op_sput_object.S */
2767 EXPORT_PC
2768 add x0, xFP, #OFF_FP_SHADOWFRAME
2769 mov x1, xPC
2770 mov x2, xINST
2771 mov x3, xSELF
2772 bl MterpSputObject
2773 cbz w0, MterpException
2774 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
2775 GET_INST_OPCODE ip // extract opcode from rINST
2776 GOTO_OPCODE ip // jump to next instruction
2777
2778/* ------------------------------ */
2779 .balign 128
2780.L_op_sput_boolean: /* 0x6a */
2781/* File: arm64/op_sput_boolean.S */
2782/* File: arm64/op_sput.S */
2783 /*
2784 * General SPUT handler wrapper.
2785 *
2786 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2787 */
2788 /* op vAA, field//BBBB */
2789 EXPORT_PC
2790 FETCH w0, 1 // r0<- field ref BBBB
2791 lsr w3, wINST, #8 // r3<- AA
2792 GET_VREG w1, w3 // r1<= fp[AA]
2793 ldr x2, [xFP, #OFF_FP_METHOD]
2794 mov x3, xSELF
2795 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2796 bl artSet8StaticFromCode
2797 cbnz w0, MterpException // 0 on success
2798 ADVANCE 2 // Past exception point - now advance rPC
2799 GET_INST_OPCODE ip // extract opcode from rINST
2800 GOTO_OPCODE ip // jump to next instruction
2801
2802
2803/* ------------------------------ */
2804 .balign 128
2805.L_op_sput_byte: /* 0x6b */
2806/* File: arm64/op_sput_byte.S */
2807/* File: arm64/op_sput.S */
2808 /*
2809 * General SPUT handler wrapper.
2810 *
2811 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2812 */
2813 /* op vAA, field//BBBB */
2814 EXPORT_PC
2815 FETCH w0, 1 // r0<- field ref BBBB
2816 lsr w3, wINST, #8 // r3<- AA
2817 GET_VREG w1, w3 // r1<= fp[AA]
2818 ldr x2, [xFP, #OFF_FP_METHOD]
2819 mov x3, xSELF
2820 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2821 bl artSet8StaticFromCode
2822 cbnz w0, MterpException // 0 on success
2823 ADVANCE 2 // Past exception point - now advance rPC
2824 GET_INST_OPCODE ip // extract opcode from rINST
2825 GOTO_OPCODE ip // jump to next instruction
2826
2827
2828/* ------------------------------ */
2829 .balign 128
2830.L_op_sput_char: /* 0x6c */
2831/* File: arm64/op_sput_char.S */
2832/* File: arm64/op_sput.S */
2833 /*
2834 * General SPUT handler wrapper.
2835 *
2836 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2837 */
2838 /* op vAA, field//BBBB */
2839 EXPORT_PC
2840 FETCH w0, 1 // r0<- field ref BBBB
2841 lsr w3, wINST, #8 // r3<- AA
2842 GET_VREG w1, w3 // r1<= fp[AA]
2843 ldr x2, [xFP, #OFF_FP_METHOD]
2844 mov x3, xSELF
2845 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2846 bl artSet16StaticFromCode
2847 cbnz w0, MterpException // 0 on success
2848 ADVANCE 2 // Past exception point - now advance rPC
2849 GET_INST_OPCODE ip // extract opcode from rINST
2850 GOTO_OPCODE ip // jump to next instruction
2851
2852
2853/* ------------------------------ */
2854 .balign 128
2855.L_op_sput_short: /* 0x6d */
2856/* File: arm64/op_sput_short.S */
2857/* File: arm64/op_sput.S */
2858 /*
2859 * General SPUT handler wrapper.
2860 *
2861 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2862 */
2863 /* op vAA, field//BBBB */
2864 EXPORT_PC
2865 FETCH w0, 1 // r0<- field ref BBBB
2866 lsr w3, wINST, #8 // r3<- AA
2867 GET_VREG w1, w3 // r1<= fp[AA]
2868 ldr x2, [xFP, #OFF_FP_METHOD]
2869 mov x3, xSELF
2870 PREFETCH_INST 2 // Get next inst, but don't advance rPC
2871 bl artSet16StaticFromCode
2872 cbnz w0, MterpException // 0 on success
2873 ADVANCE 2 // Past exception point - now advance rPC
2874 GET_INST_OPCODE ip // extract opcode from rINST
2875 GOTO_OPCODE ip // jump to next instruction
2876
2877
2878/* ------------------------------ */
2879 .balign 128
2880.L_op_invoke_virtual: /* 0x6e */
2881/* File: arm64/op_invoke_virtual.S */
2882/* File: arm64/invoke.S */
2883 /*
2884 * Generic invoke handler wrapper.
2885 */
2886 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2887 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2888 .extern MterpInvokeVirtual
2889 EXPORT_PC
2890 mov x0, xSELF
2891 add x1, xFP, #OFF_FP_SHADOWFRAME
2892 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002893 mov x3, xINST
2894 bl MterpInvokeVirtual
2895 cbz w0, MterpException
2896 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002897 bl MterpShouldSwitchInterpreters
2898 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002899 GET_INST_OPCODE ip
2900 GOTO_OPCODE ip
2901
2902
2903 /*
2904 * Handle a virtual method call.
2905 *
2906 * for: invoke-virtual, invoke-virtual/range
2907 */
2908 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2909 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2910
2911/* ------------------------------ */
2912 .balign 128
2913.L_op_invoke_super: /* 0x6f */
2914/* File: arm64/op_invoke_super.S */
2915/* File: arm64/invoke.S */
2916 /*
2917 * Generic invoke handler wrapper.
2918 */
2919 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2920 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2921 .extern MterpInvokeSuper
2922 EXPORT_PC
2923 mov x0, xSELF
2924 add x1, xFP, #OFF_FP_SHADOWFRAME
2925 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002926 mov x3, xINST
2927 bl MterpInvokeSuper
2928 cbz w0, MterpException
2929 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002930 bl MterpShouldSwitchInterpreters
2931 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002932 GET_INST_OPCODE ip
2933 GOTO_OPCODE ip
2934
2935
2936 /*
2937 * Handle a "super" method call.
2938 *
2939 * for: invoke-super, invoke-super/range
2940 */
2941 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2942 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2943
2944/* ------------------------------ */
2945 .balign 128
2946.L_op_invoke_direct: /* 0x70 */
2947/* File: arm64/op_invoke_direct.S */
2948/* File: arm64/invoke.S */
2949 /*
2950 * Generic invoke handler wrapper.
2951 */
2952 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2953 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2954 .extern MterpInvokeDirect
2955 EXPORT_PC
2956 mov x0, xSELF
2957 add x1, xFP, #OFF_FP_SHADOWFRAME
2958 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002959 mov x3, xINST
2960 bl MterpInvokeDirect
2961 cbz w0, MterpException
2962 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002963 bl MterpShouldSwitchInterpreters
2964 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002965 GET_INST_OPCODE ip
2966 GOTO_OPCODE ip
2967
2968
2969
2970/* ------------------------------ */
2971 .balign 128
2972.L_op_invoke_static: /* 0x71 */
2973/* File: arm64/op_invoke_static.S */
2974/* File: arm64/invoke.S */
2975 /*
2976 * Generic invoke handler wrapper.
2977 */
2978 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
2979 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
2980 .extern MterpInvokeStatic
2981 EXPORT_PC
2982 mov x0, xSELF
2983 add x1, xFP, #OFF_FP_SHADOWFRAME
2984 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002985 mov x3, xINST
2986 bl MterpInvokeStatic
2987 cbz w0, MterpException
2988 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00002989 bl MterpShouldSwitchInterpreters
2990 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00002991 GET_INST_OPCODE ip
2992 GOTO_OPCODE ip
2993
2994
2995
2996
2997/* ------------------------------ */
2998 .balign 128
2999.L_op_invoke_interface: /* 0x72 */
3000/* File: arm64/op_invoke_interface.S */
3001/* File: arm64/invoke.S */
3002 /*
3003 * Generic invoke handler wrapper.
3004 */
3005 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3006 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3007 .extern MterpInvokeInterface
3008 EXPORT_PC
3009 mov x0, xSELF
3010 add x1, xFP, #OFF_FP_SHADOWFRAME
3011 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003012 mov x3, xINST
3013 bl MterpInvokeInterface
3014 cbz w0, MterpException
3015 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003016 bl MterpShouldSwitchInterpreters
3017 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003018 GET_INST_OPCODE ip
3019 GOTO_OPCODE ip
3020
3021
3022 /*
3023 * Handle an interface method call.
3024 *
3025 * for: invoke-interface, invoke-interface/range
3026 */
3027 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3028 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3029
3030/* ------------------------------ */
3031 .balign 128
3032.L_op_return_void_no_barrier: /* 0x73 */
3033/* File: arm64/op_return_void_no_barrier.S */
3034 ldr w7, [xSELF, #THREAD_FLAGS_OFFSET]
3035 mov x0, xSELF
3036 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3037 b.ne .Lop_return_void_no_barrier_check
3038.Lop_return_void_no_barrier_return:
3039 mov x0, #0
3040 b MterpReturn
3041.Lop_return_void_no_barrier_check:
3042 bl MterpSuspendCheck // (self)
3043 b .Lop_return_void_no_barrier_return
3044
3045/* ------------------------------ */
3046 .balign 128
3047.L_op_invoke_virtual_range: /* 0x74 */
3048/* File: arm64/op_invoke_virtual_range.S */
3049/* File: arm64/invoke.S */
3050 /*
3051 * Generic invoke handler wrapper.
3052 */
3053 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3054 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3055 .extern MterpInvokeVirtualRange
3056 EXPORT_PC
3057 mov x0, xSELF
3058 add x1, xFP, #OFF_FP_SHADOWFRAME
3059 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003060 mov x3, xINST
3061 bl MterpInvokeVirtualRange
3062 cbz w0, MterpException
3063 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003064 bl MterpShouldSwitchInterpreters
3065 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003066 GET_INST_OPCODE ip
3067 GOTO_OPCODE ip
3068
3069
3070
3071/* ------------------------------ */
3072 .balign 128
3073.L_op_invoke_super_range: /* 0x75 */
3074/* File: arm64/op_invoke_super_range.S */
3075/* File: arm64/invoke.S */
3076 /*
3077 * Generic invoke handler wrapper.
3078 */
3079 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3080 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3081 .extern MterpInvokeSuperRange
3082 EXPORT_PC
3083 mov x0, xSELF
3084 add x1, xFP, #OFF_FP_SHADOWFRAME
3085 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003086 mov x3, xINST
3087 bl MterpInvokeSuperRange
3088 cbz w0, MterpException
3089 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003090 bl MterpShouldSwitchInterpreters
3091 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003092 GET_INST_OPCODE ip
3093 GOTO_OPCODE ip
3094
3095
3096
3097/* ------------------------------ */
3098 .balign 128
3099.L_op_invoke_direct_range: /* 0x76 */
3100/* File: arm64/op_invoke_direct_range.S */
3101/* File: arm64/invoke.S */
3102 /*
3103 * Generic invoke handler wrapper.
3104 */
3105 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3106 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3107 .extern MterpInvokeDirectRange
3108 EXPORT_PC
3109 mov x0, xSELF
3110 add x1, xFP, #OFF_FP_SHADOWFRAME
3111 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003112 mov x3, xINST
3113 bl MterpInvokeDirectRange
3114 cbz w0, MterpException
3115 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003116 bl MterpShouldSwitchInterpreters
3117 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003118 GET_INST_OPCODE ip
3119 GOTO_OPCODE ip
3120
3121
3122
3123/* ------------------------------ */
3124 .balign 128
3125.L_op_invoke_static_range: /* 0x77 */
3126/* File: arm64/op_invoke_static_range.S */
3127/* File: arm64/invoke.S */
3128 /*
3129 * Generic invoke handler wrapper.
3130 */
3131 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3132 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3133 .extern MterpInvokeStaticRange
3134 EXPORT_PC
3135 mov x0, xSELF
3136 add x1, xFP, #OFF_FP_SHADOWFRAME
3137 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003138 mov x3, xINST
3139 bl MterpInvokeStaticRange
3140 cbz w0, MterpException
3141 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003142 bl MterpShouldSwitchInterpreters
3143 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003144 GET_INST_OPCODE ip
3145 GOTO_OPCODE ip
3146
3147
3148
3149/* ------------------------------ */
3150 .balign 128
3151.L_op_invoke_interface_range: /* 0x78 */
3152/* File: arm64/op_invoke_interface_range.S */
3153/* File: arm64/invoke.S */
3154 /*
3155 * Generic invoke handler wrapper.
3156 */
3157 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3158 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3159 .extern MterpInvokeInterfaceRange
3160 EXPORT_PC
3161 mov x0, xSELF
3162 add x1, xFP, #OFF_FP_SHADOWFRAME
3163 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003164 mov x3, xINST
3165 bl MterpInvokeInterfaceRange
3166 cbz w0, MterpException
3167 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003168 bl MterpShouldSwitchInterpreters
3169 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003170 GET_INST_OPCODE ip
3171 GOTO_OPCODE ip
3172
3173
3174
3175/* ------------------------------ */
3176 .balign 128
3177.L_op_unused_79: /* 0x79 */
3178/* File: arm64/op_unused_79.S */
3179/* File: arm64/unused.S */
3180/*
3181 * Bail to reference interpreter to throw.
3182 */
3183 b MterpFallback
3184
3185
3186/* ------------------------------ */
3187 .balign 128
3188.L_op_unused_7a: /* 0x7a */
3189/* File: arm64/op_unused_7a.S */
3190/* File: arm64/unused.S */
3191/*
3192 * Bail to reference interpreter to throw.
3193 */
3194 b MterpFallback
3195
3196
3197/* ------------------------------ */
3198 .balign 128
3199.L_op_neg_int: /* 0x7b */
3200/* File: arm64/op_neg_int.S */
3201/* File: arm64/unop.S */
3202 /*
3203 * Generic 32-bit unary operation. Provide an "instr" line that
3204 * specifies an instruction that performs "result = op w0".
3205 * This could be an ARM instruction or a function call.
3206 *
3207 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3208 * int-to-byte, int-to-char, int-to-short
3209 */
3210 /* unop vA, vB */
3211 lsr w3, wINST, #12 // w3<- B
3212 GET_VREG w0, w3 // w0<- vB
3213 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003214 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3215 sub w0, wzr, w0 // w0<- op, w0-w3 changed
3216 GET_INST_OPCODE ip // extract opcode from rINST
3217 SET_VREG w0, w9 // vAA<- w0
3218 GOTO_OPCODE ip // jump to next instruction
3219 /* 8-9 instructions */
3220
3221
3222/* ------------------------------ */
3223 .balign 128
3224.L_op_not_int: /* 0x7c */
3225/* File: arm64/op_not_int.S */
3226/* File: arm64/unop.S */
3227 /*
3228 * Generic 32-bit unary operation. Provide an "instr" line that
3229 * specifies an instruction that performs "result = op w0".
3230 * This could be an ARM instruction or a function call.
3231 *
3232 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3233 * int-to-byte, int-to-char, int-to-short
3234 */
3235 /* unop vA, vB */
3236 lsr w3, wINST, #12 // w3<- B
3237 GET_VREG w0, w3 // w0<- vB
3238 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003239 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3240 mvn w0, w0 // w0<- op, w0-w3 changed
3241 GET_INST_OPCODE ip // extract opcode from rINST
3242 SET_VREG w0, w9 // vAA<- w0
3243 GOTO_OPCODE ip // jump to next instruction
3244 /* 8-9 instructions */
3245
3246
3247/* ------------------------------ */
3248 .balign 128
3249.L_op_neg_long: /* 0x7d */
3250/* File: arm64/op_neg_long.S */
3251/* File: arm64/unopWide.S */
3252 /*
3253 * Generic 64-bit unary operation. Provide an "instr" line that
3254 * specifies an instruction that performs "result = op x0".
3255 *
3256 * For: neg-long, not-long
3257 */
3258 /* unop vA, vB */
3259 lsr w3, wINST, #12 // w3<- B
3260 ubfx w4, wINST, #8, #4 // w4<- A
3261 GET_VREG_WIDE x0, w3
3262 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003263 sub x0, xzr, x0
3264 GET_INST_OPCODE ip // extract opcode from wINST
3265 SET_VREG_WIDE x0, w4
3266 GOTO_OPCODE ip // jump to next instruction
3267 /* 10-11 instructions */
3268
3269
3270/* ------------------------------ */
3271 .balign 128
3272.L_op_not_long: /* 0x7e */
3273/* File: arm64/op_not_long.S */
3274/* File: arm64/unopWide.S */
3275 /*
3276 * Generic 64-bit unary operation. Provide an "instr" line that
3277 * specifies an instruction that performs "result = op x0".
3278 *
3279 * For: neg-long, not-long
3280 */
3281 /* unop vA, vB */
3282 lsr w3, wINST, #12 // w3<- B
3283 ubfx w4, wINST, #8, #4 // w4<- A
3284 GET_VREG_WIDE x0, w3
3285 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003286 mvn x0, x0
3287 GET_INST_OPCODE ip // extract opcode from wINST
3288 SET_VREG_WIDE x0, w4
3289 GOTO_OPCODE ip // jump to next instruction
3290 /* 10-11 instructions */
3291
3292
3293/* ------------------------------ */
3294 .balign 128
3295.L_op_neg_float: /* 0x7f */
3296/* File: arm64/op_neg_float.S */
3297/* File: arm64/unop.S */
3298 /*
3299 * Generic 32-bit unary operation. Provide an "instr" line that
3300 * specifies an instruction that performs "result = op w0".
3301 * This could be an ARM instruction or a function call.
3302 *
3303 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3304 * int-to-byte, int-to-char, int-to-short
3305 */
3306 /* unop vA, vB */
3307 lsr w3, wINST, #12 // w3<- B
3308 GET_VREG w0, w3 // w0<- vB
3309 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003310 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003311 eor w0, w0, #0x80000000 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003312 GET_INST_OPCODE ip // extract opcode from rINST
3313 SET_VREG w0, w9 // vAA<- w0
3314 GOTO_OPCODE ip // jump to next instruction
3315 /* 8-9 instructions */
3316
3317
3318/* ------------------------------ */
3319 .balign 128
3320.L_op_neg_double: /* 0x80 */
3321/* File: arm64/op_neg_double.S */
3322/* File: arm64/unopWide.S */
3323 /*
3324 * Generic 64-bit unary operation. Provide an "instr" line that
3325 * specifies an instruction that performs "result = op x0".
3326 *
3327 * For: neg-long, not-long
3328 */
3329 /* unop vA, vB */
3330 lsr w3, wINST, #12 // w3<- B
3331 ubfx w4, wINST, #8, #4 // w4<- A
3332 GET_VREG_WIDE x0, w3
3333 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003334 eor x0, x0, #0x8000000000000000
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003335 GET_INST_OPCODE ip // extract opcode from wINST
3336 SET_VREG_WIDE x0, w4
3337 GOTO_OPCODE ip // jump to next instruction
3338 /* 10-11 instructions */
3339
3340
3341/* ------------------------------ */
3342 .balign 128
3343.L_op_int_to_long: /* 0x81 */
3344/* File: arm64/op_int_to_long.S */
Vladimir Markoc4165022016-07-28 14:04:18 +01003345 /* int-to-long vA, vB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003346 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003347 ubfx w4, wINST, #8, #4 // w4<- A
Vladimir Marko20421b92016-07-26 16:38:11 +01003348 GET_VREG_S x0, w3 // x0<- sign_extend(fp[B])
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003349 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003350 GET_INST_OPCODE ip // extract opcode from wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003351 SET_VREG_WIDE x0, w4 // fp[A]<- x0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003352 GOTO_OPCODE ip // jump to next instruction
3353
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003354/* ------------------------------ */
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 */
Vladimir Marko20421b92016-07-26 16:38:11 +01003403/* we ignore the high word, making this equivalent to a 32-bit reg move */
3404/* File: arm64/op_move.S */
3405 /* for move, move-object, long-to-int */
3406 /* op vA, vB */
3407 lsr w1, wINST, #12 // x1<- B from 15:12
3408 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003409 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003410 GET_VREG w2, w1 // x2<- fp[B]
3411 GET_INST_OPCODE ip // ip<- opcode from wINST
3412 .if 0
3413 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
3414 .else
3415 SET_VREG w2, w0 // fp[A]<- x2
3416 .endif
3417 GOTO_OPCODE ip // execute next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003418
3419
3420/* ------------------------------ */
3421 .balign 128
3422.L_op_long_to_float: /* 0x85 */
3423/* File: arm64/op_long_to_float.S */
3424/* File: arm64/funopNarrower.S */
3425 /*
3426 * Generic 64bit-to-32bit floating point unary operation. Provide an
3427 * "instr" line that specifies an instruction that performs "s0 = op x0".
3428 *
3429 * For: int-to-double, float-to-double, float-to-long
3430 */
3431 /* unop vA, vB */
3432 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003433 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003434 GET_VREG_WIDE x0, w3
3435 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003436 scvtf s0, x0 // d0<- op
3437 GET_INST_OPCODE ip // extract opcode from wINST
3438 SET_VREG s0, w4 // vA<- d0
3439 GOTO_OPCODE ip // jump to next instruction
3440
3441
3442/* ------------------------------ */
3443 .balign 128
3444.L_op_long_to_double: /* 0x86 */
3445/* File: arm64/op_long_to_double.S */
3446/* File: arm64/funopWide.S */
3447 /*
3448 * Generic 64bit-to-64bit floating point unary operation. Provide an
3449 * "instr" line that specifies an instruction that performs "d0 = op x0".
3450 *
3451 * For: long-to-double, double-to-long
3452 */
3453 /* unop vA, vB */
3454 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003455 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003456 GET_VREG_WIDE x0, w3
3457 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003458 scvtf d0, x0 // d0<- op
3459 GET_INST_OPCODE ip // extract opcode from wINST
3460 SET_VREG_WIDE d0, w4 // vA<- d0
3461 GOTO_OPCODE ip // jump to next instruction
3462
3463
3464/* ------------------------------ */
3465 .balign 128
3466.L_op_float_to_int: /* 0x87 */
3467/* File: arm64/op_float_to_int.S */
3468/* File: arm64/funopNarrow.S */
3469 /*
3470 * Generic 32bit-to-32bit floating point unary operation. Provide an
3471 * "instr" line that specifies an instruction that performs "w0 = op s0".
3472 *
3473 * For: int-to-float, float-to-int
3474 * TODO: refactor all of the conversions - parameterize width and use same template.
3475 */
3476 /* unop vA, vB */
3477 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003478 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003479 GET_VREG s0, w3
3480 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003481 fcvtzs w0, s0 // d0<- op
3482 GET_INST_OPCODE ip // extract opcode from wINST
3483 SET_VREG w0, w4 // vA<- d0
3484 GOTO_OPCODE ip // jump to next instruction
3485
3486
3487/* ------------------------------ */
3488 .balign 128
3489.L_op_float_to_long: /* 0x88 */
3490/* File: arm64/op_float_to_long.S */
3491/* File: arm64/funopWider.S */
3492 /*
3493 * Generic 32bit-to-64bit floating point unary operation. Provide an
3494 * "instr" line that specifies an instruction that performs "x0 = op s0".
3495 *
3496 * For: int-to-double, float-to-double, float-to-long
3497 */
3498 /* unop vA, vB */
3499 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003500 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003501 GET_VREG s0, w3
3502 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003503 fcvtzs x0, s0 // d0<- op
3504 GET_INST_OPCODE ip // extract opcode from wINST
3505 SET_VREG_WIDE x0, w4 // vA<- d0
3506 GOTO_OPCODE ip // jump to next instruction
3507
3508
3509/* ------------------------------ */
3510 .balign 128
3511.L_op_float_to_double: /* 0x89 */
3512/* File: arm64/op_float_to_double.S */
3513/* File: arm64/funopWider.S */
3514 /*
3515 * Generic 32bit-to-64bit floating point unary operation. Provide an
3516 * "instr" line that specifies an instruction that performs "d0 = op s0".
3517 *
3518 * For: int-to-double, float-to-double, float-to-long
3519 */
3520 /* unop vA, vB */
3521 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003522 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003523 GET_VREG s0, w3
3524 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003525 fcvt d0, s0 // d0<- op
3526 GET_INST_OPCODE ip // extract opcode from wINST
3527 SET_VREG_WIDE d0, w4 // vA<- d0
3528 GOTO_OPCODE ip // jump to next instruction
3529
3530
3531/* ------------------------------ */
3532 .balign 128
3533.L_op_double_to_int: /* 0x8a */
3534/* File: arm64/op_double_to_int.S */
3535/* File: arm64/funopNarrower.S */
3536 /*
3537 * Generic 64bit-to-32bit floating point unary operation. Provide an
3538 * "instr" line that specifies an instruction that performs "w0 = op d0".
3539 *
3540 * For: int-to-double, float-to-double, float-to-long
3541 */
3542 /* unop vA, vB */
3543 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003544 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003545 GET_VREG_WIDE d0, w3
3546 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003547 fcvtzs w0, d0 // d0<- op
3548 GET_INST_OPCODE ip // extract opcode from wINST
3549 SET_VREG w0, w4 // vA<- d0
3550 GOTO_OPCODE ip // jump to next instruction
3551
3552
3553/* ------------------------------ */
3554 .balign 128
3555.L_op_double_to_long: /* 0x8b */
3556/* File: arm64/op_double_to_long.S */
3557/* File: arm64/funopWide.S */
3558 /*
3559 * Generic 64bit-to-64bit floating point unary operation. Provide an
3560 * "instr" line that specifies an instruction that performs "x0 = op d0".
3561 *
3562 * For: long-to-double, double-to-long
3563 */
3564 /* unop vA, vB */
3565 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003566 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003567 GET_VREG_WIDE d0, w3
3568 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003569 fcvtzs x0, d0 // d0<- op
3570 GET_INST_OPCODE ip // extract opcode from wINST
3571 SET_VREG_WIDE x0, w4 // vA<- d0
3572 GOTO_OPCODE ip // jump to next instruction
3573
3574
3575/* ------------------------------ */
3576 .balign 128
3577.L_op_double_to_float: /* 0x8c */
3578/* File: arm64/op_double_to_float.S */
3579/* File: arm64/funopNarrower.S */
3580 /*
3581 * Generic 64bit-to-32bit floating point unary operation. Provide an
3582 * "instr" line that specifies an instruction that performs "s0 = op d0".
3583 *
3584 * For: int-to-double, float-to-double, float-to-long
3585 */
3586 /* unop vA, vB */
3587 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003588 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003589 GET_VREG_WIDE d0, w3
3590 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003591 fcvt s0, d0 // d0<- op
3592 GET_INST_OPCODE ip // extract opcode from wINST
3593 SET_VREG s0, w4 // vA<- d0
3594 GOTO_OPCODE ip // jump to next instruction
3595
3596
3597/* ------------------------------ */
3598 .balign 128
3599.L_op_int_to_byte: /* 0x8d */
3600/* File: arm64/op_int_to_byte.S */
3601/* File: arm64/unop.S */
3602 /*
3603 * Generic 32-bit unary operation. Provide an "instr" line that
3604 * specifies an instruction that performs "result = op w0".
3605 * This could be an ARM instruction or a function call.
3606 *
3607 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3608 * int-to-byte, int-to-char, int-to-short
3609 */
3610 /* unop vA, vB */
3611 lsr w3, wINST, #12 // w3<- B
3612 GET_VREG w0, w3 // w0<- vB
3613 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003614 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3615 sxtb w0, w0 // w0<- op, w0-w3 changed
3616 GET_INST_OPCODE ip // extract opcode from rINST
3617 SET_VREG w0, w9 // vAA<- w0
3618 GOTO_OPCODE ip // jump to next instruction
3619 /* 8-9 instructions */
3620
3621
3622/* ------------------------------ */
3623 .balign 128
3624.L_op_int_to_char: /* 0x8e */
3625/* File: arm64/op_int_to_char.S */
3626/* File: arm64/unop.S */
3627 /*
3628 * Generic 32-bit unary operation. Provide an "instr" line that
3629 * specifies an instruction that performs "result = op w0".
3630 * This could be an ARM instruction or a function call.
3631 *
3632 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3633 * int-to-byte, int-to-char, int-to-short
3634 */
3635 /* unop vA, vB */
3636 lsr w3, wINST, #12 // w3<- B
3637 GET_VREG w0, w3 // w0<- vB
3638 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003639 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3640 uxth w0, w0 // w0<- op, w0-w3 changed
3641 GET_INST_OPCODE ip // extract opcode from rINST
3642 SET_VREG w0, w9 // vAA<- w0
3643 GOTO_OPCODE ip // jump to next instruction
3644 /* 8-9 instructions */
3645
3646
3647/* ------------------------------ */
3648 .balign 128
3649.L_op_int_to_short: /* 0x8f */
3650/* File: arm64/op_int_to_short.S */
3651/* File: arm64/unop.S */
3652 /*
3653 * Generic 32-bit unary operation. Provide an "instr" line that
3654 * specifies an instruction that performs "result = op w0".
3655 * This could be an ARM instruction or a function call.
3656 *
3657 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3658 * int-to-byte, int-to-char, int-to-short
3659 */
3660 /* unop vA, vB */
3661 lsr w3, wINST, #12 // w3<- B
3662 GET_VREG w0, w3 // w0<- vB
3663 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003664 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3665 sxth w0, w0 // w0<- op, w0-w3 changed
3666 GET_INST_OPCODE ip // extract opcode from rINST
3667 SET_VREG w0, w9 // vAA<- w0
3668 GOTO_OPCODE ip // jump to next instruction
3669 /* 8-9 instructions */
3670
3671
3672/* ------------------------------ */
3673 .balign 128
3674.L_op_add_int: /* 0x90 */
3675/* File: arm64/op_add_int.S */
3676/* File: arm64/binop.S */
3677 /*
3678 * Generic 32-bit binary operation. Provide an "instr" line that
3679 * specifies an instruction that performs "result = w0 op w1".
3680 * This could be an ARM instruction or a function call. (If the result
3681 * comes back in a register other than w0, you can override "result".)
3682 *
3683 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3684 * vCC (w1). Useful for integer division and modulus. Note that we
3685 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3686 * handles it correctly.
3687 *
3688 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3689 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3690 * mul-float, div-float, rem-float
3691 */
3692 /* binop vAA, vBB, vCC */
3693 FETCH w0, 1 // w0<- CCBB
3694 lsr w9, wINST, #8 // w9<- AA
3695 lsr w3, w0, #8 // w3<- CC
3696 and w2, w0, #255 // w2<- BB
3697 GET_VREG w1, w3 // w1<- vCC
3698 GET_VREG w0, w2 // w0<- vBB
3699 .if 0
3700 cbz w1, common_errDivideByZero // is second operand zero?
3701 .endif
3702 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3703 // optional op; may set condition codes
3704 add w0, w0, w1 // w0<- op, w0-w3 changed
3705 GET_INST_OPCODE ip // extract opcode from rINST
3706 SET_VREG w0, w9 // vAA<- w0
3707 GOTO_OPCODE ip // jump to next instruction
3708 /* 11-14 instructions */
3709
3710
3711/* ------------------------------ */
3712 .balign 128
3713.L_op_sub_int: /* 0x91 */
3714/* File: arm64/op_sub_int.S */
3715/* File: arm64/binop.S */
3716 /*
3717 * Generic 32-bit binary operation. Provide an "instr" line that
3718 * specifies an instruction that performs "result = w0 op w1".
3719 * This could be an ARM instruction or a function call. (If the result
3720 * comes back in a register other than w0, you can override "result".)
3721 *
3722 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3723 * vCC (w1). Useful for integer division and modulus. Note that we
3724 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3725 * handles it correctly.
3726 *
3727 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3728 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3729 * mul-float, div-float, rem-float
3730 */
3731 /* binop vAA, vBB, vCC */
3732 FETCH w0, 1 // w0<- CCBB
3733 lsr w9, wINST, #8 // w9<- AA
3734 lsr w3, w0, #8 // w3<- CC
3735 and w2, w0, #255 // w2<- BB
3736 GET_VREG w1, w3 // w1<- vCC
3737 GET_VREG w0, w2 // w0<- vBB
3738 .if 0
3739 cbz w1, common_errDivideByZero // is second operand zero?
3740 .endif
3741 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3742 // optional op; may set condition codes
3743 sub w0, w0, w1 // w0<- op, w0-w3 changed
3744 GET_INST_OPCODE ip // extract opcode from rINST
3745 SET_VREG w0, w9 // vAA<- w0
3746 GOTO_OPCODE ip // jump to next instruction
3747 /* 11-14 instructions */
3748
3749
3750/* ------------------------------ */
3751 .balign 128
3752.L_op_mul_int: /* 0x92 */
3753/* File: arm64/op_mul_int.S */
3754/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
3755/* File: arm64/binop.S */
3756 /*
3757 * Generic 32-bit binary operation. Provide an "instr" line that
3758 * specifies an instruction that performs "result = w0 op w1".
3759 * This could be an ARM instruction or a function call. (If the result
3760 * comes back in a register other than w0, you can override "result".)
3761 *
3762 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3763 * vCC (w1). Useful for integer division and modulus. Note that we
3764 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3765 * handles it correctly.
3766 *
3767 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3768 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3769 * mul-float, div-float, rem-float
3770 */
3771 /* binop vAA, vBB, vCC */
3772 FETCH w0, 1 // w0<- CCBB
3773 lsr w9, wINST, #8 // w9<- AA
3774 lsr w3, w0, #8 // w3<- CC
3775 and w2, w0, #255 // w2<- BB
3776 GET_VREG w1, w3 // w1<- vCC
3777 GET_VREG w0, w2 // w0<- vBB
3778 .if 0
3779 cbz w1, common_errDivideByZero // is second operand zero?
3780 .endif
3781 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3782 // optional op; may set condition codes
3783 mul w0, w1, w0 // w0<- op, w0-w3 changed
3784 GET_INST_OPCODE ip // extract opcode from rINST
3785 SET_VREG w0, w9 // vAA<- w0
3786 GOTO_OPCODE ip // jump to next instruction
3787 /* 11-14 instructions */
3788
3789
3790/* ------------------------------ */
3791 .balign 128
3792.L_op_div_int: /* 0x93 */
3793/* File: arm64/op_div_int.S */
3794/* File: arm64/binop.S */
3795 /*
3796 * Generic 32-bit binary operation. Provide an "instr" line that
3797 * specifies an instruction that performs "result = w0 op w1".
3798 * This could be an ARM instruction or a function call. (If the result
3799 * comes back in a register other than w0, you can override "result".)
3800 *
3801 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3802 * vCC (w1). Useful for integer division and modulus. Note that we
3803 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3804 * handles it correctly.
3805 *
3806 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3807 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3808 * mul-float, div-float, rem-float
3809 */
3810 /* binop vAA, vBB, vCC */
3811 FETCH w0, 1 // w0<- CCBB
3812 lsr w9, wINST, #8 // w9<- AA
3813 lsr w3, w0, #8 // w3<- CC
3814 and w2, w0, #255 // w2<- BB
3815 GET_VREG w1, w3 // w1<- vCC
3816 GET_VREG w0, w2 // w0<- vBB
3817 .if 1
3818 cbz w1, common_errDivideByZero // is second operand zero?
3819 .endif
3820 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3821 // optional op; may set condition codes
3822 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
3823 GET_INST_OPCODE ip // extract opcode from rINST
3824 SET_VREG w0, w9 // vAA<- w0
3825 GOTO_OPCODE ip // jump to next instruction
3826 /* 11-14 instructions */
3827
3828
3829/* ------------------------------ */
3830 .balign 128
3831.L_op_rem_int: /* 0x94 */
3832/* File: arm64/op_rem_int.S */
3833/* File: arm64/binop.S */
3834 /*
3835 * Generic 32-bit binary operation. Provide an "instr" line that
3836 * specifies an instruction that performs "result = w0 op w1".
3837 * This could be an ARM instruction or a function call. (If the result
3838 * comes back in a register other than w0, you can override "result".)
3839 *
3840 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3841 * vCC (w1). Useful for integer division and modulus. Note that we
3842 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3843 * handles it correctly.
3844 *
3845 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3846 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3847 * mul-float, div-float, rem-float
3848 */
3849 /* binop vAA, vBB, vCC */
3850 FETCH w0, 1 // w0<- CCBB
3851 lsr w9, wINST, #8 // w9<- AA
3852 lsr w3, w0, #8 // w3<- CC
3853 and w2, w0, #255 // w2<- BB
3854 GET_VREG w1, w3 // w1<- vCC
3855 GET_VREG w0, w2 // w0<- vBB
3856 .if 1
3857 cbz w1, common_errDivideByZero // is second operand zero?
3858 .endif
3859 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3860 sdiv w2, w0, w1 // optional op; may set condition codes
3861 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
3862 GET_INST_OPCODE ip // extract opcode from rINST
3863 SET_VREG w0, w9 // vAA<- w0
3864 GOTO_OPCODE ip // jump to next instruction
3865 /* 11-14 instructions */
3866
3867
3868/* ------------------------------ */
3869 .balign 128
3870.L_op_and_int: /* 0x95 */
3871/* File: arm64/op_and_int.S */
3872/* File: arm64/binop.S */
3873 /*
3874 * Generic 32-bit binary operation. Provide an "instr" line that
3875 * specifies an instruction that performs "result = w0 op w1".
3876 * This could be an ARM instruction or a function call. (If the result
3877 * comes back in a register other than w0, you can override "result".)
3878 *
3879 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3880 * vCC (w1). Useful for integer division and modulus. Note that we
3881 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3882 * handles it correctly.
3883 *
3884 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3885 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3886 * mul-float, div-float, rem-float
3887 */
3888 /* binop vAA, vBB, vCC */
3889 FETCH w0, 1 // w0<- CCBB
3890 lsr w9, wINST, #8 // w9<- AA
3891 lsr w3, w0, #8 // w3<- CC
3892 and w2, w0, #255 // w2<- BB
3893 GET_VREG w1, w3 // w1<- vCC
3894 GET_VREG w0, w2 // w0<- vBB
3895 .if 0
3896 cbz w1, common_errDivideByZero // is second operand zero?
3897 .endif
3898 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3899 // optional op; may set condition codes
3900 and w0, w0, w1 // w0<- op, w0-w3 changed
3901 GET_INST_OPCODE ip // extract opcode from rINST
3902 SET_VREG w0, w9 // vAA<- w0
3903 GOTO_OPCODE ip // jump to next instruction
3904 /* 11-14 instructions */
3905
3906
3907/* ------------------------------ */
3908 .balign 128
3909.L_op_or_int: /* 0x96 */
3910/* File: arm64/op_or_int.S */
3911/* File: arm64/binop.S */
3912 /*
3913 * Generic 32-bit binary operation. Provide an "instr" line that
3914 * specifies an instruction that performs "result = w0 op w1".
3915 * This could be an ARM instruction or a function call. (If the result
3916 * comes back in a register other than w0, you can override "result".)
3917 *
3918 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3919 * vCC (w1). Useful for integer division and modulus. Note that we
3920 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3921 * handles it correctly.
3922 *
3923 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3924 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3925 * mul-float, div-float, rem-float
3926 */
3927 /* binop vAA, vBB, vCC */
3928 FETCH w0, 1 // w0<- CCBB
3929 lsr w9, wINST, #8 // w9<- AA
3930 lsr w3, w0, #8 // w3<- CC
3931 and w2, w0, #255 // w2<- BB
3932 GET_VREG w1, w3 // w1<- vCC
3933 GET_VREG w0, w2 // w0<- vBB
3934 .if 0
3935 cbz w1, common_errDivideByZero // is second operand zero?
3936 .endif
3937 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3938 // optional op; may set condition codes
3939 orr w0, w0, w1 // w0<- op, w0-w3 changed
3940 GET_INST_OPCODE ip // extract opcode from rINST
3941 SET_VREG w0, w9 // vAA<- w0
3942 GOTO_OPCODE ip // jump to next instruction
3943 /* 11-14 instructions */
3944
3945
3946/* ------------------------------ */
3947 .balign 128
3948.L_op_xor_int: /* 0x97 */
3949/* File: arm64/op_xor_int.S */
3950/* File: arm64/binop.S */
3951 /*
3952 * Generic 32-bit binary operation. Provide an "instr" line that
3953 * specifies an instruction that performs "result = w0 op w1".
3954 * This could be an ARM instruction or a function call. (If the result
3955 * comes back in a register other than w0, you can override "result".)
3956 *
3957 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3958 * vCC (w1). Useful for integer division and modulus. Note that we
3959 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3960 * handles it correctly.
3961 *
3962 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3963 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3964 * mul-float, div-float, rem-float
3965 */
3966 /* binop vAA, vBB, vCC */
3967 FETCH w0, 1 // w0<- CCBB
3968 lsr w9, wINST, #8 // w9<- AA
3969 lsr w3, w0, #8 // w3<- CC
3970 and w2, w0, #255 // w2<- BB
3971 GET_VREG w1, w3 // w1<- vCC
3972 GET_VREG w0, w2 // w0<- vBB
3973 .if 0
3974 cbz w1, common_errDivideByZero // is second operand zero?
3975 .endif
3976 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3977 // optional op; may set condition codes
3978 eor w0, w0, w1 // w0<- op, w0-w3 changed
3979 GET_INST_OPCODE ip // extract opcode from rINST
3980 SET_VREG w0, w9 // vAA<- w0
3981 GOTO_OPCODE ip // jump to next instruction
3982 /* 11-14 instructions */
3983
3984
3985/* ------------------------------ */
3986 .balign 128
3987.L_op_shl_int: /* 0x98 */
3988/* File: arm64/op_shl_int.S */
3989/* File: arm64/binop.S */
3990 /*
3991 * Generic 32-bit binary operation. Provide an "instr" line that
3992 * specifies an instruction that performs "result = w0 op w1".
3993 * This could be an ARM instruction or a function call. (If the result
3994 * comes back in a register other than w0, you can override "result".)
3995 *
3996 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3997 * vCC (w1). Useful for integer division and modulus. Note that we
3998 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3999 * handles it correctly.
4000 *
4001 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4002 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4003 * mul-float, div-float, rem-float
4004 */
4005 /* binop vAA, vBB, vCC */
4006 FETCH w0, 1 // w0<- CCBB
4007 lsr w9, wINST, #8 // w9<- AA
4008 lsr w3, w0, #8 // w3<- CC
4009 and w2, w0, #255 // w2<- BB
4010 GET_VREG w1, w3 // w1<- vCC
4011 GET_VREG w0, w2 // w0<- vBB
4012 .if 0
4013 cbz w1, common_errDivideByZero // is second operand zero?
4014 .endif
4015 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004016 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004017 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4018 GET_INST_OPCODE ip // extract opcode from rINST
4019 SET_VREG w0, w9 // vAA<- w0
4020 GOTO_OPCODE ip // jump to next instruction
4021 /* 11-14 instructions */
4022
4023
4024/* ------------------------------ */
4025 .balign 128
4026.L_op_shr_int: /* 0x99 */
4027/* File: arm64/op_shr_int.S */
4028/* File: arm64/binop.S */
4029 /*
4030 * Generic 32-bit binary operation. Provide an "instr" line that
4031 * specifies an instruction that performs "result = w0 op w1".
4032 * This could be an ARM instruction or a function call. (If the result
4033 * comes back in a register other than w0, you can override "result".)
4034 *
4035 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4036 * vCC (w1). Useful for integer division and modulus. Note that we
4037 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4038 * handles it correctly.
4039 *
4040 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4041 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4042 * mul-float, div-float, rem-float
4043 */
4044 /* binop vAA, vBB, vCC */
4045 FETCH w0, 1 // w0<- CCBB
4046 lsr w9, wINST, #8 // w9<- AA
4047 lsr w3, w0, #8 // w3<- CC
4048 and w2, w0, #255 // w2<- BB
4049 GET_VREG w1, w3 // w1<- vCC
4050 GET_VREG w0, w2 // w0<- vBB
4051 .if 0
4052 cbz w1, common_errDivideByZero // is second operand zero?
4053 .endif
4054 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004055 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004056 asr w0, w0, w1 // w0<- op, w0-w3 changed
4057 GET_INST_OPCODE ip // extract opcode from rINST
4058 SET_VREG w0, w9 // vAA<- w0
4059 GOTO_OPCODE ip // jump to next instruction
4060 /* 11-14 instructions */
4061
4062
4063/* ------------------------------ */
4064 .balign 128
4065.L_op_ushr_int: /* 0x9a */
4066/* File: arm64/op_ushr_int.S */
4067/* File: arm64/binop.S */
4068 /*
4069 * Generic 32-bit binary operation. Provide an "instr" line that
4070 * specifies an instruction that performs "result = w0 op w1".
4071 * This could be an ARM instruction or a function call. (If the result
4072 * comes back in a register other than w0, you can override "result".)
4073 *
4074 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4075 * vCC (w1). Useful for integer division and modulus. Note that we
4076 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4077 * handles it correctly.
4078 *
4079 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4080 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4081 * mul-float, div-float, rem-float
4082 */
4083 /* binop vAA, vBB, vCC */
4084 FETCH w0, 1 // w0<- CCBB
4085 lsr w9, wINST, #8 // w9<- AA
4086 lsr w3, w0, #8 // w3<- CC
4087 and w2, w0, #255 // w2<- BB
4088 GET_VREG w1, w3 // w1<- vCC
4089 GET_VREG w0, w2 // w0<- vBB
4090 .if 0
4091 cbz w1, common_errDivideByZero // is second operand zero?
4092 .endif
4093 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004094 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004095 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4096 GET_INST_OPCODE ip // extract opcode from rINST
4097 SET_VREG w0, w9 // vAA<- w0
4098 GOTO_OPCODE ip // jump to next instruction
4099 /* 11-14 instructions */
4100
4101
4102/* ------------------------------ */
4103 .balign 128
4104.L_op_add_long: /* 0x9b */
4105/* File: arm64/op_add_long.S */
4106/* File: arm64/binopWide.S */
4107 /*
4108 * Generic 64-bit binary operation. Provide an "instr" line that
4109 * specifies an instruction that performs "result = x1 op x2".
4110 * This could be an ARM instruction or a function call. (If the result
4111 * comes back in a register other than x0, you can override "result".)
4112 *
4113 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4114 * vCC (w1). Useful for integer division and modulus.
4115 *
4116 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4117 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4118 */
4119 /* binop vAA, vBB, vCC */
4120 FETCH w0, 1 // w0<- CCBB
4121 lsr w4, wINST, #8 // w4<- AA
4122 lsr w2, w0, #8 // w2<- CC
4123 and w1, w0, #255 // w1<- BB
4124 GET_VREG_WIDE x2, w2 // w2<- vCC
4125 GET_VREG_WIDE x1, w1 // w1<- vBB
4126 .if 0
4127 cbz x2, common_errDivideByZero // is second operand zero?
4128 .endif
4129 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4130
4131 add x0, x1, x2 // x0<- op, w0-w4 changed
4132 GET_INST_OPCODE ip // extract opcode from rINST
4133 SET_VREG_WIDE x0, w4 // vAA<- x0
4134 GOTO_OPCODE ip // jump to next instruction
4135 /* 11-14 instructions */
4136
4137
4138/* ------------------------------ */
4139 .balign 128
4140.L_op_sub_long: /* 0x9c */
4141/* File: arm64/op_sub_long.S */
4142/* File: arm64/binopWide.S */
4143 /*
4144 * Generic 64-bit binary operation. Provide an "instr" line that
4145 * specifies an instruction that performs "result = x1 op x2".
4146 * This could be an ARM instruction or a function call. (If the result
4147 * comes back in a register other than x0, you can override "result".)
4148 *
4149 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4150 * vCC (w1). Useful for integer division and modulus.
4151 *
4152 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4153 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4154 */
4155 /* binop vAA, vBB, vCC */
4156 FETCH w0, 1 // w0<- CCBB
4157 lsr w4, wINST, #8 // w4<- AA
4158 lsr w2, w0, #8 // w2<- CC
4159 and w1, w0, #255 // w1<- BB
4160 GET_VREG_WIDE x2, w2 // w2<- vCC
4161 GET_VREG_WIDE x1, w1 // w1<- vBB
4162 .if 0
4163 cbz x2, common_errDivideByZero // is second operand zero?
4164 .endif
4165 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4166
4167 sub x0, x1, x2 // x0<- op, w0-w4 changed
4168 GET_INST_OPCODE ip // extract opcode from rINST
4169 SET_VREG_WIDE x0, w4 // vAA<- x0
4170 GOTO_OPCODE ip // jump to next instruction
4171 /* 11-14 instructions */
4172
4173
4174/* ------------------------------ */
4175 .balign 128
4176.L_op_mul_long: /* 0x9d */
4177/* File: arm64/op_mul_long.S */
4178/* File: arm64/binopWide.S */
4179 /*
4180 * Generic 64-bit binary operation. Provide an "instr" line that
4181 * specifies an instruction that performs "result = x1 op x2".
4182 * This could be an ARM instruction or a function call. (If the result
4183 * comes back in a register other than x0, you can override "result".)
4184 *
4185 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4186 * vCC (w1). Useful for integer division and modulus.
4187 *
4188 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4189 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4190 */
4191 /* binop vAA, vBB, vCC */
4192 FETCH w0, 1 // w0<- CCBB
4193 lsr w4, wINST, #8 // w4<- AA
4194 lsr w2, w0, #8 // w2<- CC
4195 and w1, w0, #255 // w1<- BB
4196 GET_VREG_WIDE x2, w2 // w2<- vCC
4197 GET_VREG_WIDE x1, w1 // w1<- vBB
4198 .if 0
4199 cbz x2, common_errDivideByZero // is second operand zero?
4200 .endif
4201 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4202
4203 mul x0, x1, x2 // x0<- op, w0-w4 changed
4204 GET_INST_OPCODE ip // extract opcode from rINST
4205 SET_VREG_WIDE x0, w4 // vAA<- x0
4206 GOTO_OPCODE ip // jump to next instruction
4207 /* 11-14 instructions */
4208
4209
4210/* ------------------------------ */
4211 .balign 128
4212.L_op_div_long: /* 0x9e */
4213/* File: arm64/op_div_long.S */
4214/* File: arm64/binopWide.S */
4215 /*
4216 * Generic 64-bit binary operation. Provide an "instr" line that
4217 * specifies an instruction that performs "result = x1 op x2".
4218 * This could be an ARM instruction or a function call. (If the result
4219 * comes back in a register other than x0, you can override "result".)
4220 *
4221 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4222 * vCC (w1). Useful for integer division and modulus.
4223 *
4224 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4225 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4226 */
4227 /* binop vAA, vBB, vCC */
4228 FETCH w0, 1 // w0<- CCBB
4229 lsr w4, wINST, #8 // w4<- AA
4230 lsr w2, w0, #8 // w2<- CC
4231 and w1, w0, #255 // w1<- BB
4232 GET_VREG_WIDE x2, w2 // w2<- vCC
4233 GET_VREG_WIDE x1, w1 // w1<- vBB
4234 .if 1
4235 cbz x2, common_errDivideByZero // is second operand zero?
4236 .endif
4237 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4238
4239 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4240 GET_INST_OPCODE ip // extract opcode from rINST
4241 SET_VREG_WIDE x0, w4 // vAA<- x0
4242 GOTO_OPCODE ip // jump to next instruction
4243 /* 11-14 instructions */
4244
4245
4246/* ------------------------------ */
4247 .balign 128
4248.L_op_rem_long: /* 0x9f */
4249/* File: arm64/op_rem_long.S */
4250/* File: arm64/binopWide.S */
4251 /*
4252 * Generic 64-bit binary operation. Provide an "instr" line that
4253 * specifies an instruction that performs "result = x1 op x2".
4254 * This could be an ARM instruction or a function call. (If the result
4255 * comes back in a register other than x0, you can override "result".)
4256 *
4257 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4258 * vCC (w1). Useful for integer division and modulus.
4259 *
4260 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4261 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4262 */
4263 /* binop vAA, vBB, vCC */
4264 FETCH w0, 1 // w0<- CCBB
4265 lsr w4, wINST, #8 // w4<- AA
4266 lsr w2, w0, #8 // w2<- CC
4267 and w1, w0, #255 // w1<- BB
4268 GET_VREG_WIDE x2, w2 // w2<- vCC
4269 GET_VREG_WIDE x1, w1 // w1<- vBB
4270 .if 1
4271 cbz x2, common_errDivideByZero // is second operand zero?
4272 .endif
4273 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4274 sdiv x3, x1, x2
4275 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4276 GET_INST_OPCODE ip // extract opcode from rINST
4277 SET_VREG_WIDE x0, w4 // vAA<- x0
4278 GOTO_OPCODE ip // jump to next instruction
4279 /* 11-14 instructions */
4280
4281
4282/* ------------------------------ */
4283 .balign 128
4284.L_op_and_long: /* 0xa0 */
4285/* File: arm64/op_and_long.S */
4286/* File: arm64/binopWide.S */
4287 /*
4288 * Generic 64-bit binary operation. Provide an "instr" line that
4289 * specifies an instruction that performs "result = x1 op x2".
4290 * This could be an ARM instruction or a function call. (If the result
4291 * comes back in a register other than x0, you can override "result".)
4292 *
4293 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4294 * vCC (w1). Useful for integer division and modulus.
4295 *
4296 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4297 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4298 */
4299 /* binop vAA, vBB, vCC */
4300 FETCH w0, 1 // w0<- CCBB
4301 lsr w4, wINST, #8 // w4<- AA
4302 lsr w2, w0, #8 // w2<- CC
4303 and w1, w0, #255 // w1<- BB
4304 GET_VREG_WIDE x2, w2 // w2<- vCC
4305 GET_VREG_WIDE x1, w1 // w1<- vBB
4306 .if 0
4307 cbz x2, common_errDivideByZero // is second operand zero?
4308 .endif
4309 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4310
4311 and x0, x1, x2 // x0<- op, w0-w4 changed
4312 GET_INST_OPCODE ip // extract opcode from rINST
4313 SET_VREG_WIDE x0, w4 // vAA<- x0
4314 GOTO_OPCODE ip // jump to next instruction
4315 /* 11-14 instructions */
4316
4317
4318/* ------------------------------ */
4319 .balign 128
4320.L_op_or_long: /* 0xa1 */
4321/* File: arm64/op_or_long.S */
4322/* File: arm64/binopWide.S */
4323 /*
4324 * Generic 64-bit binary operation. Provide an "instr" line that
4325 * specifies an instruction that performs "result = x1 op x2".
4326 * This could be an ARM instruction or a function call. (If the result
4327 * comes back in a register other than x0, you can override "result".)
4328 *
4329 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4330 * vCC (w1). Useful for integer division and modulus.
4331 *
4332 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4333 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4334 */
4335 /* binop vAA, vBB, vCC */
4336 FETCH w0, 1 // w0<- CCBB
4337 lsr w4, wINST, #8 // w4<- AA
4338 lsr w2, w0, #8 // w2<- CC
4339 and w1, w0, #255 // w1<- BB
4340 GET_VREG_WIDE x2, w2 // w2<- vCC
4341 GET_VREG_WIDE x1, w1 // w1<- vBB
4342 .if 0
4343 cbz x2, common_errDivideByZero // is second operand zero?
4344 .endif
4345 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4346
4347 orr x0, x1, x2 // x0<- op, w0-w4 changed
4348 GET_INST_OPCODE ip // extract opcode from rINST
4349 SET_VREG_WIDE x0, w4 // vAA<- x0
4350 GOTO_OPCODE ip // jump to next instruction
4351 /* 11-14 instructions */
4352
4353
4354/* ------------------------------ */
4355 .balign 128
4356.L_op_xor_long: /* 0xa2 */
4357/* File: arm64/op_xor_long.S */
4358/* File: arm64/binopWide.S */
4359 /*
4360 * Generic 64-bit binary operation. Provide an "instr" line that
4361 * specifies an instruction that performs "result = x1 op x2".
4362 * This could be an ARM instruction or a function call. (If the result
4363 * comes back in a register other than x0, you can override "result".)
4364 *
4365 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4366 * vCC (w1). Useful for integer division and modulus.
4367 *
4368 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4369 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4370 */
4371 /* binop vAA, vBB, vCC */
4372 FETCH w0, 1 // w0<- CCBB
4373 lsr w4, wINST, #8 // w4<- AA
4374 lsr w2, w0, #8 // w2<- CC
4375 and w1, w0, #255 // w1<- BB
4376 GET_VREG_WIDE x2, w2 // w2<- vCC
4377 GET_VREG_WIDE x1, w1 // w1<- vBB
4378 .if 0
4379 cbz x2, common_errDivideByZero // is second operand zero?
4380 .endif
4381 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4382
4383 eor x0, x1, x2 // x0<- op, w0-w4 changed
4384 GET_INST_OPCODE ip // extract opcode from rINST
4385 SET_VREG_WIDE x0, w4 // vAA<- x0
4386 GOTO_OPCODE ip // jump to next instruction
4387 /* 11-14 instructions */
4388
4389
4390/* ------------------------------ */
4391 .balign 128
4392.L_op_shl_long: /* 0xa3 */
4393/* File: arm64/op_shl_long.S */
4394/* File: arm64/shiftWide.S */
4395 /*
4396 * 64-bit shift operation.
4397 *
4398 * For: shl-long, shr-long, ushr-long
4399 */
4400 /* binop vAA, vBB, vCC */
4401 FETCH w0, 1 // w0<- CCBB
4402 lsr w3, wINST, #8 // w3<- AA
4403 lsr w2, w0, #8 // w2<- CC
4404 GET_VREG w2, w2 // w2<- vCC (shift count)
4405 and w1, w0, #255 // w1<- BB
4406 GET_VREG_WIDE x1, w1 // x1<- vBB
4407 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004408 lsl x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004409 GET_INST_OPCODE ip // extract opcode from rINST
4410 SET_VREG_WIDE x0, w3 // vAA<- x0
4411 GOTO_OPCODE ip // jump to next instruction
4412 /* 11-14 instructions */
4413
4414
4415/* ------------------------------ */
4416 .balign 128
4417.L_op_shr_long: /* 0xa4 */
4418/* File: arm64/op_shr_long.S */
4419/* File: arm64/shiftWide.S */
4420 /*
4421 * 64-bit shift operation.
4422 *
4423 * For: shl-long, shr-long, ushr-long
4424 */
4425 /* binop vAA, vBB, vCC */
4426 FETCH w0, 1 // w0<- CCBB
4427 lsr w3, wINST, #8 // w3<- AA
4428 lsr w2, w0, #8 // w2<- CC
4429 GET_VREG w2, w2 // w2<- vCC (shift count)
4430 and w1, w0, #255 // w1<- BB
4431 GET_VREG_WIDE x1, w1 // x1<- vBB
4432 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004433 asr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004434 GET_INST_OPCODE ip // extract opcode from rINST
4435 SET_VREG_WIDE x0, w3 // vAA<- x0
4436 GOTO_OPCODE ip // jump to next instruction
4437 /* 11-14 instructions */
4438
4439
4440/* ------------------------------ */
4441 .balign 128
4442.L_op_ushr_long: /* 0xa5 */
4443/* File: arm64/op_ushr_long.S */
4444/* File: arm64/shiftWide.S */
4445 /*
4446 * 64-bit shift operation.
4447 *
4448 * For: shl-long, shr-long, ushr-long
4449 */
4450 /* binop vAA, vBB, vCC */
4451 FETCH w0, 1 // w0<- CCBB
4452 lsr w3, wINST, #8 // w3<- AA
4453 lsr w2, w0, #8 // w2<- CC
4454 GET_VREG w2, w2 // w2<- vCC (shift count)
4455 and w1, w0, #255 // w1<- BB
4456 GET_VREG_WIDE x1, w1 // x1<- vBB
4457 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004458 lsr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004459 GET_INST_OPCODE ip // extract opcode from rINST
4460 SET_VREG_WIDE x0, w3 // vAA<- x0
4461 GOTO_OPCODE ip // jump to next instruction
4462 /* 11-14 instructions */
4463
4464
4465/* ------------------------------ */
4466 .balign 128
4467.L_op_add_float: /* 0xa6 */
4468/* File: arm64/op_add_float.S */
4469/* File: arm64/fbinop.S */
4470 /*:
4471 * Generic 32-bit floating-point operation.
4472 *
4473 * For: add-float, sub-float, mul-float, div-float
4474 * form: <op> s0, s0, s1
4475 */
4476 /* floatop vAA, vBB, vCC */
4477 FETCH w0, 1 // r0<- CCBB
4478 lsr w1, w0, #8 // r2<- CC
4479 and w0, w0, #255 // r1<- BB
4480 GET_VREG s1, w1
4481 GET_VREG s0, w0
4482 fadd s0, s0, s1 // s0<- op
4483 lsr w1, wINST, #8 // r1<- AA
4484 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4485 GET_INST_OPCODE ip // extract opcode from rINST
4486 SET_VREG s0, w1
4487 GOTO_OPCODE ip // jump to next instruction
4488
4489
4490/* ------------------------------ */
4491 .balign 128
4492.L_op_sub_float: /* 0xa7 */
4493/* File: arm64/op_sub_float.S */
4494/* File: arm64/fbinop.S */
4495 /*:
4496 * Generic 32-bit floating-point operation.
4497 *
4498 * For: add-float, sub-float, mul-float, div-float
4499 * form: <op> s0, s0, s1
4500 */
4501 /* floatop vAA, vBB, vCC */
4502 FETCH w0, 1 // r0<- CCBB
4503 lsr w1, w0, #8 // r2<- CC
4504 and w0, w0, #255 // r1<- BB
4505 GET_VREG s1, w1
4506 GET_VREG s0, w0
4507 fsub s0, s0, s1 // s0<- op
4508 lsr w1, wINST, #8 // r1<- AA
4509 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4510 GET_INST_OPCODE ip // extract opcode from rINST
4511 SET_VREG s0, w1
4512 GOTO_OPCODE ip // jump to next instruction
4513
4514
4515/* ------------------------------ */
4516 .balign 128
4517.L_op_mul_float: /* 0xa8 */
4518/* File: arm64/op_mul_float.S */
4519/* File: arm64/fbinop.S */
4520 /*:
4521 * Generic 32-bit floating-point operation.
4522 *
4523 * For: add-float, sub-float, mul-float, div-float
4524 * form: <op> s0, s0, s1
4525 */
4526 /* floatop vAA, vBB, vCC */
4527 FETCH w0, 1 // r0<- CCBB
4528 lsr w1, w0, #8 // r2<- CC
4529 and w0, w0, #255 // r1<- BB
4530 GET_VREG s1, w1
4531 GET_VREG s0, w0
4532 fmul s0, s0, s1 // s0<- op
4533 lsr w1, wINST, #8 // r1<- AA
4534 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4535 GET_INST_OPCODE ip // extract opcode from rINST
4536 SET_VREG s0, w1
4537 GOTO_OPCODE ip // jump to next instruction
4538
4539
4540/* ------------------------------ */
4541 .balign 128
4542.L_op_div_float: /* 0xa9 */
4543/* File: arm64/op_div_float.S */
4544/* File: arm64/fbinop.S */
4545 /*:
4546 * Generic 32-bit floating-point operation.
4547 *
4548 * For: add-float, sub-float, mul-float, div-float
4549 * form: <op> s0, s0, s1
4550 */
4551 /* floatop vAA, vBB, vCC */
4552 FETCH w0, 1 // r0<- CCBB
4553 lsr w1, w0, #8 // r2<- CC
4554 and w0, w0, #255 // r1<- BB
4555 GET_VREG s1, w1
4556 GET_VREG s0, w0
4557 fdiv s0, s0, s1 // s0<- op
4558 lsr w1, wINST, #8 // r1<- AA
4559 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4560 GET_INST_OPCODE ip // extract opcode from rINST
4561 SET_VREG s0, w1
4562 GOTO_OPCODE ip // jump to next instruction
4563
4564
4565/* ------------------------------ */
4566 .balign 128
4567.L_op_rem_float: /* 0xaa */
4568/* File: arm64/op_rem_float.S */
4569/* EABI doesn't define a float remainder function, but libm does */
4570/* File: arm64/fbinop.S */
4571 /*:
4572 * Generic 32-bit floating-point operation.
4573 *
4574 * For: add-float, sub-float, mul-float, div-float
4575 * form: <op> s0, s0, s1
4576 */
4577 /* floatop vAA, vBB, vCC */
4578 FETCH w0, 1 // r0<- CCBB
4579 lsr w1, w0, #8 // r2<- CC
4580 and w0, w0, #255 // r1<- BB
4581 GET_VREG s1, w1
4582 GET_VREG s0, w0
4583 bl fmodf // s0<- op
4584 lsr w1, wINST, #8 // r1<- AA
4585 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4586 GET_INST_OPCODE ip // extract opcode from rINST
4587 SET_VREG s0, w1
4588 GOTO_OPCODE ip // jump to next instruction
4589
4590
4591/* ------------------------------ */
4592 .balign 128
4593.L_op_add_double: /* 0xab */
4594/* File: arm64/op_add_double.S */
4595/* File: arm64/binopWide.S */
4596 /*
4597 * Generic 64-bit binary operation. Provide an "instr" line that
4598 * specifies an instruction that performs "result = x1 op x2".
4599 * This could be an ARM instruction or a function call. (If the result
4600 * comes back in a register other than x0, you can override "result".)
4601 *
4602 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4603 * vCC (w1). Useful for integer division and modulus.
4604 *
4605 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4606 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4607 */
4608 /* binop vAA, vBB, vCC */
4609 FETCH w0, 1 // w0<- CCBB
4610 lsr w4, wINST, #8 // w4<- AA
4611 lsr w2, w0, #8 // w2<- CC
4612 and w1, w0, #255 // w1<- BB
4613 GET_VREG_WIDE d2, w2 // w2<- vCC
4614 GET_VREG_WIDE d1, w1 // w1<- vBB
4615 .if 0
4616 cbz d2, common_errDivideByZero // is second operand zero?
4617 .endif
4618 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4619
4620 fadd d0, d1, d2 // d0<- op, w0-w4 changed
4621 GET_INST_OPCODE ip // extract opcode from rINST
4622 SET_VREG_WIDE d0, w4 // vAA<- d0
4623 GOTO_OPCODE ip // jump to next instruction
4624 /* 11-14 instructions */
4625
4626
4627/* ------------------------------ */
4628 .balign 128
4629.L_op_sub_double: /* 0xac */
4630/* File: arm64/op_sub_double.S */
4631/* File: arm64/binopWide.S */
4632 /*
4633 * Generic 64-bit binary operation. Provide an "instr" line that
4634 * specifies an instruction that performs "result = x1 op x2".
4635 * This could be an ARM instruction or a function call. (If the result
4636 * comes back in a register other than x0, you can override "result".)
4637 *
4638 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4639 * vCC (w1). Useful for integer division and modulus.
4640 *
4641 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4642 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4643 */
4644 /* binop vAA, vBB, vCC */
4645 FETCH w0, 1 // w0<- CCBB
4646 lsr w4, wINST, #8 // w4<- AA
4647 lsr w2, w0, #8 // w2<- CC
4648 and w1, w0, #255 // w1<- BB
4649 GET_VREG_WIDE d2, w2 // w2<- vCC
4650 GET_VREG_WIDE d1, w1 // w1<- vBB
4651 .if 0
4652 cbz d2, common_errDivideByZero // is second operand zero?
4653 .endif
4654 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4655
4656 fsub d0, d1, d2 // d0<- op, w0-w4 changed
4657 GET_INST_OPCODE ip // extract opcode from rINST
4658 SET_VREG_WIDE d0, w4 // vAA<- d0
4659 GOTO_OPCODE ip // jump to next instruction
4660 /* 11-14 instructions */
4661
4662
4663/* ------------------------------ */
4664 .balign 128
4665.L_op_mul_double: /* 0xad */
4666/* File: arm64/op_mul_double.S */
4667/* File: arm64/binopWide.S */
4668 /*
4669 * Generic 64-bit binary operation. Provide an "instr" line that
4670 * specifies an instruction that performs "result = x1 op x2".
4671 * This could be an ARM instruction or a function call. (If the result
4672 * comes back in a register other than x0, you can override "result".)
4673 *
4674 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4675 * vCC (w1). Useful for integer division and modulus.
4676 *
4677 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4678 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4679 */
4680 /* binop vAA, vBB, vCC */
4681 FETCH w0, 1 // w0<- CCBB
4682 lsr w4, wINST, #8 // w4<- AA
4683 lsr w2, w0, #8 // w2<- CC
4684 and w1, w0, #255 // w1<- BB
4685 GET_VREG_WIDE d2, w2 // w2<- vCC
4686 GET_VREG_WIDE d1, w1 // w1<- vBB
4687 .if 0
4688 cbz d2, common_errDivideByZero // is second operand zero?
4689 .endif
4690 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4691
4692 fmul d0, d1, d2 // d0<- op, w0-w4 changed
4693 GET_INST_OPCODE ip // extract opcode from rINST
4694 SET_VREG_WIDE d0, w4 // vAA<- d0
4695 GOTO_OPCODE ip // jump to next instruction
4696 /* 11-14 instructions */
4697
4698
4699/* ------------------------------ */
4700 .balign 128
4701.L_op_div_double: /* 0xae */
4702/* File: arm64/op_div_double.S */
4703/* File: arm64/binopWide.S */
4704 /*
4705 * Generic 64-bit binary operation. Provide an "instr" line that
4706 * specifies an instruction that performs "result = x1 op x2".
4707 * This could be an ARM instruction or a function call. (If the result
4708 * comes back in a register other than x0, you can override "result".)
4709 *
4710 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4711 * vCC (w1). Useful for integer division and modulus.
4712 *
4713 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4714 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4715 */
4716 /* binop vAA, vBB, vCC */
4717 FETCH w0, 1 // w0<- CCBB
4718 lsr w4, wINST, #8 // w4<- AA
4719 lsr w2, w0, #8 // w2<- CC
4720 and w1, w0, #255 // w1<- BB
4721 GET_VREG_WIDE d2, w2 // w2<- vCC
4722 GET_VREG_WIDE d1, w1 // w1<- vBB
4723 .if 0
4724 cbz d2, common_errDivideByZero // is second operand zero?
4725 .endif
4726 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4727
4728 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
4729 GET_INST_OPCODE ip // extract opcode from rINST
4730 SET_VREG_WIDE d0, w4 // vAA<- d0
4731 GOTO_OPCODE ip // jump to next instruction
4732 /* 11-14 instructions */
4733
4734
4735/* ------------------------------ */
4736 .balign 128
4737.L_op_rem_double: /* 0xaf */
4738/* File: arm64/op_rem_double.S */
4739 /* rem vAA, vBB, vCC */
4740 FETCH w0, 1 // w0<- CCBB
4741 lsr w2, w0, #8 // w2<- CC
4742 and w1, w0, #255 // w1<- BB
4743 GET_VREG_WIDE d1, w2 // d1<- vCC
4744 GET_VREG_WIDE d0, w1 // d0<- vBB
4745 bl fmod
4746 lsr w4, wINST, #8 // w4<- AA
4747 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4748 GET_INST_OPCODE ip // extract opcode from rINST
4749 SET_VREG_WIDE d0, w4 // vAA<- result
4750 GOTO_OPCODE ip // jump to next instruction
4751 /* 11-14 instructions */
4752
4753/* ------------------------------ */
4754 .balign 128
4755.L_op_add_int_2addr: /* 0xb0 */
4756/* File: arm64/op_add_int_2addr.S */
4757/* File: arm64/binop2addr.S */
4758 /*
4759 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4760 * that specifies an instruction that performs "result = w0 op w1".
4761 * This could be an ARM instruction or a function call. (If the result
4762 * comes back in a register other than w0, you can override "result".)
4763 *
4764 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4765 * vCC (w1). Useful for integer division and modulus.
4766 *
4767 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4768 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4769 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4770 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4771 */
4772 /* binop/2addr vA, vB */
4773 lsr w3, wINST, #12 // w3<- B
4774 ubfx w9, wINST, #8, #4 // w9<- A
4775 GET_VREG w1, w3 // w1<- vB
4776 GET_VREG w0, w9 // w0<- vA
4777 .if 0
4778 cbz w1, common_errDivideByZero
4779 .endif
4780 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4781 // optional op; may set condition codes
4782 add w0, w0, w1 // w0<- op, w0-w3 changed
4783 GET_INST_OPCODE ip // extract opcode from rINST
4784 SET_VREG w0, w9 // vAA<- w0
4785 GOTO_OPCODE ip // jump to next instruction
4786 /* 10-13 instructions */
4787
4788
4789/* ------------------------------ */
4790 .balign 128
4791.L_op_sub_int_2addr: /* 0xb1 */
4792/* File: arm64/op_sub_int_2addr.S */
4793/* File: arm64/binop2addr.S */
4794 /*
4795 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4796 * that specifies an instruction that performs "result = w0 op w1".
4797 * This could be an ARM instruction or a function call. (If the result
4798 * comes back in a register other than w0, you can override "result".)
4799 *
4800 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4801 * vCC (w1). Useful for integer division and modulus.
4802 *
4803 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4804 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4805 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4806 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4807 */
4808 /* binop/2addr vA, vB */
4809 lsr w3, wINST, #12 // w3<- B
4810 ubfx w9, wINST, #8, #4 // w9<- A
4811 GET_VREG w1, w3 // w1<- vB
4812 GET_VREG w0, w9 // w0<- vA
4813 .if 0
4814 cbz w1, common_errDivideByZero
4815 .endif
4816 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4817 // optional op; may set condition codes
4818 sub w0, w0, w1 // w0<- op, w0-w3 changed
4819 GET_INST_OPCODE ip // extract opcode from rINST
4820 SET_VREG w0, w9 // vAA<- w0
4821 GOTO_OPCODE ip // jump to next instruction
4822 /* 10-13 instructions */
4823
4824
4825/* ------------------------------ */
4826 .balign 128
4827.L_op_mul_int_2addr: /* 0xb2 */
4828/* File: arm64/op_mul_int_2addr.S */
4829/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
4830/* File: arm64/binop2addr.S */
4831 /*
4832 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4833 * that specifies an instruction that performs "result = w0 op w1".
4834 * This could be an ARM instruction or a function call. (If the result
4835 * comes back in a register other than w0, you can override "result".)
4836 *
4837 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4838 * vCC (w1). Useful for integer division and modulus.
4839 *
4840 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4841 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4842 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4843 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4844 */
4845 /* binop/2addr vA, vB */
4846 lsr w3, wINST, #12 // w3<- B
4847 ubfx w9, wINST, #8, #4 // w9<- A
4848 GET_VREG w1, w3 // w1<- vB
4849 GET_VREG w0, w9 // w0<- vA
4850 .if 0
4851 cbz w1, common_errDivideByZero
4852 .endif
4853 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4854 // optional op; may set condition codes
4855 mul w0, w1, w0 // w0<- op, w0-w3 changed
4856 GET_INST_OPCODE ip // extract opcode from rINST
4857 SET_VREG w0, w9 // vAA<- w0
4858 GOTO_OPCODE ip // jump to next instruction
4859 /* 10-13 instructions */
4860
4861
4862/* ------------------------------ */
4863 .balign 128
4864.L_op_div_int_2addr: /* 0xb3 */
4865/* File: arm64/op_div_int_2addr.S */
4866/* File: arm64/binop2addr.S */
4867 /*
4868 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4869 * that specifies an instruction that performs "result = w0 op w1".
4870 * This could be an ARM instruction or a function call. (If the result
4871 * comes back in a register other than w0, you can override "result".)
4872 *
4873 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4874 * vCC (w1). Useful for integer division and modulus.
4875 *
4876 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4877 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4878 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4879 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4880 */
4881 /* binop/2addr vA, vB */
4882 lsr w3, wINST, #12 // w3<- B
4883 ubfx w9, wINST, #8, #4 // w9<- A
4884 GET_VREG w1, w3 // w1<- vB
4885 GET_VREG w0, w9 // w0<- vA
4886 .if 1
4887 cbz w1, common_errDivideByZero
4888 .endif
4889 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4890 // optional op; may set condition codes
4891 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4892 GET_INST_OPCODE ip // extract opcode from rINST
4893 SET_VREG w0, w9 // vAA<- w0
4894 GOTO_OPCODE ip // jump to next instruction
4895 /* 10-13 instructions */
4896
4897
4898/* ------------------------------ */
4899 .balign 128
4900.L_op_rem_int_2addr: /* 0xb4 */
4901/* File: arm64/op_rem_int_2addr.S */
4902/* File: arm64/binop2addr.S */
4903 /*
4904 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4905 * that specifies an instruction that performs "result = w0 op w1".
4906 * This could be an ARM instruction or a function call. (If the result
4907 * comes back in a register other than w0, you can override "result".)
4908 *
4909 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4910 * vCC (w1). Useful for integer division and modulus.
4911 *
4912 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4913 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4914 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4915 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4916 */
4917 /* binop/2addr vA, vB */
4918 lsr w3, wINST, #12 // w3<- B
4919 ubfx w9, wINST, #8, #4 // w9<- A
4920 GET_VREG w1, w3 // w1<- vB
4921 GET_VREG w0, w9 // w0<- vA
4922 .if 1
4923 cbz w1, common_errDivideByZero
4924 .endif
4925 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4926 sdiv w2, w0, w1 // optional op; may set condition codes
4927 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4928 GET_INST_OPCODE ip // extract opcode from rINST
4929 SET_VREG w0, w9 // vAA<- w0
4930 GOTO_OPCODE ip // jump to next instruction
4931 /* 10-13 instructions */
4932
4933
4934/* ------------------------------ */
4935 .balign 128
4936.L_op_and_int_2addr: /* 0xb5 */
4937/* File: arm64/op_and_int_2addr.S */
4938/* File: arm64/binop2addr.S */
4939 /*
4940 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4941 * that specifies an instruction that performs "result = w0 op w1".
4942 * This could be an ARM instruction or a function call. (If the result
4943 * comes back in a register other than w0, you can override "result".)
4944 *
4945 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4946 * vCC (w1). Useful for integer division and modulus.
4947 *
4948 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4949 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4950 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4951 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4952 */
4953 /* binop/2addr vA, vB */
4954 lsr w3, wINST, #12 // w3<- B
4955 ubfx w9, wINST, #8, #4 // w9<- A
4956 GET_VREG w1, w3 // w1<- vB
4957 GET_VREG w0, w9 // w0<- vA
4958 .if 0
4959 cbz w1, common_errDivideByZero
4960 .endif
4961 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4962 // optional op; may set condition codes
4963 and w0, w0, w1 // w0<- op, w0-w3 changed
4964 GET_INST_OPCODE ip // extract opcode from rINST
4965 SET_VREG w0, w9 // vAA<- w0
4966 GOTO_OPCODE ip // jump to next instruction
4967 /* 10-13 instructions */
4968
4969
4970/* ------------------------------ */
4971 .balign 128
4972.L_op_or_int_2addr: /* 0xb6 */
4973/* File: arm64/op_or_int_2addr.S */
4974/* File: arm64/binop2addr.S */
4975 /*
4976 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4977 * that specifies an instruction that performs "result = w0 op w1".
4978 * This could be an ARM instruction or a function call. (If the result
4979 * comes back in a register other than w0, you can override "result".)
4980 *
4981 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4982 * vCC (w1). Useful for integer division and modulus.
4983 *
4984 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4985 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4986 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4987 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4988 */
4989 /* binop/2addr vA, vB */
4990 lsr w3, wINST, #12 // w3<- B
4991 ubfx w9, wINST, #8, #4 // w9<- A
4992 GET_VREG w1, w3 // w1<- vB
4993 GET_VREG w0, w9 // w0<- vA
4994 .if 0
4995 cbz w1, common_errDivideByZero
4996 .endif
4997 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4998 // optional op; may set condition codes
4999 orr w0, w0, w1 // w0<- op, w0-w3 changed
5000 GET_INST_OPCODE ip // extract opcode from rINST
5001 SET_VREG w0, w9 // vAA<- w0
5002 GOTO_OPCODE ip // jump to next instruction
5003 /* 10-13 instructions */
5004
5005
5006/* ------------------------------ */
5007 .balign 128
5008.L_op_xor_int_2addr: /* 0xb7 */
5009/* File: arm64/op_xor_int_2addr.S */
5010/* File: arm64/binop2addr.S */
5011 /*
5012 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5013 * that specifies an instruction that performs "result = w0 op w1".
5014 * This could be an ARM instruction or a function call. (If the result
5015 * comes back in a register other than w0, you can override "result".)
5016 *
5017 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5018 * vCC (w1). Useful for integer division and modulus.
5019 *
5020 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5021 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5022 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5023 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5024 */
5025 /* binop/2addr vA, vB */
5026 lsr w3, wINST, #12 // w3<- B
5027 ubfx w9, wINST, #8, #4 // w9<- A
5028 GET_VREG w1, w3 // w1<- vB
5029 GET_VREG w0, w9 // w0<- vA
5030 .if 0
5031 cbz w1, common_errDivideByZero
5032 .endif
5033 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5034 // optional op; may set condition codes
5035 eor w0, w0, w1 // w0<- op, w0-w3 changed
5036 GET_INST_OPCODE ip // extract opcode from rINST
5037 SET_VREG w0, w9 // vAA<- w0
5038 GOTO_OPCODE ip // jump to next instruction
5039 /* 10-13 instructions */
5040
5041
5042/* ------------------------------ */
5043 .balign 128
5044.L_op_shl_int_2addr: /* 0xb8 */
5045/* File: arm64/op_shl_int_2addr.S */
5046/* File: arm64/binop2addr.S */
5047 /*
5048 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5049 * that specifies an instruction that performs "result = w0 op w1".
5050 * This could be an ARM instruction or a function call. (If the result
5051 * comes back in a register other than w0, you can override "result".)
5052 *
5053 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5054 * vCC (w1). Useful for integer division and modulus.
5055 *
5056 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5057 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5058 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5059 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5060 */
5061 /* binop/2addr vA, vB */
5062 lsr w3, wINST, #12 // w3<- B
5063 ubfx w9, wINST, #8, #4 // w9<- A
5064 GET_VREG w1, w3 // w1<- vB
5065 GET_VREG w0, w9 // w0<- vA
5066 .if 0
5067 cbz w1, common_errDivideByZero
5068 .endif
5069 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005070 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005071 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5072 GET_INST_OPCODE ip // extract opcode from rINST
5073 SET_VREG w0, w9 // vAA<- w0
5074 GOTO_OPCODE ip // jump to next instruction
5075 /* 10-13 instructions */
5076
5077
5078/* ------------------------------ */
5079 .balign 128
5080.L_op_shr_int_2addr: /* 0xb9 */
5081/* File: arm64/op_shr_int_2addr.S */
5082/* File: arm64/binop2addr.S */
5083 /*
5084 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5085 * that specifies an instruction that performs "result = w0 op w1".
5086 * This could be an ARM instruction or a function call. (If the result
5087 * comes back in a register other than w0, you can override "result".)
5088 *
5089 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5090 * vCC (w1). Useful for integer division and modulus.
5091 *
5092 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5093 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5094 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5095 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5096 */
5097 /* binop/2addr vA, vB */
5098 lsr w3, wINST, #12 // w3<- B
5099 ubfx w9, wINST, #8, #4 // w9<- A
5100 GET_VREG w1, w3 // w1<- vB
5101 GET_VREG w0, w9 // w0<- vA
5102 .if 0
5103 cbz w1, common_errDivideByZero
5104 .endif
5105 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005106 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005107 asr w0, w0, w1 // w0<- op, w0-w3 changed
5108 GET_INST_OPCODE ip // extract opcode from rINST
5109 SET_VREG w0, w9 // vAA<- w0
5110 GOTO_OPCODE ip // jump to next instruction
5111 /* 10-13 instructions */
5112
5113
5114/* ------------------------------ */
5115 .balign 128
5116.L_op_ushr_int_2addr: /* 0xba */
5117/* File: arm64/op_ushr_int_2addr.S */
5118/* File: arm64/binop2addr.S */
5119 /*
5120 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5121 * that specifies an instruction that performs "result = w0 op w1".
5122 * This could be an ARM instruction or a function call. (If the result
5123 * comes back in a register other than w0, you can override "result".)
5124 *
5125 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5126 * vCC (w1). Useful for integer division and modulus.
5127 *
5128 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5129 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5130 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5131 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5132 */
5133 /* binop/2addr vA, vB */
5134 lsr w3, wINST, #12 // w3<- B
5135 ubfx w9, wINST, #8, #4 // w9<- A
5136 GET_VREG w1, w3 // w1<- vB
5137 GET_VREG w0, w9 // w0<- vA
5138 .if 0
5139 cbz w1, common_errDivideByZero
5140 .endif
5141 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005142 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005143 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5144 GET_INST_OPCODE ip // extract opcode from rINST
5145 SET_VREG w0, w9 // vAA<- w0
5146 GOTO_OPCODE ip // jump to next instruction
5147 /* 10-13 instructions */
5148
5149
5150/* ------------------------------ */
5151 .balign 128
5152.L_op_add_long_2addr: /* 0xbb */
5153/* File: arm64/op_add_long_2addr.S */
5154/* File: arm64/binopWide2addr.S */
5155 /*
5156 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5157 * that specifies an instruction that performs "x0 = x0 op x1".
5158 * This must not be a function call, as we keep w2 live across it.
5159 *
5160 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5161 * vCC (w1). Useful for integer division and modulus.
5162 *
5163 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5164 * and-long/2addr, or-long/2addr, xor-long/2addr,
5165 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5166 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5167 */
5168 /* binop/2addr vA, vB */
5169 lsr w1, wINST, #12 // w1<- B
5170 ubfx w2, wINST, #8, #4 // w2<- A
5171 GET_VREG_WIDE x1, w1 // x1<- vB
5172 GET_VREG_WIDE x0, w2 // x0<- vA
5173 .if 0
5174 cbz x1, common_errDivideByZero
5175 .endif
5176 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5177
5178 add x0, x0, x1 // result<- op
5179 GET_INST_OPCODE ip // extract opcode from rINST
5180 SET_VREG_WIDE x0, w2 // vAA<- result
5181 GOTO_OPCODE ip // jump to next instruction
5182 /* 10-13 instructions */
5183
5184
5185/* ------------------------------ */
5186 .balign 128
5187.L_op_sub_long_2addr: /* 0xbc */
5188/* File: arm64/op_sub_long_2addr.S */
5189/* File: arm64/binopWide2addr.S */
5190 /*
5191 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5192 * that specifies an instruction that performs "x0 = x0 op x1".
5193 * This must not be a function call, as we keep w2 live across it.
5194 *
5195 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5196 * vCC (w1). Useful for integer division and modulus.
5197 *
5198 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5199 * and-long/2addr, or-long/2addr, xor-long/2addr,
5200 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5201 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5202 */
5203 /* binop/2addr vA, vB */
5204 lsr w1, wINST, #12 // w1<- B
5205 ubfx w2, wINST, #8, #4 // w2<- A
5206 GET_VREG_WIDE x1, w1 // x1<- vB
5207 GET_VREG_WIDE x0, w2 // x0<- vA
5208 .if 0
5209 cbz x1, common_errDivideByZero
5210 .endif
5211 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5212
5213 sub x0, x0, x1 // result<- op
5214 GET_INST_OPCODE ip // extract opcode from rINST
5215 SET_VREG_WIDE x0, w2 // vAA<- result
5216 GOTO_OPCODE ip // jump to next instruction
5217 /* 10-13 instructions */
5218
5219
5220/* ------------------------------ */
5221 .balign 128
5222.L_op_mul_long_2addr: /* 0xbd */
5223/* File: arm64/op_mul_long_2addr.S */
5224/* File: arm64/binopWide2addr.S */
5225 /*
5226 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5227 * that specifies an instruction that performs "x0 = x0 op x1".
5228 * This must not be a function call, as we keep w2 live across it.
5229 *
5230 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5231 * vCC (w1). Useful for integer division and modulus.
5232 *
5233 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5234 * and-long/2addr, or-long/2addr, xor-long/2addr,
5235 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5236 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5237 */
5238 /* binop/2addr vA, vB */
5239 lsr w1, wINST, #12 // w1<- B
5240 ubfx w2, wINST, #8, #4 // w2<- A
5241 GET_VREG_WIDE x1, w1 // x1<- vB
5242 GET_VREG_WIDE x0, w2 // x0<- vA
5243 .if 0
5244 cbz x1, common_errDivideByZero
5245 .endif
5246 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5247
5248 mul x0, x0, x1 // result<- op
5249 GET_INST_OPCODE ip // extract opcode from rINST
5250 SET_VREG_WIDE x0, w2 // vAA<- result
5251 GOTO_OPCODE ip // jump to next instruction
5252 /* 10-13 instructions */
5253
5254
5255/* ------------------------------ */
5256 .balign 128
5257.L_op_div_long_2addr: /* 0xbe */
5258/* File: arm64/op_div_long_2addr.S */
5259/* File: arm64/binopWide2addr.S */
5260 /*
5261 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5262 * that specifies an instruction that performs "x0 = x0 op x1".
5263 * This must not be a function call, as we keep w2 live across it.
5264 *
5265 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5266 * vCC (w1). Useful for integer division and modulus.
5267 *
5268 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5269 * and-long/2addr, or-long/2addr, xor-long/2addr,
5270 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5271 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5272 */
5273 /* binop/2addr vA, vB */
5274 lsr w1, wINST, #12 // w1<- B
5275 ubfx w2, wINST, #8, #4 // w2<- A
5276 GET_VREG_WIDE x1, w1 // x1<- vB
5277 GET_VREG_WIDE x0, w2 // x0<- vA
5278 .if 1
5279 cbz x1, common_errDivideByZero
5280 .endif
5281 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5282
5283 sdiv x0, x0, x1 // result<- op
5284 GET_INST_OPCODE ip // extract opcode from rINST
5285 SET_VREG_WIDE x0, w2 // vAA<- result
5286 GOTO_OPCODE ip // jump to next instruction
5287 /* 10-13 instructions */
5288
5289
5290/* ------------------------------ */
5291 .balign 128
5292.L_op_rem_long_2addr: /* 0xbf */
5293/* File: arm64/op_rem_long_2addr.S */
5294/* File: arm64/binopWide2addr.S */
5295 /*
5296 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5297 * that specifies an instruction that performs "x0 = x0 op x1".
5298 * This must not be a function call, as we keep w2 live across it.
5299 *
5300 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5301 * vCC (w1). Useful for integer division and modulus.
5302 *
5303 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5304 * and-long/2addr, or-long/2addr, xor-long/2addr,
5305 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5306 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5307 */
5308 /* binop/2addr vA, vB */
5309 lsr w1, wINST, #12 // w1<- B
5310 ubfx w2, wINST, #8, #4 // w2<- A
5311 GET_VREG_WIDE x1, w1 // x1<- vB
5312 GET_VREG_WIDE x0, w2 // x0<- vA
5313 .if 1
5314 cbz x1, common_errDivideByZero
5315 .endif
5316 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5317 sdiv x3, x0, x1
5318 msub x0, x3, x1, x0 // result<- op
5319 GET_INST_OPCODE ip // extract opcode from rINST
5320 SET_VREG_WIDE x0, w2 // vAA<- result
5321 GOTO_OPCODE ip // jump to next instruction
5322 /* 10-13 instructions */
5323
5324
5325/* ------------------------------ */
5326 .balign 128
5327.L_op_and_long_2addr: /* 0xc0 */
5328/* File: arm64/op_and_long_2addr.S */
5329/* File: arm64/binopWide2addr.S */
5330 /*
5331 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5332 * that specifies an instruction that performs "x0 = x0 op x1".
5333 * This must not be a function call, as we keep w2 live across it.
5334 *
5335 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5336 * vCC (w1). Useful for integer division and modulus.
5337 *
5338 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5339 * and-long/2addr, or-long/2addr, xor-long/2addr,
5340 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5341 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5342 */
5343 /* binop/2addr vA, vB */
5344 lsr w1, wINST, #12 // w1<- B
5345 ubfx w2, wINST, #8, #4 // w2<- A
5346 GET_VREG_WIDE x1, w1 // x1<- vB
5347 GET_VREG_WIDE x0, w2 // x0<- vA
5348 .if 0
5349 cbz x1, common_errDivideByZero
5350 .endif
5351 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5352
5353 and x0, x0, x1 // result<- op
5354 GET_INST_OPCODE ip // extract opcode from rINST
5355 SET_VREG_WIDE x0, w2 // vAA<- result
5356 GOTO_OPCODE ip // jump to next instruction
5357 /* 10-13 instructions */
5358
5359
5360/* ------------------------------ */
5361 .balign 128
5362.L_op_or_long_2addr: /* 0xc1 */
5363/* File: arm64/op_or_long_2addr.S */
5364/* File: arm64/binopWide2addr.S */
5365 /*
5366 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5367 * that specifies an instruction that performs "x0 = x0 op x1".
5368 * This must not be a function call, as we keep w2 live across it.
5369 *
5370 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5371 * vCC (w1). Useful for integer division and modulus.
5372 *
5373 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5374 * and-long/2addr, or-long/2addr, xor-long/2addr,
5375 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5376 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5377 */
5378 /* binop/2addr vA, vB */
5379 lsr w1, wINST, #12 // w1<- B
5380 ubfx w2, wINST, #8, #4 // w2<- A
5381 GET_VREG_WIDE x1, w1 // x1<- vB
5382 GET_VREG_WIDE x0, w2 // x0<- vA
5383 .if 0
5384 cbz x1, common_errDivideByZero
5385 .endif
5386 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5387
5388 orr x0, x0, x1 // result<- op
5389 GET_INST_OPCODE ip // extract opcode from rINST
5390 SET_VREG_WIDE x0, w2 // vAA<- result
5391 GOTO_OPCODE ip // jump to next instruction
5392 /* 10-13 instructions */
5393
5394
5395/* ------------------------------ */
5396 .balign 128
5397.L_op_xor_long_2addr: /* 0xc2 */
5398/* File: arm64/op_xor_long_2addr.S */
5399/* File: arm64/binopWide2addr.S */
5400 /*
5401 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5402 * that specifies an instruction that performs "x0 = x0 op x1".
5403 * This must not be a function call, as we keep w2 live across it.
5404 *
5405 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5406 * vCC (w1). Useful for integer division and modulus.
5407 *
5408 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5409 * and-long/2addr, or-long/2addr, xor-long/2addr,
5410 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5411 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5412 */
5413 /* binop/2addr vA, vB */
5414 lsr w1, wINST, #12 // w1<- B
5415 ubfx w2, wINST, #8, #4 // w2<- A
5416 GET_VREG_WIDE x1, w1 // x1<- vB
5417 GET_VREG_WIDE x0, w2 // x0<- vA
5418 .if 0
5419 cbz x1, common_errDivideByZero
5420 .endif
5421 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5422
5423 eor x0, x0, x1 // result<- op
5424 GET_INST_OPCODE ip // extract opcode from rINST
5425 SET_VREG_WIDE x0, w2 // vAA<- result
5426 GOTO_OPCODE ip // jump to next instruction
5427 /* 10-13 instructions */
5428
5429
5430/* ------------------------------ */
5431 .balign 128
5432.L_op_shl_long_2addr: /* 0xc3 */
5433/* File: arm64/op_shl_long_2addr.S */
5434/* File: arm64/shiftWide2addr.S */
5435 /*
5436 * Generic 64-bit shift operation.
5437 */
5438 /* binop/2addr vA, vB */
5439 lsr w1, wINST, #12 // w1<- B
5440 ubfx w2, wINST, #8, #4 // w2<- A
5441 GET_VREG w1, w1 // x1<- vB
5442 GET_VREG_WIDE x0, w2 // x0<- vA
5443 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005444 lsl x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005445 GET_INST_OPCODE ip // extract opcode from rINST
5446 SET_VREG_WIDE x0, w2 // vAA<- result
5447 GOTO_OPCODE ip // jump to next instruction
5448 /* 10-13 instructions */
5449
5450
5451/* ------------------------------ */
5452 .balign 128
5453.L_op_shr_long_2addr: /* 0xc4 */
5454/* File: arm64/op_shr_long_2addr.S */
5455/* File: arm64/shiftWide2addr.S */
5456 /*
5457 * Generic 64-bit shift operation.
5458 */
5459 /* binop/2addr vA, vB */
5460 lsr w1, wINST, #12 // w1<- B
5461 ubfx w2, wINST, #8, #4 // w2<- A
5462 GET_VREG w1, w1 // x1<- vB
5463 GET_VREG_WIDE x0, w2 // x0<- vA
5464 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005465 asr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005466 GET_INST_OPCODE ip // extract opcode from rINST
5467 SET_VREG_WIDE x0, w2 // vAA<- result
5468 GOTO_OPCODE ip // jump to next instruction
5469 /* 10-13 instructions */
5470
5471
5472/* ------------------------------ */
5473 .balign 128
5474.L_op_ushr_long_2addr: /* 0xc5 */
5475/* File: arm64/op_ushr_long_2addr.S */
5476/* File: arm64/shiftWide2addr.S */
5477 /*
5478 * Generic 64-bit shift operation.
5479 */
5480 /* binop/2addr vA, vB */
5481 lsr w1, wINST, #12 // w1<- B
5482 ubfx w2, wINST, #8, #4 // w2<- A
5483 GET_VREG w1, w1 // x1<- vB
5484 GET_VREG_WIDE x0, w2 // x0<- vA
5485 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005486 lsr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005487 GET_INST_OPCODE ip // extract opcode from rINST
5488 SET_VREG_WIDE x0, w2 // vAA<- result
5489 GOTO_OPCODE ip // jump to next instruction
5490 /* 10-13 instructions */
5491
5492
5493/* ------------------------------ */
5494 .balign 128
5495.L_op_add_float_2addr: /* 0xc6 */
5496/* File: arm64/op_add_float_2addr.S */
5497/* File: arm64/fbinop2addr.S */
5498 /*
5499 * Generic 32-bit floating point "/2addr" binary operation. Provide
5500 * an "instr" line that specifies an instruction that performs
5501 * "s2 = s0 op s1".
5502 *
5503 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5504 */
5505 /* binop/2addr vA, vB */
5506 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005507 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005508 GET_VREG s1, w3
5509 GET_VREG s0, w9
5510 fadd s2, s0, s1 // s2<- op
5511 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5512 GET_INST_OPCODE ip // extract opcode from rINST
5513 SET_VREG s2, w9
5514 GOTO_OPCODE ip // jump to next instruction
5515
5516
5517/* ------------------------------ */
5518 .balign 128
5519.L_op_sub_float_2addr: /* 0xc7 */
5520/* File: arm64/op_sub_float_2addr.S */
5521/* File: arm64/fbinop2addr.S */
5522 /*
5523 * Generic 32-bit floating point "/2addr" binary operation. Provide
5524 * an "instr" line that specifies an instruction that performs
5525 * "s2 = s0 op s1".
5526 *
5527 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5528 */
5529 /* binop/2addr vA, vB */
5530 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005531 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005532 GET_VREG s1, w3
5533 GET_VREG s0, w9
5534 fsub s2, s0, s1 // s2<- op
5535 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5536 GET_INST_OPCODE ip // extract opcode from rINST
5537 SET_VREG s2, w9
5538 GOTO_OPCODE ip // jump to next instruction
5539
5540
5541/* ------------------------------ */
5542 .balign 128
5543.L_op_mul_float_2addr: /* 0xc8 */
5544/* File: arm64/op_mul_float_2addr.S */
5545/* File: arm64/fbinop2addr.S */
5546 /*
5547 * Generic 32-bit floating point "/2addr" binary operation. Provide
5548 * an "instr" line that specifies an instruction that performs
5549 * "s2 = s0 op s1".
5550 *
5551 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5552 */
5553 /* binop/2addr vA, vB */
5554 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005555 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005556 GET_VREG s1, w3
5557 GET_VREG s0, w9
5558 fmul s2, s0, s1 // s2<- op
5559 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5560 GET_INST_OPCODE ip // extract opcode from rINST
5561 SET_VREG s2, w9
5562 GOTO_OPCODE ip // jump to next instruction
5563
5564
5565/* ------------------------------ */
5566 .balign 128
5567.L_op_div_float_2addr: /* 0xc9 */
5568/* File: arm64/op_div_float_2addr.S */
5569/* File: arm64/fbinop2addr.S */
5570 /*
5571 * Generic 32-bit floating point "/2addr" binary operation. Provide
5572 * an "instr" line that specifies an instruction that performs
5573 * "s2 = s0 op s1".
5574 *
5575 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5576 */
5577 /* binop/2addr vA, vB */
5578 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005579 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005580 GET_VREG s1, w3
5581 GET_VREG s0, w9
5582 fdiv s2, s0, s1 // s2<- op
5583 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5584 GET_INST_OPCODE ip // extract opcode from rINST
5585 SET_VREG s2, w9
5586 GOTO_OPCODE ip // jump to next instruction
5587
5588
5589/* ------------------------------ */
5590 .balign 128
5591.L_op_rem_float_2addr: /* 0xca */
5592/* File: arm64/op_rem_float_2addr.S */
5593 /* rem vA, vB */
5594 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005595 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005596 GET_VREG s1, w3
5597 GET_VREG s0, w9
5598 bl fmodf
Vladimir Markoe6220222016-07-20 14:25:30 +01005599 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005600 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5601 GET_INST_OPCODE ip // extract opcode from rINST
5602 SET_VREG s0, w9
5603 GOTO_OPCODE ip // jump to next instruction
5604
5605/* ------------------------------ */
5606 .balign 128
5607.L_op_add_double_2addr: /* 0xcb */
5608/* File: arm64/op_add_double_2addr.S */
5609/* File: arm64/binopWide2addr.S */
5610 /*
5611 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5612 * that specifies an instruction that performs "x0 = x0 op x1".
5613 * This must not be a function call, as we keep w2 live across it.
5614 *
5615 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5616 * vCC (w1). Useful for integer division and modulus.
5617 *
5618 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5619 * and-long/2addr, or-long/2addr, xor-long/2addr,
5620 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5621 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5622 */
5623 /* binop/2addr vA, vB */
5624 lsr w1, wINST, #12 // w1<- B
5625 ubfx w2, wINST, #8, #4 // w2<- A
5626 GET_VREG_WIDE d1, w1 // x1<- vB
5627 GET_VREG_WIDE d0, w2 // x0<- vA
5628 .if 0
5629 cbz d1, common_errDivideByZero
5630 .endif
5631 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5632
5633 fadd d0, d0, d1 // result<- op
5634 GET_INST_OPCODE ip // extract opcode from rINST
5635 SET_VREG_WIDE d0, w2 // vAA<- result
5636 GOTO_OPCODE ip // jump to next instruction
5637 /* 10-13 instructions */
5638
5639
5640/* ------------------------------ */
5641 .balign 128
5642.L_op_sub_double_2addr: /* 0xcc */
5643/* File: arm64/op_sub_double_2addr.S */
5644/* File: arm64/binopWide2addr.S */
5645 /*
5646 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5647 * that specifies an instruction that performs "x0 = x0 op x1".
5648 * This must not be a function call, as we keep w2 live across it.
5649 *
5650 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5651 * vCC (w1). Useful for integer division and modulus.
5652 *
5653 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5654 * and-long/2addr, or-long/2addr, xor-long/2addr,
5655 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5656 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5657 */
5658 /* binop/2addr vA, vB */
5659 lsr w1, wINST, #12 // w1<- B
5660 ubfx w2, wINST, #8, #4 // w2<- A
5661 GET_VREG_WIDE d1, w1 // x1<- vB
5662 GET_VREG_WIDE d0, w2 // x0<- vA
5663 .if 0
5664 cbz d1, common_errDivideByZero
5665 .endif
5666 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5667
5668 fsub d0, d0, d1 // result<- op
5669 GET_INST_OPCODE ip // extract opcode from rINST
5670 SET_VREG_WIDE d0, w2 // vAA<- result
5671 GOTO_OPCODE ip // jump to next instruction
5672 /* 10-13 instructions */
5673
5674
5675/* ------------------------------ */
5676 .balign 128
5677.L_op_mul_double_2addr: /* 0xcd */
5678/* File: arm64/op_mul_double_2addr.S */
5679/* File: arm64/binopWide2addr.S */
5680 /*
5681 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5682 * that specifies an instruction that performs "x0 = x0 op x1".
5683 * This must not be a function call, as we keep w2 live across it.
5684 *
5685 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5686 * vCC (w1). Useful for integer division and modulus.
5687 *
5688 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5689 * and-long/2addr, or-long/2addr, xor-long/2addr,
5690 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5691 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5692 */
5693 /* binop/2addr vA, vB */
5694 lsr w1, wINST, #12 // w1<- B
5695 ubfx w2, wINST, #8, #4 // w2<- A
5696 GET_VREG_WIDE d1, w1 // x1<- vB
5697 GET_VREG_WIDE d0, w2 // x0<- vA
5698 .if 0
5699 cbz d1, common_errDivideByZero
5700 .endif
5701 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5702
5703 fmul d0, d0, d1 // result<- op
5704 GET_INST_OPCODE ip // extract opcode from rINST
5705 SET_VREG_WIDE d0, w2 // vAA<- result
5706 GOTO_OPCODE ip // jump to next instruction
5707 /* 10-13 instructions */
5708
5709
5710/* ------------------------------ */
5711 .balign 128
5712.L_op_div_double_2addr: /* 0xce */
5713/* File: arm64/op_div_double_2addr.S */
5714/* File: arm64/binopWide2addr.S */
5715 /*
5716 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5717 * that specifies an instruction that performs "x0 = x0 op x1".
5718 * This must not be a function call, as we keep w2 live across it.
5719 *
5720 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5721 * vCC (w1). Useful for integer division and modulus.
5722 *
5723 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5724 * and-long/2addr, or-long/2addr, xor-long/2addr,
5725 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5726 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5727 */
5728 /* binop/2addr vA, vB */
5729 lsr w1, wINST, #12 // w1<- B
5730 ubfx w2, wINST, #8, #4 // w2<- A
5731 GET_VREG_WIDE d1, w1 // x1<- vB
5732 GET_VREG_WIDE d0, w2 // x0<- vA
5733 .if 0
5734 cbz d1, common_errDivideByZero
5735 .endif
5736 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5737
5738 fdiv d0, d0, d1 // result<- op
5739 GET_INST_OPCODE ip // extract opcode from rINST
5740 SET_VREG_WIDE d0, w2 // vAA<- result
5741 GOTO_OPCODE ip // jump to next instruction
5742 /* 10-13 instructions */
5743
5744
5745/* ------------------------------ */
5746 .balign 128
5747.L_op_rem_double_2addr: /* 0xcf */
5748/* File: arm64/op_rem_double_2addr.S */
5749 /* rem vA, vB */
5750 lsr w1, wINST, #12 // w1<- B
5751 ubfx w2, wINST, #8, #4 // w2<- A
5752 GET_VREG_WIDE d1, w1 // d1<- vB
5753 GET_VREG_WIDE d0, w2 // d0<- vA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005754 bl fmod
5755 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
buzbee908c0b22016-03-16 14:39:50 -07005756 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005757 GET_INST_OPCODE ip // extract opcode from rINST
5758 SET_VREG_WIDE d0, w2 // vAA<- result
5759 GOTO_OPCODE ip // jump to next instruction
5760 /* 10-13 instructions */
5761
5762/* ------------------------------ */
5763 .balign 128
5764.L_op_add_int_lit16: /* 0xd0 */
5765/* File: arm64/op_add_int_lit16.S */
5766/* File: arm64/binopLit16.S */
5767 /*
5768 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5769 * that specifies an instruction that performs "result = w0 op w1".
5770 * This could be an ARM instruction or a function call. (If the result
5771 * comes back in a register other than w0, you can override "result".)
5772 *
5773 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5774 * vCC (w1). Useful for integer division and modulus.
5775 *
5776 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5777 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5778 */
5779 /* binop/lit16 vA, vB, #+CCCC */
5780 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5781 lsr w2, wINST, #12 // w2<- B
5782 ubfx w9, wINST, #8, #4 // w9<- A
5783 GET_VREG w0, w2 // w0<- vB
5784 .if 0
5785 cbz w1, common_errDivideByZero
5786 .endif
5787 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5788
5789 add w0, w0, w1 // w0<- op, w0-w3 changed
5790 GET_INST_OPCODE ip // extract opcode from rINST
5791 SET_VREG w0, w9 // vAA<- w0
5792 GOTO_OPCODE ip // jump to next instruction
5793 /* 10-13 instructions */
5794
5795
5796/* ------------------------------ */
5797 .balign 128
5798.L_op_rsub_int: /* 0xd1 */
5799/* File: arm64/op_rsub_int.S */
5800/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5801/* File: arm64/binopLit16.S */
5802 /*
5803 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5804 * that specifies an instruction that performs "result = w0 op w1".
5805 * This could be an ARM instruction or a function call. (If the result
5806 * comes back in a register other than w0, you can override "result".)
5807 *
5808 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5809 * vCC (w1). Useful for integer division and modulus.
5810 *
5811 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5812 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5813 */
5814 /* binop/lit16 vA, vB, #+CCCC */
5815 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5816 lsr w2, wINST, #12 // w2<- B
5817 ubfx w9, wINST, #8, #4 // w9<- A
5818 GET_VREG w0, w2 // w0<- vB
5819 .if 0
5820 cbz w1, common_errDivideByZero
5821 .endif
5822 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5823
5824 sub w0, w1, w0 // w0<- op, w0-w3 changed
5825 GET_INST_OPCODE ip // extract opcode from rINST
5826 SET_VREG w0, w9 // vAA<- w0
5827 GOTO_OPCODE ip // jump to next instruction
5828 /* 10-13 instructions */
5829
5830
5831/* ------------------------------ */
5832 .balign 128
5833.L_op_mul_int_lit16: /* 0xd2 */
5834/* File: arm64/op_mul_int_lit16.S */
5835/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5836/* File: arm64/binopLit16.S */
5837 /*
5838 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5839 * that specifies an instruction that performs "result = w0 op w1".
5840 * This could be an ARM instruction or a function call. (If the result
5841 * comes back in a register other than w0, you can override "result".)
5842 *
5843 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5844 * vCC (w1). Useful for integer division and modulus.
5845 *
5846 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5847 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5848 */
5849 /* binop/lit16 vA, vB, #+CCCC */
5850 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5851 lsr w2, wINST, #12 // w2<- B
5852 ubfx w9, wINST, #8, #4 // w9<- A
5853 GET_VREG w0, w2 // w0<- vB
5854 .if 0
5855 cbz w1, common_errDivideByZero
5856 .endif
5857 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5858
5859 mul w0, w1, w0 // w0<- op, w0-w3 changed
5860 GET_INST_OPCODE ip // extract opcode from rINST
5861 SET_VREG w0, w9 // vAA<- w0
5862 GOTO_OPCODE ip // jump to next instruction
5863 /* 10-13 instructions */
5864
5865
5866/* ------------------------------ */
5867 .balign 128
5868.L_op_div_int_lit16: /* 0xd3 */
5869/* File: arm64/op_div_int_lit16.S */
5870/* File: arm64/binopLit16.S */
5871 /*
5872 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5873 * that specifies an instruction that performs "result = w0 op w1".
5874 * This could be an ARM instruction or a function call. (If the result
5875 * comes back in a register other than w0, you can override "result".)
5876 *
5877 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5878 * vCC (w1). Useful for integer division and modulus.
5879 *
5880 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5881 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5882 */
5883 /* binop/lit16 vA, vB, #+CCCC */
5884 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5885 lsr w2, wINST, #12 // w2<- B
5886 ubfx w9, wINST, #8, #4 // w9<- A
5887 GET_VREG w0, w2 // w0<- vB
5888 .if 1
5889 cbz w1, common_errDivideByZero
5890 .endif
5891 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5892
5893 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5894 GET_INST_OPCODE ip // extract opcode from rINST
5895 SET_VREG w0, w9 // vAA<- w0
5896 GOTO_OPCODE ip // jump to next instruction
5897 /* 10-13 instructions */
5898
5899
5900/* ------------------------------ */
5901 .balign 128
5902.L_op_rem_int_lit16: /* 0xd4 */
5903/* File: arm64/op_rem_int_lit16.S */
5904/* File: arm64/binopLit16.S */
5905 /*
5906 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5907 * that specifies an instruction that performs "result = w0 op w1".
5908 * This could be an ARM instruction or a function call. (If the result
5909 * comes back in a register other than w0, you can override "result".)
5910 *
5911 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5912 * vCC (w1). Useful for integer division and modulus.
5913 *
5914 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5915 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5916 */
5917 /* binop/lit16 vA, vB, #+CCCC */
5918 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5919 lsr w2, wINST, #12 // w2<- B
5920 ubfx w9, wINST, #8, #4 // w9<- A
5921 GET_VREG w0, w2 // w0<- vB
5922 .if 1
5923 cbz w1, common_errDivideByZero
5924 .endif
5925 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5926 sdiv w3, w0, w1
5927 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
5928 GET_INST_OPCODE ip // extract opcode from rINST
5929 SET_VREG w0, w9 // vAA<- w0
5930 GOTO_OPCODE ip // jump to next instruction
5931 /* 10-13 instructions */
5932
5933
5934/* ------------------------------ */
5935 .balign 128
5936.L_op_and_int_lit16: /* 0xd5 */
5937/* File: arm64/op_and_int_lit16.S */
5938/* File: arm64/binopLit16.S */
5939 /*
5940 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5941 * that specifies an instruction that performs "result = w0 op w1".
5942 * This could be an ARM instruction or a function call. (If the result
5943 * comes back in a register other than w0, you can override "result".)
5944 *
5945 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5946 * vCC (w1). Useful for integer division and modulus.
5947 *
5948 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5949 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5950 */
5951 /* binop/lit16 vA, vB, #+CCCC */
5952 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5953 lsr w2, wINST, #12 // w2<- B
5954 ubfx w9, wINST, #8, #4 // w9<- A
5955 GET_VREG w0, w2 // w0<- vB
5956 .if 0
5957 cbz w1, common_errDivideByZero
5958 .endif
5959 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5960
5961 and w0, w0, w1 // w0<- op, w0-w3 changed
5962 GET_INST_OPCODE ip // extract opcode from rINST
5963 SET_VREG w0, w9 // vAA<- w0
5964 GOTO_OPCODE ip // jump to next instruction
5965 /* 10-13 instructions */
5966
5967
5968/* ------------------------------ */
5969 .balign 128
5970.L_op_or_int_lit16: /* 0xd6 */
5971/* File: arm64/op_or_int_lit16.S */
5972/* File: arm64/binopLit16.S */
5973 /*
5974 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5975 * that specifies an instruction that performs "result = w0 op w1".
5976 * This could be an ARM instruction or a function call. (If the result
5977 * comes back in a register other than w0, you can override "result".)
5978 *
5979 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5980 * vCC (w1). Useful for integer division and modulus.
5981 *
5982 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5983 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5984 */
5985 /* binop/lit16 vA, vB, #+CCCC */
5986 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5987 lsr w2, wINST, #12 // w2<- B
5988 ubfx w9, wINST, #8, #4 // w9<- A
5989 GET_VREG w0, w2 // w0<- vB
5990 .if 0
5991 cbz w1, common_errDivideByZero
5992 .endif
5993 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5994
5995 orr w0, w0, w1 // w0<- op, w0-w3 changed
5996 GET_INST_OPCODE ip // extract opcode from rINST
5997 SET_VREG w0, w9 // vAA<- w0
5998 GOTO_OPCODE ip // jump to next instruction
5999 /* 10-13 instructions */
6000
6001
6002/* ------------------------------ */
6003 .balign 128
6004.L_op_xor_int_lit16: /* 0xd7 */
6005/* File: arm64/op_xor_int_lit16.S */
6006/* File: arm64/binopLit16.S */
6007 /*
6008 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6009 * that specifies an instruction that performs "result = w0 op w1".
6010 * This could be an ARM instruction or a function call. (If the result
6011 * comes back in a register other than w0, you can override "result".)
6012 *
6013 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6014 * vCC (w1). Useful for integer division and modulus.
6015 *
6016 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6017 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6018 */
6019 /* binop/lit16 vA, vB, #+CCCC */
6020 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6021 lsr w2, wINST, #12 // w2<- B
6022 ubfx w9, wINST, #8, #4 // w9<- A
6023 GET_VREG w0, w2 // w0<- vB
6024 .if 0
6025 cbz w1, common_errDivideByZero
6026 .endif
6027 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6028
6029 eor w0, w0, w1 // w0<- op, w0-w3 changed
6030 GET_INST_OPCODE ip // extract opcode from rINST
6031 SET_VREG w0, w9 // vAA<- w0
6032 GOTO_OPCODE ip // jump to next instruction
6033 /* 10-13 instructions */
6034
6035
6036/* ------------------------------ */
6037 .balign 128
6038.L_op_add_int_lit8: /* 0xd8 */
6039/* File: arm64/op_add_int_lit8.S */
6040/* File: arm64/binopLit8.S */
6041 /*
6042 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6043 * that specifies an instruction that performs "result = w0 op w1".
6044 * This could be an ARM instruction or a function call. (If the result
6045 * comes back in a register other than w0, you can override "result".)
6046 *
6047 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6048 * vCC (w1). Useful for integer division and modulus.
6049 *
6050 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6051 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6052 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6053 */
6054 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006055 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006056 lsr w9, wINST, #8 // w9<- AA
6057 and w2, w3, #255 // w2<- BB
6058 GET_VREG w0, w2 // w0<- vBB
6059 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6060 .if 0
6061 cbz w1, common_errDivideByZero
6062 .endif
6063 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6064 // optional op; may set condition codes
6065 add w0, w0, w1 // w0<- op, w0-w3 changed
6066 GET_INST_OPCODE ip // extract opcode from rINST
6067 SET_VREG w0, w9 // vAA<- w0
6068 GOTO_OPCODE ip // jump to next instruction
6069 /* 10-12 instructions */
6070
6071
6072/* ------------------------------ */
6073 .balign 128
6074.L_op_rsub_int_lit8: /* 0xd9 */
6075/* File: arm64/op_rsub_int_lit8.S */
6076/* File: arm64/binopLit8.S */
6077 /*
6078 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6079 * that specifies an instruction that performs "result = w0 op w1".
6080 * This could be an ARM instruction or a function call. (If the result
6081 * comes back in a register other than w0, you can override "result".)
6082 *
6083 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6084 * vCC (w1). Useful for integer division and modulus.
6085 *
6086 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6087 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6088 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6089 */
6090 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006091 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006092 lsr w9, wINST, #8 // w9<- AA
6093 and w2, w3, #255 // w2<- BB
6094 GET_VREG w0, w2 // w0<- vBB
6095 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6096 .if 0
6097 cbz w1, common_errDivideByZero
6098 .endif
6099 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6100 // optional op; may set condition codes
6101 sub w0, w1, w0 // w0<- op, w0-w3 changed
6102 GET_INST_OPCODE ip // extract opcode from rINST
6103 SET_VREG w0, w9 // vAA<- w0
6104 GOTO_OPCODE ip // jump to next instruction
6105 /* 10-12 instructions */
6106
6107
6108/* ------------------------------ */
6109 .balign 128
6110.L_op_mul_int_lit8: /* 0xda */
6111/* File: arm64/op_mul_int_lit8.S */
6112/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6113/* File: arm64/binopLit8.S */
6114 /*
6115 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6116 * that specifies an instruction that performs "result = w0 op w1".
6117 * This could be an ARM instruction or a function call. (If the result
6118 * comes back in a register other than w0, you can override "result".)
6119 *
6120 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6121 * vCC (w1). Useful for integer division and modulus.
6122 *
6123 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6124 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6125 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6126 */
6127 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006128 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006129 lsr w9, wINST, #8 // w9<- AA
6130 and w2, w3, #255 // w2<- BB
6131 GET_VREG w0, w2 // w0<- vBB
6132 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6133 .if 0
6134 cbz w1, common_errDivideByZero
6135 .endif
6136 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6137 // optional op; may set condition codes
6138 mul w0, w1, w0 // w0<- op, w0-w3 changed
6139 GET_INST_OPCODE ip // extract opcode from rINST
6140 SET_VREG w0, w9 // vAA<- w0
6141 GOTO_OPCODE ip // jump to next instruction
6142 /* 10-12 instructions */
6143
6144
6145/* ------------------------------ */
6146 .balign 128
6147.L_op_div_int_lit8: /* 0xdb */
6148/* File: arm64/op_div_int_lit8.S */
6149/* File: arm64/binopLit8.S */
6150 /*
6151 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6152 * that specifies an instruction that performs "result = w0 op w1".
6153 * This could be an ARM instruction or a function call. (If the result
6154 * comes back in a register other than w0, you can override "result".)
6155 *
6156 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6157 * vCC (w1). Useful for integer division and modulus.
6158 *
6159 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6160 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6161 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6162 */
6163 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006164 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006165 lsr w9, wINST, #8 // w9<- AA
6166 and w2, w3, #255 // w2<- BB
6167 GET_VREG w0, w2 // w0<- vBB
6168 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6169 .if 1
6170 cbz w1, common_errDivideByZero
6171 .endif
6172 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6173 // optional op; may set condition codes
6174 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6175 GET_INST_OPCODE ip // extract opcode from rINST
6176 SET_VREG w0, w9 // vAA<- w0
6177 GOTO_OPCODE ip // jump to next instruction
6178 /* 10-12 instructions */
6179
6180
6181/* ------------------------------ */
6182 .balign 128
6183.L_op_rem_int_lit8: /* 0xdc */
6184/* File: arm64/op_rem_int_lit8.S */
6185/* File: arm64/binopLit8.S */
6186 /*
6187 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6188 * that specifies an instruction that performs "result = w0 op w1".
6189 * This could be an ARM instruction or a function call. (If the result
6190 * comes back in a register other than w0, you can override "result".)
6191 *
6192 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6193 * vCC (w1). Useful for integer division and modulus.
6194 *
6195 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6196 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6197 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6198 */
6199 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006200 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006201 lsr w9, wINST, #8 // w9<- AA
6202 and w2, w3, #255 // w2<- BB
6203 GET_VREG w0, w2 // w0<- vBB
6204 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6205 .if 1
6206 cbz w1, common_errDivideByZero
6207 .endif
6208 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6209 sdiv w3, w0, w1 // optional op; may set condition codes
6210 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6211 GET_INST_OPCODE ip // extract opcode from rINST
6212 SET_VREG w0, w9 // vAA<- w0
6213 GOTO_OPCODE ip // jump to next instruction
6214 /* 10-12 instructions */
6215
6216
6217/* ------------------------------ */
6218 .balign 128
6219.L_op_and_int_lit8: /* 0xdd */
6220/* File: arm64/op_and_int_lit8.S */
6221/* File: arm64/binopLit8.S */
6222 /*
6223 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6224 * that specifies an instruction that performs "result = w0 op w1".
6225 * This could be an ARM instruction or a function call. (If the result
6226 * comes back in a register other than w0, you can override "result".)
6227 *
6228 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6229 * vCC (w1). Useful for integer division and modulus.
6230 *
6231 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6232 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6233 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6234 */
6235 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006236 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006237 lsr w9, wINST, #8 // w9<- AA
6238 and w2, w3, #255 // w2<- BB
6239 GET_VREG w0, w2 // w0<- vBB
6240 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6241 .if 0
6242 cbz w1, common_errDivideByZero
6243 .endif
6244 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6245 // optional op; may set condition codes
6246 and w0, w0, w1 // w0<- op, w0-w3 changed
6247 GET_INST_OPCODE ip // extract opcode from rINST
6248 SET_VREG w0, w9 // vAA<- w0
6249 GOTO_OPCODE ip // jump to next instruction
6250 /* 10-12 instructions */
6251
6252
6253/* ------------------------------ */
6254 .balign 128
6255.L_op_or_int_lit8: /* 0xde */
6256/* File: arm64/op_or_int_lit8.S */
6257/* File: arm64/binopLit8.S */
6258 /*
6259 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6260 * that specifies an instruction that performs "result = w0 op w1".
6261 * This could be an ARM instruction or a function call. (If the result
6262 * comes back in a register other than w0, you can override "result".)
6263 *
6264 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6265 * vCC (w1). Useful for integer division and modulus.
6266 *
6267 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6268 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6269 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6270 */
6271 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006272 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006273 lsr w9, wINST, #8 // w9<- AA
6274 and w2, w3, #255 // w2<- BB
6275 GET_VREG w0, w2 // w0<- vBB
6276 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6277 .if 0
6278 cbz w1, common_errDivideByZero
6279 .endif
6280 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6281 // optional op; may set condition codes
6282 orr w0, w0, w1 // w0<- op, w0-w3 changed
6283 GET_INST_OPCODE ip // extract opcode from rINST
6284 SET_VREG w0, w9 // vAA<- w0
6285 GOTO_OPCODE ip // jump to next instruction
6286 /* 10-12 instructions */
6287
6288
6289/* ------------------------------ */
6290 .balign 128
6291.L_op_xor_int_lit8: /* 0xdf */
6292/* File: arm64/op_xor_int_lit8.S */
6293/* File: arm64/binopLit8.S */
6294 /*
6295 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6296 * that specifies an instruction that performs "result = w0 op w1".
6297 * This could be an ARM instruction or a function call. (If the result
6298 * comes back in a register other than w0, you can override "result".)
6299 *
6300 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6301 * vCC (w1). Useful for integer division and modulus.
6302 *
6303 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6304 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6305 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6306 */
6307 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006308 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006309 lsr w9, wINST, #8 // w9<- AA
6310 and w2, w3, #255 // w2<- BB
6311 GET_VREG w0, w2 // w0<- vBB
6312 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6313 .if 0
6314 cbz w1, common_errDivideByZero
6315 .endif
6316 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6317 // optional op; may set condition codes
6318 eor w0, w0, w1 // w0<- op, w0-w3 changed
6319 GET_INST_OPCODE ip // extract opcode from rINST
6320 SET_VREG w0, w9 // vAA<- w0
6321 GOTO_OPCODE ip // jump to next instruction
6322 /* 10-12 instructions */
6323
6324
6325/* ------------------------------ */
6326 .balign 128
6327.L_op_shl_int_lit8: /* 0xe0 */
6328/* File: arm64/op_shl_int_lit8.S */
6329/* File: arm64/binopLit8.S */
6330 /*
6331 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6332 * that specifies an instruction that performs "result = w0 op w1".
6333 * This could be an ARM instruction or a function call. (If the result
6334 * comes back in a register other than w0, you can override "result".)
6335 *
6336 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6337 * vCC (w1). Useful for integer division and modulus.
6338 *
6339 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6340 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6341 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6342 */
6343 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006344 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006345 lsr w9, wINST, #8 // w9<- AA
6346 and w2, w3, #255 // w2<- BB
6347 GET_VREG w0, w2 // w0<- vBB
6348 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6349 .if 0
6350 cbz w1, common_errDivideByZero
6351 .endif
6352 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006353 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006354 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6355 GET_INST_OPCODE ip // extract opcode from rINST
6356 SET_VREG w0, w9 // vAA<- w0
6357 GOTO_OPCODE ip // jump to next instruction
6358 /* 10-12 instructions */
6359
6360
6361/* ------------------------------ */
6362 .balign 128
6363.L_op_shr_int_lit8: /* 0xe1 */
6364/* File: arm64/op_shr_int_lit8.S */
6365/* File: arm64/binopLit8.S */
6366 /*
6367 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6368 * that specifies an instruction that performs "result = w0 op w1".
6369 * This could be an ARM instruction or a function call. (If the result
6370 * comes back in a register other than w0, you can override "result".)
6371 *
6372 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6373 * vCC (w1). Useful for integer division and modulus.
6374 *
6375 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6376 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6377 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6378 */
6379 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006380 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006381 lsr w9, wINST, #8 // w9<- AA
6382 and w2, w3, #255 // w2<- BB
6383 GET_VREG w0, w2 // w0<- vBB
6384 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6385 .if 0
6386 cbz w1, common_errDivideByZero
6387 .endif
6388 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006389 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006390 asr w0, w0, w1 // w0<- op, w0-w3 changed
6391 GET_INST_OPCODE ip // extract opcode from rINST
6392 SET_VREG w0, w9 // vAA<- w0
6393 GOTO_OPCODE ip // jump to next instruction
6394 /* 10-12 instructions */
6395
6396
6397/* ------------------------------ */
6398 .balign 128
6399.L_op_ushr_int_lit8: /* 0xe2 */
6400/* File: arm64/op_ushr_int_lit8.S */
6401/* File: arm64/binopLit8.S */
6402 /*
6403 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6404 * that specifies an instruction that performs "result = w0 op w1".
6405 * This could be an ARM instruction or a function call. (If the result
6406 * comes back in a register other than w0, you can override "result".)
6407 *
6408 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6409 * vCC (w1). Useful for integer division and modulus.
6410 *
6411 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6412 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6413 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6414 */
6415 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006416 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006417 lsr w9, wINST, #8 // w9<- AA
6418 and w2, w3, #255 // w2<- BB
6419 GET_VREG w0, w2 // w0<- vBB
6420 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6421 .if 0
6422 cbz w1, common_errDivideByZero
6423 .endif
6424 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006425 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006426 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6427 GET_INST_OPCODE ip // extract opcode from rINST
6428 SET_VREG w0, w9 // vAA<- w0
6429 GOTO_OPCODE ip // jump to next instruction
6430 /* 10-12 instructions */
6431
6432
6433/* ------------------------------ */
6434 .balign 128
6435.L_op_iget_quick: /* 0xe3 */
6436/* File: arm64/op_iget_quick.S */
6437 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6438 /* op vA, vB, offset//CCCC */
6439 lsr w2, wINST, #12 // w2<- B
6440 FETCH w1, 1 // w1<- field byte offset
6441 GET_VREG w3, w2 // w3<- object we're operating on
6442 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006443 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006444 ldr w0, [x3, x1] // w0<- obj.field
6445 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6446
6447 SET_VREG w0, w2 // fp[A]<- w0
6448 GET_INST_OPCODE ip // extract opcode from rINST
6449 GOTO_OPCODE ip // jump to next instruction
6450
6451/* ------------------------------ */
6452 .balign 128
6453.L_op_iget_wide_quick: /* 0xe4 */
6454/* File: arm64/op_iget_wide_quick.S */
6455 /* iget-wide-quick vA, vB, offset//CCCC */
6456 lsr w2, wINST, #12 // w2<- B
6457 FETCH w4, 1 // w4<- field byte offset
6458 GET_VREG w3, w2 // w3<- object we're operating on
6459 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006460 cbz w3, common_errNullObject // object was null
Vladimir Marko20421b92016-07-26 16:38:11 +01006461 ldr x0, [x3, x4] // x0<- obj.field
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006462 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6463 SET_VREG_WIDE x0, w2
6464 GET_INST_OPCODE ip // extract opcode from wINST
6465 GOTO_OPCODE ip // jump to next instruction
6466
6467/* ------------------------------ */
6468 .balign 128
6469.L_op_iget_object_quick: /* 0xe5 */
6470/* File: arm64/op_iget_object_quick.S */
6471 /* For: iget-object-quick */
6472 /* op vA, vB, offset//CCCC */
6473 lsr w2, wINST, #12 // w2<- B
6474 FETCH w1, 1 // w1<- field byte offset
6475 EXPORT_PC
6476 GET_VREG w0, w2 // w0<- object we're operating on
6477 bl artIGetObjectFromMterp // (obj, offset)
6478 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6479 ubfx w2, wINST, #8, #4 // w2<- A
6480 PREFETCH_INST 2
6481 cbnz w3, MterpPossibleException // bail out
6482 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6483 ADVANCE 2 // advance rPC
6484 GET_INST_OPCODE ip // extract opcode from wINST
6485 GOTO_OPCODE ip // jump to next instruction
6486
6487/* ------------------------------ */
6488 .balign 128
6489.L_op_iput_quick: /* 0xe6 */
6490/* File: arm64/op_iput_quick.S */
6491 /* For: iput-quick, iput-object-quick */
6492 /* op vA, vB, offset//CCCC */
6493 lsr w2, wINST, #12 // w2<- B
6494 FETCH w1, 1 // w1<- field byte offset
6495 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6496 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006497 cbz w3, common_errNullObject // object was null
6498 GET_VREG w0, w2 // w0<- fp[A]
6499 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6500 str w0, [x3, x1] // obj.field<- w0
6501 GET_INST_OPCODE ip // extract opcode from rINST
6502 GOTO_OPCODE ip // jump to next instruction
6503
6504/* ------------------------------ */
6505 .balign 128
6506.L_op_iput_wide_quick: /* 0xe7 */
6507/* File: arm64/op_iput_wide_quick.S */
6508 /* iput-wide-quick vA, vB, offset//CCCC */
6509 lsr w2, wINST, #12 // w2<- B
6510 FETCH w3, 1 // w3<- field byte offset
6511 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6512 ubfx w0, wINST, #8, #4 // w0<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006513 cbz w2, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006514 GET_VREG_WIDE x0, w0 // x0-< fp[A]
6515 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01006516 str x0, [x2, x3] // obj.field<- x0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006517 GET_INST_OPCODE ip // extract opcode from wINST
6518 GOTO_OPCODE ip // jump to next instruction
6519
6520/* ------------------------------ */
6521 .balign 128
6522.L_op_iput_object_quick: /* 0xe8 */
6523/* File: arm64/op_iput_object_quick.S */
6524 EXPORT_PC
6525 add x0, xFP, #OFF_FP_SHADOWFRAME
6526 mov x1, xPC
6527 mov w2, wINST
6528 bl MterpIputObjectQuick
6529 cbz w0, MterpException
6530 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6531 GET_INST_OPCODE ip // extract opcode from rINST
6532 GOTO_OPCODE ip // jump to next instruction
6533
6534/* ------------------------------ */
6535 .balign 128
6536.L_op_invoke_virtual_quick: /* 0xe9 */
6537/* File: arm64/op_invoke_virtual_quick.S */
6538/* File: arm64/invoke.S */
6539 /*
6540 * Generic invoke handler wrapper.
6541 */
6542 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6543 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6544 .extern MterpInvokeVirtualQuick
6545 EXPORT_PC
6546 mov x0, xSELF
6547 add x1, xFP, #OFF_FP_SHADOWFRAME
6548 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006549 mov x3, xINST
6550 bl MterpInvokeVirtualQuick
6551 cbz w0, MterpException
6552 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006553 bl MterpShouldSwitchInterpreters
6554 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006555 GET_INST_OPCODE ip
6556 GOTO_OPCODE ip
6557
6558
6559
6560/* ------------------------------ */
6561 .balign 128
6562.L_op_invoke_virtual_range_quick: /* 0xea */
6563/* File: arm64/op_invoke_virtual_range_quick.S */
6564/* File: arm64/invoke.S */
6565 /*
6566 * Generic invoke handler wrapper.
6567 */
6568 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6569 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6570 .extern MterpInvokeVirtualQuickRange
6571 EXPORT_PC
6572 mov x0, xSELF
6573 add x1, xFP, #OFF_FP_SHADOWFRAME
6574 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006575 mov x3, xINST
6576 bl MterpInvokeVirtualQuickRange
6577 cbz w0, MterpException
6578 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006579 bl MterpShouldSwitchInterpreters
6580 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006581 GET_INST_OPCODE ip
6582 GOTO_OPCODE ip
6583
6584
6585
6586/* ------------------------------ */
6587 .balign 128
6588.L_op_iput_boolean_quick: /* 0xeb */
6589/* File: arm64/op_iput_boolean_quick.S */
6590/* File: arm64/op_iput_quick.S */
6591 /* For: iput-quick, iput-object-quick */
6592 /* op vA, vB, offset//CCCC */
6593 lsr w2, wINST, #12 // w2<- B
6594 FETCH w1, 1 // w1<- field byte offset
6595 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6596 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006597 cbz w3, common_errNullObject // object was null
6598 GET_VREG w0, w2 // w0<- fp[A]
6599 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6600 strb w0, [x3, x1] // obj.field<- w0
6601 GET_INST_OPCODE ip // extract opcode from rINST
6602 GOTO_OPCODE ip // jump to next instruction
6603
6604
6605/* ------------------------------ */
6606 .balign 128
6607.L_op_iput_byte_quick: /* 0xec */
6608/* File: arm64/op_iput_byte_quick.S */
6609/* File: arm64/op_iput_quick.S */
6610 /* For: iput-quick, iput-object-quick */
6611 /* op vA, vB, offset//CCCC */
6612 lsr w2, wINST, #12 // w2<- B
6613 FETCH w1, 1 // w1<- field byte offset
6614 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6615 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006616 cbz w3, common_errNullObject // object was null
6617 GET_VREG w0, w2 // w0<- fp[A]
6618 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6619 strb w0, [x3, x1] // obj.field<- w0
6620 GET_INST_OPCODE ip // extract opcode from rINST
6621 GOTO_OPCODE ip // jump to next instruction
6622
6623
6624/* ------------------------------ */
6625 .balign 128
6626.L_op_iput_char_quick: /* 0xed */
6627/* File: arm64/op_iput_char_quick.S */
6628/* File: arm64/op_iput_quick.S */
6629 /* For: iput-quick, iput-object-quick */
6630 /* op vA, vB, offset//CCCC */
6631 lsr w2, wINST, #12 // w2<- B
6632 FETCH w1, 1 // w1<- field byte offset
6633 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6634 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006635 cbz w3, common_errNullObject // object was null
6636 GET_VREG w0, w2 // w0<- fp[A]
6637 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6638 strh w0, [x3, x1] // obj.field<- w0
6639 GET_INST_OPCODE ip // extract opcode from rINST
6640 GOTO_OPCODE ip // jump to next instruction
6641
6642
6643/* ------------------------------ */
6644 .balign 128
6645.L_op_iput_short_quick: /* 0xee */
6646/* File: arm64/op_iput_short_quick.S */
6647/* File: arm64/op_iput_quick.S */
6648 /* For: iput-quick, iput-object-quick */
6649 /* op vA, vB, offset//CCCC */
6650 lsr w2, wINST, #12 // w2<- B
6651 FETCH w1, 1 // w1<- field byte offset
6652 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6653 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006654 cbz w3, common_errNullObject // object was null
6655 GET_VREG w0, w2 // w0<- fp[A]
6656 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6657 strh w0, [x3, x1] // obj.field<- w0
6658 GET_INST_OPCODE ip // extract opcode from rINST
6659 GOTO_OPCODE ip // jump to next instruction
6660
6661
6662/* ------------------------------ */
6663 .balign 128
6664.L_op_iget_boolean_quick: /* 0xef */
6665/* File: arm64/op_iget_boolean_quick.S */
6666/* File: arm64/op_iget_quick.S */
6667 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6668 /* op vA, vB, offset//CCCC */
6669 lsr w2, wINST, #12 // w2<- B
6670 FETCH w1, 1 // w1<- field byte offset
6671 GET_VREG w3, w2 // w3<- object we're operating on
6672 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006673 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006674 ldrb w0, [x3, x1] // w0<- obj.field
6675 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6676
6677 SET_VREG w0, w2 // fp[A]<- w0
6678 GET_INST_OPCODE ip // extract opcode from rINST
6679 GOTO_OPCODE ip // jump to next instruction
6680
6681
6682/* ------------------------------ */
6683 .balign 128
6684.L_op_iget_byte_quick: /* 0xf0 */
6685/* File: arm64/op_iget_byte_quick.S */
6686/* File: arm64/op_iget_quick.S */
6687 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6688 /* op vA, vB, offset//CCCC */
6689 lsr w2, wINST, #12 // w2<- B
6690 FETCH w1, 1 // w1<- field byte offset
6691 GET_VREG w3, w2 // w3<- object we're operating on
6692 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006693 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006694 ldrsb w0, [x3, x1] // w0<- obj.field
6695 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6696
6697 SET_VREG w0, w2 // fp[A]<- w0
6698 GET_INST_OPCODE ip // extract opcode from rINST
6699 GOTO_OPCODE ip // jump to next instruction
6700
6701
6702/* ------------------------------ */
6703 .balign 128
6704.L_op_iget_char_quick: /* 0xf1 */
6705/* File: arm64/op_iget_char_quick.S */
6706/* File: arm64/op_iget_quick.S */
6707 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6708 /* op vA, vB, offset//CCCC */
6709 lsr w2, wINST, #12 // w2<- B
6710 FETCH w1, 1 // w1<- field byte offset
6711 GET_VREG w3, w2 // w3<- object we're operating on
6712 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006713 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006714 ldrh w0, [x3, x1] // w0<- obj.field
6715 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6716
6717 SET_VREG w0, w2 // fp[A]<- w0
6718 GET_INST_OPCODE ip // extract opcode from rINST
6719 GOTO_OPCODE ip // jump to next instruction
6720
6721
6722/* ------------------------------ */
6723 .balign 128
6724.L_op_iget_short_quick: /* 0xf2 */
6725/* File: arm64/op_iget_short_quick.S */
6726/* File: arm64/op_iget_quick.S */
6727 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6728 /* op vA, vB, offset//CCCC */
6729 lsr w2, wINST, #12 // w2<- B
6730 FETCH w1, 1 // w1<- field byte offset
6731 GET_VREG w3, w2 // w3<- object we're operating on
6732 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006733 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006734 ldrsh w0, [x3, x1] // w0<- obj.field
6735 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6736
6737 SET_VREG w0, w2 // fp[A]<- w0
6738 GET_INST_OPCODE ip // extract opcode from rINST
6739 GOTO_OPCODE ip // jump to next instruction
6740
6741
6742/* ------------------------------ */
6743 .balign 128
6744.L_op_invoke_lambda: /* 0xf3 */
6745/* Transfer stub to alternate interpreter */
6746 b MterpFallback
6747
6748
6749/* ------------------------------ */
6750 .balign 128
6751.L_op_unused_f4: /* 0xf4 */
6752/* File: arm64/op_unused_f4.S */
6753/* File: arm64/unused.S */
6754/*
6755 * Bail to reference interpreter to throw.
6756 */
6757 b MterpFallback
6758
6759
6760/* ------------------------------ */
6761 .balign 128
6762.L_op_capture_variable: /* 0xf5 */
6763/* Transfer stub to alternate interpreter */
6764 b MterpFallback
6765
6766
6767/* ------------------------------ */
6768 .balign 128
6769.L_op_create_lambda: /* 0xf6 */
6770/* Transfer stub to alternate interpreter */
6771 b MterpFallback
6772
6773
6774/* ------------------------------ */
6775 .balign 128
6776.L_op_liberate_variable: /* 0xf7 */
6777/* Transfer stub to alternate interpreter */
6778 b MterpFallback
6779
6780
6781/* ------------------------------ */
6782 .balign 128
6783.L_op_box_lambda: /* 0xf8 */
6784/* Transfer stub to alternate interpreter */
6785 b MterpFallback
6786
6787
6788/* ------------------------------ */
6789 .balign 128
6790.L_op_unbox_lambda: /* 0xf9 */
6791/* Transfer stub to alternate interpreter */
6792 b MterpFallback
6793
6794
6795/* ------------------------------ */
6796 .balign 128
6797.L_op_unused_fa: /* 0xfa */
6798/* File: arm64/op_unused_fa.S */
6799/* File: arm64/unused.S */
6800/*
6801 * Bail to reference interpreter to throw.
6802 */
6803 b MterpFallback
6804
6805
6806/* ------------------------------ */
6807 .balign 128
6808.L_op_unused_fb: /* 0xfb */
6809/* File: arm64/op_unused_fb.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_fc: /* 0xfc */
6820/* File: arm64/op_unused_fc.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_fd: /* 0xfd */
6831/* File: arm64/op_unused_fd.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_fe: /* 0xfe */
6842/* File: arm64/op_unused_fe.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_ff: /* 0xff */
6853/* File: arm64/op_unused_ff.S */
6854/* File: arm64/unused.S */
6855/*
6856 * Bail to reference interpreter to throw.
6857 */
6858 b MterpFallback
6859
6860
6861 .balign 128
6862 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
6863 .global artMterpAsmInstructionEnd
6864artMterpAsmInstructionEnd:
6865
6866/*
6867 * ===========================================================================
6868 * Sister implementations
6869 * ===========================================================================
6870 */
6871 .global artMterpAsmSisterStart
6872 .type artMterpAsmSisterStart, %function
6873 .text
6874 .balign 4
6875artMterpAsmSisterStart:
6876
6877 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
6878 .global artMterpAsmSisterEnd
6879artMterpAsmSisterEnd:
6880
Vladimir Marko20421b92016-07-26 16:38:11 +01006881/* File: arm64/footer.S */
6882/*
6883 * ===========================================================================
6884 * Common subroutines and data
6885 * ===========================================================================
6886 */
6887
6888
6889/*
6890 * We've detected a condition that will result in an exception, but the exception
6891 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
6892 * TUNING: for consistency, we may want to just go ahead and handle these here.
6893 */
6894common_errDivideByZero:
6895 EXPORT_PC
6896#if MTERP_LOGGING
6897 mov x0, xSELF
6898 add x1, xFP, #OFF_FP_SHADOWFRAME
6899 bl MterpLogDivideByZeroException
6900#endif
6901 b MterpCommonFallback
6902
6903common_errArrayIndex:
6904 EXPORT_PC
6905#if MTERP_LOGGING
6906 mov x0, xSELF
6907 add x1, xFP, #OFF_FP_SHADOWFRAME
6908 bl MterpLogArrayIndexException
6909#endif
6910 b MterpCommonFallback
6911
6912common_errNegativeArraySize:
6913 EXPORT_PC
6914#if MTERP_LOGGING
6915 mov x0, xSELF
6916 add x1, xFP, #OFF_FP_SHADOWFRAME
6917 bl MterpLogNegativeArraySizeException
6918#endif
6919 b MterpCommonFallback
6920
6921common_errNoSuchMethod:
6922 EXPORT_PC
6923#if MTERP_LOGGING
6924 mov x0, xSELF
6925 add x1, xFP, #OFF_FP_SHADOWFRAME
6926 bl MterpLogNoSuchMethodException
6927#endif
6928 b MterpCommonFallback
6929
6930common_errNullObject:
6931 EXPORT_PC
6932#if MTERP_LOGGING
6933 mov x0, xSELF
6934 add x1, xFP, #OFF_FP_SHADOWFRAME
6935 bl MterpLogNullObjectException
6936#endif
6937 b MterpCommonFallback
6938
6939common_exceptionThrown:
6940 EXPORT_PC
6941#if MTERP_LOGGING
6942 mov x0, xSELF
6943 add x1, xFP, #OFF_FP_SHADOWFRAME
6944 bl MterpLogExceptionThrownException
6945#endif
6946 b MterpCommonFallback
6947
6948MterpSuspendFallback:
6949 EXPORT_PC
6950#if MTERP_LOGGING
6951 mov x0, xSELF
6952 add x1, xFP, #OFF_FP_SHADOWFRAME
6953 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
6954 bl MterpLogSuspendFallback
6955#endif
6956 b MterpCommonFallback
6957
6958/*
6959 * If we're here, something is out of the ordinary. If there is a pending
6960 * exception, handle it. Otherwise, roll back and retry with the reference
6961 * interpreter.
6962 */
6963MterpPossibleException:
6964 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
6965 cbz x0, MterpFallback // If not, fall back to reference interpreter.
6966 /* intentional fallthrough - handle pending exception. */
6967/*
6968 * On return from a runtime helper routine, we've found a pending exception.
6969 * Can we handle it here - or need to bail out to caller?
6970 *
6971 */
6972MterpException:
6973 mov x0, xSELF
6974 add x1, xFP, #OFF_FP_SHADOWFRAME
6975 bl MterpHandleException // (self, shadow_frame)
6976 cbz w0, MterpExceptionReturn // no local catch, back to caller.
6977 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
6978 ldr w1, [xFP, #OFF_FP_DEX_PC]
6979 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
6980 add xPC, x0, #CODEITEM_INSNS_OFFSET
6981 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
6982 /* Do we need to switch interpreters? */
6983 bl MterpShouldSwitchInterpreters
6984 cbnz w0, MterpFallback
6985 /* resume execution at catch block */
6986 EXPORT_PC
6987 FETCH_INST
6988 GET_INST_OPCODE ip
6989 GOTO_OPCODE ip
6990 /* NOTE: no fallthrough */
6991/*
6992 * Common handling for branches with support for Jit profiling.
6993 * On entry:
6994 * wINST <= signed offset
6995 * wPROFILE <= signed hotness countdown (expanded to 32 bits)
6996 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
6997 *
6998 * We have quite a few different cases for branch profiling, OSR detection and
6999 * suspend check support here.
7000 *
7001 * Taken backward branches:
7002 * If profiling active, do hotness countdown and report if we hit zero.
7003 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
7004 * Is there a pending suspend request? If so, suspend.
7005 *
7006 * Taken forward branches and not-taken backward branches:
7007 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
7008 *
7009 * Our most common case is expected to be a taken backward branch with active jit profiling,
7010 * but no full OSR check and no pending suspend request.
7011 * Next most common case is not-taken branch with no full OSR check.
7012 *
7013 */
7014MterpCommonTakenBranchNoFlags:
7015 cmp wINST, #0
7016 b.gt .L_forward_branch // don't add forward branches to hotness
7017 tbnz wPROFILE, #31, .L_no_count_backwards // go if negative
7018 subs wPROFILE, wPROFILE, #1 // countdown
7019 b.eq .L_add_batch // counted down to zero - report
7020.L_resume_backward_branch:
7021 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
7022 add w2, wINST, wINST // w2<- byte offset
7023 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
7024 REFRESH_IBASE
7025 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
7026 b.ne .L_suspend_request_pending
7027 GET_INST_OPCODE ip // extract opcode from wINST
7028 GOTO_OPCODE ip // jump to next instruction
7029
7030.L_suspend_request_pending:
7031 EXPORT_PC
7032 mov x0, xSELF
7033 bl MterpSuspendCheck // (self)
7034 cbnz x0, MterpFallback
7035 REFRESH_IBASE // might have changed during suspend
7036 GET_INST_OPCODE ip // extract opcode from wINST
7037 GOTO_OPCODE ip // jump to next instruction
7038
7039.L_no_count_backwards:
7040 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
7041 b.ne .L_resume_backward_branch
7042 mov x0, xSELF
7043 add x1, xFP, #OFF_FP_SHADOWFRAME
7044 mov x2, xINST
7045 EXPORT_PC
7046 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7047 cbnz x0, MterpOnStackReplacement
7048 b .L_resume_backward_branch
7049
7050.L_forward_branch:
7051 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
7052 b.eq .L_check_osr_forward
7053.L_resume_forward_branch:
7054 add w2, wINST, wINST // w2<- byte offset
7055 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
7056 GET_INST_OPCODE ip // extract opcode from wINST
7057 GOTO_OPCODE ip // jump to next instruction
7058
7059.L_check_osr_forward:
7060 mov x0, xSELF
7061 add x1, xFP, #OFF_FP_SHADOWFRAME
7062 mov x2, xINST
7063 EXPORT_PC
7064 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7065 cbnz x0, MterpOnStackReplacement
7066 b .L_resume_forward_branch
7067
7068.L_add_batch:
7069 add x1, xFP, #OFF_FP_SHADOWFRAME
7070 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
7071 ldr x0, [xFP, #OFF_FP_METHOD]
7072 mov x2, xSELF
7073 bl MterpAddHotnessBatch // (method, shadow_frame, self)
7074 mov wPROFILE, w0 // restore new hotness countdown to wPROFILE
7075 b .L_no_count_backwards
7076
7077/*
7078 * Entered from the conditional branch handlers when OSR check request active on
7079 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
7080 */
7081.L_check_not_taken_osr:
7082 mov x0, xSELF
7083 add x1, xFP, #OFF_FP_SHADOWFRAME
7084 mov x2, #2
7085 EXPORT_PC
7086 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7087 cbnz x0, MterpOnStackReplacement
7088 FETCH_ADVANCE_INST 2
7089 GET_INST_OPCODE ip // extract opcode from wINST
7090 GOTO_OPCODE ip // jump to next instruction
7091
7092
7093/*
7094 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
7095 * still needs to get the opcode and branch to it, and flags are in lr.
7096 */
7097MterpCheckSuspendAndContinue:
7098 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
7099 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
7100 b.ne check1
7101 GET_INST_OPCODE ip // extract opcode from wINST
7102 GOTO_OPCODE ip // jump to next instruction
7103check1:
7104 EXPORT_PC
7105 mov x0, xSELF
7106 bl MterpSuspendCheck // (self)
7107 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
7108 GET_INST_OPCODE ip // extract opcode from wINST
7109 GOTO_OPCODE ip // jump to next instruction
7110
7111/*
7112 * On-stack replacement has happened, and now we've returned from the compiled method.
7113 */
7114MterpOnStackReplacement:
7115#if MTERP_LOGGING
7116 mov x0, xSELF
7117 add x1, xFP, #OFF_FP_SHADOWFRAME
7118 sxtw x2, wINST
7119 bl MterpLogOSR
7120#endif
7121 mov x0, #1 // Signal normal return
7122 b MterpDone
7123
7124/*
7125 * Bail out to reference interpreter.
7126 */
7127MterpFallback:
7128 EXPORT_PC
7129#if MTERP_LOGGING
7130 mov x0, xSELF
7131 add x1, xFP, #OFF_FP_SHADOWFRAME
7132 bl MterpLogFallback
7133#endif
7134MterpCommonFallback:
7135 mov x0, #0 // signal retry with reference interpreter.
7136 b MterpDone
7137
7138/*
7139 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
7140 * SP and LR. Here we restore SP, restore the registers, and then restore
7141 * LR to PC.
7142 *
7143 * On entry:
7144 * uint32_t* xFP (should still be live, pointer to base of vregs)
7145 */
7146MterpExceptionReturn:
7147 mov x0, #1 // signal return to caller.
7148 b MterpDone
7149MterpReturn:
7150 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
7151 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
7152 str x0, [x2]
7153 mov x0, xSELF
7154 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
7155 b.eq check2
7156 bl MterpSuspendCheck // (self)
7157check2:
7158 mov x0, #1 // signal return to caller.
7159MterpDone:
7160/*
7161 * At this point, we expect wPROFILE to be non-zero. If negative, hotness is disabled or we're
7162 * checking for OSR. If greater than zero, we might have unreported hotness to register
7163 * (the difference between the ending wPROFILE and the cached hotness counter). wPROFILE
7164 * should only reach zero immediately after a hotness decrement, and is then reset to either
7165 * a negative special state or the new non-zero countdown value.
7166 */
7167 cmp wPROFILE, #0
7168 bgt MterpProfileActive // if > 0, we may have some counts to report.
7169 ldp fp, lr, [sp, #64]
7170 ldp xPC, xFP, [sp, #48]
7171 ldp xSELF, xINST, [sp, #32]
7172 ldp xIBASE, xREFS, [sp, #16]
7173 ldp xPROFILE, x27, [sp], #80
7174 ret
7175
7176MterpProfileActive:
7177 mov xINST, x0 // stash return value
7178 /* Report cached hotness counts */
7179 ldr x0, [xFP, #OFF_FP_METHOD]
7180 add x1, xFP, #OFF_FP_SHADOWFRAME
7181 mov x2, xSELF
7182 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
7183 bl MterpAddHotnessBatch // (method, shadow_frame, self)
7184 mov x0, xINST // restore return value
7185 ldp fp, lr, [sp, #64]
7186 ldp xPC, xFP, [sp, #48]
7187 ldp xSELF, xINST, [sp, #32]
7188 ldp xIBASE, xREFS, [sp, #16]
7189 ldp xPROFILE, x27, [sp], #80
7190 ret
7191
7192 .cfi_endproc
7193 .size ExecuteMterpImpl, .-ExecuteMterpImpl
7194
7195
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007196
7197 .global artMterpAsmAltInstructionStart
7198 .type artMterpAsmAltInstructionStart, %function
7199 .text
7200
7201artMterpAsmAltInstructionStart = .L_ALT_op_nop
7202/* ------------------------------ */
7203 .balign 128
7204.L_ALT_op_nop: /* 0x00 */
7205/* File: arm64/alt_stub.S */
7206/*
7207 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7208 * any interesting requests and then jump to the real instruction
7209 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7210 */
7211 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007212 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7213 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
7214 mov x0, xSELF
7215 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007216 mov x2, xPC
7217 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007218
7219/* ------------------------------ */
7220 .balign 128
7221.L_ALT_op_move: /* 0x01 */
7222/* File: arm64/alt_stub.S */
7223/*
7224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7225 * any interesting requests and then jump to the real instruction
7226 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7227 */
7228 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007229 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7230 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
7231 mov x0, xSELF
7232 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007233 mov x2, xPC
7234 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007235
7236/* ------------------------------ */
7237 .balign 128
7238.L_ALT_op_move_from16: /* 0x02 */
7239/* File: arm64/alt_stub.S */
7240/*
7241 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7242 * any interesting requests and then jump to the real instruction
7243 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7244 */
7245 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007246 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7247 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
7248 mov x0, xSELF
7249 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007250 mov x2, xPC
7251 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007252
7253/* ------------------------------ */
7254 .balign 128
7255.L_ALT_op_move_16: /* 0x03 */
7256/* File: arm64/alt_stub.S */
7257/*
7258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7259 * any interesting requests and then jump to the real instruction
7260 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7261 */
7262 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007263 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7264 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
7265 mov x0, xSELF
7266 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007267 mov x2, xPC
7268 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007269
7270/* ------------------------------ */
7271 .balign 128
7272.L_ALT_op_move_wide: /* 0x04 */
7273/* File: arm64/alt_stub.S */
7274/*
7275 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7276 * any interesting requests and then jump to the real instruction
7277 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7278 */
7279 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007280 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7281 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
7282 mov x0, xSELF
7283 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007284 mov x2, xPC
7285 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007286
7287/* ------------------------------ */
7288 .balign 128
7289.L_ALT_op_move_wide_from16: /* 0x05 */
7290/* File: arm64/alt_stub.S */
7291/*
7292 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7293 * any interesting requests and then jump to the real instruction
7294 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7295 */
7296 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007297 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7298 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
7299 mov x0, xSELF
7300 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007301 mov x2, xPC
7302 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007303
7304/* ------------------------------ */
7305 .balign 128
7306.L_ALT_op_move_wide_16: /* 0x06 */
7307/* File: arm64/alt_stub.S */
7308/*
7309 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7310 * any interesting requests and then jump to the real instruction
7311 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7312 */
7313 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007314 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7315 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7316 mov x0, xSELF
7317 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007318 mov x2, xPC
7319 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007320
7321/* ------------------------------ */
7322 .balign 128
7323.L_ALT_op_move_object: /* 0x07 */
7324/* File: arm64/alt_stub.S */
7325/*
7326 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7327 * any interesting requests and then jump to the real instruction
7328 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7329 */
7330 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007331 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7332 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7333 mov x0, xSELF
7334 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007335 mov x2, xPC
7336 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007337
7338/* ------------------------------ */
7339 .balign 128
7340.L_ALT_op_move_object_from16: /* 0x08 */
7341/* File: arm64/alt_stub.S */
7342/*
7343 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7344 * any interesting requests and then jump to the real instruction
7345 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7346 */
7347 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007348 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7349 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7350 mov x0, xSELF
7351 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007352 mov x2, xPC
7353 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007354
7355/* ------------------------------ */
7356 .balign 128
7357.L_ALT_op_move_object_16: /* 0x09 */
7358/* File: arm64/alt_stub.S */
7359/*
7360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7361 * any interesting requests and then jump to the real instruction
7362 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7363 */
7364 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007365 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7366 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7367 mov x0, xSELF
7368 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007369 mov x2, xPC
7370 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007371
7372/* ------------------------------ */
7373 .balign 128
7374.L_ALT_op_move_result: /* 0x0a */
7375/* File: arm64/alt_stub.S */
7376/*
7377 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7378 * any interesting requests and then jump to the real instruction
7379 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7380 */
7381 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007382 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7383 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7384 mov x0, xSELF
7385 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007386 mov x2, xPC
7387 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007388
7389/* ------------------------------ */
7390 .balign 128
7391.L_ALT_op_move_result_wide: /* 0x0b */
7392/* File: arm64/alt_stub.S */
7393/*
7394 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7395 * any interesting requests and then jump to the real instruction
7396 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7397 */
7398 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007399 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7400 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7401 mov x0, xSELF
7402 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007403 mov x2, xPC
7404 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007405
7406/* ------------------------------ */
7407 .balign 128
7408.L_ALT_op_move_result_object: /* 0x0c */
7409/* File: arm64/alt_stub.S */
7410/*
7411 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7412 * any interesting requests and then jump to the real instruction
7413 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7414 */
7415 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007416 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7417 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7418 mov x0, xSELF
7419 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007420 mov x2, xPC
7421 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007422
7423/* ------------------------------ */
7424 .balign 128
7425.L_ALT_op_move_exception: /* 0x0d */
7426/* File: arm64/alt_stub.S */
7427/*
7428 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7429 * any interesting requests and then jump to the real instruction
7430 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7431 */
7432 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007433 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7434 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7435 mov x0, xSELF
7436 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007437 mov x2, xPC
7438 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007439
7440/* ------------------------------ */
7441 .balign 128
7442.L_ALT_op_return_void: /* 0x0e */
7443/* File: arm64/alt_stub.S */
7444/*
7445 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7446 * any interesting requests and then jump to the real instruction
7447 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7448 */
7449 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007450 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7451 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7452 mov x0, xSELF
7453 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007454 mov x2, xPC
7455 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007456
7457/* ------------------------------ */
7458 .balign 128
7459.L_ALT_op_return: /* 0x0f */
7460/* File: arm64/alt_stub.S */
7461/*
7462 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7463 * any interesting requests and then jump to the real instruction
7464 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7465 */
7466 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007467 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7468 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7469 mov x0, xSELF
7470 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007471 mov x2, xPC
7472 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007473
7474/* ------------------------------ */
7475 .balign 128
7476.L_ALT_op_return_wide: /* 0x10 */
7477/* File: arm64/alt_stub.S */
7478/*
7479 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7480 * any interesting requests and then jump to the real instruction
7481 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7482 */
7483 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007484 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7485 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7486 mov x0, xSELF
7487 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007488 mov x2, xPC
7489 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007490
7491/* ------------------------------ */
7492 .balign 128
7493.L_ALT_op_return_object: /* 0x11 */
7494/* File: arm64/alt_stub.S */
7495/*
7496 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7497 * any interesting requests and then jump to the real instruction
7498 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7499 */
7500 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007501 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7502 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7503 mov x0, xSELF
7504 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007505 mov x2, xPC
7506 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007507
7508/* ------------------------------ */
7509 .balign 128
7510.L_ALT_op_const_4: /* 0x12 */
7511/* File: arm64/alt_stub.S */
7512/*
7513 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7514 * any interesting requests and then jump to the real instruction
7515 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7516 */
7517 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007518 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7519 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7520 mov x0, xSELF
7521 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007522 mov x2, xPC
7523 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007524
7525/* ------------------------------ */
7526 .balign 128
7527.L_ALT_op_const_16: /* 0x13 */
7528/* File: arm64/alt_stub.S */
7529/*
7530 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7531 * any interesting requests and then jump to the real instruction
7532 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7533 */
7534 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007535 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7536 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7537 mov x0, xSELF
7538 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007539 mov x2, xPC
7540 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007541
7542/* ------------------------------ */
7543 .balign 128
7544.L_ALT_op_const: /* 0x14 */
7545/* File: arm64/alt_stub.S */
7546/*
7547 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7548 * any interesting requests and then jump to the real instruction
7549 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7550 */
7551 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007552 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7553 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7554 mov x0, xSELF
7555 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007556 mov x2, xPC
7557 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007558
7559/* ------------------------------ */
7560 .balign 128
7561.L_ALT_op_const_high16: /* 0x15 */
7562/* File: arm64/alt_stub.S */
7563/*
7564 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7565 * any interesting requests and then jump to the real instruction
7566 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7567 */
7568 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007569 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7570 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7571 mov x0, xSELF
7572 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007573 mov x2, xPC
7574 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007575
7576/* ------------------------------ */
7577 .balign 128
7578.L_ALT_op_const_wide_16: /* 0x16 */
7579/* File: arm64/alt_stub.S */
7580/*
7581 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7582 * any interesting requests and then jump to the real instruction
7583 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7584 */
7585 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007586 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7587 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7588 mov x0, xSELF
7589 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007590 mov x2, xPC
7591 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007592
7593/* ------------------------------ */
7594 .balign 128
7595.L_ALT_op_const_wide_32: /* 0x17 */
7596/* File: arm64/alt_stub.S */
7597/*
7598 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7599 * any interesting requests and then jump to the real instruction
7600 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7601 */
7602 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007603 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7604 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7605 mov x0, xSELF
7606 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007607 mov x2, xPC
7608 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007609
7610/* ------------------------------ */
7611 .balign 128
7612.L_ALT_op_const_wide: /* 0x18 */
7613/* File: arm64/alt_stub.S */
7614/*
7615 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7616 * any interesting requests and then jump to the real instruction
7617 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7618 */
7619 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007620 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7621 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7622 mov x0, xSELF
7623 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007624 mov x2, xPC
7625 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007626
7627/* ------------------------------ */
7628 .balign 128
7629.L_ALT_op_const_wide_high16: /* 0x19 */
7630/* File: arm64/alt_stub.S */
7631/*
7632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7633 * any interesting requests and then jump to the real instruction
7634 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7635 */
7636 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007637 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7638 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7639 mov x0, xSELF
7640 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007641 mov x2, xPC
7642 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007643
7644/* ------------------------------ */
7645 .balign 128
7646.L_ALT_op_const_string: /* 0x1a */
7647/* File: arm64/alt_stub.S */
7648/*
7649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7650 * any interesting requests and then jump to the real instruction
7651 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7652 */
7653 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007654 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7655 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7656 mov x0, xSELF
7657 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007658 mov x2, xPC
7659 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007660
7661/* ------------------------------ */
7662 .balign 128
7663.L_ALT_op_const_string_jumbo: /* 0x1b */
7664/* File: arm64/alt_stub.S */
7665/*
7666 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7667 * any interesting requests and then jump to the real instruction
7668 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7669 */
7670 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007671 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7672 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7673 mov x0, xSELF
7674 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007675 mov x2, xPC
7676 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007677
7678/* ------------------------------ */
7679 .balign 128
7680.L_ALT_op_const_class: /* 0x1c */
7681/* File: arm64/alt_stub.S */
7682/*
7683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7684 * any interesting requests and then jump to the real instruction
7685 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7686 */
7687 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007688 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7689 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7690 mov x0, xSELF
7691 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007692 mov x2, xPC
7693 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007694
7695/* ------------------------------ */
7696 .balign 128
7697.L_ALT_op_monitor_enter: /* 0x1d */
7698/* File: arm64/alt_stub.S */
7699/*
7700 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7701 * any interesting requests and then jump to the real instruction
7702 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7703 */
7704 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007705 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7706 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7707 mov x0, xSELF
7708 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007709 mov x2, xPC
7710 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007711
7712/* ------------------------------ */
7713 .balign 128
7714.L_ALT_op_monitor_exit: /* 0x1e */
7715/* File: arm64/alt_stub.S */
7716/*
7717 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7718 * any interesting requests and then jump to the real instruction
7719 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7720 */
7721 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007722 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7723 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7724 mov x0, xSELF
7725 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007726 mov x2, xPC
7727 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007728
7729/* ------------------------------ */
7730 .balign 128
7731.L_ALT_op_check_cast: /* 0x1f */
7732/* File: arm64/alt_stub.S */
7733/*
7734 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7735 * any interesting requests and then jump to the real instruction
7736 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7737 */
7738 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007739 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7740 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7741 mov x0, xSELF
7742 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007743 mov x2, xPC
7744 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007745
7746/* ------------------------------ */
7747 .balign 128
7748.L_ALT_op_instance_of: /* 0x20 */
7749/* File: arm64/alt_stub.S */
7750/*
7751 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7752 * any interesting requests and then jump to the real instruction
7753 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7754 */
7755 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007756 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7757 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7758 mov x0, xSELF
7759 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007760 mov x2, xPC
7761 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007762
7763/* ------------------------------ */
7764 .balign 128
7765.L_ALT_op_array_length: /* 0x21 */
7766/* File: arm64/alt_stub.S */
7767/*
7768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7769 * any interesting requests and then jump to the real instruction
7770 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7771 */
7772 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007773 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7774 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7775 mov x0, xSELF
7776 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007777 mov x2, xPC
7778 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007779
7780/* ------------------------------ */
7781 .balign 128
7782.L_ALT_op_new_instance: /* 0x22 */
7783/* File: arm64/alt_stub.S */
7784/*
7785 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7786 * any interesting requests and then jump to the real instruction
7787 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7788 */
7789 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007790 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7791 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7792 mov x0, xSELF
7793 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007794 mov x2, xPC
7795 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007796
7797/* ------------------------------ */
7798 .balign 128
7799.L_ALT_op_new_array: /* 0x23 */
7800/* File: arm64/alt_stub.S */
7801/*
7802 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7803 * any interesting requests and then jump to the real instruction
7804 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7805 */
7806 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007807 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7808 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7809 mov x0, xSELF
7810 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007811 mov x2, xPC
7812 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007813
7814/* ------------------------------ */
7815 .balign 128
7816.L_ALT_op_filled_new_array: /* 0x24 */
7817/* File: arm64/alt_stub.S */
7818/*
7819 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7820 * any interesting requests and then jump to the real instruction
7821 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7822 */
7823 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007824 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7825 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7826 mov x0, xSELF
7827 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007828 mov x2, xPC
7829 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007830
7831/* ------------------------------ */
7832 .balign 128
7833.L_ALT_op_filled_new_array_range: /* 0x25 */
7834/* File: arm64/alt_stub.S */
7835/*
7836 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7837 * any interesting requests and then jump to the real instruction
7838 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7839 */
7840 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007841 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7842 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7843 mov x0, xSELF
7844 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007845 mov x2, xPC
7846 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007847
7848/* ------------------------------ */
7849 .balign 128
7850.L_ALT_op_fill_array_data: /* 0x26 */
7851/* File: arm64/alt_stub.S */
7852/*
7853 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7854 * any interesting requests and then jump to the real instruction
7855 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7856 */
7857 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007858 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7859 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7860 mov x0, xSELF
7861 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007862 mov x2, xPC
7863 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007864
7865/* ------------------------------ */
7866 .balign 128
7867.L_ALT_op_throw: /* 0x27 */
7868/* File: arm64/alt_stub.S */
7869/*
7870 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7871 * any interesting requests and then jump to the real instruction
7872 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7873 */
7874 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007875 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7876 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
7877 mov x0, xSELF
7878 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007879 mov x2, xPC
7880 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007881
7882/* ------------------------------ */
7883 .balign 128
7884.L_ALT_op_goto: /* 0x28 */
7885/* File: arm64/alt_stub.S */
7886/*
7887 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7888 * any interesting requests and then jump to the real instruction
7889 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7890 */
7891 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007892 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7893 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
7894 mov x0, xSELF
7895 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007896 mov x2, xPC
7897 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007898
7899/* ------------------------------ */
7900 .balign 128
7901.L_ALT_op_goto_16: /* 0x29 */
7902/* File: arm64/alt_stub.S */
7903/*
7904 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7905 * any interesting requests and then jump to the real instruction
7906 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7907 */
7908 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007909 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7910 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
7911 mov x0, xSELF
7912 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007913 mov x2, xPC
7914 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007915
7916/* ------------------------------ */
7917 .balign 128
7918.L_ALT_op_goto_32: /* 0x2a */
7919/* File: arm64/alt_stub.S */
7920/*
7921 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7922 * any interesting requests and then jump to the real instruction
7923 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7924 */
7925 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007926 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7927 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
7928 mov x0, xSELF
7929 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007930 mov x2, xPC
7931 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007932
7933/* ------------------------------ */
7934 .balign 128
7935.L_ALT_op_packed_switch: /* 0x2b */
7936/* File: arm64/alt_stub.S */
7937/*
7938 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7939 * any interesting requests and then jump to the real instruction
7940 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7941 */
7942 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007943 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7944 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
7945 mov x0, xSELF
7946 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007947 mov x2, xPC
7948 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007949
7950/* ------------------------------ */
7951 .balign 128
7952.L_ALT_op_sparse_switch: /* 0x2c */
7953/* File: arm64/alt_stub.S */
7954/*
7955 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7956 * any interesting requests and then jump to the real instruction
7957 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7958 */
7959 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007960 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7961 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
7962 mov x0, xSELF
7963 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007964 mov x2, xPC
7965 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007966
7967/* ------------------------------ */
7968 .balign 128
7969.L_ALT_op_cmpl_float: /* 0x2d */
7970/* File: arm64/alt_stub.S */
7971/*
7972 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7973 * any interesting requests and then jump to the real instruction
7974 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7975 */
7976 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007977 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7978 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
7979 mov x0, xSELF
7980 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007981 mov x2, xPC
7982 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007983
7984/* ------------------------------ */
7985 .balign 128
7986.L_ALT_op_cmpg_float: /* 0x2e */
7987/* File: arm64/alt_stub.S */
7988/*
7989 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7990 * any interesting requests and then jump to the real instruction
7991 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7992 */
7993 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007994 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7995 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
7996 mov x0, xSELF
7997 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007998 mov x2, xPC
7999 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008000
8001/* ------------------------------ */
8002 .balign 128
8003.L_ALT_op_cmpl_double: /* 0x2f */
8004/* File: arm64/alt_stub.S */
8005/*
8006 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8007 * any interesting requests and then jump to the real instruction
8008 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8009 */
8010 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008011 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8012 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
8013 mov x0, xSELF
8014 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008015 mov x2, xPC
8016 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008017
8018/* ------------------------------ */
8019 .balign 128
8020.L_ALT_op_cmpg_double: /* 0x30 */
8021/* File: arm64/alt_stub.S */
8022/*
8023 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8024 * any interesting requests and then jump to the real instruction
8025 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8026 */
8027 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008028 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8029 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
8030 mov x0, xSELF
8031 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008032 mov x2, xPC
8033 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008034
8035/* ------------------------------ */
8036 .balign 128
8037.L_ALT_op_cmp_long: /* 0x31 */
8038/* File: arm64/alt_stub.S */
8039/*
8040 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8041 * any interesting requests and then jump to the real instruction
8042 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8043 */
8044 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008045 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8046 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
8047 mov x0, xSELF
8048 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008049 mov x2, xPC
8050 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008051
8052/* ------------------------------ */
8053 .balign 128
8054.L_ALT_op_if_eq: /* 0x32 */
8055/* File: arm64/alt_stub.S */
8056/*
8057 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8058 * any interesting requests and then jump to the real instruction
8059 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8060 */
8061 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008062 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8063 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
8064 mov x0, xSELF
8065 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008066 mov x2, xPC
8067 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008068
8069/* ------------------------------ */
8070 .balign 128
8071.L_ALT_op_if_ne: /* 0x33 */
8072/* File: arm64/alt_stub.S */
8073/*
8074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8075 * any interesting requests and then jump to the real instruction
8076 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8077 */
8078 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008079 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8080 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
8081 mov x0, xSELF
8082 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008083 mov x2, xPC
8084 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008085
8086/* ------------------------------ */
8087 .balign 128
8088.L_ALT_op_if_lt: /* 0x34 */
8089/* File: arm64/alt_stub.S */
8090/*
8091 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8092 * any interesting requests and then jump to the real instruction
8093 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8094 */
8095 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008096 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8097 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
8098 mov x0, xSELF
8099 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008100 mov x2, xPC
8101 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008102
8103/* ------------------------------ */
8104 .balign 128
8105.L_ALT_op_if_ge: /* 0x35 */
8106/* File: arm64/alt_stub.S */
8107/*
8108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8109 * any interesting requests and then jump to the real instruction
8110 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8111 */
8112 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008113 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8114 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
8115 mov x0, xSELF
8116 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008117 mov x2, xPC
8118 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008119
8120/* ------------------------------ */
8121 .balign 128
8122.L_ALT_op_if_gt: /* 0x36 */
8123/* File: arm64/alt_stub.S */
8124/*
8125 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8126 * any interesting requests and then jump to the real instruction
8127 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8128 */
8129 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008130 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8131 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
8132 mov x0, xSELF
8133 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008134 mov x2, xPC
8135 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008136
8137/* ------------------------------ */
8138 .balign 128
8139.L_ALT_op_if_le: /* 0x37 */
8140/* File: arm64/alt_stub.S */
8141/*
8142 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8143 * any interesting requests and then jump to the real instruction
8144 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8145 */
8146 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008147 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8148 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
8149 mov x0, xSELF
8150 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008151 mov x2, xPC
8152 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008153
8154/* ------------------------------ */
8155 .balign 128
8156.L_ALT_op_if_eqz: /* 0x38 */
8157/* File: arm64/alt_stub.S */
8158/*
8159 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8160 * any interesting requests and then jump to the real instruction
8161 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8162 */
8163 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008164 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8165 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
8166 mov x0, xSELF
8167 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008168 mov x2, xPC
8169 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008170
8171/* ------------------------------ */
8172 .balign 128
8173.L_ALT_op_if_nez: /* 0x39 */
8174/* File: arm64/alt_stub.S */
8175/*
8176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8177 * any interesting requests and then jump to the real instruction
8178 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8179 */
8180 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008181 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8182 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
8183 mov x0, xSELF
8184 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008185 mov x2, xPC
8186 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008187
8188/* ------------------------------ */
8189 .balign 128
8190.L_ALT_op_if_ltz: /* 0x3a */
8191/* File: arm64/alt_stub.S */
8192/*
8193 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8194 * any interesting requests and then jump to the real instruction
8195 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8196 */
8197 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008198 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8199 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
8200 mov x0, xSELF
8201 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008202 mov x2, xPC
8203 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008204
8205/* ------------------------------ */
8206 .balign 128
8207.L_ALT_op_if_gez: /* 0x3b */
8208/* File: arm64/alt_stub.S */
8209/*
8210 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8211 * any interesting requests and then jump to the real instruction
8212 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8213 */
8214 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008215 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8216 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
8217 mov x0, xSELF
8218 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008219 mov x2, xPC
8220 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008221
8222/* ------------------------------ */
8223 .balign 128
8224.L_ALT_op_if_gtz: /* 0x3c */
8225/* File: arm64/alt_stub.S */
8226/*
8227 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8228 * any interesting requests and then jump to the real instruction
8229 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8230 */
8231 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008232 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8233 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
8234 mov x0, xSELF
8235 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008236 mov x2, xPC
8237 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008238
8239/* ------------------------------ */
8240 .balign 128
8241.L_ALT_op_if_lez: /* 0x3d */
8242/* File: arm64/alt_stub.S */
8243/*
8244 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8245 * any interesting requests and then jump to the real instruction
8246 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8247 */
8248 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008249 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8250 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
8251 mov x0, xSELF
8252 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008253 mov x2, xPC
8254 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008255
8256/* ------------------------------ */
8257 .balign 128
8258.L_ALT_op_unused_3e: /* 0x3e */
8259/* File: arm64/alt_stub.S */
8260/*
8261 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8262 * any interesting requests and then jump to the real instruction
8263 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8264 */
8265 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008266 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8267 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
8268 mov x0, xSELF
8269 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008270 mov x2, xPC
8271 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008272
8273/* ------------------------------ */
8274 .balign 128
8275.L_ALT_op_unused_3f: /* 0x3f */
8276/* File: arm64/alt_stub.S */
8277/*
8278 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8279 * any interesting requests and then jump to the real instruction
8280 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8281 */
8282 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008283 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8284 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
8285 mov x0, xSELF
8286 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008287 mov x2, xPC
8288 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008289
8290/* ------------------------------ */
8291 .balign 128
8292.L_ALT_op_unused_40: /* 0x40 */
8293/* File: arm64/alt_stub.S */
8294/*
8295 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8296 * any interesting requests and then jump to the real instruction
8297 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8298 */
8299 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008300 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8301 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
8302 mov x0, xSELF
8303 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008304 mov x2, xPC
8305 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008306
8307/* ------------------------------ */
8308 .balign 128
8309.L_ALT_op_unused_41: /* 0x41 */
8310/* File: arm64/alt_stub.S */
8311/*
8312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8313 * any interesting requests and then jump to the real instruction
8314 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8315 */
8316 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008317 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8318 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8319 mov x0, xSELF
8320 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008321 mov x2, xPC
8322 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008323
8324/* ------------------------------ */
8325 .balign 128
8326.L_ALT_op_unused_42: /* 0x42 */
8327/* File: arm64/alt_stub.S */
8328/*
8329 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8330 * any interesting requests and then jump to the real instruction
8331 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8332 */
8333 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008334 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8335 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8336 mov x0, xSELF
8337 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008338 mov x2, xPC
8339 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008340
8341/* ------------------------------ */
8342 .balign 128
8343.L_ALT_op_unused_43: /* 0x43 */
8344/* File: arm64/alt_stub.S */
8345/*
8346 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8347 * any interesting requests and then jump to the real instruction
8348 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8349 */
8350 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008351 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8352 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8353 mov x0, xSELF
8354 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008355 mov x2, xPC
8356 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008357
8358/* ------------------------------ */
8359 .balign 128
8360.L_ALT_op_aget: /* 0x44 */
8361/* File: arm64/alt_stub.S */
8362/*
8363 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8364 * any interesting requests and then jump to the real instruction
8365 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8366 */
8367 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008368 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8369 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8370 mov x0, xSELF
8371 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008372 mov x2, xPC
8373 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008374
8375/* ------------------------------ */
8376 .balign 128
8377.L_ALT_op_aget_wide: /* 0x45 */
8378/* File: arm64/alt_stub.S */
8379/*
8380 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8381 * any interesting requests and then jump to the real instruction
8382 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8383 */
8384 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008385 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8386 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8387 mov x0, xSELF
8388 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008389 mov x2, xPC
8390 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008391
8392/* ------------------------------ */
8393 .balign 128
8394.L_ALT_op_aget_object: /* 0x46 */
8395/* File: arm64/alt_stub.S */
8396/*
8397 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8398 * any interesting requests and then jump to the real instruction
8399 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8400 */
8401 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008402 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8403 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8404 mov x0, xSELF
8405 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008406 mov x2, xPC
8407 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008408
8409/* ------------------------------ */
8410 .balign 128
8411.L_ALT_op_aget_boolean: /* 0x47 */
8412/* File: arm64/alt_stub.S */
8413/*
8414 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8415 * any interesting requests and then jump to the real instruction
8416 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8417 */
8418 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008419 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8420 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8421 mov x0, xSELF
8422 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008423 mov x2, xPC
8424 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008425
8426/* ------------------------------ */
8427 .balign 128
8428.L_ALT_op_aget_byte: /* 0x48 */
8429/* File: arm64/alt_stub.S */
8430/*
8431 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8432 * any interesting requests and then jump to the real instruction
8433 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8434 */
8435 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008436 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8437 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8438 mov x0, xSELF
8439 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008440 mov x2, xPC
8441 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008442
8443/* ------------------------------ */
8444 .balign 128
8445.L_ALT_op_aget_char: /* 0x49 */
8446/* File: arm64/alt_stub.S */
8447/*
8448 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8449 * any interesting requests and then jump to the real instruction
8450 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8451 */
8452 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008453 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8454 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8455 mov x0, xSELF
8456 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008457 mov x2, xPC
8458 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008459
8460/* ------------------------------ */
8461 .balign 128
8462.L_ALT_op_aget_short: /* 0x4a */
8463/* File: arm64/alt_stub.S */
8464/*
8465 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8466 * any interesting requests and then jump to the real instruction
8467 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8468 */
8469 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008470 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8471 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8472 mov x0, xSELF
8473 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008474 mov x2, xPC
8475 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008476
8477/* ------------------------------ */
8478 .balign 128
8479.L_ALT_op_aput: /* 0x4b */
8480/* File: arm64/alt_stub.S */
8481/*
8482 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8483 * any interesting requests and then jump to the real instruction
8484 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8485 */
8486 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008487 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8488 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8489 mov x0, xSELF
8490 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008491 mov x2, xPC
8492 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008493
8494/* ------------------------------ */
8495 .balign 128
8496.L_ALT_op_aput_wide: /* 0x4c */
8497/* File: arm64/alt_stub.S */
8498/*
8499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8500 * any interesting requests and then jump to the real instruction
8501 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8502 */
8503 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008504 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8505 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8506 mov x0, xSELF
8507 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008508 mov x2, xPC
8509 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008510
8511/* ------------------------------ */
8512 .balign 128
8513.L_ALT_op_aput_object: /* 0x4d */
8514/* File: arm64/alt_stub.S */
8515/*
8516 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8517 * any interesting requests and then jump to the real instruction
8518 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8519 */
8520 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008521 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8522 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8523 mov x0, xSELF
8524 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008525 mov x2, xPC
8526 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008527
8528/* ------------------------------ */
8529 .balign 128
8530.L_ALT_op_aput_boolean: /* 0x4e */
8531/* File: arm64/alt_stub.S */
8532/*
8533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8534 * any interesting requests and then jump to the real instruction
8535 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8536 */
8537 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008538 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8539 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8540 mov x0, xSELF
8541 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008542 mov x2, xPC
8543 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008544
8545/* ------------------------------ */
8546 .balign 128
8547.L_ALT_op_aput_byte: /* 0x4f */
8548/* File: arm64/alt_stub.S */
8549/*
8550 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8551 * any interesting requests and then jump to the real instruction
8552 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8553 */
8554 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008555 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8556 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8557 mov x0, xSELF
8558 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008559 mov x2, xPC
8560 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008561
8562/* ------------------------------ */
8563 .balign 128
8564.L_ALT_op_aput_char: /* 0x50 */
8565/* File: arm64/alt_stub.S */
8566/*
8567 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8568 * any interesting requests and then jump to the real instruction
8569 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8570 */
8571 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008572 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8573 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8574 mov x0, xSELF
8575 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008576 mov x2, xPC
8577 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008578
8579/* ------------------------------ */
8580 .balign 128
8581.L_ALT_op_aput_short: /* 0x51 */
8582/* File: arm64/alt_stub.S */
8583/*
8584 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8585 * any interesting requests and then jump to the real instruction
8586 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8587 */
8588 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008589 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8590 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8591 mov x0, xSELF
8592 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008593 mov x2, xPC
8594 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008595
8596/* ------------------------------ */
8597 .balign 128
8598.L_ALT_op_iget: /* 0x52 */
8599/* File: arm64/alt_stub.S */
8600/*
8601 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8602 * any interesting requests and then jump to the real instruction
8603 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8604 */
8605 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008606 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8607 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8608 mov x0, xSELF
8609 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008610 mov x2, xPC
8611 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008612
8613/* ------------------------------ */
8614 .balign 128
8615.L_ALT_op_iget_wide: /* 0x53 */
8616/* File: arm64/alt_stub.S */
8617/*
8618 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8619 * any interesting requests and then jump to the real instruction
8620 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8621 */
8622 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008623 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8624 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8625 mov x0, xSELF
8626 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008627 mov x2, xPC
8628 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008629
8630/* ------------------------------ */
8631 .balign 128
8632.L_ALT_op_iget_object: /* 0x54 */
8633/* File: arm64/alt_stub.S */
8634/*
8635 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8636 * any interesting requests and then jump to the real instruction
8637 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8638 */
8639 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008640 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8641 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8642 mov x0, xSELF
8643 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008644 mov x2, xPC
8645 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008646
8647/* ------------------------------ */
8648 .balign 128
8649.L_ALT_op_iget_boolean: /* 0x55 */
8650/* File: arm64/alt_stub.S */
8651/*
8652 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8653 * any interesting requests and then jump to the real instruction
8654 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8655 */
8656 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008657 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8658 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8659 mov x0, xSELF
8660 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008661 mov x2, xPC
8662 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008663
8664/* ------------------------------ */
8665 .balign 128
8666.L_ALT_op_iget_byte: /* 0x56 */
8667/* File: arm64/alt_stub.S */
8668/*
8669 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8670 * any interesting requests and then jump to the real instruction
8671 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8672 */
8673 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008674 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8675 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8676 mov x0, xSELF
8677 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008678 mov x2, xPC
8679 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008680
8681/* ------------------------------ */
8682 .balign 128
8683.L_ALT_op_iget_char: /* 0x57 */
8684/* File: arm64/alt_stub.S */
8685/*
8686 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8687 * any interesting requests and then jump to the real instruction
8688 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8689 */
8690 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008691 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8692 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8693 mov x0, xSELF
8694 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008695 mov x2, xPC
8696 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008697
8698/* ------------------------------ */
8699 .balign 128
8700.L_ALT_op_iget_short: /* 0x58 */
8701/* File: arm64/alt_stub.S */
8702/*
8703 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8704 * any interesting requests and then jump to the real instruction
8705 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8706 */
8707 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008708 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8709 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8710 mov x0, xSELF
8711 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008712 mov x2, xPC
8713 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008714
8715/* ------------------------------ */
8716 .balign 128
8717.L_ALT_op_iput: /* 0x59 */
8718/* File: arm64/alt_stub.S */
8719/*
8720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8721 * any interesting requests and then jump to the real instruction
8722 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8723 */
8724 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008725 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8726 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8727 mov x0, xSELF
8728 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008729 mov x2, xPC
8730 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008731
8732/* ------------------------------ */
8733 .balign 128
8734.L_ALT_op_iput_wide: /* 0x5a */
8735/* File: arm64/alt_stub.S */
8736/*
8737 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8738 * any interesting requests and then jump to the real instruction
8739 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8740 */
8741 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008742 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8743 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8744 mov x0, xSELF
8745 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008746 mov x2, xPC
8747 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008748
8749/* ------------------------------ */
8750 .balign 128
8751.L_ALT_op_iput_object: /* 0x5b */
8752/* File: arm64/alt_stub.S */
8753/*
8754 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8755 * any interesting requests and then jump to the real instruction
8756 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8757 */
8758 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008759 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8760 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8761 mov x0, xSELF
8762 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008763 mov x2, xPC
8764 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008765
8766/* ------------------------------ */
8767 .balign 128
8768.L_ALT_op_iput_boolean: /* 0x5c */
8769/* File: arm64/alt_stub.S */
8770/*
8771 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8772 * any interesting requests and then jump to the real instruction
8773 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8774 */
8775 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008776 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8777 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8778 mov x0, xSELF
8779 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008780 mov x2, xPC
8781 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008782
8783/* ------------------------------ */
8784 .balign 128
8785.L_ALT_op_iput_byte: /* 0x5d */
8786/* File: arm64/alt_stub.S */
8787/*
8788 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8789 * any interesting requests and then jump to the real instruction
8790 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8791 */
8792 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008793 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8794 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8795 mov x0, xSELF
8796 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008797 mov x2, xPC
8798 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008799
8800/* ------------------------------ */
8801 .balign 128
8802.L_ALT_op_iput_char: /* 0x5e */
8803/* File: arm64/alt_stub.S */
8804/*
8805 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8806 * any interesting requests and then jump to the real instruction
8807 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8808 */
8809 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008810 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8811 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8812 mov x0, xSELF
8813 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008814 mov x2, xPC
8815 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008816
8817/* ------------------------------ */
8818 .balign 128
8819.L_ALT_op_iput_short: /* 0x5f */
8820/* File: arm64/alt_stub.S */
8821/*
8822 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8823 * any interesting requests and then jump to the real instruction
8824 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8825 */
8826 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008827 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8828 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8829 mov x0, xSELF
8830 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008831 mov x2, xPC
8832 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008833
8834/* ------------------------------ */
8835 .balign 128
8836.L_ALT_op_sget: /* 0x60 */
8837/* File: arm64/alt_stub.S */
8838/*
8839 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8840 * any interesting requests and then jump to the real instruction
8841 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8842 */
8843 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008844 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8845 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8846 mov x0, xSELF
8847 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008848 mov x2, xPC
8849 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008850
8851/* ------------------------------ */
8852 .balign 128
8853.L_ALT_op_sget_wide: /* 0x61 */
8854/* File: arm64/alt_stub.S */
8855/*
8856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8857 * any interesting requests and then jump to the real instruction
8858 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8859 */
8860 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008861 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8862 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8863 mov x0, xSELF
8864 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008865 mov x2, xPC
8866 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008867
8868/* ------------------------------ */
8869 .balign 128
8870.L_ALT_op_sget_object: /* 0x62 */
8871/* File: arm64/alt_stub.S */
8872/*
8873 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8874 * any interesting requests and then jump to the real instruction
8875 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8876 */
8877 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008878 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8879 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
8880 mov x0, xSELF
8881 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008882 mov x2, xPC
8883 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008884
8885/* ------------------------------ */
8886 .balign 128
8887.L_ALT_op_sget_boolean: /* 0x63 */
8888/* File: arm64/alt_stub.S */
8889/*
8890 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8891 * any interesting requests and then jump to the real instruction
8892 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8893 */
8894 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008895 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8896 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
8897 mov x0, xSELF
8898 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008899 mov x2, xPC
8900 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008901
8902/* ------------------------------ */
8903 .balign 128
8904.L_ALT_op_sget_byte: /* 0x64 */
8905/* File: arm64/alt_stub.S */
8906/*
8907 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8908 * any interesting requests and then jump to the real instruction
8909 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8910 */
8911 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008912 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8913 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
8914 mov x0, xSELF
8915 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008916 mov x2, xPC
8917 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008918
8919/* ------------------------------ */
8920 .balign 128
8921.L_ALT_op_sget_char: /* 0x65 */
8922/* File: arm64/alt_stub.S */
8923/*
8924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8925 * any interesting requests and then jump to the real instruction
8926 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8927 */
8928 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008929 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8930 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
8931 mov x0, xSELF
8932 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008933 mov x2, xPC
8934 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008935
8936/* ------------------------------ */
8937 .balign 128
8938.L_ALT_op_sget_short: /* 0x66 */
8939/* File: arm64/alt_stub.S */
8940/*
8941 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8942 * any interesting requests and then jump to the real instruction
8943 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8944 */
8945 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008946 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8947 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
8948 mov x0, xSELF
8949 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008950 mov x2, xPC
8951 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008952
8953/* ------------------------------ */
8954 .balign 128
8955.L_ALT_op_sput: /* 0x67 */
8956/* File: arm64/alt_stub.S */
8957/*
8958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8959 * any interesting requests and then jump to the real instruction
8960 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8961 */
8962 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008963 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8964 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
8965 mov x0, xSELF
8966 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008967 mov x2, xPC
8968 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008969
8970/* ------------------------------ */
8971 .balign 128
8972.L_ALT_op_sput_wide: /* 0x68 */
8973/* File: arm64/alt_stub.S */
8974/*
8975 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8976 * any interesting requests and then jump to the real instruction
8977 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8978 */
8979 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008980 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8981 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
8982 mov x0, xSELF
8983 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008984 mov x2, xPC
8985 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008986
8987/* ------------------------------ */
8988 .balign 128
8989.L_ALT_op_sput_object: /* 0x69 */
8990/* File: arm64/alt_stub.S */
8991/*
8992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8993 * any interesting requests and then jump to the real instruction
8994 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8995 */
8996 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008997 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8998 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
8999 mov x0, xSELF
9000 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009001 mov x2, xPC
9002 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009003
9004/* ------------------------------ */
9005 .balign 128
9006.L_ALT_op_sput_boolean: /* 0x6a */
9007/* File: arm64/alt_stub.S */
9008/*
9009 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9010 * any interesting requests and then jump to the real instruction
9011 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9012 */
9013 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009014 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9015 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
9016 mov x0, xSELF
9017 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009018 mov x2, xPC
9019 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009020
9021/* ------------------------------ */
9022 .balign 128
9023.L_ALT_op_sput_byte: /* 0x6b */
9024/* File: arm64/alt_stub.S */
9025/*
9026 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9027 * any interesting requests and then jump to the real instruction
9028 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9029 */
9030 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009031 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9032 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
9033 mov x0, xSELF
9034 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009035 mov x2, xPC
9036 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009037
9038/* ------------------------------ */
9039 .balign 128
9040.L_ALT_op_sput_char: /* 0x6c */
9041/* File: arm64/alt_stub.S */
9042/*
9043 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9044 * any interesting requests and then jump to the real instruction
9045 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9046 */
9047 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009048 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9049 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
9050 mov x0, xSELF
9051 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009052 mov x2, xPC
9053 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009054
9055/* ------------------------------ */
9056 .balign 128
9057.L_ALT_op_sput_short: /* 0x6d */
9058/* File: arm64/alt_stub.S */
9059/*
9060 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9061 * any interesting requests and then jump to the real instruction
9062 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9063 */
9064 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009065 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9066 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
9067 mov x0, xSELF
9068 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009069 mov x2, xPC
9070 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009071
9072/* ------------------------------ */
9073 .balign 128
9074.L_ALT_op_invoke_virtual: /* 0x6e */
9075/* File: arm64/alt_stub.S */
9076/*
9077 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9078 * any interesting requests and then jump to the real instruction
9079 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9080 */
9081 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009082 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9083 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
9084 mov x0, xSELF
9085 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009086 mov x2, xPC
9087 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009088
9089/* ------------------------------ */
9090 .balign 128
9091.L_ALT_op_invoke_super: /* 0x6f */
9092/* File: arm64/alt_stub.S */
9093/*
9094 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9095 * any interesting requests and then jump to the real instruction
9096 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9097 */
9098 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009099 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9100 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
9101 mov x0, xSELF
9102 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009103 mov x2, xPC
9104 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009105
9106/* ------------------------------ */
9107 .balign 128
9108.L_ALT_op_invoke_direct: /* 0x70 */
9109/* File: arm64/alt_stub.S */
9110/*
9111 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9112 * any interesting requests and then jump to the real instruction
9113 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9114 */
9115 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009116 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9117 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
9118 mov x0, xSELF
9119 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009120 mov x2, xPC
9121 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009122
9123/* ------------------------------ */
9124 .balign 128
9125.L_ALT_op_invoke_static: /* 0x71 */
9126/* File: arm64/alt_stub.S */
9127/*
9128 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9129 * any interesting requests and then jump to the real instruction
9130 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9131 */
9132 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009133 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9134 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
9135 mov x0, xSELF
9136 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009137 mov x2, xPC
9138 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009139
9140/* ------------------------------ */
9141 .balign 128
9142.L_ALT_op_invoke_interface: /* 0x72 */
9143/* File: arm64/alt_stub.S */
9144/*
9145 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9146 * any interesting requests and then jump to the real instruction
9147 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9148 */
9149 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009150 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9151 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
9152 mov x0, xSELF
9153 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009154 mov x2, xPC
9155 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009156
9157/* ------------------------------ */
9158 .balign 128
9159.L_ALT_op_return_void_no_barrier: /* 0x73 */
9160/* File: arm64/alt_stub.S */
9161/*
9162 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9163 * any interesting requests and then jump to the real instruction
9164 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9165 */
9166 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009167 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9168 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
9169 mov x0, xSELF
9170 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009171 mov x2, xPC
9172 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009173
9174/* ------------------------------ */
9175 .balign 128
9176.L_ALT_op_invoke_virtual_range: /* 0x74 */
9177/* File: arm64/alt_stub.S */
9178/*
9179 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9180 * any interesting requests and then jump to the real instruction
9181 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9182 */
9183 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009184 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9185 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
9186 mov x0, xSELF
9187 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009188 mov x2, xPC
9189 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009190
9191/* ------------------------------ */
9192 .balign 128
9193.L_ALT_op_invoke_super_range: /* 0x75 */
9194/* File: arm64/alt_stub.S */
9195/*
9196 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9197 * any interesting requests and then jump to the real instruction
9198 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9199 */
9200 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009201 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9202 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
9203 mov x0, xSELF
9204 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009205 mov x2, xPC
9206 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009207
9208/* ------------------------------ */
9209 .balign 128
9210.L_ALT_op_invoke_direct_range: /* 0x76 */
9211/* File: arm64/alt_stub.S */
9212/*
9213 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9214 * any interesting requests and then jump to the real instruction
9215 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9216 */
9217 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009218 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9219 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
9220 mov x0, xSELF
9221 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009222 mov x2, xPC
9223 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009224
9225/* ------------------------------ */
9226 .balign 128
9227.L_ALT_op_invoke_static_range: /* 0x77 */
9228/* File: arm64/alt_stub.S */
9229/*
9230 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9231 * any interesting requests and then jump to the real instruction
9232 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9233 */
9234 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009235 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9236 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
9237 mov x0, xSELF
9238 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009239 mov x2, xPC
9240 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009241
9242/* ------------------------------ */
9243 .balign 128
9244.L_ALT_op_invoke_interface_range: /* 0x78 */
9245/* File: arm64/alt_stub.S */
9246/*
9247 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9248 * any interesting requests and then jump to the real instruction
9249 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9250 */
9251 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009252 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9253 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
9254 mov x0, xSELF
9255 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009256 mov x2, xPC
9257 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009258
9259/* ------------------------------ */
9260 .balign 128
9261.L_ALT_op_unused_79: /* 0x79 */
9262/* File: arm64/alt_stub.S */
9263/*
9264 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9265 * any interesting requests and then jump to the real instruction
9266 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9267 */
9268 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009269 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9270 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
9271 mov x0, xSELF
9272 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009273 mov x2, xPC
9274 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009275
9276/* ------------------------------ */
9277 .balign 128
9278.L_ALT_op_unused_7a: /* 0x7a */
9279/* File: arm64/alt_stub.S */
9280/*
9281 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9282 * any interesting requests and then jump to the real instruction
9283 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9284 */
9285 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009286 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9287 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
9288 mov x0, xSELF
9289 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009290 mov x2, xPC
9291 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009292
9293/* ------------------------------ */
9294 .balign 128
9295.L_ALT_op_neg_int: /* 0x7b */
9296/* File: arm64/alt_stub.S */
9297/*
9298 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9299 * any interesting requests and then jump to the real instruction
9300 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9301 */
9302 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009303 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9304 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
9305 mov x0, xSELF
9306 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009307 mov x2, xPC
9308 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009309
9310/* ------------------------------ */
9311 .balign 128
9312.L_ALT_op_not_int: /* 0x7c */
9313/* File: arm64/alt_stub.S */
9314/*
9315 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9316 * any interesting requests and then jump to the real instruction
9317 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9318 */
9319 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009320 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9321 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9322 mov x0, xSELF
9323 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009324 mov x2, xPC
9325 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009326
9327/* ------------------------------ */
9328 .balign 128
9329.L_ALT_op_neg_long: /* 0x7d */
9330/* File: arm64/alt_stub.S */
9331/*
9332 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9333 * any interesting requests and then jump to the real instruction
9334 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9335 */
9336 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009337 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9338 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9339 mov x0, xSELF
9340 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009341 mov x2, xPC
9342 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009343
9344/* ------------------------------ */
9345 .balign 128
9346.L_ALT_op_not_long: /* 0x7e */
9347/* File: arm64/alt_stub.S */
9348/*
9349 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9350 * any interesting requests and then jump to the real instruction
9351 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9352 */
9353 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009354 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9355 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9356 mov x0, xSELF
9357 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009358 mov x2, xPC
9359 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009360
9361/* ------------------------------ */
9362 .balign 128
9363.L_ALT_op_neg_float: /* 0x7f */
9364/* File: arm64/alt_stub.S */
9365/*
9366 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9367 * any interesting requests and then jump to the real instruction
9368 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9369 */
9370 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009371 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9372 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9373 mov x0, xSELF
9374 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009375 mov x2, xPC
9376 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009377
9378/* ------------------------------ */
9379 .balign 128
9380.L_ALT_op_neg_double: /* 0x80 */
9381/* File: arm64/alt_stub.S */
9382/*
9383 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9384 * any interesting requests and then jump to the real instruction
9385 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9386 */
9387 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009388 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9389 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9390 mov x0, xSELF
9391 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009392 mov x2, xPC
9393 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009394
9395/* ------------------------------ */
9396 .balign 128
9397.L_ALT_op_int_to_long: /* 0x81 */
9398/* File: arm64/alt_stub.S */
9399/*
9400 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9401 * any interesting requests and then jump to the real instruction
9402 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9403 */
9404 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009405 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9406 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9407 mov x0, xSELF
9408 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009409 mov x2, xPC
9410 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009411
9412/* ------------------------------ */
9413 .balign 128
9414.L_ALT_op_int_to_float: /* 0x82 */
9415/* File: arm64/alt_stub.S */
9416/*
9417 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9418 * any interesting requests and then jump to the real instruction
9419 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9420 */
9421 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009422 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9423 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9424 mov x0, xSELF
9425 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009426 mov x2, xPC
9427 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009428
9429/* ------------------------------ */
9430 .balign 128
9431.L_ALT_op_int_to_double: /* 0x83 */
9432/* File: arm64/alt_stub.S */
9433/*
9434 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9435 * any interesting requests and then jump to the real instruction
9436 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9437 */
9438 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009439 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9440 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9441 mov x0, xSELF
9442 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009443 mov x2, xPC
9444 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009445
9446/* ------------------------------ */
9447 .balign 128
9448.L_ALT_op_long_to_int: /* 0x84 */
9449/* File: arm64/alt_stub.S */
9450/*
9451 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9452 * any interesting requests and then jump to the real instruction
9453 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9454 */
9455 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009456 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9457 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9458 mov x0, xSELF
9459 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009460 mov x2, xPC
9461 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009462
9463/* ------------------------------ */
9464 .balign 128
9465.L_ALT_op_long_to_float: /* 0x85 */
9466/* File: arm64/alt_stub.S */
9467/*
9468 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9469 * any interesting requests and then jump to the real instruction
9470 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9471 */
9472 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009473 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9474 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9475 mov x0, xSELF
9476 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009477 mov x2, xPC
9478 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009479
9480/* ------------------------------ */
9481 .balign 128
9482.L_ALT_op_long_to_double: /* 0x86 */
9483/* File: arm64/alt_stub.S */
9484/*
9485 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9486 * any interesting requests and then jump to the real instruction
9487 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9488 */
9489 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009490 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9491 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9492 mov x0, xSELF
9493 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009494 mov x2, xPC
9495 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009496
9497/* ------------------------------ */
9498 .balign 128
9499.L_ALT_op_float_to_int: /* 0x87 */
9500/* File: arm64/alt_stub.S */
9501/*
9502 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9503 * any interesting requests and then jump to the real instruction
9504 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9505 */
9506 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009507 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9508 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9509 mov x0, xSELF
9510 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009511 mov x2, xPC
9512 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009513
9514/* ------------------------------ */
9515 .balign 128
9516.L_ALT_op_float_to_long: /* 0x88 */
9517/* File: arm64/alt_stub.S */
9518/*
9519 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9520 * any interesting requests and then jump to the real instruction
9521 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9522 */
9523 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009524 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9525 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9526 mov x0, xSELF
9527 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009528 mov x2, xPC
9529 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009530
9531/* ------------------------------ */
9532 .balign 128
9533.L_ALT_op_float_to_double: /* 0x89 */
9534/* File: arm64/alt_stub.S */
9535/*
9536 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9537 * any interesting requests and then jump to the real instruction
9538 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9539 */
9540 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009541 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9542 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9543 mov x0, xSELF
9544 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009545 mov x2, xPC
9546 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009547
9548/* ------------------------------ */
9549 .balign 128
9550.L_ALT_op_double_to_int: /* 0x8a */
9551/* File: arm64/alt_stub.S */
9552/*
9553 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9554 * any interesting requests and then jump to the real instruction
9555 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9556 */
9557 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009558 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9559 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9560 mov x0, xSELF
9561 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009562 mov x2, xPC
9563 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009564
9565/* ------------------------------ */
9566 .balign 128
9567.L_ALT_op_double_to_long: /* 0x8b */
9568/* File: arm64/alt_stub.S */
9569/*
9570 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9571 * any interesting requests and then jump to the real instruction
9572 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9573 */
9574 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009575 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9576 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9577 mov x0, xSELF
9578 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009579 mov x2, xPC
9580 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009581
9582/* ------------------------------ */
9583 .balign 128
9584.L_ALT_op_double_to_float: /* 0x8c */
9585/* File: arm64/alt_stub.S */
9586/*
9587 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9588 * any interesting requests and then jump to the real instruction
9589 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9590 */
9591 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009592 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9593 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9594 mov x0, xSELF
9595 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009596 mov x2, xPC
9597 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009598
9599/* ------------------------------ */
9600 .balign 128
9601.L_ALT_op_int_to_byte: /* 0x8d */
9602/* File: arm64/alt_stub.S */
9603/*
9604 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9605 * any interesting requests and then jump to the real instruction
9606 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9607 */
9608 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009609 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9610 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9611 mov x0, xSELF
9612 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009613 mov x2, xPC
9614 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009615
9616/* ------------------------------ */
9617 .balign 128
9618.L_ALT_op_int_to_char: /* 0x8e */
9619/* File: arm64/alt_stub.S */
9620/*
9621 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9622 * any interesting requests and then jump to the real instruction
9623 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9624 */
9625 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009626 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9627 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9628 mov x0, xSELF
9629 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009630 mov x2, xPC
9631 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009632
9633/* ------------------------------ */
9634 .balign 128
9635.L_ALT_op_int_to_short: /* 0x8f */
9636/* File: arm64/alt_stub.S */
9637/*
9638 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9639 * any interesting requests and then jump to the real instruction
9640 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9641 */
9642 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009643 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9644 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9645 mov x0, xSELF
9646 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009647 mov x2, xPC
9648 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009649
9650/* ------------------------------ */
9651 .balign 128
9652.L_ALT_op_add_int: /* 0x90 */
9653/* File: arm64/alt_stub.S */
9654/*
9655 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9656 * any interesting requests and then jump to the real instruction
9657 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9658 */
9659 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009660 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9661 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9662 mov x0, xSELF
9663 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009664 mov x2, xPC
9665 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009666
9667/* ------------------------------ */
9668 .balign 128
9669.L_ALT_op_sub_int: /* 0x91 */
9670/* File: arm64/alt_stub.S */
9671/*
9672 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9673 * any interesting requests and then jump to the real instruction
9674 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9675 */
9676 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009677 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9678 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9679 mov x0, xSELF
9680 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009681 mov x2, xPC
9682 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009683
9684/* ------------------------------ */
9685 .balign 128
9686.L_ALT_op_mul_int: /* 0x92 */
9687/* File: arm64/alt_stub.S */
9688/*
9689 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9690 * any interesting requests and then jump to the real instruction
9691 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9692 */
9693 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009694 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9695 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9696 mov x0, xSELF
9697 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009698 mov x2, xPC
9699 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009700
9701/* ------------------------------ */
9702 .balign 128
9703.L_ALT_op_div_int: /* 0x93 */
9704/* File: arm64/alt_stub.S */
9705/*
9706 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9707 * any interesting requests and then jump to the real instruction
9708 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9709 */
9710 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009711 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9712 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9713 mov x0, xSELF
9714 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009715 mov x2, xPC
9716 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009717
9718/* ------------------------------ */
9719 .balign 128
9720.L_ALT_op_rem_int: /* 0x94 */
9721/* File: arm64/alt_stub.S */
9722/*
9723 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9724 * any interesting requests and then jump to the real instruction
9725 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9726 */
9727 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009728 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9729 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9730 mov x0, xSELF
9731 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009732 mov x2, xPC
9733 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009734
9735/* ------------------------------ */
9736 .balign 128
9737.L_ALT_op_and_int: /* 0x95 */
9738/* File: arm64/alt_stub.S */
9739/*
9740 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9741 * any interesting requests and then jump to the real instruction
9742 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9743 */
9744 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009745 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9746 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9747 mov x0, xSELF
9748 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009749 mov x2, xPC
9750 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009751
9752/* ------------------------------ */
9753 .balign 128
9754.L_ALT_op_or_int: /* 0x96 */
9755/* File: arm64/alt_stub.S */
9756/*
9757 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9758 * any interesting requests and then jump to the real instruction
9759 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9760 */
9761 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009762 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9763 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9764 mov x0, xSELF
9765 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009766 mov x2, xPC
9767 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009768
9769/* ------------------------------ */
9770 .balign 128
9771.L_ALT_op_xor_int: /* 0x97 */
9772/* File: arm64/alt_stub.S */
9773/*
9774 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9775 * any interesting requests and then jump to the real instruction
9776 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9777 */
9778 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009779 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9780 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9781 mov x0, xSELF
9782 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009783 mov x2, xPC
9784 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009785
9786/* ------------------------------ */
9787 .balign 128
9788.L_ALT_op_shl_int: /* 0x98 */
9789/* File: arm64/alt_stub.S */
9790/*
9791 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9792 * any interesting requests and then jump to the real instruction
9793 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9794 */
9795 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009796 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9797 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9798 mov x0, xSELF
9799 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009800 mov x2, xPC
9801 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009802
9803/* ------------------------------ */
9804 .balign 128
9805.L_ALT_op_shr_int: /* 0x99 */
9806/* File: arm64/alt_stub.S */
9807/*
9808 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9809 * any interesting requests and then jump to the real instruction
9810 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9811 */
9812 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009813 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9814 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9815 mov x0, xSELF
9816 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009817 mov x2, xPC
9818 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009819
9820/* ------------------------------ */
9821 .balign 128
9822.L_ALT_op_ushr_int: /* 0x9a */
9823/* File: arm64/alt_stub.S */
9824/*
9825 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9826 * any interesting requests and then jump to the real instruction
9827 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9828 */
9829 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009830 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9831 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9832 mov x0, xSELF
9833 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009834 mov x2, xPC
9835 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009836
9837/* ------------------------------ */
9838 .balign 128
9839.L_ALT_op_add_long: /* 0x9b */
9840/* File: arm64/alt_stub.S */
9841/*
9842 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9843 * any interesting requests and then jump to the real instruction
9844 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9845 */
9846 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009847 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9848 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9849 mov x0, xSELF
9850 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009851 mov x2, xPC
9852 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009853
9854/* ------------------------------ */
9855 .balign 128
9856.L_ALT_op_sub_long: /* 0x9c */
9857/* File: arm64/alt_stub.S */
9858/*
9859 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9860 * any interesting requests and then jump to the real instruction
9861 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9862 */
9863 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009864 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9865 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9866 mov x0, xSELF
9867 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009868 mov x2, xPC
9869 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009870
9871/* ------------------------------ */
9872 .balign 128
9873.L_ALT_op_mul_long: /* 0x9d */
9874/* File: arm64/alt_stub.S */
9875/*
9876 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9877 * any interesting requests and then jump to the real instruction
9878 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9879 */
9880 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009881 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9882 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
9883 mov x0, xSELF
9884 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009885 mov x2, xPC
9886 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009887
9888/* ------------------------------ */
9889 .balign 128
9890.L_ALT_op_div_long: /* 0x9e */
9891/* File: arm64/alt_stub.S */
9892/*
9893 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9894 * any interesting requests and then jump to the real instruction
9895 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9896 */
9897 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009898 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9899 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
9900 mov x0, xSELF
9901 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009902 mov x2, xPC
9903 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009904
9905/* ------------------------------ */
9906 .balign 128
9907.L_ALT_op_rem_long: /* 0x9f */
9908/* File: arm64/alt_stub.S */
9909/*
9910 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9911 * any interesting requests and then jump to the real instruction
9912 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9913 */
9914 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009915 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9916 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
9917 mov x0, xSELF
9918 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009919 mov x2, xPC
9920 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009921
9922/* ------------------------------ */
9923 .balign 128
9924.L_ALT_op_and_long: /* 0xa0 */
9925/* File: arm64/alt_stub.S */
9926/*
9927 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9928 * any interesting requests and then jump to the real instruction
9929 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9930 */
9931 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009932 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9933 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
9934 mov x0, xSELF
9935 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009936 mov x2, xPC
9937 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009938
9939/* ------------------------------ */
9940 .balign 128
9941.L_ALT_op_or_long: /* 0xa1 */
9942/* File: arm64/alt_stub.S */
9943/*
9944 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9945 * any interesting requests and then jump to the real instruction
9946 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9947 */
9948 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009949 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9950 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
9951 mov x0, xSELF
9952 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009953 mov x2, xPC
9954 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009955
9956/* ------------------------------ */
9957 .balign 128
9958.L_ALT_op_xor_long: /* 0xa2 */
9959/* File: arm64/alt_stub.S */
9960/*
9961 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9962 * any interesting requests and then jump to the real instruction
9963 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9964 */
9965 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009966 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9967 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
9968 mov x0, xSELF
9969 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009970 mov x2, xPC
9971 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009972
9973/* ------------------------------ */
9974 .balign 128
9975.L_ALT_op_shl_long: /* 0xa3 */
9976/* File: arm64/alt_stub.S */
9977/*
9978 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9979 * any interesting requests and then jump to the real instruction
9980 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9981 */
9982 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009983 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9984 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
9985 mov x0, xSELF
9986 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009987 mov x2, xPC
9988 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009989
9990/* ------------------------------ */
9991 .balign 128
9992.L_ALT_op_shr_long: /* 0xa4 */
9993/* File: arm64/alt_stub.S */
9994/*
9995 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9996 * any interesting requests and then jump to the real instruction
9997 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9998 */
9999 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010000 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10001 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
10002 mov x0, xSELF
10003 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010004 mov x2, xPC
10005 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010006
10007/* ------------------------------ */
10008 .balign 128
10009.L_ALT_op_ushr_long: /* 0xa5 */
10010/* File: arm64/alt_stub.S */
10011/*
10012 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10013 * any interesting requests and then jump to the real instruction
10014 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10015 */
10016 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010017 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10018 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
10019 mov x0, xSELF
10020 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010021 mov x2, xPC
10022 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010023
10024/* ------------------------------ */
10025 .balign 128
10026.L_ALT_op_add_float: /* 0xa6 */
10027/* File: arm64/alt_stub.S */
10028/*
10029 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10030 * any interesting requests and then jump to the real instruction
10031 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10032 */
10033 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010034 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10035 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
10036 mov x0, xSELF
10037 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010038 mov x2, xPC
10039 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010040
10041/* ------------------------------ */
10042 .balign 128
10043.L_ALT_op_sub_float: /* 0xa7 */
10044/* File: arm64/alt_stub.S */
10045/*
10046 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10047 * any interesting requests and then jump to the real instruction
10048 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10049 */
10050 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010051 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10052 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
10053 mov x0, xSELF
10054 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010055 mov x2, xPC
10056 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010057
10058/* ------------------------------ */
10059 .balign 128
10060.L_ALT_op_mul_float: /* 0xa8 */
10061/* File: arm64/alt_stub.S */
10062/*
10063 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10064 * any interesting requests and then jump to the real instruction
10065 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10066 */
10067 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010068 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10069 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
10070 mov x0, xSELF
10071 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010072 mov x2, xPC
10073 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010074
10075/* ------------------------------ */
10076 .balign 128
10077.L_ALT_op_div_float: /* 0xa9 */
10078/* File: arm64/alt_stub.S */
10079/*
10080 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10081 * any interesting requests and then jump to the real instruction
10082 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10083 */
10084 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010085 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10086 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
10087 mov x0, xSELF
10088 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010089 mov x2, xPC
10090 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010091
10092/* ------------------------------ */
10093 .balign 128
10094.L_ALT_op_rem_float: /* 0xaa */
10095/* File: arm64/alt_stub.S */
10096/*
10097 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10098 * any interesting requests and then jump to the real instruction
10099 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10100 */
10101 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010102 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10103 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
10104 mov x0, xSELF
10105 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010106 mov x2, xPC
10107 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010108
10109/* ------------------------------ */
10110 .balign 128
10111.L_ALT_op_add_double: /* 0xab */
10112/* File: arm64/alt_stub.S */
10113/*
10114 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10115 * any interesting requests and then jump to the real instruction
10116 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10117 */
10118 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010119 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10120 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
10121 mov x0, xSELF
10122 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010123 mov x2, xPC
10124 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010125
10126/* ------------------------------ */
10127 .balign 128
10128.L_ALT_op_sub_double: /* 0xac */
10129/* File: arm64/alt_stub.S */
10130/*
10131 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10132 * any interesting requests and then jump to the real instruction
10133 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10134 */
10135 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010136 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10137 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
10138 mov x0, xSELF
10139 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010140 mov x2, xPC
10141 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010142
10143/* ------------------------------ */
10144 .balign 128
10145.L_ALT_op_mul_double: /* 0xad */
10146/* File: arm64/alt_stub.S */
10147/*
10148 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10149 * any interesting requests and then jump to the real instruction
10150 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10151 */
10152 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010153 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10154 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
10155 mov x0, xSELF
10156 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010157 mov x2, xPC
10158 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010159
10160/* ------------------------------ */
10161 .balign 128
10162.L_ALT_op_div_double: /* 0xae */
10163/* File: arm64/alt_stub.S */
10164/*
10165 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10166 * any interesting requests and then jump to the real instruction
10167 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10168 */
10169 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010170 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10171 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
10172 mov x0, xSELF
10173 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010174 mov x2, xPC
10175 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010176
10177/* ------------------------------ */
10178 .balign 128
10179.L_ALT_op_rem_double: /* 0xaf */
10180/* File: arm64/alt_stub.S */
10181/*
10182 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10183 * any interesting requests and then jump to the real instruction
10184 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10185 */
10186 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010187 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10188 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
10189 mov x0, xSELF
10190 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010191 mov x2, xPC
10192 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010193
10194/* ------------------------------ */
10195 .balign 128
10196.L_ALT_op_add_int_2addr: /* 0xb0 */
10197/* File: arm64/alt_stub.S */
10198/*
10199 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10200 * any interesting requests and then jump to the real instruction
10201 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10202 */
10203 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010204 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10205 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
10206 mov x0, xSELF
10207 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010208 mov x2, xPC
10209 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010210
10211/* ------------------------------ */
10212 .balign 128
10213.L_ALT_op_sub_int_2addr: /* 0xb1 */
10214/* File: arm64/alt_stub.S */
10215/*
10216 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10217 * any interesting requests and then jump to the real instruction
10218 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10219 */
10220 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010221 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10222 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
10223 mov x0, xSELF
10224 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010225 mov x2, xPC
10226 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010227
10228/* ------------------------------ */
10229 .balign 128
10230.L_ALT_op_mul_int_2addr: /* 0xb2 */
10231/* File: arm64/alt_stub.S */
10232/*
10233 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10234 * any interesting requests and then jump to the real instruction
10235 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10236 */
10237 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010238 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10239 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
10240 mov x0, xSELF
10241 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010242 mov x2, xPC
10243 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010244
10245/* ------------------------------ */
10246 .balign 128
10247.L_ALT_op_div_int_2addr: /* 0xb3 */
10248/* File: arm64/alt_stub.S */
10249/*
10250 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10251 * any interesting requests and then jump to the real instruction
10252 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10253 */
10254 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010255 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10256 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
10257 mov x0, xSELF
10258 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010259 mov x2, xPC
10260 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010261
10262/* ------------------------------ */
10263 .balign 128
10264.L_ALT_op_rem_int_2addr: /* 0xb4 */
10265/* File: arm64/alt_stub.S */
10266/*
10267 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10268 * any interesting requests and then jump to the real instruction
10269 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10270 */
10271 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010272 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10273 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
10274 mov x0, xSELF
10275 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010276 mov x2, xPC
10277 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010278
10279/* ------------------------------ */
10280 .balign 128
10281.L_ALT_op_and_int_2addr: /* 0xb5 */
10282/* File: arm64/alt_stub.S */
10283/*
10284 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10285 * any interesting requests and then jump to the real instruction
10286 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10287 */
10288 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010289 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10290 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
10291 mov x0, xSELF
10292 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010293 mov x2, xPC
10294 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010295
10296/* ------------------------------ */
10297 .balign 128
10298.L_ALT_op_or_int_2addr: /* 0xb6 */
10299/* File: arm64/alt_stub.S */
10300/*
10301 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10302 * any interesting requests and then jump to the real instruction
10303 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10304 */
10305 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010306 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10307 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10308 mov x0, xSELF
10309 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010310 mov x2, xPC
10311 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010312
10313/* ------------------------------ */
10314 .balign 128
10315.L_ALT_op_xor_int_2addr: /* 0xb7 */
10316/* File: arm64/alt_stub.S */
10317/*
10318 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10319 * any interesting requests and then jump to the real instruction
10320 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10321 */
10322 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010323 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10324 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10325 mov x0, xSELF
10326 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010327 mov x2, xPC
10328 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010329
10330/* ------------------------------ */
10331 .balign 128
10332.L_ALT_op_shl_int_2addr: /* 0xb8 */
10333/* File: arm64/alt_stub.S */
10334/*
10335 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10336 * any interesting requests and then jump to the real instruction
10337 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10338 */
10339 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010340 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10341 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10342 mov x0, xSELF
10343 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010344 mov x2, xPC
10345 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010346
10347/* ------------------------------ */
10348 .balign 128
10349.L_ALT_op_shr_int_2addr: /* 0xb9 */
10350/* File: arm64/alt_stub.S */
10351/*
10352 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10353 * any interesting requests and then jump to the real instruction
10354 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10355 */
10356 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010357 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10358 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10359 mov x0, xSELF
10360 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010361 mov x2, xPC
10362 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010363
10364/* ------------------------------ */
10365 .balign 128
10366.L_ALT_op_ushr_int_2addr: /* 0xba */
10367/* File: arm64/alt_stub.S */
10368/*
10369 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10370 * any interesting requests and then jump to the real instruction
10371 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10372 */
10373 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010374 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10375 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10376 mov x0, xSELF
10377 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010378 mov x2, xPC
10379 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010380
10381/* ------------------------------ */
10382 .balign 128
10383.L_ALT_op_add_long_2addr: /* 0xbb */
10384/* File: arm64/alt_stub.S */
10385/*
10386 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10387 * any interesting requests and then jump to the real instruction
10388 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10389 */
10390 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010391 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10392 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10393 mov x0, xSELF
10394 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010395 mov x2, xPC
10396 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010397
10398/* ------------------------------ */
10399 .balign 128
10400.L_ALT_op_sub_long_2addr: /* 0xbc */
10401/* File: arm64/alt_stub.S */
10402/*
10403 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10404 * any interesting requests and then jump to the real instruction
10405 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10406 */
10407 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010408 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10409 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10410 mov x0, xSELF
10411 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010412 mov x2, xPC
10413 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010414
10415/* ------------------------------ */
10416 .balign 128
10417.L_ALT_op_mul_long_2addr: /* 0xbd */
10418/* File: arm64/alt_stub.S */
10419/*
10420 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10421 * any interesting requests and then jump to the real instruction
10422 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10423 */
10424 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010425 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10426 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10427 mov x0, xSELF
10428 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010429 mov x2, xPC
10430 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010431
10432/* ------------------------------ */
10433 .balign 128
10434.L_ALT_op_div_long_2addr: /* 0xbe */
10435/* File: arm64/alt_stub.S */
10436/*
10437 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10438 * any interesting requests and then jump to the real instruction
10439 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10440 */
10441 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010442 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10443 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10444 mov x0, xSELF
10445 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010446 mov x2, xPC
10447 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010448
10449/* ------------------------------ */
10450 .balign 128
10451.L_ALT_op_rem_long_2addr: /* 0xbf */
10452/* File: arm64/alt_stub.S */
10453/*
10454 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10455 * any interesting requests and then jump to the real instruction
10456 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10457 */
10458 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010459 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10460 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10461 mov x0, xSELF
10462 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010463 mov x2, xPC
10464 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010465
10466/* ------------------------------ */
10467 .balign 128
10468.L_ALT_op_and_long_2addr: /* 0xc0 */
10469/* File: arm64/alt_stub.S */
10470/*
10471 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10472 * any interesting requests and then jump to the real instruction
10473 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10474 */
10475 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010476 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10477 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10478 mov x0, xSELF
10479 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010480 mov x2, xPC
10481 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010482
10483/* ------------------------------ */
10484 .balign 128
10485.L_ALT_op_or_long_2addr: /* 0xc1 */
10486/* File: arm64/alt_stub.S */
10487/*
10488 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10489 * any interesting requests and then jump to the real instruction
10490 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10491 */
10492 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010493 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10494 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10495 mov x0, xSELF
10496 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010497 mov x2, xPC
10498 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010499
10500/* ------------------------------ */
10501 .balign 128
10502.L_ALT_op_xor_long_2addr: /* 0xc2 */
10503/* File: arm64/alt_stub.S */
10504/*
10505 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10506 * any interesting requests and then jump to the real instruction
10507 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10508 */
10509 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010510 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10511 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10512 mov x0, xSELF
10513 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010514 mov x2, xPC
10515 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010516
10517/* ------------------------------ */
10518 .balign 128
10519.L_ALT_op_shl_long_2addr: /* 0xc3 */
10520/* File: arm64/alt_stub.S */
10521/*
10522 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10523 * any interesting requests and then jump to the real instruction
10524 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10525 */
10526 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010527 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10528 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10529 mov x0, xSELF
10530 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010531 mov x2, xPC
10532 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010533
10534/* ------------------------------ */
10535 .balign 128
10536.L_ALT_op_shr_long_2addr: /* 0xc4 */
10537/* File: arm64/alt_stub.S */
10538/*
10539 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10540 * any interesting requests and then jump to the real instruction
10541 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10542 */
10543 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010544 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10545 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10546 mov x0, xSELF
10547 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010548 mov x2, xPC
10549 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010550
10551/* ------------------------------ */
10552 .balign 128
10553.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10554/* File: arm64/alt_stub.S */
10555/*
10556 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10557 * any interesting requests and then jump to the real instruction
10558 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10559 */
10560 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010561 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10562 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10563 mov x0, xSELF
10564 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010565 mov x2, xPC
10566 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010567
10568/* ------------------------------ */
10569 .balign 128
10570.L_ALT_op_add_float_2addr: /* 0xc6 */
10571/* File: arm64/alt_stub.S */
10572/*
10573 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10574 * any interesting requests and then jump to the real instruction
10575 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10576 */
10577 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010578 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10579 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10580 mov x0, xSELF
10581 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010582 mov x2, xPC
10583 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010584
10585/* ------------------------------ */
10586 .balign 128
10587.L_ALT_op_sub_float_2addr: /* 0xc7 */
10588/* File: arm64/alt_stub.S */
10589/*
10590 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10591 * any interesting requests and then jump to the real instruction
10592 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10593 */
10594 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010595 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10596 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10597 mov x0, xSELF
10598 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010599 mov x2, xPC
10600 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010601
10602/* ------------------------------ */
10603 .balign 128
10604.L_ALT_op_mul_float_2addr: /* 0xc8 */
10605/* File: arm64/alt_stub.S */
10606/*
10607 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10608 * any interesting requests and then jump to the real instruction
10609 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10610 */
10611 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010612 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10613 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10614 mov x0, xSELF
10615 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010616 mov x2, xPC
10617 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010618
10619/* ------------------------------ */
10620 .balign 128
10621.L_ALT_op_div_float_2addr: /* 0xc9 */
10622/* File: arm64/alt_stub.S */
10623/*
10624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10625 * any interesting requests and then jump to the real instruction
10626 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10627 */
10628 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010629 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10630 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10631 mov x0, xSELF
10632 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010633 mov x2, xPC
10634 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010635
10636/* ------------------------------ */
10637 .balign 128
10638.L_ALT_op_rem_float_2addr: /* 0xca */
10639/* File: arm64/alt_stub.S */
10640/*
10641 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10642 * any interesting requests and then jump to the real instruction
10643 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10644 */
10645 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010646 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10647 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10648 mov x0, xSELF
10649 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010650 mov x2, xPC
10651 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010652
10653/* ------------------------------ */
10654 .balign 128
10655.L_ALT_op_add_double_2addr: /* 0xcb */
10656/* File: arm64/alt_stub.S */
10657/*
10658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10659 * any interesting requests and then jump to the real instruction
10660 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10661 */
10662 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010663 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10664 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10665 mov x0, xSELF
10666 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010667 mov x2, xPC
10668 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010669
10670/* ------------------------------ */
10671 .balign 128
10672.L_ALT_op_sub_double_2addr: /* 0xcc */
10673/* File: arm64/alt_stub.S */
10674/*
10675 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10676 * any interesting requests and then jump to the real instruction
10677 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10678 */
10679 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010680 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10681 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10682 mov x0, xSELF
10683 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010684 mov x2, xPC
10685 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010686
10687/* ------------------------------ */
10688 .balign 128
10689.L_ALT_op_mul_double_2addr: /* 0xcd */
10690/* File: arm64/alt_stub.S */
10691/*
10692 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10693 * any interesting requests and then jump to the real instruction
10694 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10695 */
10696 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010697 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10698 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10699 mov x0, xSELF
10700 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010701 mov x2, xPC
10702 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010703
10704/* ------------------------------ */
10705 .balign 128
10706.L_ALT_op_div_double_2addr: /* 0xce */
10707/* File: arm64/alt_stub.S */
10708/*
10709 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10710 * any interesting requests and then jump to the real instruction
10711 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10712 */
10713 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010714 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10715 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10716 mov x0, xSELF
10717 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010718 mov x2, xPC
10719 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010720
10721/* ------------------------------ */
10722 .balign 128
10723.L_ALT_op_rem_double_2addr: /* 0xcf */
10724/* File: arm64/alt_stub.S */
10725/*
10726 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10727 * any interesting requests and then jump to the real instruction
10728 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10729 */
10730 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010731 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10732 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10733 mov x0, xSELF
10734 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010735 mov x2, xPC
10736 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010737
10738/* ------------------------------ */
10739 .balign 128
10740.L_ALT_op_add_int_lit16: /* 0xd0 */
10741/* File: arm64/alt_stub.S */
10742/*
10743 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10744 * any interesting requests and then jump to the real instruction
10745 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10746 */
10747 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010748 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10749 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10750 mov x0, xSELF
10751 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010752 mov x2, xPC
10753 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010754
10755/* ------------------------------ */
10756 .balign 128
10757.L_ALT_op_rsub_int: /* 0xd1 */
10758/* File: arm64/alt_stub.S */
10759/*
10760 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10761 * any interesting requests and then jump to the real instruction
10762 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10763 */
10764 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010765 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10766 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10767 mov x0, xSELF
10768 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010769 mov x2, xPC
10770 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010771
10772/* ------------------------------ */
10773 .balign 128
10774.L_ALT_op_mul_int_lit16: /* 0xd2 */
10775/* File: arm64/alt_stub.S */
10776/*
10777 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10778 * any interesting requests and then jump to the real instruction
10779 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10780 */
10781 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010782 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10783 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10784 mov x0, xSELF
10785 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010786 mov x2, xPC
10787 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010788
10789/* ------------------------------ */
10790 .balign 128
10791.L_ALT_op_div_int_lit16: /* 0xd3 */
10792/* File: arm64/alt_stub.S */
10793/*
10794 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10795 * any interesting requests and then jump to the real instruction
10796 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10797 */
10798 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010799 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10800 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10801 mov x0, xSELF
10802 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010803 mov x2, xPC
10804 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010805
10806/* ------------------------------ */
10807 .balign 128
10808.L_ALT_op_rem_int_lit16: /* 0xd4 */
10809/* File: arm64/alt_stub.S */
10810/*
10811 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10812 * any interesting requests and then jump to the real instruction
10813 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10814 */
10815 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010816 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10817 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10818 mov x0, xSELF
10819 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010820 mov x2, xPC
10821 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010822
10823/* ------------------------------ */
10824 .balign 128
10825.L_ALT_op_and_int_lit16: /* 0xd5 */
10826/* File: arm64/alt_stub.S */
10827/*
10828 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10829 * any interesting requests and then jump to the real instruction
10830 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10831 */
10832 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010833 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10834 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10835 mov x0, xSELF
10836 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010837 mov x2, xPC
10838 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010839
10840/* ------------------------------ */
10841 .balign 128
10842.L_ALT_op_or_int_lit16: /* 0xd6 */
10843/* File: arm64/alt_stub.S */
10844/*
10845 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10846 * any interesting requests and then jump to the real instruction
10847 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10848 */
10849 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010850 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10851 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10852 mov x0, xSELF
10853 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010854 mov x2, xPC
10855 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010856
10857/* ------------------------------ */
10858 .balign 128
10859.L_ALT_op_xor_int_lit16: /* 0xd7 */
10860/* File: arm64/alt_stub.S */
10861/*
10862 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10863 * any interesting requests and then jump to the real instruction
10864 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10865 */
10866 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010867 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10868 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10869 mov x0, xSELF
10870 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010871 mov x2, xPC
10872 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010873
10874/* ------------------------------ */
10875 .balign 128
10876.L_ALT_op_add_int_lit8: /* 0xd8 */
10877/* File: arm64/alt_stub.S */
10878/*
10879 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10880 * any interesting requests and then jump to the real instruction
10881 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10882 */
10883 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010884 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10885 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
10886 mov x0, xSELF
10887 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010888 mov x2, xPC
10889 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010890
10891/* ------------------------------ */
10892 .balign 128
10893.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10894/* File: arm64/alt_stub.S */
10895/*
10896 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10897 * any interesting requests and then jump to the real instruction
10898 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10899 */
10900 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010901 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10902 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
10903 mov x0, xSELF
10904 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010905 mov x2, xPC
10906 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010907
10908/* ------------------------------ */
10909 .balign 128
10910.L_ALT_op_mul_int_lit8: /* 0xda */
10911/* File: arm64/alt_stub.S */
10912/*
10913 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10914 * any interesting requests and then jump to the real instruction
10915 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10916 */
10917 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010918 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10919 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
10920 mov x0, xSELF
10921 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010922 mov x2, xPC
10923 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010924
10925/* ------------------------------ */
10926 .balign 128
10927.L_ALT_op_div_int_lit8: /* 0xdb */
10928/* File: arm64/alt_stub.S */
10929/*
10930 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10931 * any interesting requests and then jump to the real instruction
10932 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10933 */
10934 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010935 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10936 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
10937 mov x0, xSELF
10938 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010939 mov x2, xPC
10940 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010941
10942/* ------------------------------ */
10943 .balign 128
10944.L_ALT_op_rem_int_lit8: /* 0xdc */
10945/* File: arm64/alt_stub.S */
10946/*
10947 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10948 * any interesting requests and then jump to the real instruction
10949 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10950 */
10951 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010952 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10953 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
10954 mov x0, xSELF
10955 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010956 mov x2, xPC
10957 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010958
10959/* ------------------------------ */
10960 .balign 128
10961.L_ALT_op_and_int_lit8: /* 0xdd */
10962/* File: arm64/alt_stub.S */
10963/*
10964 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10965 * any interesting requests and then jump to the real instruction
10966 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10967 */
10968 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010969 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10970 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
10971 mov x0, xSELF
10972 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010973 mov x2, xPC
10974 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010975
10976/* ------------------------------ */
10977 .balign 128
10978.L_ALT_op_or_int_lit8: /* 0xde */
10979/* File: arm64/alt_stub.S */
10980/*
10981 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10982 * any interesting requests and then jump to the real instruction
10983 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10984 */
10985 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010986 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10987 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
10988 mov x0, xSELF
10989 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010990 mov x2, xPC
10991 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010992
10993/* ------------------------------ */
10994 .balign 128
10995.L_ALT_op_xor_int_lit8: /* 0xdf */
10996/* File: arm64/alt_stub.S */
10997/*
10998 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10999 * any interesting requests and then jump to the real instruction
11000 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11001 */
11002 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011003 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11004 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
11005 mov x0, xSELF
11006 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011007 mov x2, xPC
11008 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011009
11010/* ------------------------------ */
11011 .balign 128
11012.L_ALT_op_shl_int_lit8: /* 0xe0 */
11013/* File: arm64/alt_stub.S */
11014/*
11015 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11016 * any interesting requests and then jump to the real instruction
11017 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11018 */
11019 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011020 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11021 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
11022 mov x0, xSELF
11023 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011024 mov x2, xPC
11025 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011026
11027/* ------------------------------ */
11028 .balign 128
11029.L_ALT_op_shr_int_lit8: /* 0xe1 */
11030/* File: arm64/alt_stub.S */
11031/*
11032 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11033 * any interesting requests and then jump to the real instruction
11034 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11035 */
11036 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011037 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11038 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
11039 mov x0, xSELF
11040 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011041 mov x2, xPC
11042 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011043
11044/* ------------------------------ */
11045 .balign 128
11046.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11047/* File: arm64/alt_stub.S */
11048/*
11049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11050 * any interesting requests and then jump to the real instruction
11051 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11052 */
11053 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011054 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11055 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
11056 mov x0, xSELF
11057 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011058 mov x2, xPC
11059 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011060
11061/* ------------------------------ */
11062 .balign 128
11063.L_ALT_op_iget_quick: /* 0xe3 */
11064/* File: arm64/alt_stub.S */
11065/*
11066 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11067 * any interesting requests and then jump to the real instruction
11068 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11069 */
11070 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011071 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11072 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
11073 mov x0, xSELF
11074 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011075 mov x2, xPC
11076 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011077
11078/* ------------------------------ */
11079 .balign 128
11080.L_ALT_op_iget_wide_quick: /* 0xe4 */
11081/* File: arm64/alt_stub.S */
11082/*
11083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11084 * any interesting requests and then jump to the real instruction
11085 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11086 */
11087 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011088 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11089 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
11090 mov x0, xSELF
11091 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011092 mov x2, xPC
11093 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011094
11095/* ------------------------------ */
11096 .balign 128
11097.L_ALT_op_iget_object_quick: /* 0xe5 */
11098/* File: arm64/alt_stub.S */
11099/*
11100 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11101 * any interesting requests and then jump to the real instruction
11102 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11103 */
11104 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011105 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11106 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
11107 mov x0, xSELF
11108 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011109 mov x2, xPC
11110 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011111
11112/* ------------------------------ */
11113 .balign 128
11114.L_ALT_op_iput_quick: /* 0xe6 */
11115/* File: arm64/alt_stub.S */
11116/*
11117 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11118 * any interesting requests and then jump to the real instruction
11119 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11120 */
11121 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011122 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11123 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
11124 mov x0, xSELF
11125 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011126 mov x2, xPC
11127 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011128
11129/* ------------------------------ */
11130 .balign 128
11131.L_ALT_op_iput_wide_quick: /* 0xe7 */
11132/* File: arm64/alt_stub.S */
11133/*
11134 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11135 * any interesting requests and then jump to the real instruction
11136 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11137 */
11138 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011139 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11140 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
11141 mov x0, xSELF
11142 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011143 mov x2, xPC
11144 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011145
11146/* ------------------------------ */
11147 .balign 128
11148.L_ALT_op_iput_object_quick: /* 0xe8 */
11149/* File: arm64/alt_stub.S */
11150/*
11151 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11152 * any interesting requests and then jump to the real instruction
11153 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11154 */
11155 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011156 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11157 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
11158 mov x0, xSELF
11159 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011160 mov x2, xPC
11161 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011162
11163/* ------------------------------ */
11164 .balign 128
11165.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11166/* File: arm64/alt_stub.S */
11167/*
11168 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11169 * any interesting requests and then jump to the real instruction
11170 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11171 */
11172 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011173 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11174 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
11175 mov x0, xSELF
11176 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011177 mov x2, xPC
11178 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011179
11180/* ------------------------------ */
11181 .balign 128
11182.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11183/* File: arm64/alt_stub.S */
11184/*
11185 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11186 * any interesting requests and then jump to the real instruction
11187 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11188 */
11189 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011190 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11191 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
11192 mov x0, xSELF
11193 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011194 mov x2, xPC
11195 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011196
11197/* ------------------------------ */
11198 .balign 128
11199.L_ALT_op_iput_boolean_quick: /* 0xeb */
11200/* File: arm64/alt_stub.S */
11201/*
11202 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11203 * any interesting requests and then jump to the real instruction
11204 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11205 */
11206 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011207 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11208 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
11209 mov x0, xSELF
11210 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011211 mov x2, xPC
11212 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011213
11214/* ------------------------------ */
11215 .balign 128
11216.L_ALT_op_iput_byte_quick: /* 0xec */
11217/* File: arm64/alt_stub.S */
11218/*
11219 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11220 * any interesting requests and then jump to the real instruction
11221 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11222 */
11223 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011224 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11225 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
11226 mov x0, xSELF
11227 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011228 mov x2, xPC
11229 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011230
11231/* ------------------------------ */
11232 .balign 128
11233.L_ALT_op_iput_char_quick: /* 0xed */
11234/* File: arm64/alt_stub.S */
11235/*
11236 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11237 * any interesting requests and then jump to the real instruction
11238 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11239 */
11240 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011241 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11242 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
11243 mov x0, xSELF
11244 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011245 mov x2, xPC
11246 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011247
11248/* ------------------------------ */
11249 .balign 128
11250.L_ALT_op_iput_short_quick: /* 0xee */
11251/* File: arm64/alt_stub.S */
11252/*
11253 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11254 * any interesting requests and then jump to the real instruction
11255 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11256 */
11257 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011258 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11259 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
11260 mov x0, xSELF
11261 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011262 mov x2, xPC
11263 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011264
11265/* ------------------------------ */
11266 .balign 128
11267.L_ALT_op_iget_boolean_quick: /* 0xef */
11268/* File: arm64/alt_stub.S */
11269/*
11270 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11271 * any interesting requests and then jump to the real instruction
11272 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11273 */
11274 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011275 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11276 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
11277 mov x0, xSELF
11278 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011279 mov x2, xPC
11280 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011281
11282/* ------------------------------ */
11283 .balign 128
11284.L_ALT_op_iget_byte_quick: /* 0xf0 */
11285/* File: arm64/alt_stub.S */
11286/*
11287 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11288 * any interesting requests and then jump to the real instruction
11289 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11290 */
11291 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011292 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11293 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
11294 mov x0, xSELF
11295 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011296 mov x2, xPC
11297 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011298
11299/* ------------------------------ */
11300 .balign 128
11301.L_ALT_op_iget_char_quick: /* 0xf1 */
11302/* File: arm64/alt_stub.S */
11303/*
11304 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11305 * any interesting requests and then jump to the real instruction
11306 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11307 */
11308 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011309 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11310 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11311 mov x0, xSELF
11312 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011313 mov x2, xPC
11314 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011315
11316/* ------------------------------ */
11317 .balign 128
11318.L_ALT_op_iget_short_quick: /* 0xf2 */
11319/* File: arm64/alt_stub.S */
11320/*
11321 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11322 * any interesting requests and then jump to the real instruction
11323 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11324 */
11325 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011326 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11327 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11328 mov x0, xSELF
11329 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011330 mov x2, xPC
11331 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011332
11333/* ------------------------------ */
11334 .balign 128
11335.L_ALT_op_invoke_lambda: /* 0xf3 */
11336/* File: arm64/alt_stub.S */
11337/*
11338 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11339 * any interesting requests and then jump to the real instruction
11340 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11341 */
11342 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011343 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11344 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11345 mov x0, xSELF
11346 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011347 mov x2, xPC
11348 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011349
11350/* ------------------------------ */
11351 .balign 128
11352.L_ALT_op_unused_f4: /* 0xf4 */
11353/* File: arm64/alt_stub.S */
11354/*
11355 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11356 * any interesting requests and then jump to the real instruction
11357 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11358 */
11359 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011360 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11361 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11362 mov x0, xSELF
11363 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011364 mov x2, xPC
11365 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011366
11367/* ------------------------------ */
11368 .balign 128
11369.L_ALT_op_capture_variable: /* 0xf5 */
11370/* File: arm64/alt_stub.S */
11371/*
11372 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11373 * any interesting requests and then jump to the real instruction
11374 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11375 */
11376 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011377 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11378 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11379 mov x0, xSELF
11380 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011381 mov x2, xPC
11382 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011383
11384/* ------------------------------ */
11385 .balign 128
11386.L_ALT_op_create_lambda: /* 0xf6 */
11387/* File: arm64/alt_stub.S */
11388/*
11389 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11390 * any interesting requests and then jump to the real instruction
11391 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11392 */
11393 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011394 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11395 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11396 mov x0, xSELF
11397 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011398 mov x2, xPC
11399 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011400
11401/* ------------------------------ */
11402 .balign 128
11403.L_ALT_op_liberate_variable: /* 0xf7 */
11404/* File: arm64/alt_stub.S */
11405/*
11406 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11407 * any interesting requests and then jump to the real instruction
11408 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11409 */
11410 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011411 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11412 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11413 mov x0, xSELF
11414 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011415 mov x2, xPC
11416 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011417
11418/* ------------------------------ */
11419 .balign 128
11420.L_ALT_op_box_lambda: /* 0xf8 */
11421/* File: arm64/alt_stub.S */
11422/*
11423 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11424 * any interesting requests and then jump to the real instruction
11425 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11426 */
11427 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011428 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11429 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11430 mov x0, xSELF
11431 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011432 mov x2, xPC
11433 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011434
11435/* ------------------------------ */
11436 .balign 128
11437.L_ALT_op_unbox_lambda: /* 0xf9 */
11438/* File: arm64/alt_stub.S */
11439/*
11440 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11441 * any interesting requests and then jump to the real instruction
11442 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11443 */
11444 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011445 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11446 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11447 mov x0, xSELF
11448 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011449 mov x2, xPC
11450 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011451
11452/* ------------------------------ */
11453 .balign 128
11454.L_ALT_op_unused_fa: /* 0xfa */
11455/* File: arm64/alt_stub.S */
11456/*
11457 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11458 * any interesting requests and then jump to the real instruction
11459 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11460 */
11461 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011462 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11463 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11464 mov x0, xSELF
11465 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011466 mov x2, xPC
11467 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011468
11469/* ------------------------------ */
11470 .balign 128
11471.L_ALT_op_unused_fb: /* 0xfb */
11472/* File: arm64/alt_stub.S */
11473/*
11474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11475 * any interesting requests and then jump to the real instruction
11476 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11477 */
11478 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011479 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11480 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11481 mov x0, xSELF
11482 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011483 mov x2, xPC
11484 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011485
11486/* ------------------------------ */
11487 .balign 128
11488.L_ALT_op_unused_fc: /* 0xfc */
11489/* File: arm64/alt_stub.S */
11490/*
11491 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11492 * any interesting requests and then jump to the real instruction
11493 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11494 */
11495 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011496 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11497 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11498 mov x0, xSELF
11499 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011500 mov x2, xPC
11501 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011502
11503/* ------------------------------ */
11504 .balign 128
11505.L_ALT_op_unused_fd: /* 0xfd */
11506/* File: arm64/alt_stub.S */
11507/*
11508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11509 * any interesting requests and then jump to the real instruction
11510 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11511 */
11512 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011513 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11514 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11515 mov x0, xSELF
11516 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011517 mov x2, xPC
11518 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011519
11520/* ------------------------------ */
11521 .balign 128
11522.L_ALT_op_unused_fe: /* 0xfe */
11523/* File: arm64/alt_stub.S */
11524/*
11525 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11526 * any interesting requests and then jump to the real instruction
11527 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11528 */
11529 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011530 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11531 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11532 mov x0, xSELF
11533 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011534 mov x2, xPC
11535 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011536
11537/* ------------------------------ */
11538 .balign 128
11539.L_ALT_op_unused_ff: /* 0xff */
11540/* File: arm64/alt_stub.S */
11541/*
11542 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11543 * any interesting requests and then jump to the real instruction
11544 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11545 */
11546 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011547 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11548 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11549 mov x0, xSELF
11550 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011551 mov x2, xPC
11552 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011553
11554 .balign 128
11555 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11556 .global artMterpAsmAltInstructionEnd
11557artMterpAsmAltInstructionEnd: