blob: 67f1c6ee6d5d8f7d2678f4e27112ac7c3dff32a4 [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 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003345 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003346 ubfx w4, wINST, #8, #4 // w4<- A
Vladimir Marko20421b92016-07-26 16:38:11 +01003347 GET_VREG_S x0, w3 // x0<- sign_extend(fp[B])
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003348 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003349 GET_INST_OPCODE ip // extract opcode from wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003350 SET_VREG_WIDE x0, w4 // fp[A]<- x0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003351 GOTO_OPCODE ip // jump to next instruction
3352
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003353/* ------------------------------ */
3354 .balign 128
3355.L_op_int_to_float: /* 0x82 */
3356/* File: arm64/op_int_to_float.S */
3357/* File: arm64/funopNarrow.S */
3358 /*
3359 * Generic 32bit-to-32bit floating point unary operation. Provide an
3360 * "instr" line that specifies an instruction that performs "s0 = op w0".
3361 *
3362 * For: int-to-float, float-to-int
3363 * TODO: refactor all of the conversions - parameterize width and use same template.
3364 */
3365 /* unop vA, vB */
3366 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003367 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003368 GET_VREG w0, w3
3369 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003370 scvtf s0, w0 // d0<- op
3371 GET_INST_OPCODE ip // extract opcode from wINST
3372 SET_VREG s0, w4 // vA<- d0
3373 GOTO_OPCODE ip // jump to next instruction
3374
3375
3376/* ------------------------------ */
3377 .balign 128
3378.L_op_int_to_double: /* 0x83 */
3379/* File: arm64/op_int_to_double.S */
3380/* File: arm64/funopWider.S */
3381 /*
3382 * Generic 32bit-to-64bit floating point unary operation. Provide an
3383 * "instr" line that specifies an instruction that performs "d0 = op w0".
3384 *
3385 * For: int-to-double, float-to-double, float-to-long
3386 */
3387 /* unop vA, vB */
3388 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003389 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003390 GET_VREG w0, w3
3391 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003392 scvtf d0, w0 // d0<- op
3393 GET_INST_OPCODE ip // extract opcode from wINST
3394 SET_VREG_WIDE d0, w4 // vA<- d0
3395 GOTO_OPCODE ip // jump to next instruction
3396
3397
3398/* ------------------------------ */
3399 .balign 128
3400.L_op_long_to_int: /* 0x84 */
3401/* File: arm64/op_long_to_int.S */
Vladimir Marko20421b92016-07-26 16:38:11 +01003402/* we ignore the high word, making this equivalent to a 32-bit reg move */
3403/* File: arm64/op_move.S */
3404 /* for move, move-object, long-to-int */
3405 /* op vA, vB */
3406 lsr w1, wINST, #12 // x1<- B from 15:12
3407 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003408 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003409 GET_VREG w2, w1 // x2<- fp[B]
3410 GET_INST_OPCODE ip // ip<- opcode from wINST
3411 .if 0
3412 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
3413 .else
3414 SET_VREG w2, w0 // fp[A]<- x2
3415 .endif
3416 GOTO_OPCODE ip // execute next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003417
3418
3419/* ------------------------------ */
3420 .balign 128
3421.L_op_long_to_float: /* 0x85 */
3422/* File: arm64/op_long_to_float.S */
3423/* File: arm64/funopNarrower.S */
3424 /*
3425 * Generic 64bit-to-32bit floating point unary operation. Provide an
3426 * "instr" line that specifies an instruction that performs "s0 = op x0".
3427 *
3428 * For: int-to-double, float-to-double, float-to-long
3429 */
3430 /* unop vA, vB */
3431 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003432 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003433 GET_VREG_WIDE x0, w3
3434 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003435 scvtf s0, x0 // d0<- op
3436 GET_INST_OPCODE ip // extract opcode from wINST
3437 SET_VREG s0, w4 // vA<- d0
3438 GOTO_OPCODE ip // jump to next instruction
3439
3440
3441/* ------------------------------ */
3442 .balign 128
3443.L_op_long_to_double: /* 0x86 */
3444/* File: arm64/op_long_to_double.S */
3445/* File: arm64/funopWide.S */
3446 /*
3447 * Generic 64bit-to-64bit floating point unary operation. Provide an
3448 * "instr" line that specifies an instruction that performs "d0 = op x0".
3449 *
3450 * For: long-to-double, double-to-long
3451 */
3452 /* unop vA, vB */
3453 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003454 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003455 GET_VREG_WIDE x0, w3
3456 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003457 scvtf d0, x0 // d0<- op
3458 GET_INST_OPCODE ip // extract opcode from wINST
3459 SET_VREG_WIDE d0, w4 // vA<- d0
3460 GOTO_OPCODE ip // jump to next instruction
3461
3462
3463/* ------------------------------ */
3464 .balign 128
3465.L_op_float_to_int: /* 0x87 */
3466/* File: arm64/op_float_to_int.S */
3467/* File: arm64/funopNarrow.S */
3468 /*
3469 * Generic 32bit-to-32bit floating point unary operation. Provide an
3470 * "instr" line that specifies an instruction that performs "w0 = op s0".
3471 *
3472 * For: int-to-float, float-to-int
3473 * TODO: refactor all of the conversions - parameterize width and use same template.
3474 */
3475 /* unop vA, vB */
3476 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003477 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003478 GET_VREG s0, w3
3479 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003480 fcvtzs w0, s0 // d0<- op
3481 GET_INST_OPCODE ip // extract opcode from wINST
3482 SET_VREG w0, w4 // vA<- d0
3483 GOTO_OPCODE ip // jump to next instruction
3484
3485
3486/* ------------------------------ */
3487 .balign 128
3488.L_op_float_to_long: /* 0x88 */
3489/* File: arm64/op_float_to_long.S */
3490/* File: arm64/funopWider.S */
3491 /*
3492 * Generic 32bit-to-64bit floating point unary operation. Provide an
3493 * "instr" line that specifies an instruction that performs "x0 = op s0".
3494 *
3495 * For: int-to-double, float-to-double, float-to-long
3496 */
3497 /* unop vA, vB */
3498 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003499 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003500 GET_VREG s0, w3
3501 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003502 fcvtzs x0, s0 // d0<- op
3503 GET_INST_OPCODE ip // extract opcode from wINST
3504 SET_VREG_WIDE x0, w4 // vA<- d0
3505 GOTO_OPCODE ip // jump to next instruction
3506
3507
3508/* ------------------------------ */
3509 .balign 128
3510.L_op_float_to_double: /* 0x89 */
3511/* File: arm64/op_float_to_double.S */
3512/* File: arm64/funopWider.S */
3513 /*
3514 * Generic 32bit-to-64bit floating point unary operation. Provide an
3515 * "instr" line that specifies an instruction that performs "d0 = op s0".
3516 *
3517 * For: int-to-double, float-to-double, float-to-long
3518 */
3519 /* unop vA, vB */
3520 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003521 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003522 GET_VREG s0, w3
3523 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003524 fcvt d0, s0 // d0<- op
3525 GET_INST_OPCODE ip // extract opcode from wINST
3526 SET_VREG_WIDE d0, w4 // vA<- d0
3527 GOTO_OPCODE ip // jump to next instruction
3528
3529
3530/* ------------------------------ */
3531 .balign 128
3532.L_op_double_to_int: /* 0x8a */
3533/* File: arm64/op_double_to_int.S */
3534/* File: arm64/funopNarrower.S */
3535 /*
3536 * Generic 64bit-to-32bit floating point unary operation. Provide an
3537 * "instr" line that specifies an instruction that performs "w0 = op d0".
3538 *
3539 * For: int-to-double, float-to-double, float-to-long
3540 */
3541 /* unop vA, vB */
3542 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003543 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003544 GET_VREG_WIDE d0, w3
3545 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003546 fcvtzs w0, d0 // d0<- op
3547 GET_INST_OPCODE ip // extract opcode from wINST
3548 SET_VREG w0, w4 // vA<- d0
3549 GOTO_OPCODE ip // jump to next instruction
3550
3551
3552/* ------------------------------ */
3553 .balign 128
3554.L_op_double_to_long: /* 0x8b */
3555/* File: arm64/op_double_to_long.S */
3556/* File: arm64/funopWide.S */
3557 /*
3558 * Generic 64bit-to-64bit floating point unary operation. Provide an
3559 * "instr" line that specifies an instruction that performs "x0 = op d0".
3560 *
3561 * For: long-to-double, double-to-long
3562 */
3563 /* unop vA, vB */
3564 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003565 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003566 GET_VREG_WIDE d0, w3
3567 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003568 fcvtzs x0, d0 // d0<- op
3569 GET_INST_OPCODE ip // extract opcode from wINST
3570 SET_VREG_WIDE x0, w4 // vA<- d0
3571 GOTO_OPCODE ip // jump to next instruction
3572
3573
3574/* ------------------------------ */
3575 .balign 128
3576.L_op_double_to_float: /* 0x8c */
3577/* File: arm64/op_double_to_float.S */
3578/* File: arm64/funopNarrower.S */
3579 /*
3580 * Generic 64bit-to-32bit floating point unary operation. Provide an
3581 * "instr" line that specifies an instruction that performs "s0 = op d0".
3582 *
3583 * For: int-to-double, float-to-double, float-to-long
3584 */
3585 /* unop vA, vB */
3586 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003587 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003588 GET_VREG_WIDE d0, w3
3589 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003590 fcvt s0, d0 // d0<- op
3591 GET_INST_OPCODE ip // extract opcode from wINST
3592 SET_VREG s0, w4 // vA<- d0
3593 GOTO_OPCODE ip // jump to next instruction
3594
3595
3596/* ------------------------------ */
3597 .balign 128
3598.L_op_int_to_byte: /* 0x8d */
3599/* File: arm64/op_int_to_byte.S */
3600/* File: arm64/unop.S */
3601 /*
3602 * Generic 32-bit unary operation. Provide an "instr" line that
3603 * specifies an instruction that performs "result = op w0".
3604 * This could be an ARM instruction or a function call.
3605 *
3606 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3607 * int-to-byte, int-to-char, int-to-short
3608 */
3609 /* unop vA, vB */
3610 lsr w3, wINST, #12 // w3<- B
3611 GET_VREG w0, w3 // w0<- vB
3612 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003613 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3614 sxtb w0, w0 // w0<- op, w0-w3 changed
3615 GET_INST_OPCODE ip // extract opcode from rINST
3616 SET_VREG w0, w9 // vAA<- w0
3617 GOTO_OPCODE ip // jump to next instruction
3618 /* 8-9 instructions */
3619
3620
3621/* ------------------------------ */
3622 .balign 128
3623.L_op_int_to_char: /* 0x8e */
3624/* File: arm64/op_int_to_char.S */
3625/* File: arm64/unop.S */
3626 /*
3627 * Generic 32-bit unary operation. Provide an "instr" line that
3628 * specifies an instruction that performs "result = op w0".
3629 * This could be an ARM instruction or a function call.
3630 *
3631 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3632 * int-to-byte, int-to-char, int-to-short
3633 */
3634 /* unop vA, vB */
3635 lsr w3, wINST, #12 // w3<- B
3636 GET_VREG w0, w3 // w0<- vB
3637 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003638 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3639 uxth w0, w0 // w0<- op, w0-w3 changed
3640 GET_INST_OPCODE ip // extract opcode from rINST
3641 SET_VREG w0, w9 // vAA<- w0
3642 GOTO_OPCODE ip // jump to next instruction
3643 /* 8-9 instructions */
3644
3645
3646/* ------------------------------ */
3647 .balign 128
3648.L_op_int_to_short: /* 0x8f */
3649/* File: arm64/op_int_to_short.S */
3650/* File: arm64/unop.S */
3651 /*
3652 * Generic 32-bit unary operation. Provide an "instr" line that
3653 * specifies an instruction that performs "result = op w0".
3654 * This could be an ARM instruction or a function call.
3655 *
3656 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3657 * int-to-byte, int-to-char, int-to-short
3658 */
3659 /* unop vA, vB */
3660 lsr w3, wINST, #12 // w3<- B
3661 GET_VREG w0, w3 // w0<- vB
3662 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003663 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3664 sxth w0, w0 // w0<- op, w0-w3 changed
3665 GET_INST_OPCODE ip // extract opcode from rINST
3666 SET_VREG w0, w9 // vAA<- w0
3667 GOTO_OPCODE ip // jump to next instruction
3668 /* 8-9 instructions */
3669
3670
3671/* ------------------------------ */
3672 .balign 128
3673.L_op_add_int: /* 0x90 */
3674/* File: arm64/op_add_int.S */
3675/* File: arm64/binop.S */
3676 /*
3677 * Generic 32-bit binary operation. Provide an "instr" line that
3678 * specifies an instruction that performs "result = w0 op w1".
3679 * This could be an ARM instruction or a function call. (If the result
3680 * comes back in a register other than w0, you can override "result".)
3681 *
3682 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3683 * vCC (w1). Useful for integer division and modulus. Note that we
3684 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3685 * handles it correctly.
3686 *
3687 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3688 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3689 * mul-float, div-float, rem-float
3690 */
3691 /* binop vAA, vBB, vCC */
3692 FETCH w0, 1 // w0<- CCBB
3693 lsr w9, wINST, #8 // w9<- AA
3694 lsr w3, w0, #8 // w3<- CC
3695 and w2, w0, #255 // w2<- BB
3696 GET_VREG w1, w3 // w1<- vCC
3697 GET_VREG w0, w2 // w0<- vBB
3698 .if 0
3699 cbz w1, common_errDivideByZero // is second operand zero?
3700 .endif
3701 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3702 // optional op; may set condition codes
3703 add w0, w0, w1 // w0<- op, w0-w3 changed
3704 GET_INST_OPCODE ip // extract opcode from rINST
3705 SET_VREG w0, w9 // vAA<- w0
3706 GOTO_OPCODE ip // jump to next instruction
3707 /* 11-14 instructions */
3708
3709
3710/* ------------------------------ */
3711 .balign 128
3712.L_op_sub_int: /* 0x91 */
3713/* File: arm64/op_sub_int.S */
3714/* File: arm64/binop.S */
3715 /*
3716 * Generic 32-bit binary operation. Provide an "instr" line that
3717 * specifies an instruction that performs "result = w0 op w1".
3718 * This could be an ARM instruction or a function call. (If the result
3719 * comes back in a register other than w0, you can override "result".)
3720 *
3721 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3722 * vCC (w1). Useful for integer division and modulus. Note that we
3723 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3724 * handles it correctly.
3725 *
3726 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3727 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3728 * mul-float, div-float, rem-float
3729 */
3730 /* binop vAA, vBB, vCC */
3731 FETCH w0, 1 // w0<- CCBB
3732 lsr w9, wINST, #8 // w9<- AA
3733 lsr w3, w0, #8 // w3<- CC
3734 and w2, w0, #255 // w2<- BB
3735 GET_VREG w1, w3 // w1<- vCC
3736 GET_VREG w0, w2 // w0<- vBB
3737 .if 0
3738 cbz w1, common_errDivideByZero // is second operand zero?
3739 .endif
3740 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3741 // optional op; may set condition codes
3742 sub w0, w0, w1 // w0<- op, w0-w3 changed
3743 GET_INST_OPCODE ip // extract opcode from rINST
3744 SET_VREG w0, w9 // vAA<- w0
3745 GOTO_OPCODE ip // jump to next instruction
3746 /* 11-14 instructions */
3747
3748
3749/* ------------------------------ */
3750 .balign 128
3751.L_op_mul_int: /* 0x92 */
3752/* File: arm64/op_mul_int.S */
3753/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
3754/* File: arm64/binop.S */
3755 /*
3756 * Generic 32-bit binary operation. Provide an "instr" line that
3757 * specifies an instruction that performs "result = w0 op w1".
3758 * This could be an ARM instruction or a function call. (If the result
3759 * comes back in a register other than w0, you can override "result".)
3760 *
3761 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3762 * vCC (w1). Useful for integer division and modulus. Note that we
3763 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3764 * handles it correctly.
3765 *
3766 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3767 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3768 * mul-float, div-float, rem-float
3769 */
3770 /* binop vAA, vBB, vCC */
3771 FETCH w0, 1 // w0<- CCBB
3772 lsr w9, wINST, #8 // w9<- AA
3773 lsr w3, w0, #8 // w3<- CC
3774 and w2, w0, #255 // w2<- BB
3775 GET_VREG w1, w3 // w1<- vCC
3776 GET_VREG w0, w2 // w0<- vBB
3777 .if 0
3778 cbz w1, common_errDivideByZero // is second operand zero?
3779 .endif
3780 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3781 // optional op; may set condition codes
3782 mul w0, w1, w0 // w0<- op, w0-w3 changed
3783 GET_INST_OPCODE ip // extract opcode from rINST
3784 SET_VREG w0, w9 // vAA<- w0
3785 GOTO_OPCODE ip // jump to next instruction
3786 /* 11-14 instructions */
3787
3788
3789/* ------------------------------ */
3790 .balign 128
3791.L_op_div_int: /* 0x93 */
3792/* File: arm64/op_div_int.S */
3793/* File: arm64/binop.S */
3794 /*
3795 * Generic 32-bit binary operation. Provide an "instr" line that
3796 * specifies an instruction that performs "result = w0 op w1".
3797 * This could be an ARM instruction or a function call. (If the result
3798 * comes back in a register other than w0, you can override "result".)
3799 *
3800 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3801 * vCC (w1). Useful for integer division and modulus. Note that we
3802 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3803 * handles it correctly.
3804 *
3805 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3806 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3807 * mul-float, div-float, rem-float
3808 */
3809 /* binop vAA, vBB, vCC */
3810 FETCH w0, 1 // w0<- CCBB
3811 lsr w9, wINST, #8 // w9<- AA
3812 lsr w3, w0, #8 // w3<- CC
3813 and w2, w0, #255 // w2<- BB
3814 GET_VREG w1, w3 // w1<- vCC
3815 GET_VREG w0, w2 // w0<- vBB
3816 .if 1
3817 cbz w1, common_errDivideByZero // is second operand zero?
3818 .endif
3819 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3820 // optional op; may set condition codes
3821 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
3822 GET_INST_OPCODE ip // extract opcode from rINST
3823 SET_VREG w0, w9 // vAA<- w0
3824 GOTO_OPCODE ip // jump to next instruction
3825 /* 11-14 instructions */
3826
3827
3828/* ------------------------------ */
3829 .balign 128
3830.L_op_rem_int: /* 0x94 */
3831/* File: arm64/op_rem_int.S */
3832/* File: arm64/binop.S */
3833 /*
3834 * Generic 32-bit binary operation. Provide an "instr" line that
3835 * specifies an instruction that performs "result = w0 op w1".
3836 * This could be an ARM instruction or a function call. (If the result
3837 * comes back in a register other than w0, you can override "result".)
3838 *
3839 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3840 * vCC (w1). Useful for integer division and modulus. Note that we
3841 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3842 * handles it correctly.
3843 *
3844 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3845 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3846 * mul-float, div-float, rem-float
3847 */
3848 /* binop vAA, vBB, vCC */
3849 FETCH w0, 1 // w0<- CCBB
3850 lsr w9, wINST, #8 // w9<- AA
3851 lsr w3, w0, #8 // w3<- CC
3852 and w2, w0, #255 // w2<- BB
3853 GET_VREG w1, w3 // w1<- vCC
3854 GET_VREG w0, w2 // w0<- vBB
3855 .if 1
3856 cbz w1, common_errDivideByZero // is second operand zero?
3857 .endif
3858 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3859 sdiv w2, w0, w1 // optional op; may set condition codes
3860 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
3861 GET_INST_OPCODE ip // extract opcode from rINST
3862 SET_VREG w0, w9 // vAA<- w0
3863 GOTO_OPCODE ip // jump to next instruction
3864 /* 11-14 instructions */
3865
3866
3867/* ------------------------------ */
3868 .balign 128
3869.L_op_and_int: /* 0x95 */
3870/* File: arm64/op_and_int.S */
3871/* File: arm64/binop.S */
3872 /*
3873 * Generic 32-bit binary operation. Provide an "instr" line that
3874 * specifies an instruction that performs "result = w0 op w1".
3875 * This could be an ARM instruction or a function call. (If the result
3876 * comes back in a register other than w0, you can override "result".)
3877 *
3878 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3879 * vCC (w1). Useful for integer division and modulus. Note that we
3880 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3881 * handles it correctly.
3882 *
3883 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3884 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3885 * mul-float, div-float, rem-float
3886 */
3887 /* binop vAA, vBB, vCC */
3888 FETCH w0, 1 // w0<- CCBB
3889 lsr w9, wINST, #8 // w9<- AA
3890 lsr w3, w0, #8 // w3<- CC
3891 and w2, w0, #255 // w2<- BB
3892 GET_VREG w1, w3 // w1<- vCC
3893 GET_VREG w0, w2 // w0<- vBB
3894 .if 0
3895 cbz w1, common_errDivideByZero // is second operand zero?
3896 .endif
3897 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3898 // optional op; may set condition codes
3899 and w0, w0, w1 // w0<- op, w0-w3 changed
3900 GET_INST_OPCODE ip // extract opcode from rINST
3901 SET_VREG w0, w9 // vAA<- w0
3902 GOTO_OPCODE ip // jump to next instruction
3903 /* 11-14 instructions */
3904
3905
3906/* ------------------------------ */
3907 .balign 128
3908.L_op_or_int: /* 0x96 */
3909/* File: arm64/op_or_int.S */
3910/* File: arm64/binop.S */
3911 /*
3912 * Generic 32-bit binary operation. Provide an "instr" line that
3913 * specifies an instruction that performs "result = w0 op w1".
3914 * This could be an ARM instruction or a function call. (If the result
3915 * comes back in a register other than w0, you can override "result".)
3916 *
3917 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3918 * vCC (w1). Useful for integer division and modulus. Note that we
3919 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3920 * handles it correctly.
3921 *
3922 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3923 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3924 * mul-float, div-float, rem-float
3925 */
3926 /* binop vAA, vBB, vCC */
3927 FETCH w0, 1 // w0<- CCBB
3928 lsr w9, wINST, #8 // w9<- AA
3929 lsr w3, w0, #8 // w3<- CC
3930 and w2, w0, #255 // w2<- BB
3931 GET_VREG w1, w3 // w1<- vCC
3932 GET_VREG w0, w2 // w0<- vBB
3933 .if 0
3934 cbz w1, common_errDivideByZero // is second operand zero?
3935 .endif
3936 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3937 // optional op; may set condition codes
3938 orr w0, w0, w1 // w0<- op, w0-w3 changed
3939 GET_INST_OPCODE ip // extract opcode from rINST
3940 SET_VREG w0, w9 // vAA<- w0
3941 GOTO_OPCODE ip // jump to next instruction
3942 /* 11-14 instructions */
3943
3944
3945/* ------------------------------ */
3946 .balign 128
3947.L_op_xor_int: /* 0x97 */
3948/* File: arm64/op_xor_int.S */
3949/* File: arm64/binop.S */
3950 /*
3951 * Generic 32-bit binary operation. Provide an "instr" line that
3952 * specifies an instruction that performs "result = w0 op w1".
3953 * This could be an ARM instruction or a function call. (If the result
3954 * comes back in a register other than w0, you can override "result".)
3955 *
3956 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3957 * vCC (w1). Useful for integer division and modulus. Note that we
3958 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3959 * handles it correctly.
3960 *
3961 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3962 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3963 * mul-float, div-float, rem-float
3964 */
3965 /* binop vAA, vBB, vCC */
3966 FETCH w0, 1 // w0<- CCBB
3967 lsr w9, wINST, #8 // w9<- AA
3968 lsr w3, w0, #8 // w3<- CC
3969 and w2, w0, #255 // w2<- BB
3970 GET_VREG w1, w3 // w1<- vCC
3971 GET_VREG w0, w2 // w0<- vBB
3972 .if 0
3973 cbz w1, common_errDivideByZero // is second operand zero?
3974 .endif
3975 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3976 // optional op; may set condition codes
3977 eor w0, w0, w1 // w0<- op, w0-w3 changed
3978 GET_INST_OPCODE ip // extract opcode from rINST
3979 SET_VREG w0, w9 // vAA<- w0
3980 GOTO_OPCODE ip // jump to next instruction
3981 /* 11-14 instructions */
3982
3983
3984/* ------------------------------ */
3985 .balign 128
3986.L_op_shl_int: /* 0x98 */
3987/* File: arm64/op_shl_int.S */
3988/* File: arm64/binop.S */
3989 /*
3990 * Generic 32-bit binary operation. Provide an "instr" line that
3991 * specifies an instruction that performs "result = w0 op w1".
3992 * This could be an ARM instruction or a function call. (If the result
3993 * comes back in a register other than w0, you can override "result".)
3994 *
3995 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3996 * vCC (w1). Useful for integer division and modulus. Note that we
3997 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3998 * handles it correctly.
3999 *
4000 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4001 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4002 * mul-float, div-float, rem-float
4003 */
4004 /* binop vAA, vBB, vCC */
4005 FETCH w0, 1 // w0<- CCBB
4006 lsr w9, wINST, #8 // w9<- AA
4007 lsr w3, w0, #8 // w3<- CC
4008 and w2, w0, #255 // w2<- BB
4009 GET_VREG w1, w3 // w1<- vCC
4010 GET_VREG w0, w2 // w0<- vBB
4011 .if 0
4012 cbz w1, common_errDivideByZero // is second operand zero?
4013 .endif
4014 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004015 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004016 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4017 GET_INST_OPCODE ip // extract opcode from rINST
4018 SET_VREG w0, w9 // vAA<- w0
4019 GOTO_OPCODE ip // jump to next instruction
4020 /* 11-14 instructions */
4021
4022
4023/* ------------------------------ */
4024 .balign 128
4025.L_op_shr_int: /* 0x99 */
4026/* File: arm64/op_shr_int.S */
4027/* File: arm64/binop.S */
4028 /*
4029 * Generic 32-bit binary operation. Provide an "instr" line that
4030 * specifies an instruction that performs "result = w0 op w1".
4031 * This could be an ARM instruction or a function call. (If the result
4032 * comes back in a register other than w0, you can override "result".)
4033 *
4034 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4035 * vCC (w1). Useful for integer division and modulus. Note that we
4036 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4037 * handles it correctly.
4038 *
4039 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4040 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4041 * mul-float, div-float, rem-float
4042 */
4043 /* binop vAA, vBB, vCC */
4044 FETCH w0, 1 // w0<- CCBB
4045 lsr w9, wINST, #8 // w9<- AA
4046 lsr w3, w0, #8 // w3<- CC
4047 and w2, w0, #255 // w2<- BB
4048 GET_VREG w1, w3 // w1<- vCC
4049 GET_VREG w0, w2 // w0<- vBB
4050 .if 0
4051 cbz w1, common_errDivideByZero // is second operand zero?
4052 .endif
4053 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004054 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004055 asr w0, w0, w1 // w0<- op, w0-w3 changed
4056 GET_INST_OPCODE ip // extract opcode from rINST
4057 SET_VREG w0, w9 // vAA<- w0
4058 GOTO_OPCODE ip // jump to next instruction
4059 /* 11-14 instructions */
4060
4061
4062/* ------------------------------ */
4063 .balign 128
4064.L_op_ushr_int: /* 0x9a */
4065/* File: arm64/op_ushr_int.S */
4066/* File: arm64/binop.S */
4067 /*
4068 * Generic 32-bit binary operation. Provide an "instr" line that
4069 * specifies an instruction that performs "result = w0 op w1".
4070 * This could be an ARM instruction or a function call. (If the result
4071 * comes back in a register other than w0, you can override "result".)
4072 *
4073 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4074 * vCC (w1). Useful for integer division and modulus. Note that we
4075 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4076 * handles it correctly.
4077 *
4078 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4079 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4080 * mul-float, div-float, rem-float
4081 */
4082 /* binop vAA, vBB, vCC */
4083 FETCH w0, 1 // w0<- CCBB
4084 lsr w9, wINST, #8 // w9<- AA
4085 lsr w3, w0, #8 // w3<- CC
4086 and w2, w0, #255 // w2<- BB
4087 GET_VREG w1, w3 // w1<- vCC
4088 GET_VREG w0, w2 // w0<- vBB
4089 .if 0
4090 cbz w1, common_errDivideByZero // is second operand zero?
4091 .endif
4092 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004093 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004094 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4095 GET_INST_OPCODE ip // extract opcode from rINST
4096 SET_VREG w0, w9 // vAA<- w0
4097 GOTO_OPCODE ip // jump to next instruction
4098 /* 11-14 instructions */
4099
4100
4101/* ------------------------------ */
4102 .balign 128
4103.L_op_add_long: /* 0x9b */
4104/* File: arm64/op_add_long.S */
4105/* File: arm64/binopWide.S */
4106 /*
4107 * Generic 64-bit binary operation. Provide an "instr" line that
4108 * specifies an instruction that performs "result = x1 op x2".
4109 * This could be an ARM instruction or a function call. (If the result
4110 * comes back in a register other than x0, you can override "result".)
4111 *
4112 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4113 * vCC (w1). Useful for integer division and modulus.
4114 *
4115 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4116 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4117 */
4118 /* binop vAA, vBB, vCC */
4119 FETCH w0, 1 // w0<- CCBB
4120 lsr w4, wINST, #8 // w4<- AA
4121 lsr w2, w0, #8 // w2<- CC
4122 and w1, w0, #255 // w1<- BB
4123 GET_VREG_WIDE x2, w2 // w2<- vCC
4124 GET_VREG_WIDE x1, w1 // w1<- vBB
4125 .if 0
4126 cbz x2, common_errDivideByZero // is second operand zero?
4127 .endif
4128 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4129
4130 add x0, x1, x2 // x0<- op, w0-w4 changed
4131 GET_INST_OPCODE ip // extract opcode from rINST
4132 SET_VREG_WIDE x0, w4 // vAA<- x0
4133 GOTO_OPCODE ip // jump to next instruction
4134 /* 11-14 instructions */
4135
4136
4137/* ------------------------------ */
4138 .balign 128
4139.L_op_sub_long: /* 0x9c */
4140/* File: arm64/op_sub_long.S */
4141/* File: arm64/binopWide.S */
4142 /*
4143 * Generic 64-bit binary operation. Provide an "instr" line that
4144 * specifies an instruction that performs "result = x1 op x2".
4145 * This could be an ARM instruction or a function call. (If the result
4146 * comes back in a register other than x0, you can override "result".)
4147 *
4148 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4149 * vCC (w1). Useful for integer division and modulus.
4150 *
4151 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4152 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4153 */
4154 /* binop vAA, vBB, vCC */
4155 FETCH w0, 1 // w0<- CCBB
4156 lsr w4, wINST, #8 // w4<- AA
4157 lsr w2, w0, #8 // w2<- CC
4158 and w1, w0, #255 // w1<- BB
4159 GET_VREG_WIDE x2, w2 // w2<- vCC
4160 GET_VREG_WIDE x1, w1 // w1<- vBB
4161 .if 0
4162 cbz x2, common_errDivideByZero // is second operand zero?
4163 .endif
4164 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4165
4166 sub x0, x1, x2 // x0<- op, w0-w4 changed
4167 GET_INST_OPCODE ip // extract opcode from rINST
4168 SET_VREG_WIDE x0, w4 // vAA<- x0
4169 GOTO_OPCODE ip // jump to next instruction
4170 /* 11-14 instructions */
4171
4172
4173/* ------------------------------ */
4174 .balign 128
4175.L_op_mul_long: /* 0x9d */
4176/* File: arm64/op_mul_long.S */
4177/* File: arm64/binopWide.S */
4178 /*
4179 * Generic 64-bit binary operation. Provide an "instr" line that
4180 * specifies an instruction that performs "result = x1 op x2".
4181 * This could be an ARM instruction or a function call. (If the result
4182 * comes back in a register other than x0, you can override "result".)
4183 *
4184 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4185 * vCC (w1). Useful for integer division and modulus.
4186 *
4187 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4188 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4189 */
4190 /* binop vAA, vBB, vCC */
4191 FETCH w0, 1 // w0<- CCBB
4192 lsr w4, wINST, #8 // w4<- AA
4193 lsr w2, w0, #8 // w2<- CC
4194 and w1, w0, #255 // w1<- BB
4195 GET_VREG_WIDE x2, w2 // w2<- vCC
4196 GET_VREG_WIDE x1, w1 // w1<- vBB
4197 .if 0
4198 cbz x2, common_errDivideByZero // is second operand zero?
4199 .endif
4200 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4201
4202 mul x0, x1, x2 // x0<- op, w0-w4 changed
4203 GET_INST_OPCODE ip // extract opcode from rINST
4204 SET_VREG_WIDE x0, w4 // vAA<- x0
4205 GOTO_OPCODE ip // jump to next instruction
4206 /* 11-14 instructions */
4207
4208
4209/* ------------------------------ */
4210 .balign 128
4211.L_op_div_long: /* 0x9e */
4212/* File: arm64/op_div_long.S */
4213/* File: arm64/binopWide.S */
4214 /*
4215 * Generic 64-bit binary operation. Provide an "instr" line that
4216 * specifies an instruction that performs "result = x1 op x2".
4217 * This could be an ARM instruction or a function call. (If the result
4218 * comes back in a register other than x0, you can override "result".)
4219 *
4220 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4221 * vCC (w1). Useful for integer division and modulus.
4222 *
4223 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4224 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4225 */
4226 /* binop vAA, vBB, vCC */
4227 FETCH w0, 1 // w0<- CCBB
4228 lsr w4, wINST, #8 // w4<- AA
4229 lsr w2, w0, #8 // w2<- CC
4230 and w1, w0, #255 // w1<- BB
4231 GET_VREG_WIDE x2, w2 // w2<- vCC
4232 GET_VREG_WIDE x1, w1 // w1<- vBB
4233 .if 1
4234 cbz x2, common_errDivideByZero // is second operand zero?
4235 .endif
4236 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4237
4238 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4239 GET_INST_OPCODE ip // extract opcode from rINST
4240 SET_VREG_WIDE x0, w4 // vAA<- x0
4241 GOTO_OPCODE ip // jump to next instruction
4242 /* 11-14 instructions */
4243
4244
4245/* ------------------------------ */
4246 .balign 128
4247.L_op_rem_long: /* 0x9f */
4248/* File: arm64/op_rem_long.S */
4249/* File: arm64/binopWide.S */
4250 /*
4251 * Generic 64-bit binary operation. Provide an "instr" line that
4252 * specifies an instruction that performs "result = x1 op x2".
4253 * This could be an ARM instruction or a function call. (If the result
4254 * comes back in a register other than x0, you can override "result".)
4255 *
4256 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4257 * vCC (w1). Useful for integer division and modulus.
4258 *
4259 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4260 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4261 */
4262 /* binop vAA, vBB, vCC */
4263 FETCH w0, 1 // w0<- CCBB
4264 lsr w4, wINST, #8 // w4<- AA
4265 lsr w2, w0, #8 // w2<- CC
4266 and w1, w0, #255 // w1<- BB
4267 GET_VREG_WIDE x2, w2 // w2<- vCC
4268 GET_VREG_WIDE x1, w1 // w1<- vBB
4269 .if 1
4270 cbz x2, common_errDivideByZero // is second operand zero?
4271 .endif
4272 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4273 sdiv x3, x1, x2
4274 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4275 GET_INST_OPCODE ip // extract opcode from rINST
4276 SET_VREG_WIDE x0, w4 // vAA<- x0
4277 GOTO_OPCODE ip // jump to next instruction
4278 /* 11-14 instructions */
4279
4280
4281/* ------------------------------ */
4282 .balign 128
4283.L_op_and_long: /* 0xa0 */
4284/* File: arm64/op_and_long.S */
4285/* File: arm64/binopWide.S */
4286 /*
4287 * Generic 64-bit binary operation. Provide an "instr" line that
4288 * specifies an instruction that performs "result = x1 op x2".
4289 * This could be an ARM instruction or a function call. (If the result
4290 * comes back in a register other than x0, you can override "result".)
4291 *
4292 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4293 * vCC (w1). Useful for integer division and modulus.
4294 *
4295 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4296 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4297 */
4298 /* binop vAA, vBB, vCC */
4299 FETCH w0, 1 // w0<- CCBB
4300 lsr w4, wINST, #8 // w4<- AA
4301 lsr w2, w0, #8 // w2<- CC
4302 and w1, w0, #255 // w1<- BB
4303 GET_VREG_WIDE x2, w2 // w2<- vCC
4304 GET_VREG_WIDE x1, w1 // w1<- vBB
4305 .if 0
4306 cbz x2, common_errDivideByZero // is second operand zero?
4307 .endif
4308 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4309
4310 and x0, x1, x2 // x0<- op, w0-w4 changed
4311 GET_INST_OPCODE ip // extract opcode from rINST
4312 SET_VREG_WIDE x0, w4 // vAA<- x0
4313 GOTO_OPCODE ip // jump to next instruction
4314 /* 11-14 instructions */
4315
4316
4317/* ------------------------------ */
4318 .balign 128
4319.L_op_or_long: /* 0xa1 */
4320/* File: arm64/op_or_long.S */
4321/* File: arm64/binopWide.S */
4322 /*
4323 * Generic 64-bit binary operation. Provide an "instr" line that
4324 * specifies an instruction that performs "result = x1 op x2".
4325 * This could be an ARM instruction or a function call. (If the result
4326 * comes back in a register other than x0, you can override "result".)
4327 *
4328 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4329 * vCC (w1). Useful for integer division and modulus.
4330 *
4331 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4332 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4333 */
4334 /* binop vAA, vBB, vCC */
4335 FETCH w0, 1 // w0<- CCBB
4336 lsr w4, wINST, #8 // w4<- AA
4337 lsr w2, w0, #8 // w2<- CC
4338 and w1, w0, #255 // w1<- BB
4339 GET_VREG_WIDE x2, w2 // w2<- vCC
4340 GET_VREG_WIDE x1, w1 // w1<- vBB
4341 .if 0
4342 cbz x2, common_errDivideByZero // is second operand zero?
4343 .endif
4344 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4345
4346 orr x0, x1, x2 // x0<- op, w0-w4 changed
4347 GET_INST_OPCODE ip // extract opcode from rINST
4348 SET_VREG_WIDE x0, w4 // vAA<- x0
4349 GOTO_OPCODE ip // jump to next instruction
4350 /* 11-14 instructions */
4351
4352
4353/* ------------------------------ */
4354 .balign 128
4355.L_op_xor_long: /* 0xa2 */
4356/* File: arm64/op_xor_long.S */
4357/* File: arm64/binopWide.S */
4358 /*
4359 * Generic 64-bit binary operation. Provide an "instr" line that
4360 * specifies an instruction that performs "result = x1 op x2".
4361 * This could be an ARM instruction or a function call. (If the result
4362 * comes back in a register other than x0, you can override "result".)
4363 *
4364 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4365 * vCC (w1). Useful for integer division and modulus.
4366 *
4367 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4368 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4369 */
4370 /* binop vAA, vBB, vCC */
4371 FETCH w0, 1 // w0<- CCBB
4372 lsr w4, wINST, #8 // w4<- AA
4373 lsr w2, w0, #8 // w2<- CC
4374 and w1, w0, #255 // w1<- BB
4375 GET_VREG_WIDE x2, w2 // w2<- vCC
4376 GET_VREG_WIDE x1, w1 // w1<- vBB
4377 .if 0
4378 cbz x2, common_errDivideByZero // is second operand zero?
4379 .endif
4380 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4381
4382 eor x0, x1, x2 // x0<- op, w0-w4 changed
4383 GET_INST_OPCODE ip // extract opcode from rINST
4384 SET_VREG_WIDE x0, w4 // vAA<- x0
4385 GOTO_OPCODE ip // jump to next instruction
4386 /* 11-14 instructions */
4387
4388
4389/* ------------------------------ */
4390 .balign 128
4391.L_op_shl_long: /* 0xa3 */
4392/* File: arm64/op_shl_long.S */
4393/* File: arm64/shiftWide.S */
4394 /*
4395 * 64-bit shift operation.
4396 *
4397 * For: shl-long, shr-long, ushr-long
4398 */
4399 /* binop vAA, vBB, vCC */
4400 FETCH w0, 1 // w0<- CCBB
4401 lsr w3, wINST, #8 // w3<- AA
4402 lsr w2, w0, #8 // w2<- CC
4403 GET_VREG w2, w2 // w2<- vCC (shift count)
4404 and w1, w0, #255 // w1<- BB
4405 GET_VREG_WIDE x1, w1 // x1<- vBB
4406 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004407 lsl x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004408 GET_INST_OPCODE ip // extract opcode from rINST
4409 SET_VREG_WIDE x0, w3 // vAA<- x0
4410 GOTO_OPCODE ip // jump to next instruction
4411 /* 11-14 instructions */
4412
4413
4414/* ------------------------------ */
4415 .balign 128
4416.L_op_shr_long: /* 0xa4 */
4417/* File: arm64/op_shr_long.S */
4418/* File: arm64/shiftWide.S */
4419 /*
4420 * 64-bit shift operation.
4421 *
4422 * For: shl-long, shr-long, ushr-long
4423 */
4424 /* binop vAA, vBB, vCC */
4425 FETCH w0, 1 // w0<- CCBB
4426 lsr w3, wINST, #8 // w3<- AA
4427 lsr w2, w0, #8 // w2<- CC
4428 GET_VREG w2, w2 // w2<- vCC (shift count)
4429 and w1, w0, #255 // w1<- BB
4430 GET_VREG_WIDE x1, w1 // x1<- vBB
4431 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004432 asr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004433 GET_INST_OPCODE ip // extract opcode from rINST
4434 SET_VREG_WIDE x0, w3 // vAA<- x0
4435 GOTO_OPCODE ip // jump to next instruction
4436 /* 11-14 instructions */
4437
4438
4439/* ------------------------------ */
4440 .balign 128
4441.L_op_ushr_long: /* 0xa5 */
4442/* File: arm64/op_ushr_long.S */
4443/* File: arm64/shiftWide.S */
4444 /*
4445 * 64-bit shift operation.
4446 *
4447 * For: shl-long, shr-long, ushr-long
4448 */
4449 /* binop vAA, vBB, vCC */
4450 FETCH w0, 1 // w0<- CCBB
4451 lsr w3, wINST, #8 // w3<- AA
4452 lsr w2, w0, #8 // w2<- CC
4453 GET_VREG w2, w2 // w2<- vCC (shift count)
4454 and w1, w0, #255 // w1<- BB
4455 GET_VREG_WIDE x1, w1 // x1<- vBB
4456 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004457 lsr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004458 GET_INST_OPCODE ip // extract opcode from rINST
4459 SET_VREG_WIDE x0, w3 // vAA<- x0
4460 GOTO_OPCODE ip // jump to next instruction
4461 /* 11-14 instructions */
4462
4463
4464/* ------------------------------ */
4465 .balign 128
4466.L_op_add_float: /* 0xa6 */
4467/* File: arm64/op_add_float.S */
4468/* File: arm64/fbinop.S */
4469 /*:
4470 * Generic 32-bit floating-point operation.
4471 *
4472 * For: add-float, sub-float, mul-float, div-float
4473 * form: <op> s0, s0, s1
4474 */
4475 /* floatop vAA, vBB, vCC */
4476 FETCH w0, 1 // r0<- CCBB
4477 lsr w1, w0, #8 // r2<- CC
4478 and w0, w0, #255 // r1<- BB
4479 GET_VREG s1, w1
4480 GET_VREG s0, w0
4481 fadd s0, s0, s1 // s0<- op
4482 lsr w1, wINST, #8 // r1<- AA
4483 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4484 GET_INST_OPCODE ip // extract opcode from rINST
4485 SET_VREG s0, w1
4486 GOTO_OPCODE ip // jump to next instruction
4487
4488
4489/* ------------------------------ */
4490 .balign 128
4491.L_op_sub_float: /* 0xa7 */
4492/* File: arm64/op_sub_float.S */
4493/* File: arm64/fbinop.S */
4494 /*:
4495 * Generic 32-bit floating-point operation.
4496 *
4497 * For: add-float, sub-float, mul-float, div-float
4498 * form: <op> s0, s0, s1
4499 */
4500 /* floatop vAA, vBB, vCC */
4501 FETCH w0, 1 // r0<- CCBB
4502 lsr w1, w0, #8 // r2<- CC
4503 and w0, w0, #255 // r1<- BB
4504 GET_VREG s1, w1
4505 GET_VREG s0, w0
4506 fsub s0, s0, s1 // s0<- op
4507 lsr w1, wINST, #8 // r1<- AA
4508 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4509 GET_INST_OPCODE ip // extract opcode from rINST
4510 SET_VREG s0, w1
4511 GOTO_OPCODE ip // jump to next instruction
4512
4513
4514/* ------------------------------ */
4515 .balign 128
4516.L_op_mul_float: /* 0xa8 */
4517/* File: arm64/op_mul_float.S */
4518/* File: arm64/fbinop.S */
4519 /*:
4520 * Generic 32-bit floating-point operation.
4521 *
4522 * For: add-float, sub-float, mul-float, div-float
4523 * form: <op> s0, s0, s1
4524 */
4525 /* floatop vAA, vBB, vCC */
4526 FETCH w0, 1 // r0<- CCBB
4527 lsr w1, w0, #8 // r2<- CC
4528 and w0, w0, #255 // r1<- BB
4529 GET_VREG s1, w1
4530 GET_VREG s0, w0
4531 fmul s0, s0, s1 // s0<- op
4532 lsr w1, wINST, #8 // r1<- AA
4533 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4534 GET_INST_OPCODE ip // extract opcode from rINST
4535 SET_VREG s0, w1
4536 GOTO_OPCODE ip // jump to next instruction
4537
4538
4539/* ------------------------------ */
4540 .balign 128
4541.L_op_div_float: /* 0xa9 */
4542/* File: arm64/op_div_float.S */
4543/* File: arm64/fbinop.S */
4544 /*:
4545 * Generic 32-bit floating-point operation.
4546 *
4547 * For: add-float, sub-float, mul-float, div-float
4548 * form: <op> s0, s0, s1
4549 */
4550 /* floatop vAA, vBB, vCC */
4551 FETCH w0, 1 // r0<- CCBB
4552 lsr w1, w0, #8 // r2<- CC
4553 and w0, w0, #255 // r1<- BB
4554 GET_VREG s1, w1
4555 GET_VREG s0, w0
4556 fdiv s0, s0, s1 // s0<- op
4557 lsr w1, wINST, #8 // r1<- AA
4558 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4559 GET_INST_OPCODE ip // extract opcode from rINST
4560 SET_VREG s0, w1
4561 GOTO_OPCODE ip // jump to next instruction
4562
4563
4564/* ------------------------------ */
4565 .balign 128
4566.L_op_rem_float: /* 0xaa */
4567/* File: arm64/op_rem_float.S */
4568/* EABI doesn't define a float remainder function, but libm does */
4569/* File: arm64/fbinop.S */
4570 /*:
4571 * Generic 32-bit floating-point operation.
4572 *
4573 * For: add-float, sub-float, mul-float, div-float
4574 * form: <op> s0, s0, s1
4575 */
4576 /* floatop vAA, vBB, vCC */
4577 FETCH w0, 1 // r0<- CCBB
4578 lsr w1, w0, #8 // r2<- CC
4579 and w0, w0, #255 // r1<- BB
4580 GET_VREG s1, w1
4581 GET_VREG s0, w0
4582 bl fmodf // s0<- op
4583 lsr w1, wINST, #8 // r1<- AA
4584 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4585 GET_INST_OPCODE ip // extract opcode from rINST
4586 SET_VREG s0, w1
4587 GOTO_OPCODE ip // jump to next instruction
4588
4589
4590/* ------------------------------ */
4591 .balign 128
4592.L_op_add_double: /* 0xab */
4593/* File: arm64/op_add_double.S */
4594/* File: arm64/binopWide.S */
4595 /*
4596 * Generic 64-bit binary operation. Provide an "instr" line that
4597 * specifies an instruction that performs "result = x1 op x2".
4598 * This could be an ARM instruction or a function call. (If the result
4599 * comes back in a register other than x0, you can override "result".)
4600 *
4601 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4602 * vCC (w1). Useful for integer division and modulus.
4603 *
4604 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4605 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4606 */
4607 /* binop vAA, vBB, vCC */
4608 FETCH w0, 1 // w0<- CCBB
4609 lsr w4, wINST, #8 // w4<- AA
4610 lsr w2, w0, #8 // w2<- CC
4611 and w1, w0, #255 // w1<- BB
4612 GET_VREG_WIDE d2, w2 // w2<- vCC
4613 GET_VREG_WIDE d1, w1 // w1<- vBB
4614 .if 0
4615 cbz d2, common_errDivideByZero // is second operand zero?
4616 .endif
4617 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4618
4619 fadd d0, d1, d2 // d0<- op, w0-w4 changed
4620 GET_INST_OPCODE ip // extract opcode from rINST
4621 SET_VREG_WIDE d0, w4 // vAA<- d0
4622 GOTO_OPCODE ip // jump to next instruction
4623 /* 11-14 instructions */
4624
4625
4626/* ------------------------------ */
4627 .balign 128
4628.L_op_sub_double: /* 0xac */
4629/* File: arm64/op_sub_double.S */
4630/* File: arm64/binopWide.S */
4631 /*
4632 * Generic 64-bit binary operation. Provide an "instr" line that
4633 * specifies an instruction that performs "result = x1 op x2".
4634 * This could be an ARM instruction or a function call. (If the result
4635 * comes back in a register other than x0, you can override "result".)
4636 *
4637 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4638 * vCC (w1). Useful for integer division and modulus.
4639 *
4640 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4641 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4642 */
4643 /* binop vAA, vBB, vCC */
4644 FETCH w0, 1 // w0<- CCBB
4645 lsr w4, wINST, #8 // w4<- AA
4646 lsr w2, w0, #8 // w2<- CC
4647 and w1, w0, #255 // w1<- BB
4648 GET_VREG_WIDE d2, w2 // w2<- vCC
4649 GET_VREG_WIDE d1, w1 // w1<- vBB
4650 .if 0
4651 cbz d2, common_errDivideByZero // is second operand zero?
4652 .endif
4653 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4654
4655 fsub d0, d1, d2 // d0<- op, w0-w4 changed
4656 GET_INST_OPCODE ip // extract opcode from rINST
4657 SET_VREG_WIDE d0, w4 // vAA<- d0
4658 GOTO_OPCODE ip // jump to next instruction
4659 /* 11-14 instructions */
4660
4661
4662/* ------------------------------ */
4663 .balign 128
4664.L_op_mul_double: /* 0xad */
4665/* File: arm64/op_mul_double.S */
4666/* File: arm64/binopWide.S */
4667 /*
4668 * Generic 64-bit binary operation. Provide an "instr" line that
4669 * specifies an instruction that performs "result = x1 op x2".
4670 * This could be an ARM instruction or a function call. (If the result
4671 * comes back in a register other than x0, you can override "result".)
4672 *
4673 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4674 * vCC (w1). Useful for integer division and modulus.
4675 *
4676 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4677 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4678 */
4679 /* binop vAA, vBB, vCC */
4680 FETCH w0, 1 // w0<- CCBB
4681 lsr w4, wINST, #8 // w4<- AA
4682 lsr w2, w0, #8 // w2<- CC
4683 and w1, w0, #255 // w1<- BB
4684 GET_VREG_WIDE d2, w2 // w2<- vCC
4685 GET_VREG_WIDE d1, w1 // w1<- vBB
4686 .if 0
4687 cbz d2, common_errDivideByZero // is second operand zero?
4688 .endif
4689 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4690
4691 fmul d0, d1, d2 // d0<- op, w0-w4 changed
4692 GET_INST_OPCODE ip // extract opcode from rINST
4693 SET_VREG_WIDE d0, w4 // vAA<- d0
4694 GOTO_OPCODE ip // jump to next instruction
4695 /* 11-14 instructions */
4696
4697
4698/* ------------------------------ */
4699 .balign 128
4700.L_op_div_double: /* 0xae */
4701/* File: arm64/op_div_double.S */
4702/* File: arm64/binopWide.S */
4703 /*
4704 * Generic 64-bit binary operation. Provide an "instr" line that
4705 * specifies an instruction that performs "result = x1 op x2".
4706 * This could be an ARM instruction or a function call. (If the result
4707 * comes back in a register other than x0, you can override "result".)
4708 *
4709 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4710 * vCC (w1). Useful for integer division and modulus.
4711 *
4712 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4713 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4714 */
4715 /* binop vAA, vBB, vCC */
4716 FETCH w0, 1 // w0<- CCBB
4717 lsr w4, wINST, #8 // w4<- AA
4718 lsr w2, w0, #8 // w2<- CC
4719 and w1, w0, #255 // w1<- BB
4720 GET_VREG_WIDE d2, w2 // w2<- vCC
4721 GET_VREG_WIDE d1, w1 // w1<- vBB
4722 .if 0
4723 cbz d2, common_errDivideByZero // is second operand zero?
4724 .endif
4725 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4726
4727 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
4728 GET_INST_OPCODE ip // extract opcode from rINST
4729 SET_VREG_WIDE d0, w4 // vAA<- d0
4730 GOTO_OPCODE ip // jump to next instruction
4731 /* 11-14 instructions */
4732
4733
4734/* ------------------------------ */
4735 .balign 128
4736.L_op_rem_double: /* 0xaf */
4737/* File: arm64/op_rem_double.S */
4738 /* rem vAA, vBB, vCC */
4739 FETCH w0, 1 // w0<- CCBB
4740 lsr w2, w0, #8 // w2<- CC
4741 and w1, w0, #255 // w1<- BB
4742 GET_VREG_WIDE d1, w2 // d1<- vCC
4743 GET_VREG_WIDE d0, w1 // d0<- vBB
4744 bl fmod
4745 lsr w4, wINST, #8 // w4<- AA
4746 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4747 GET_INST_OPCODE ip // extract opcode from rINST
4748 SET_VREG_WIDE d0, w4 // vAA<- result
4749 GOTO_OPCODE ip // jump to next instruction
4750 /* 11-14 instructions */
4751
4752/* ------------------------------ */
4753 .balign 128
4754.L_op_add_int_2addr: /* 0xb0 */
4755/* File: arm64/op_add_int_2addr.S */
4756/* File: arm64/binop2addr.S */
4757 /*
4758 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4759 * that specifies an instruction that performs "result = w0 op w1".
4760 * This could be an ARM instruction or a function call. (If the result
4761 * comes back in a register other than w0, you can override "result".)
4762 *
4763 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4764 * vCC (w1). Useful for integer division and modulus.
4765 *
4766 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4767 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4768 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4769 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4770 */
4771 /* binop/2addr vA, vB */
4772 lsr w3, wINST, #12 // w3<- B
4773 ubfx w9, wINST, #8, #4 // w9<- A
4774 GET_VREG w1, w3 // w1<- vB
4775 GET_VREG w0, w9 // w0<- vA
4776 .if 0
4777 cbz w1, common_errDivideByZero
4778 .endif
4779 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4780 // optional op; may set condition codes
4781 add w0, w0, w1 // w0<- op, w0-w3 changed
4782 GET_INST_OPCODE ip // extract opcode from rINST
4783 SET_VREG w0, w9 // vAA<- w0
4784 GOTO_OPCODE ip // jump to next instruction
4785 /* 10-13 instructions */
4786
4787
4788/* ------------------------------ */
4789 .balign 128
4790.L_op_sub_int_2addr: /* 0xb1 */
4791/* File: arm64/op_sub_int_2addr.S */
4792/* File: arm64/binop2addr.S */
4793 /*
4794 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4795 * that specifies an instruction that performs "result = w0 op w1".
4796 * This could be an ARM instruction or a function call. (If the result
4797 * comes back in a register other than w0, you can override "result".)
4798 *
4799 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4800 * vCC (w1). Useful for integer division and modulus.
4801 *
4802 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4803 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4804 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4805 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4806 */
4807 /* binop/2addr vA, vB */
4808 lsr w3, wINST, #12 // w3<- B
4809 ubfx w9, wINST, #8, #4 // w9<- A
4810 GET_VREG w1, w3 // w1<- vB
4811 GET_VREG w0, w9 // w0<- vA
4812 .if 0
4813 cbz w1, common_errDivideByZero
4814 .endif
4815 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4816 // optional op; may set condition codes
4817 sub w0, w0, w1 // w0<- op, w0-w3 changed
4818 GET_INST_OPCODE ip // extract opcode from rINST
4819 SET_VREG w0, w9 // vAA<- w0
4820 GOTO_OPCODE ip // jump to next instruction
4821 /* 10-13 instructions */
4822
4823
4824/* ------------------------------ */
4825 .balign 128
4826.L_op_mul_int_2addr: /* 0xb2 */
4827/* File: arm64/op_mul_int_2addr.S */
4828/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
4829/* File: arm64/binop2addr.S */
4830 /*
4831 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4832 * that specifies an instruction that performs "result = w0 op w1".
4833 * This could be an ARM instruction or a function call. (If the result
4834 * comes back in a register other than w0, you can override "result".)
4835 *
4836 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4837 * vCC (w1). Useful for integer division and modulus.
4838 *
4839 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4840 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4841 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4842 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4843 */
4844 /* binop/2addr vA, vB */
4845 lsr w3, wINST, #12 // w3<- B
4846 ubfx w9, wINST, #8, #4 // w9<- A
4847 GET_VREG w1, w3 // w1<- vB
4848 GET_VREG w0, w9 // w0<- vA
4849 .if 0
4850 cbz w1, common_errDivideByZero
4851 .endif
4852 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4853 // optional op; may set condition codes
4854 mul w0, w1, w0 // w0<- op, w0-w3 changed
4855 GET_INST_OPCODE ip // extract opcode from rINST
4856 SET_VREG w0, w9 // vAA<- w0
4857 GOTO_OPCODE ip // jump to next instruction
4858 /* 10-13 instructions */
4859
4860
4861/* ------------------------------ */
4862 .balign 128
4863.L_op_div_int_2addr: /* 0xb3 */
4864/* File: arm64/op_div_int_2addr.S */
4865/* File: arm64/binop2addr.S */
4866 /*
4867 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4868 * that specifies an instruction that performs "result = w0 op w1".
4869 * This could be an ARM instruction or a function call. (If the result
4870 * comes back in a register other than w0, you can override "result".)
4871 *
4872 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4873 * vCC (w1). Useful for integer division and modulus.
4874 *
4875 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4876 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4877 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4878 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4879 */
4880 /* binop/2addr vA, vB */
4881 lsr w3, wINST, #12 // w3<- B
4882 ubfx w9, wINST, #8, #4 // w9<- A
4883 GET_VREG w1, w3 // w1<- vB
4884 GET_VREG w0, w9 // w0<- vA
4885 .if 1
4886 cbz w1, common_errDivideByZero
4887 .endif
4888 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4889 // optional op; may set condition codes
4890 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4891 GET_INST_OPCODE ip // extract opcode from rINST
4892 SET_VREG w0, w9 // vAA<- w0
4893 GOTO_OPCODE ip // jump to next instruction
4894 /* 10-13 instructions */
4895
4896
4897/* ------------------------------ */
4898 .balign 128
4899.L_op_rem_int_2addr: /* 0xb4 */
4900/* File: arm64/op_rem_int_2addr.S */
4901/* File: arm64/binop2addr.S */
4902 /*
4903 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4904 * that specifies an instruction that performs "result = w0 op w1".
4905 * This could be an ARM instruction or a function call. (If the result
4906 * comes back in a register other than w0, you can override "result".)
4907 *
4908 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4909 * vCC (w1). Useful for integer division and modulus.
4910 *
4911 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4912 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4913 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4914 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4915 */
4916 /* binop/2addr vA, vB */
4917 lsr w3, wINST, #12 // w3<- B
4918 ubfx w9, wINST, #8, #4 // w9<- A
4919 GET_VREG w1, w3 // w1<- vB
4920 GET_VREG w0, w9 // w0<- vA
4921 .if 1
4922 cbz w1, common_errDivideByZero
4923 .endif
4924 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4925 sdiv w2, w0, w1 // optional op; may set condition codes
4926 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4927 GET_INST_OPCODE ip // extract opcode from rINST
4928 SET_VREG w0, w9 // vAA<- w0
4929 GOTO_OPCODE ip // jump to next instruction
4930 /* 10-13 instructions */
4931
4932
4933/* ------------------------------ */
4934 .balign 128
4935.L_op_and_int_2addr: /* 0xb5 */
4936/* File: arm64/op_and_int_2addr.S */
4937/* File: arm64/binop2addr.S */
4938 /*
4939 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4940 * that specifies an instruction that performs "result = w0 op w1".
4941 * This could be an ARM instruction or a function call. (If the result
4942 * comes back in a register other than w0, you can override "result".)
4943 *
4944 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4945 * vCC (w1). Useful for integer division and modulus.
4946 *
4947 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4948 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4949 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4950 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4951 */
4952 /* binop/2addr vA, vB */
4953 lsr w3, wINST, #12 // w3<- B
4954 ubfx w9, wINST, #8, #4 // w9<- A
4955 GET_VREG w1, w3 // w1<- vB
4956 GET_VREG w0, w9 // w0<- vA
4957 .if 0
4958 cbz w1, common_errDivideByZero
4959 .endif
4960 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4961 // optional op; may set condition codes
4962 and w0, w0, w1 // w0<- op, w0-w3 changed
4963 GET_INST_OPCODE ip // extract opcode from rINST
4964 SET_VREG w0, w9 // vAA<- w0
4965 GOTO_OPCODE ip // jump to next instruction
4966 /* 10-13 instructions */
4967
4968
4969/* ------------------------------ */
4970 .balign 128
4971.L_op_or_int_2addr: /* 0xb6 */
4972/* File: arm64/op_or_int_2addr.S */
4973/* File: arm64/binop2addr.S */
4974 /*
4975 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4976 * that specifies an instruction that performs "result = w0 op w1".
4977 * This could be an ARM instruction or a function call. (If the result
4978 * comes back in a register other than w0, you can override "result".)
4979 *
4980 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4981 * vCC (w1). Useful for integer division and modulus.
4982 *
4983 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4984 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4985 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4986 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4987 */
4988 /* binop/2addr vA, vB */
4989 lsr w3, wINST, #12 // w3<- B
4990 ubfx w9, wINST, #8, #4 // w9<- A
4991 GET_VREG w1, w3 // w1<- vB
4992 GET_VREG w0, w9 // w0<- vA
4993 .if 0
4994 cbz w1, common_errDivideByZero
4995 .endif
4996 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4997 // optional op; may set condition codes
4998 orr w0, w0, w1 // w0<- op, w0-w3 changed
4999 GET_INST_OPCODE ip // extract opcode from rINST
5000 SET_VREG w0, w9 // vAA<- w0
5001 GOTO_OPCODE ip // jump to next instruction
5002 /* 10-13 instructions */
5003
5004
5005/* ------------------------------ */
5006 .balign 128
5007.L_op_xor_int_2addr: /* 0xb7 */
5008/* File: arm64/op_xor_int_2addr.S */
5009/* File: arm64/binop2addr.S */
5010 /*
5011 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5012 * that specifies an instruction that performs "result = w0 op w1".
5013 * This could be an ARM instruction or a function call. (If the result
5014 * comes back in a register other than w0, you can override "result".)
5015 *
5016 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5017 * vCC (w1). Useful for integer division and modulus.
5018 *
5019 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5020 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5021 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5022 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5023 */
5024 /* binop/2addr vA, vB */
5025 lsr w3, wINST, #12 // w3<- B
5026 ubfx w9, wINST, #8, #4 // w9<- A
5027 GET_VREG w1, w3 // w1<- vB
5028 GET_VREG w0, w9 // w0<- vA
5029 .if 0
5030 cbz w1, common_errDivideByZero
5031 .endif
5032 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5033 // optional op; may set condition codes
5034 eor w0, w0, w1 // w0<- op, w0-w3 changed
5035 GET_INST_OPCODE ip // extract opcode from rINST
5036 SET_VREG w0, w9 // vAA<- w0
5037 GOTO_OPCODE ip // jump to next instruction
5038 /* 10-13 instructions */
5039
5040
5041/* ------------------------------ */
5042 .balign 128
5043.L_op_shl_int_2addr: /* 0xb8 */
5044/* File: arm64/op_shl_int_2addr.S */
5045/* File: arm64/binop2addr.S */
5046 /*
5047 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5048 * that specifies an instruction that performs "result = w0 op w1".
5049 * This could be an ARM instruction or a function call. (If the result
5050 * comes back in a register other than w0, you can override "result".)
5051 *
5052 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5053 * vCC (w1). Useful for integer division and modulus.
5054 *
5055 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5056 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5057 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5058 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5059 */
5060 /* binop/2addr vA, vB */
5061 lsr w3, wINST, #12 // w3<- B
5062 ubfx w9, wINST, #8, #4 // w9<- A
5063 GET_VREG w1, w3 // w1<- vB
5064 GET_VREG w0, w9 // w0<- vA
5065 .if 0
5066 cbz w1, common_errDivideByZero
5067 .endif
5068 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005069 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005070 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5071 GET_INST_OPCODE ip // extract opcode from rINST
5072 SET_VREG w0, w9 // vAA<- w0
5073 GOTO_OPCODE ip // jump to next instruction
5074 /* 10-13 instructions */
5075
5076
5077/* ------------------------------ */
5078 .balign 128
5079.L_op_shr_int_2addr: /* 0xb9 */
5080/* File: arm64/op_shr_int_2addr.S */
5081/* File: arm64/binop2addr.S */
5082 /*
5083 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5084 * that specifies an instruction that performs "result = w0 op w1".
5085 * This could be an ARM instruction or a function call. (If the result
5086 * comes back in a register other than w0, you can override "result".)
5087 *
5088 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5089 * vCC (w1). Useful for integer division and modulus.
5090 *
5091 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5092 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5093 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5094 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5095 */
5096 /* binop/2addr vA, vB */
5097 lsr w3, wINST, #12 // w3<- B
5098 ubfx w9, wINST, #8, #4 // w9<- A
5099 GET_VREG w1, w3 // w1<- vB
5100 GET_VREG w0, w9 // w0<- vA
5101 .if 0
5102 cbz w1, common_errDivideByZero
5103 .endif
5104 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005105 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005106 asr w0, w0, w1 // w0<- op, w0-w3 changed
5107 GET_INST_OPCODE ip // extract opcode from rINST
5108 SET_VREG w0, w9 // vAA<- w0
5109 GOTO_OPCODE ip // jump to next instruction
5110 /* 10-13 instructions */
5111
5112
5113/* ------------------------------ */
5114 .balign 128
5115.L_op_ushr_int_2addr: /* 0xba */
5116/* File: arm64/op_ushr_int_2addr.S */
5117/* File: arm64/binop2addr.S */
5118 /*
5119 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5120 * that specifies an instruction that performs "result = w0 op w1".
5121 * This could be an ARM instruction or a function call. (If the result
5122 * comes back in a register other than w0, you can override "result".)
5123 *
5124 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5125 * vCC (w1). Useful for integer division and modulus.
5126 *
5127 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5128 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5129 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5130 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5131 */
5132 /* binop/2addr vA, vB */
5133 lsr w3, wINST, #12 // w3<- B
5134 ubfx w9, wINST, #8, #4 // w9<- A
5135 GET_VREG w1, w3 // w1<- vB
5136 GET_VREG w0, w9 // w0<- vA
5137 .if 0
5138 cbz w1, common_errDivideByZero
5139 .endif
5140 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005141 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005142 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5143 GET_INST_OPCODE ip // extract opcode from rINST
5144 SET_VREG w0, w9 // vAA<- w0
5145 GOTO_OPCODE ip // jump to next instruction
5146 /* 10-13 instructions */
5147
5148
5149/* ------------------------------ */
5150 .balign 128
5151.L_op_add_long_2addr: /* 0xbb */
5152/* File: arm64/op_add_long_2addr.S */
5153/* File: arm64/binopWide2addr.S */
5154 /*
5155 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5156 * that specifies an instruction that performs "x0 = x0 op x1".
5157 * This must not be a function call, as we keep w2 live across it.
5158 *
5159 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5160 * vCC (w1). Useful for integer division and modulus.
5161 *
5162 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5163 * and-long/2addr, or-long/2addr, xor-long/2addr,
5164 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5165 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5166 */
5167 /* binop/2addr vA, vB */
5168 lsr w1, wINST, #12 // w1<- B
5169 ubfx w2, wINST, #8, #4 // w2<- A
5170 GET_VREG_WIDE x1, w1 // x1<- vB
5171 GET_VREG_WIDE x0, w2 // x0<- vA
5172 .if 0
5173 cbz x1, common_errDivideByZero
5174 .endif
5175 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5176
5177 add x0, x0, x1 // result<- op
5178 GET_INST_OPCODE ip // extract opcode from rINST
5179 SET_VREG_WIDE x0, w2 // vAA<- result
5180 GOTO_OPCODE ip // jump to next instruction
5181 /* 10-13 instructions */
5182
5183
5184/* ------------------------------ */
5185 .balign 128
5186.L_op_sub_long_2addr: /* 0xbc */
5187/* File: arm64/op_sub_long_2addr.S */
5188/* File: arm64/binopWide2addr.S */
5189 /*
5190 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5191 * that specifies an instruction that performs "x0 = x0 op x1".
5192 * This must not be a function call, as we keep w2 live across it.
5193 *
5194 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5195 * vCC (w1). Useful for integer division and modulus.
5196 *
5197 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5198 * and-long/2addr, or-long/2addr, xor-long/2addr,
5199 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5200 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5201 */
5202 /* binop/2addr vA, vB */
5203 lsr w1, wINST, #12 // w1<- B
5204 ubfx w2, wINST, #8, #4 // w2<- A
5205 GET_VREG_WIDE x1, w1 // x1<- vB
5206 GET_VREG_WIDE x0, w2 // x0<- vA
5207 .if 0
5208 cbz x1, common_errDivideByZero
5209 .endif
5210 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5211
5212 sub x0, x0, x1 // result<- op
5213 GET_INST_OPCODE ip // extract opcode from rINST
5214 SET_VREG_WIDE x0, w2 // vAA<- result
5215 GOTO_OPCODE ip // jump to next instruction
5216 /* 10-13 instructions */
5217
5218
5219/* ------------------------------ */
5220 .balign 128
5221.L_op_mul_long_2addr: /* 0xbd */
5222/* File: arm64/op_mul_long_2addr.S */
5223/* File: arm64/binopWide2addr.S */
5224 /*
5225 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5226 * that specifies an instruction that performs "x0 = x0 op x1".
5227 * This must not be a function call, as we keep w2 live across it.
5228 *
5229 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5230 * vCC (w1). Useful for integer division and modulus.
5231 *
5232 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5233 * and-long/2addr, or-long/2addr, xor-long/2addr,
5234 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5235 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5236 */
5237 /* binop/2addr vA, vB */
5238 lsr w1, wINST, #12 // w1<- B
5239 ubfx w2, wINST, #8, #4 // w2<- A
5240 GET_VREG_WIDE x1, w1 // x1<- vB
5241 GET_VREG_WIDE x0, w2 // x0<- vA
5242 .if 0
5243 cbz x1, common_errDivideByZero
5244 .endif
5245 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5246
5247 mul x0, x0, x1 // result<- op
5248 GET_INST_OPCODE ip // extract opcode from rINST
5249 SET_VREG_WIDE x0, w2 // vAA<- result
5250 GOTO_OPCODE ip // jump to next instruction
5251 /* 10-13 instructions */
5252
5253
5254/* ------------------------------ */
5255 .balign 128
5256.L_op_div_long_2addr: /* 0xbe */
5257/* File: arm64/op_div_long_2addr.S */
5258/* File: arm64/binopWide2addr.S */
5259 /*
5260 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5261 * that specifies an instruction that performs "x0 = x0 op x1".
5262 * This must not be a function call, as we keep w2 live across it.
5263 *
5264 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5265 * vCC (w1). Useful for integer division and modulus.
5266 *
5267 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5268 * and-long/2addr, or-long/2addr, xor-long/2addr,
5269 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5270 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5271 */
5272 /* binop/2addr vA, vB */
5273 lsr w1, wINST, #12 // w1<- B
5274 ubfx w2, wINST, #8, #4 // w2<- A
5275 GET_VREG_WIDE x1, w1 // x1<- vB
5276 GET_VREG_WIDE x0, w2 // x0<- vA
5277 .if 1
5278 cbz x1, common_errDivideByZero
5279 .endif
5280 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5281
5282 sdiv x0, x0, x1 // result<- op
5283 GET_INST_OPCODE ip // extract opcode from rINST
5284 SET_VREG_WIDE x0, w2 // vAA<- result
5285 GOTO_OPCODE ip // jump to next instruction
5286 /* 10-13 instructions */
5287
5288
5289/* ------------------------------ */
5290 .balign 128
5291.L_op_rem_long_2addr: /* 0xbf */
5292/* File: arm64/op_rem_long_2addr.S */
5293/* File: arm64/binopWide2addr.S */
5294 /*
5295 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5296 * that specifies an instruction that performs "x0 = x0 op x1".
5297 * This must not be a function call, as we keep w2 live across it.
5298 *
5299 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5300 * vCC (w1). Useful for integer division and modulus.
5301 *
5302 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5303 * and-long/2addr, or-long/2addr, xor-long/2addr,
5304 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5305 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5306 */
5307 /* binop/2addr vA, vB */
5308 lsr w1, wINST, #12 // w1<- B
5309 ubfx w2, wINST, #8, #4 // w2<- A
5310 GET_VREG_WIDE x1, w1 // x1<- vB
5311 GET_VREG_WIDE x0, w2 // x0<- vA
5312 .if 1
5313 cbz x1, common_errDivideByZero
5314 .endif
5315 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5316 sdiv x3, x0, x1
5317 msub x0, x3, x1, x0 // result<- op
5318 GET_INST_OPCODE ip // extract opcode from rINST
5319 SET_VREG_WIDE x0, w2 // vAA<- result
5320 GOTO_OPCODE ip // jump to next instruction
5321 /* 10-13 instructions */
5322
5323
5324/* ------------------------------ */
5325 .balign 128
5326.L_op_and_long_2addr: /* 0xc0 */
5327/* File: arm64/op_and_long_2addr.S */
5328/* File: arm64/binopWide2addr.S */
5329 /*
5330 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5331 * that specifies an instruction that performs "x0 = x0 op x1".
5332 * This must not be a function call, as we keep w2 live across it.
5333 *
5334 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5335 * vCC (w1). Useful for integer division and modulus.
5336 *
5337 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5338 * and-long/2addr, or-long/2addr, xor-long/2addr,
5339 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5340 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5341 */
5342 /* binop/2addr vA, vB */
5343 lsr w1, wINST, #12 // w1<- B
5344 ubfx w2, wINST, #8, #4 // w2<- A
5345 GET_VREG_WIDE x1, w1 // x1<- vB
5346 GET_VREG_WIDE x0, w2 // x0<- vA
5347 .if 0
5348 cbz x1, common_errDivideByZero
5349 .endif
5350 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5351
5352 and x0, x0, x1 // result<- op
5353 GET_INST_OPCODE ip // extract opcode from rINST
5354 SET_VREG_WIDE x0, w2 // vAA<- result
5355 GOTO_OPCODE ip // jump to next instruction
5356 /* 10-13 instructions */
5357
5358
5359/* ------------------------------ */
5360 .balign 128
5361.L_op_or_long_2addr: /* 0xc1 */
5362/* File: arm64/op_or_long_2addr.S */
5363/* File: arm64/binopWide2addr.S */
5364 /*
5365 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5366 * that specifies an instruction that performs "x0 = x0 op x1".
5367 * This must not be a function call, as we keep w2 live across it.
5368 *
5369 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5370 * vCC (w1). Useful for integer division and modulus.
5371 *
5372 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5373 * and-long/2addr, or-long/2addr, xor-long/2addr,
5374 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5375 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5376 */
5377 /* binop/2addr vA, vB */
5378 lsr w1, wINST, #12 // w1<- B
5379 ubfx w2, wINST, #8, #4 // w2<- A
5380 GET_VREG_WIDE x1, w1 // x1<- vB
5381 GET_VREG_WIDE x0, w2 // x0<- vA
5382 .if 0
5383 cbz x1, common_errDivideByZero
5384 .endif
5385 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5386
5387 orr x0, x0, x1 // result<- op
5388 GET_INST_OPCODE ip // extract opcode from rINST
5389 SET_VREG_WIDE x0, w2 // vAA<- result
5390 GOTO_OPCODE ip // jump to next instruction
5391 /* 10-13 instructions */
5392
5393
5394/* ------------------------------ */
5395 .balign 128
5396.L_op_xor_long_2addr: /* 0xc2 */
5397/* File: arm64/op_xor_long_2addr.S */
5398/* File: arm64/binopWide2addr.S */
5399 /*
5400 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5401 * that specifies an instruction that performs "x0 = x0 op x1".
5402 * This must not be a function call, as we keep w2 live across it.
5403 *
5404 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5405 * vCC (w1). Useful for integer division and modulus.
5406 *
5407 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5408 * and-long/2addr, or-long/2addr, xor-long/2addr,
5409 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5410 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5411 */
5412 /* binop/2addr vA, vB */
5413 lsr w1, wINST, #12 // w1<- B
5414 ubfx w2, wINST, #8, #4 // w2<- A
5415 GET_VREG_WIDE x1, w1 // x1<- vB
5416 GET_VREG_WIDE x0, w2 // x0<- vA
5417 .if 0
5418 cbz x1, common_errDivideByZero
5419 .endif
5420 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5421
5422 eor x0, x0, x1 // result<- op
5423 GET_INST_OPCODE ip // extract opcode from rINST
5424 SET_VREG_WIDE x0, w2 // vAA<- result
5425 GOTO_OPCODE ip // jump to next instruction
5426 /* 10-13 instructions */
5427
5428
5429/* ------------------------------ */
5430 .balign 128
5431.L_op_shl_long_2addr: /* 0xc3 */
5432/* File: arm64/op_shl_long_2addr.S */
5433/* File: arm64/shiftWide2addr.S */
5434 /*
5435 * Generic 64-bit shift operation.
5436 */
5437 /* binop/2addr vA, vB */
5438 lsr w1, wINST, #12 // w1<- B
5439 ubfx w2, wINST, #8, #4 // w2<- A
5440 GET_VREG w1, w1 // x1<- vB
5441 GET_VREG_WIDE x0, w2 // x0<- vA
5442 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005443 lsl x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005444 GET_INST_OPCODE ip // extract opcode from rINST
5445 SET_VREG_WIDE x0, w2 // vAA<- result
5446 GOTO_OPCODE ip // jump to next instruction
5447 /* 10-13 instructions */
5448
5449
5450/* ------------------------------ */
5451 .balign 128
5452.L_op_shr_long_2addr: /* 0xc4 */
5453/* File: arm64/op_shr_long_2addr.S */
5454/* File: arm64/shiftWide2addr.S */
5455 /*
5456 * Generic 64-bit shift operation.
5457 */
5458 /* binop/2addr vA, vB */
5459 lsr w1, wINST, #12 // w1<- B
5460 ubfx w2, wINST, #8, #4 // w2<- A
5461 GET_VREG w1, w1 // x1<- vB
5462 GET_VREG_WIDE x0, w2 // x0<- vA
5463 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005464 asr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005465 GET_INST_OPCODE ip // extract opcode from rINST
5466 SET_VREG_WIDE x0, w2 // vAA<- result
5467 GOTO_OPCODE ip // jump to next instruction
5468 /* 10-13 instructions */
5469
5470
5471/* ------------------------------ */
5472 .balign 128
5473.L_op_ushr_long_2addr: /* 0xc5 */
5474/* File: arm64/op_ushr_long_2addr.S */
5475/* File: arm64/shiftWide2addr.S */
5476 /*
5477 * Generic 64-bit shift operation.
5478 */
5479 /* binop/2addr vA, vB */
5480 lsr w1, wINST, #12 // w1<- B
5481 ubfx w2, wINST, #8, #4 // w2<- A
5482 GET_VREG w1, w1 // x1<- vB
5483 GET_VREG_WIDE x0, w2 // x0<- vA
5484 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005485 lsr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005486 GET_INST_OPCODE ip // extract opcode from rINST
5487 SET_VREG_WIDE x0, w2 // vAA<- result
5488 GOTO_OPCODE ip // jump to next instruction
5489 /* 10-13 instructions */
5490
5491
5492/* ------------------------------ */
5493 .balign 128
5494.L_op_add_float_2addr: /* 0xc6 */
5495/* File: arm64/op_add_float_2addr.S */
5496/* File: arm64/fbinop2addr.S */
5497 /*
5498 * Generic 32-bit floating point "/2addr" binary operation. Provide
5499 * an "instr" line that specifies an instruction that performs
5500 * "s2 = s0 op s1".
5501 *
5502 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5503 */
5504 /* binop/2addr vA, vB */
5505 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005506 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005507 GET_VREG s1, w3
5508 GET_VREG s0, w9
5509 fadd s2, s0, s1 // s2<- op
5510 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5511 GET_INST_OPCODE ip // extract opcode from rINST
5512 SET_VREG s2, w9
5513 GOTO_OPCODE ip // jump to next instruction
5514
5515
5516/* ------------------------------ */
5517 .balign 128
5518.L_op_sub_float_2addr: /* 0xc7 */
5519/* File: arm64/op_sub_float_2addr.S */
5520/* File: arm64/fbinop2addr.S */
5521 /*
5522 * Generic 32-bit floating point "/2addr" binary operation. Provide
5523 * an "instr" line that specifies an instruction that performs
5524 * "s2 = s0 op s1".
5525 *
5526 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5527 */
5528 /* binop/2addr vA, vB */
5529 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005530 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005531 GET_VREG s1, w3
5532 GET_VREG s0, w9
5533 fsub s2, s0, s1 // s2<- op
5534 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5535 GET_INST_OPCODE ip // extract opcode from rINST
5536 SET_VREG s2, w9
5537 GOTO_OPCODE ip // jump to next instruction
5538
5539
5540/* ------------------------------ */
5541 .balign 128
5542.L_op_mul_float_2addr: /* 0xc8 */
5543/* File: arm64/op_mul_float_2addr.S */
5544/* File: arm64/fbinop2addr.S */
5545 /*
5546 * Generic 32-bit floating point "/2addr" binary operation. Provide
5547 * an "instr" line that specifies an instruction that performs
5548 * "s2 = s0 op s1".
5549 *
5550 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5551 */
5552 /* binop/2addr vA, vB */
5553 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005554 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005555 GET_VREG s1, w3
5556 GET_VREG s0, w9
5557 fmul s2, s0, s1 // s2<- op
5558 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5559 GET_INST_OPCODE ip // extract opcode from rINST
5560 SET_VREG s2, w9
5561 GOTO_OPCODE ip // jump to next instruction
5562
5563
5564/* ------------------------------ */
5565 .balign 128
5566.L_op_div_float_2addr: /* 0xc9 */
5567/* File: arm64/op_div_float_2addr.S */
5568/* File: arm64/fbinop2addr.S */
5569 /*
5570 * Generic 32-bit floating point "/2addr" binary operation. Provide
5571 * an "instr" line that specifies an instruction that performs
5572 * "s2 = s0 op s1".
5573 *
5574 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5575 */
5576 /* binop/2addr vA, vB */
5577 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005578 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005579 GET_VREG s1, w3
5580 GET_VREG s0, w9
5581 fdiv s2, s0, s1 // s2<- op
5582 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5583 GET_INST_OPCODE ip // extract opcode from rINST
5584 SET_VREG s2, w9
5585 GOTO_OPCODE ip // jump to next instruction
5586
5587
5588/* ------------------------------ */
5589 .balign 128
5590.L_op_rem_float_2addr: /* 0xca */
5591/* File: arm64/op_rem_float_2addr.S */
5592 /* rem vA, vB */
5593 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005594 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005595 GET_VREG s1, w3
5596 GET_VREG s0, w9
5597 bl fmodf
Vladimir Markoe6220222016-07-20 14:25:30 +01005598 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005599 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5600 GET_INST_OPCODE ip // extract opcode from rINST
5601 SET_VREG s0, w9
5602 GOTO_OPCODE ip // jump to next instruction
5603
5604/* ------------------------------ */
5605 .balign 128
5606.L_op_add_double_2addr: /* 0xcb */
5607/* File: arm64/op_add_double_2addr.S */
5608/* File: arm64/binopWide2addr.S */
5609 /*
5610 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5611 * that specifies an instruction that performs "x0 = x0 op x1".
5612 * This must not be a function call, as we keep w2 live across it.
5613 *
5614 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5615 * vCC (w1). Useful for integer division and modulus.
5616 *
5617 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5618 * and-long/2addr, or-long/2addr, xor-long/2addr,
5619 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5620 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5621 */
5622 /* binop/2addr vA, vB */
5623 lsr w1, wINST, #12 // w1<- B
5624 ubfx w2, wINST, #8, #4 // w2<- A
5625 GET_VREG_WIDE d1, w1 // x1<- vB
5626 GET_VREG_WIDE d0, w2 // x0<- vA
5627 .if 0
5628 cbz d1, common_errDivideByZero
5629 .endif
5630 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5631
5632 fadd d0, d0, d1 // result<- op
5633 GET_INST_OPCODE ip // extract opcode from rINST
5634 SET_VREG_WIDE d0, w2 // vAA<- result
5635 GOTO_OPCODE ip // jump to next instruction
5636 /* 10-13 instructions */
5637
5638
5639/* ------------------------------ */
5640 .balign 128
5641.L_op_sub_double_2addr: /* 0xcc */
5642/* File: arm64/op_sub_double_2addr.S */
5643/* File: arm64/binopWide2addr.S */
5644 /*
5645 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5646 * that specifies an instruction that performs "x0 = x0 op x1".
5647 * This must not be a function call, as we keep w2 live across it.
5648 *
5649 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5650 * vCC (w1). Useful for integer division and modulus.
5651 *
5652 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5653 * and-long/2addr, or-long/2addr, xor-long/2addr,
5654 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5655 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5656 */
5657 /* binop/2addr vA, vB */
5658 lsr w1, wINST, #12 // w1<- B
5659 ubfx w2, wINST, #8, #4 // w2<- A
5660 GET_VREG_WIDE d1, w1 // x1<- vB
5661 GET_VREG_WIDE d0, w2 // x0<- vA
5662 .if 0
5663 cbz d1, common_errDivideByZero
5664 .endif
5665 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5666
5667 fsub d0, d0, d1 // result<- op
5668 GET_INST_OPCODE ip // extract opcode from rINST
5669 SET_VREG_WIDE d0, w2 // vAA<- result
5670 GOTO_OPCODE ip // jump to next instruction
5671 /* 10-13 instructions */
5672
5673
5674/* ------------------------------ */
5675 .balign 128
5676.L_op_mul_double_2addr: /* 0xcd */
5677/* File: arm64/op_mul_double_2addr.S */
5678/* File: arm64/binopWide2addr.S */
5679 /*
5680 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5681 * that specifies an instruction that performs "x0 = x0 op x1".
5682 * This must not be a function call, as we keep w2 live across it.
5683 *
5684 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5685 * vCC (w1). Useful for integer division and modulus.
5686 *
5687 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5688 * and-long/2addr, or-long/2addr, xor-long/2addr,
5689 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5690 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5691 */
5692 /* binop/2addr vA, vB */
5693 lsr w1, wINST, #12 // w1<- B
5694 ubfx w2, wINST, #8, #4 // w2<- A
5695 GET_VREG_WIDE d1, w1 // x1<- vB
5696 GET_VREG_WIDE d0, w2 // x0<- vA
5697 .if 0
5698 cbz d1, common_errDivideByZero
5699 .endif
5700 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5701
5702 fmul d0, d0, d1 // result<- op
5703 GET_INST_OPCODE ip // extract opcode from rINST
5704 SET_VREG_WIDE d0, w2 // vAA<- result
5705 GOTO_OPCODE ip // jump to next instruction
5706 /* 10-13 instructions */
5707
5708
5709/* ------------------------------ */
5710 .balign 128
5711.L_op_div_double_2addr: /* 0xce */
5712/* File: arm64/op_div_double_2addr.S */
5713/* File: arm64/binopWide2addr.S */
5714 /*
5715 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5716 * that specifies an instruction that performs "x0 = x0 op x1".
5717 * This must not be a function call, as we keep w2 live across it.
5718 *
5719 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5720 * vCC (w1). Useful for integer division and modulus.
5721 *
5722 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5723 * and-long/2addr, or-long/2addr, xor-long/2addr,
5724 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5725 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5726 */
5727 /* binop/2addr vA, vB */
5728 lsr w1, wINST, #12 // w1<- B
5729 ubfx w2, wINST, #8, #4 // w2<- A
5730 GET_VREG_WIDE d1, w1 // x1<- vB
5731 GET_VREG_WIDE d0, w2 // x0<- vA
5732 .if 0
5733 cbz d1, common_errDivideByZero
5734 .endif
5735 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5736
5737 fdiv d0, d0, d1 // result<- op
5738 GET_INST_OPCODE ip // extract opcode from rINST
5739 SET_VREG_WIDE d0, w2 // vAA<- result
5740 GOTO_OPCODE ip // jump to next instruction
5741 /* 10-13 instructions */
5742
5743
5744/* ------------------------------ */
5745 .balign 128
5746.L_op_rem_double_2addr: /* 0xcf */
5747/* File: arm64/op_rem_double_2addr.S */
5748 /* rem vA, vB */
5749 lsr w1, wINST, #12 // w1<- B
5750 ubfx w2, wINST, #8, #4 // w2<- A
5751 GET_VREG_WIDE d1, w1 // d1<- vB
5752 GET_VREG_WIDE d0, w2 // d0<- vA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005753 bl fmod
5754 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
buzbee908c0b22016-03-16 14:39:50 -07005755 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005756 GET_INST_OPCODE ip // extract opcode from rINST
5757 SET_VREG_WIDE d0, w2 // vAA<- result
5758 GOTO_OPCODE ip // jump to next instruction
5759 /* 10-13 instructions */
5760
5761/* ------------------------------ */
5762 .balign 128
5763.L_op_add_int_lit16: /* 0xd0 */
5764/* File: arm64/op_add_int_lit16.S */
5765/* File: arm64/binopLit16.S */
5766 /*
5767 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5768 * that specifies an instruction that performs "result = w0 op w1".
5769 * This could be an ARM instruction or a function call. (If the result
5770 * comes back in a register other than w0, you can override "result".)
5771 *
5772 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5773 * vCC (w1). Useful for integer division and modulus.
5774 *
5775 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5776 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5777 */
5778 /* binop/lit16 vA, vB, #+CCCC */
5779 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5780 lsr w2, wINST, #12 // w2<- B
5781 ubfx w9, wINST, #8, #4 // w9<- A
5782 GET_VREG w0, w2 // w0<- vB
5783 .if 0
5784 cbz w1, common_errDivideByZero
5785 .endif
5786 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5787
5788 add w0, w0, w1 // w0<- op, w0-w3 changed
5789 GET_INST_OPCODE ip // extract opcode from rINST
5790 SET_VREG w0, w9 // vAA<- w0
5791 GOTO_OPCODE ip // jump to next instruction
5792 /* 10-13 instructions */
5793
5794
5795/* ------------------------------ */
5796 .balign 128
5797.L_op_rsub_int: /* 0xd1 */
5798/* File: arm64/op_rsub_int.S */
5799/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5800/* File: arm64/binopLit16.S */
5801 /*
5802 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5803 * that specifies an instruction that performs "result = w0 op w1".
5804 * This could be an ARM instruction or a function call. (If the result
5805 * comes back in a register other than w0, you can override "result".)
5806 *
5807 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5808 * vCC (w1). Useful for integer division and modulus.
5809 *
5810 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5811 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5812 */
5813 /* binop/lit16 vA, vB, #+CCCC */
5814 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5815 lsr w2, wINST, #12 // w2<- B
5816 ubfx w9, wINST, #8, #4 // w9<- A
5817 GET_VREG w0, w2 // w0<- vB
5818 .if 0
5819 cbz w1, common_errDivideByZero
5820 .endif
5821 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5822
5823 sub w0, w1, w0 // w0<- op, w0-w3 changed
5824 GET_INST_OPCODE ip // extract opcode from rINST
5825 SET_VREG w0, w9 // vAA<- w0
5826 GOTO_OPCODE ip // jump to next instruction
5827 /* 10-13 instructions */
5828
5829
5830/* ------------------------------ */
5831 .balign 128
5832.L_op_mul_int_lit16: /* 0xd2 */
5833/* File: arm64/op_mul_int_lit16.S */
5834/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5835/* File: arm64/binopLit16.S */
5836 /*
5837 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5838 * that specifies an instruction that performs "result = w0 op w1".
5839 * This could be an ARM instruction or a function call. (If the result
5840 * comes back in a register other than w0, you can override "result".)
5841 *
5842 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5843 * vCC (w1). Useful for integer division and modulus.
5844 *
5845 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5846 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5847 */
5848 /* binop/lit16 vA, vB, #+CCCC */
5849 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5850 lsr w2, wINST, #12 // w2<- B
5851 ubfx w9, wINST, #8, #4 // w9<- A
5852 GET_VREG w0, w2 // w0<- vB
5853 .if 0
5854 cbz w1, common_errDivideByZero
5855 .endif
5856 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5857
5858 mul w0, w1, w0 // w0<- op, w0-w3 changed
5859 GET_INST_OPCODE ip // extract opcode from rINST
5860 SET_VREG w0, w9 // vAA<- w0
5861 GOTO_OPCODE ip // jump to next instruction
5862 /* 10-13 instructions */
5863
5864
5865/* ------------------------------ */
5866 .balign 128
5867.L_op_div_int_lit16: /* 0xd3 */
5868/* File: arm64/op_div_int_lit16.S */
5869/* File: arm64/binopLit16.S */
5870 /*
5871 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5872 * that specifies an instruction that performs "result = w0 op w1".
5873 * This could be an ARM instruction or a function call. (If the result
5874 * comes back in a register other than w0, you can override "result".)
5875 *
5876 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5877 * vCC (w1). Useful for integer division and modulus.
5878 *
5879 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5880 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5881 */
5882 /* binop/lit16 vA, vB, #+CCCC */
5883 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5884 lsr w2, wINST, #12 // w2<- B
5885 ubfx w9, wINST, #8, #4 // w9<- A
5886 GET_VREG w0, w2 // w0<- vB
5887 .if 1
5888 cbz w1, common_errDivideByZero
5889 .endif
5890 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5891
5892 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5893 GET_INST_OPCODE ip // extract opcode from rINST
5894 SET_VREG w0, w9 // vAA<- w0
5895 GOTO_OPCODE ip // jump to next instruction
5896 /* 10-13 instructions */
5897
5898
5899/* ------------------------------ */
5900 .balign 128
5901.L_op_rem_int_lit16: /* 0xd4 */
5902/* File: arm64/op_rem_int_lit16.S */
5903/* File: arm64/binopLit16.S */
5904 /*
5905 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5906 * that specifies an instruction that performs "result = w0 op w1".
5907 * This could be an ARM instruction or a function call. (If the result
5908 * comes back in a register other than w0, you can override "result".)
5909 *
5910 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5911 * vCC (w1). Useful for integer division and modulus.
5912 *
5913 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5914 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5915 */
5916 /* binop/lit16 vA, vB, #+CCCC */
5917 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5918 lsr w2, wINST, #12 // w2<- B
5919 ubfx w9, wINST, #8, #4 // w9<- A
5920 GET_VREG w0, w2 // w0<- vB
5921 .if 1
5922 cbz w1, common_errDivideByZero
5923 .endif
5924 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5925 sdiv w3, w0, w1
5926 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
5927 GET_INST_OPCODE ip // extract opcode from rINST
5928 SET_VREG w0, w9 // vAA<- w0
5929 GOTO_OPCODE ip // jump to next instruction
5930 /* 10-13 instructions */
5931
5932
5933/* ------------------------------ */
5934 .balign 128
5935.L_op_and_int_lit16: /* 0xd5 */
5936/* File: arm64/op_and_int_lit16.S */
5937/* File: arm64/binopLit16.S */
5938 /*
5939 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5940 * that specifies an instruction that performs "result = w0 op w1".
5941 * This could be an ARM instruction or a function call. (If the result
5942 * comes back in a register other than w0, you can override "result".)
5943 *
5944 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5945 * vCC (w1). Useful for integer division and modulus.
5946 *
5947 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5948 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5949 */
5950 /* binop/lit16 vA, vB, #+CCCC */
5951 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5952 lsr w2, wINST, #12 // w2<- B
5953 ubfx w9, wINST, #8, #4 // w9<- A
5954 GET_VREG w0, w2 // w0<- vB
5955 .if 0
5956 cbz w1, common_errDivideByZero
5957 .endif
5958 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5959
5960 and w0, w0, w1 // w0<- op, w0-w3 changed
5961 GET_INST_OPCODE ip // extract opcode from rINST
5962 SET_VREG w0, w9 // vAA<- w0
5963 GOTO_OPCODE ip // jump to next instruction
5964 /* 10-13 instructions */
5965
5966
5967/* ------------------------------ */
5968 .balign 128
5969.L_op_or_int_lit16: /* 0xd6 */
5970/* File: arm64/op_or_int_lit16.S */
5971/* File: arm64/binopLit16.S */
5972 /*
5973 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5974 * that specifies an instruction that performs "result = w0 op w1".
5975 * This could be an ARM instruction or a function call. (If the result
5976 * comes back in a register other than w0, you can override "result".)
5977 *
5978 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5979 * vCC (w1). Useful for integer division and modulus.
5980 *
5981 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5982 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5983 */
5984 /* binop/lit16 vA, vB, #+CCCC */
5985 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5986 lsr w2, wINST, #12 // w2<- B
5987 ubfx w9, wINST, #8, #4 // w9<- A
5988 GET_VREG w0, w2 // w0<- vB
5989 .if 0
5990 cbz w1, common_errDivideByZero
5991 .endif
5992 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5993
5994 orr w0, w0, w1 // w0<- op, w0-w3 changed
5995 GET_INST_OPCODE ip // extract opcode from rINST
5996 SET_VREG w0, w9 // vAA<- w0
5997 GOTO_OPCODE ip // jump to next instruction
5998 /* 10-13 instructions */
5999
6000
6001/* ------------------------------ */
6002 .balign 128
6003.L_op_xor_int_lit16: /* 0xd7 */
6004/* File: arm64/op_xor_int_lit16.S */
6005/* File: arm64/binopLit16.S */
6006 /*
6007 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6008 * that specifies an instruction that performs "result = w0 op w1".
6009 * This could be an ARM instruction or a function call. (If the result
6010 * comes back in a register other than w0, you can override "result".)
6011 *
6012 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6013 * vCC (w1). Useful for integer division and modulus.
6014 *
6015 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6016 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6017 */
6018 /* binop/lit16 vA, vB, #+CCCC */
6019 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6020 lsr w2, wINST, #12 // w2<- B
6021 ubfx w9, wINST, #8, #4 // w9<- A
6022 GET_VREG w0, w2 // w0<- vB
6023 .if 0
6024 cbz w1, common_errDivideByZero
6025 .endif
6026 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6027
6028 eor w0, w0, w1 // w0<- op, w0-w3 changed
6029 GET_INST_OPCODE ip // extract opcode from rINST
6030 SET_VREG w0, w9 // vAA<- w0
6031 GOTO_OPCODE ip // jump to next instruction
6032 /* 10-13 instructions */
6033
6034
6035/* ------------------------------ */
6036 .balign 128
6037.L_op_add_int_lit8: /* 0xd8 */
6038/* File: arm64/op_add_int_lit8.S */
6039/* File: arm64/binopLit8.S */
6040 /*
6041 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6042 * that specifies an instruction that performs "result = w0 op w1".
6043 * This could be an ARM instruction or a function call. (If the result
6044 * comes back in a register other than w0, you can override "result".)
6045 *
6046 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6047 * vCC (w1). Useful for integer division and modulus.
6048 *
6049 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6050 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6051 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6052 */
6053 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006054 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006055 lsr w9, wINST, #8 // w9<- AA
6056 and w2, w3, #255 // w2<- BB
6057 GET_VREG w0, w2 // w0<- vBB
6058 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6059 .if 0
6060 cbz w1, common_errDivideByZero
6061 .endif
6062 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6063 // optional op; may set condition codes
6064 add w0, w0, w1 // w0<- op, w0-w3 changed
6065 GET_INST_OPCODE ip // extract opcode from rINST
6066 SET_VREG w0, w9 // vAA<- w0
6067 GOTO_OPCODE ip // jump to next instruction
6068 /* 10-12 instructions */
6069
6070
6071/* ------------------------------ */
6072 .balign 128
6073.L_op_rsub_int_lit8: /* 0xd9 */
6074/* File: arm64/op_rsub_int_lit8.S */
6075/* File: arm64/binopLit8.S */
6076 /*
6077 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6078 * that specifies an instruction that performs "result = w0 op w1".
6079 * This could be an ARM instruction or a function call. (If the result
6080 * comes back in a register other than w0, you can override "result".)
6081 *
6082 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6083 * vCC (w1). Useful for integer division and modulus.
6084 *
6085 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6086 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6087 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6088 */
6089 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006090 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006091 lsr w9, wINST, #8 // w9<- AA
6092 and w2, w3, #255 // w2<- BB
6093 GET_VREG w0, w2 // w0<- vBB
6094 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6095 .if 0
6096 cbz w1, common_errDivideByZero
6097 .endif
6098 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6099 // optional op; may set condition codes
6100 sub w0, w1, w0 // w0<- op, w0-w3 changed
6101 GET_INST_OPCODE ip // extract opcode from rINST
6102 SET_VREG w0, w9 // vAA<- w0
6103 GOTO_OPCODE ip // jump to next instruction
6104 /* 10-12 instructions */
6105
6106
6107/* ------------------------------ */
6108 .balign 128
6109.L_op_mul_int_lit8: /* 0xda */
6110/* File: arm64/op_mul_int_lit8.S */
6111/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6112/* File: arm64/binopLit8.S */
6113 /*
6114 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6115 * that specifies an instruction that performs "result = w0 op w1".
6116 * This could be an ARM instruction or a function call. (If the result
6117 * comes back in a register other than w0, you can override "result".)
6118 *
6119 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6120 * vCC (w1). Useful for integer division and modulus.
6121 *
6122 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6123 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6124 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6125 */
6126 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006127 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006128 lsr w9, wINST, #8 // w9<- AA
6129 and w2, w3, #255 // w2<- BB
6130 GET_VREG w0, w2 // w0<- vBB
6131 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6132 .if 0
6133 cbz w1, common_errDivideByZero
6134 .endif
6135 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6136 // optional op; may set condition codes
6137 mul w0, w1, w0 // w0<- op, w0-w3 changed
6138 GET_INST_OPCODE ip // extract opcode from rINST
6139 SET_VREG w0, w9 // vAA<- w0
6140 GOTO_OPCODE ip // jump to next instruction
6141 /* 10-12 instructions */
6142
6143
6144/* ------------------------------ */
6145 .balign 128
6146.L_op_div_int_lit8: /* 0xdb */
6147/* File: arm64/op_div_int_lit8.S */
6148/* File: arm64/binopLit8.S */
6149 /*
6150 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6151 * that specifies an instruction that performs "result = w0 op w1".
6152 * This could be an ARM instruction or a function call. (If the result
6153 * comes back in a register other than w0, you can override "result".)
6154 *
6155 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6156 * vCC (w1). Useful for integer division and modulus.
6157 *
6158 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6159 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6160 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6161 */
6162 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006163 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006164 lsr w9, wINST, #8 // w9<- AA
6165 and w2, w3, #255 // w2<- BB
6166 GET_VREG w0, w2 // w0<- vBB
6167 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6168 .if 1
6169 cbz w1, common_errDivideByZero
6170 .endif
6171 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6172 // optional op; may set condition codes
6173 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6174 GET_INST_OPCODE ip // extract opcode from rINST
6175 SET_VREG w0, w9 // vAA<- w0
6176 GOTO_OPCODE ip // jump to next instruction
6177 /* 10-12 instructions */
6178
6179
6180/* ------------------------------ */
6181 .balign 128
6182.L_op_rem_int_lit8: /* 0xdc */
6183/* File: arm64/op_rem_int_lit8.S */
6184/* File: arm64/binopLit8.S */
6185 /*
6186 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6187 * that specifies an instruction that performs "result = w0 op w1".
6188 * This could be an ARM instruction or a function call. (If the result
6189 * comes back in a register other than w0, you can override "result".)
6190 *
6191 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6192 * vCC (w1). Useful for integer division and modulus.
6193 *
6194 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6195 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6196 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6197 */
6198 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006199 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006200 lsr w9, wINST, #8 // w9<- AA
6201 and w2, w3, #255 // w2<- BB
6202 GET_VREG w0, w2 // w0<- vBB
6203 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6204 .if 1
6205 cbz w1, common_errDivideByZero
6206 .endif
6207 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6208 sdiv w3, w0, w1 // optional op; may set condition codes
6209 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6210 GET_INST_OPCODE ip // extract opcode from rINST
6211 SET_VREG w0, w9 // vAA<- w0
6212 GOTO_OPCODE ip // jump to next instruction
6213 /* 10-12 instructions */
6214
6215
6216/* ------------------------------ */
6217 .balign 128
6218.L_op_and_int_lit8: /* 0xdd */
6219/* File: arm64/op_and_int_lit8.S */
6220/* File: arm64/binopLit8.S */
6221 /*
6222 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6223 * that specifies an instruction that performs "result = w0 op w1".
6224 * This could be an ARM instruction or a function call. (If the result
6225 * comes back in a register other than w0, you can override "result".)
6226 *
6227 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6228 * vCC (w1). Useful for integer division and modulus.
6229 *
6230 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6231 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6232 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6233 */
6234 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006235 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006236 lsr w9, wINST, #8 // w9<- AA
6237 and w2, w3, #255 // w2<- BB
6238 GET_VREG w0, w2 // w0<- vBB
6239 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6240 .if 0
6241 cbz w1, common_errDivideByZero
6242 .endif
6243 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6244 // optional op; may set condition codes
6245 and w0, w0, w1 // w0<- op, w0-w3 changed
6246 GET_INST_OPCODE ip // extract opcode from rINST
6247 SET_VREG w0, w9 // vAA<- w0
6248 GOTO_OPCODE ip // jump to next instruction
6249 /* 10-12 instructions */
6250
6251
6252/* ------------------------------ */
6253 .balign 128
6254.L_op_or_int_lit8: /* 0xde */
6255/* File: arm64/op_or_int_lit8.S */
6256/* File: arm64/binopLit8.S */
6257 /*
6258 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6259 * that specifies an instruction that performs "result = w0 op w1".
6260 * This could be an ARM instruction or a function call. (If the result
6261 * comes back in a register other than w0, you can override "result".)
6262 *
6263 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6264 * vCC (w1). Useful for integer division and modulus.
6265 *
6266 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6267 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6268 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6269 */
6270 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006271 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006272 lsr w9, wINST, #8 // w9<- AA
6273 and w2, w3, #255 // w2<- BB
6274 GET_VREG w0, w2 // w0<- vBB
6275 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6276 .if 0
6277 cbz w1, common_errDivideByZero
6278 .endif
6279 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6280 // optional op; may set condition codes
6281 orr w0, w0, w1 // w0<- op, w0-w3 changed
6282 GET_INST_OPCODE ip // extract opcode from rINST
6283 SET_VREG w0, w9 // vAA<- w0
6284 GOTO_OPCODE ip // jump to next instruction
6285 /* 10-12 instructions */
6286
6287
6288/* ------------------------------ */
6289 .balign 128
6290.L_op_xor_int_lit8: /* 0xdf */
6291/* File: arm64/op_xor_int_lit8.S */
6292/* File: arm64/binopLit8.S */
6293 /*
6294 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6295 * that specifies an instruction that performs "result = w0 op w1".
6296 * This could be an ARM instruction or a function call. (If the result
6297 * comes back in a register other than w0, you can override "result".)
6298 *
6299 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6300 * vCC (w1). Useful for integer division and modulus.
6301 *
6302 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6303 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6304 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6305 */
6306 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006307 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006308 lsr w9, wINST, #8 // w9<- AA
6309 and w2, w3, #255 // w2<- BB
6310 GET_VREG w0, w2 // w0<- vBB
6311 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6312 .if 0
6313 cbz w1, common_errDivideByZero
6314 .endif
6315 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6316 // optional op; may set condition codes
6317 eor w0, w0, w1 // w0<- op, w0-w3 changed
6318 GET_INST_OPCODE ip // extract opcode from rINST
6319 SET_VREG w0, w9 // vAA<- w0
6320 GOTO_OPCODE ip // jump to next instruction
6321 /* 10-12 instructions */
6322
6323
6324/* ------------------------------ */
6325 .balign 128
6326.L_op_shl_int_lit8: /* 0xe0 */
6327/* File: arm64/op_shl_int_lit8.S */
6328/* File: arm64/binopLit8.S */
6329 /*
6330 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6331 * that specifies an instruction that performs "result = w0 op w1".
6332 * This could be an ARM instruction or a function call. (If the result
6333 * comes back in a register other than w0, you can override "result".)
6334 *
6335 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6336 * vCC (w1). Useful for integer division and modulus.
6337 *
6338 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6339 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6340 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6341 */
6342 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006343 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006344 lsr w9, wINST, #8 // w9<- AA
6345 and w2, w3, #255 // w2<- BB
6346 GET_VREG w0, w2 // w0<- vBB
6347 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6348 .if 0
6349 cbz w1, common_errDivideByZero
6350 .endif
6351 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006352 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006353 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6354 GET_INST_OPCODE ip // extract opcode from rINST
6355 SET_VREG w0, w9 // vAA<- w0
6356 GOTO_OPCODE ip // jump to next instruction
6357 /* 10-12 instructions */
6358
6359
6360/* ------------------------------ */
6361 .balign 128
6362.L_op_shr_int_lit8: /* 0xe1 */
6363/* File: arm64/op_shr_int_lit8.S */
6364/* File: arm64/binopLit8.S */
6365 /*
6366 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6367 * that specifies an instruction that performs "result = w0 op w1".
6368 * This could be an ARM instruction or a function call. (If the result
6369 * comes back in a register other than w0, you can override "result".)
6370 *
6371 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6372 * vCC (w1). Useful for integer division and modulus.
6373 *
6374 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6375 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6376 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6377 */
6378 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006379 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006380 lsr w9, wINST, #8 // w9<- AA
6381 and w2, w3, #255 // w2<- BB
6382 GET_VREG w0, w2 // w0<- vBB
6383 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6384 .if 0
6385 cbz w1, common_errDivideByZero
6386 .endif
6387 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006388 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006389 asr w0, w0, w1 // w0<- op, w0-w3 changed
6390 GET_INST_OPCODE ip // extract opcode from rINST
6391 SET_VREG w0, w9 // vAA<- w0
6392 GOTO_OPCODE ip // jump to next instruction
6393 /* 10-12 instructions */
6394
6395
6396/* ------------------------------ */
6397 .balign 128
6398.L_op_ushr_int_lit8: /* 0xe2 */
6399/* File: arm64/op_ushr_int_lit8.S */
6400/* File: arm64/binopLit8.S */
6401 /*
6402 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6403 * that specifies an instruction that performs "result = w0 op w1".
6404 * This could be an ARM instruction or a function call. (If the result
6405 * comes back in a register other than w0, you can override "result".)
6406 *
6407 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6408 * vCC (w1). Useful for integer division and modulus.
6409 *
6410 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6411 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6412 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6413 */
6414 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006415 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006416 lsr w9, wINST, #8 // w9<- AA
6417 and w2, w3, #255 // w2<- BB
6418 GET_VREG w0, w2 // w0<- vBB
6419 asr w1, w3, #8 // w1<- ssssssCC (sign extended)
6420 .if 0
6421 cbz w1, common_errDivideByZero
6422 .endif
6423 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006424 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006425 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6426 GET_INST_OPCODE ip // extract opcode from rINST
6427 SET_VREG w0, w9 // vAA<- w0
6428 GOTO_OPCODE ip // jump to next instruction
6429 /* 10-12 instructions */
6430
6431
6432/* ------------------------------ */
6433 .balign 128
6434.L_op_iget_quick: /* 0xe3 */
6435/* File: arm64/op_iget_quick.S */
6436 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6437 /* op vA, vB, offset//CCCC */
6438 lsr w2, wINST, #12 // w2<- B
6439 FETCH w1, 1 // w1<- field byte offset
6440 GET_VREG w3, w2 // w3<- object we're operating on
6441 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006442 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006443 ldr w0, [x3, x1] // w0<- obj.field
6444 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6445
6446 SET_VREG w0, w2 // fp[A]<- w0
6447 GET_INST_OPCODE ip // extract opcode from rINST
6448 GOTO_OPCODE ip // jump to next instruction
6449
6450/* ------------------------------ */
6451 .balign 128
6452.L_op_iget_wide_quick: /* 0xe4 */
6453/* File: arm64/op_iget_wide_quick.S */
6454 /* iget-wide-quick vA, vB, offset//CCCC */
6455 lsr w2, wINST, #12 // w2<- B
6456 FETCH w4, 1 // w4<- field byte offset
6457 GET_VREG w3, w2 // w3<- object we're operating on
6458 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006459 cbz w3, common_errNullObject // object was null
Vladimir Marko20421b92016-07-26 16:38:11 +01006460 ldr x0, [x3, x4] // x0<- obj.field
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006461 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6462 SET_VREG_WIDE x0, w2
6463 GET_INST_OPCODE ip // extract opcode from wINST
6464 GOTO_OPCODE ip // jump to next instruction
6465
6466/* ------------------------------ */
6467 .balign 128
6468.L_op_iget_object_quick: /* 0xe5 */
6469/* File: arm64/op_iget_object_quick.S */
6470 /* For: iget-object-quick */
6471 /* op vA, vB, offset//CCCC */
6472 lsr w2, wINST, #12 // w2<- B
6473 FETCH w1, 1 // w1<- field byte offset
6474 EXPORT_PC
6475 GET_VREG w0, w2 // w0<- object we're operating on
6476 bl artIGetObjectFromMterp // (obj, offset)
6477 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6478 ubfx w2, wINST, #8, #4 // w2<- A
6479 PREFETCH_INST 2
6480 cbnz w3, MterpPossibleException // bail out
6481 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6482 ADVANCE 2 // advance rPC
6483 GET_INST_OPCODE ip // extract opcode from wINST
6484 GOTO_OPCODE ip // jump to next instruction
6485
6486/* ------------------------------ */
6487 .balign 128
6488.L_op_iput_quick: /* 0xe6 */
6489/* File: arm64/op_iput_quick.S */
6490 /* For: iput-quick, iput-object-quick */
6491 /* op vA, vB, offset//CCCC */
6492 lsr w2, wINST, #12 // w2<- B
6493 FETCH w1, 1 // w1<- field byte offset
6494 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6495 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006496 cbz w3, common_errNullObject // object was null
6497 GET_VREG w0, w2 // w0<- fp[A]
6498 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6499 str w0, [x3, x1] // obj.field<- w0
6500 GET_INST_OPCODE ip // extract opcode from rINST
6501 GOTO_OPCODE ip // jump to next instruction
6502
6503/* ------------------------------ */
6504 .balign 128
6505.L_op_iput_wide_quick: /* 0xe7 */
6506/* File: arm64/op_iput_wide_quick.S */
6507 /* iput-wide-quick vA, vB, offset//CCCC */
6508 lsr w2, wINST, #12 // w2<- B
6509 FETCH w3, 1 // w3<- field byte offset
6510 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6511 ubfx w0, wINST, #8, #4 // w0<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006512 cbz w2, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006513 GET_VREG_WIDE x0, w0 // x0-< fp[A]
6514 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01006515 str x0, [x2, x3] // obj.field<- x0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006516 GET_INST_OPCODE ip // extract opcode from wINST
6517 GOTO_OPCODE ip // jump to next instruction
6518
6519/* ------------------------------ */
6520 .balign 128
6521.L_op_iput_object_quick: /* 0xe8 */
6522/* File: arm64/op_iput_object_quick.S */
6523 EXPORT_PC
6524 add x0, xFP, #OFF_FP_SHADOWFRAME
6525 mov x1, xPC
6526 mov w2, wINST
6527 bl MterpIputObjectQuick
6528 cbz w0, MterpException
6529 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6530 GET_INST_OPCODE ip // extract opcode from rINST
6531 GOTO_OPCODE ip // jump to next instruction
6532
6533/* ------------------------------ */
6534 .balign 128
6535.L_op_invoke_virtual_quick: /* 0xe9 */
6536/* File: arm64/op_invoke_virtual_quick.S */
6537/* File: arm64/invoke.S */
6538 /*
6539 * Generic invoke handler wrapper.
6540 */
6541 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6542 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6543 .extern MterpInvokeVirtualQuick
6544 EXPORT_PC
6545 mov x0, xSELF
6546 add x1, xFP, #OFF_FP_SHADOWFRAME
6547 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006548 mov x3, xINST
6549 bl MterpInvokeVirtualQuick
6550 cbz w0, MterpException
6551 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006552 bl MterpShouldSwitchInterpreters
6553 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006554 GET_INST_OPCODE ip
6555 GOTO_OPCODE ip
6556
6557
6558
6559/* ------------------------------ */
6560 .balign 128
6561.L_op_invoke_virtual_range_quick: /* 0xea */
6562/* File: arm64/op_invoke_virtual_range_quick.S */
6563/* File: arm64/invoke.S */
6564 /*
6565 * Generic invoke handler wrapper.
6566 */
6567 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6568 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6569 .extern MterpInvokeVirtualQuickRange
6570 EXPORT_PC
6571 mov x0, xSELF
6572 add x1, xFP, #OFF_FP_SHADOWFRAME
6573 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006574 mov x3, xINST
6575 bl MterpInvokeVirtualQuickRange
6576 cbz w0, MterpException
6577 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006578 bl MterpShouldSwitchInterpreters
6579 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006580 GET_INST_OPCODE ip
6581 GOTO_OPCODE ip
6582
6583
6584
6585/* ------------------------------ */
6586 .balign 128
6587.L_op_iput_boolean_quick: /* 0xeb */
6588/* File: arm64/op_iput_boolean_quick.S */
6589/* File: arm64/op_iput_quick.S */
6590 /* For: iput-quick, iput-object-quick */
6591 /* op vA, vB, offset//CCCC */
6592 lsr w2, wINST, #12 // w2<- B
6593 FETCH w1, 1 // w1<- field byte offset
6594 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6595 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006596 cbz w3, common_errNullObject // object was null
6597 GET_VREG w0, w2 // w0<- fp[A]
6598 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6599 strb w0, [x3, x1] // obj.field<- w0
6600 GET_INST_OPCODE ip // extract opcode from rINST
6601 GOTO_OPCODE ip // jump to next instruction
6602
6603
6604/* ------------------------------ */
6605 .balign 128
6606.L_op_iput_byte_quick: /* 0xec */
6607/* File: arm64/op_iput_byte_quick.S */
6608/* File: arm64/op_iput_quick.S */
6609 /* For: iput-quick, iput-object-quick */
6610 /* op vA, vB, offset//CCCC */
6611 lsr w2, wINST, #12 // w2<- B
6612 FETCH w1, 1 // w1<- field byte offset
6613 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6614 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006615 cbz w3, common_errNullObject // object was null
6616 GET_VREG w0, w2 // w0<- fp[A]
6617 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6618 strb w0, [x3, x1] // obj.field<- w0
6619 GET_INST_OPCODE ip // extract opcode from rINST
6620 GOTO_OPCODE ip // jump to next instruction
6621
6622
6623/* ------------------------------ */
6624 .balign 128
6625.L_op_iput_char_quick: /* 0xed */
6626/* File: arm64/op_iput_char_quick.S */
6627/* File: arm64/op_iput_quick.S */
6628 /* For: iput-quick, iput-object-quick */
6629 /* op vA, vB, offset//CCCC */
6630 lsr w2, wINST, #12 // w2<- B
6631 FETCH w1, 1 // w1<- field byte offset
6632 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6633 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006634 cbz w3, common_errNullObject // object was null
6635 GET_VREG w0, w2 // w0<- fp[A]
6636 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6637 strh w0, [x3, x1] // obj.field<- w0
6638 GET_INST_OPCODE ip // extract opcode from rINST
6639 GOTO_OPCODE ip // jump to next instruction
6640
6641
6642/* ------------------------------ */
6643 .balign 128
6644.L_op_iput_short_quick: /* 0xee */
6645/* File: arm64/op_iput_short_quick.S */
6646/* File: arm64/op_iput_quick.S */
6647 /* For: iput-quick, iput-object-quick */
6648 /* op vA, vB, offset//CCCC */
6649 lsr w2, wINST, #12 // w2<- B
6650 FETCH w1, 1 // w1<- field byte offset
6651 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6652 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006653 cbz w3, common_errNullObject // object was null
6654 GET_VREG w0, w2 // w0<- fp[A]
6655 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6656 strh w0, [x3, x1] // obj.field<- w0
6657 GET_INST_OPCODE ip // extract opcode from rINST
6658 GOTO_OPCODE ip // jump to next instruction
6659
6660
6661/* ------------------------------ */
6662 .balign 128
6663.L_op_iget_boolean_quick: /* 0xef */
6664/* File: arm64/op_iget_boolean_quick.S */
6665/* File: arm64/op_iget_quick.S */
6666 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6667 /* op vA, vB, offset//CCCC */
6668 lsr w2, wINST, #12 // w2<- B
6669 FETCH w1, 1 // w1<- field byte offset
6670 GET_VREG w3, w2 // w3<- object we're operating on
6671 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006672 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006673 ldrb w0, [x3, x1] // w0<- obj.field
6674 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6675
6676 SET_VREG w0, w2 // fp[A]<- w0
6677 GET_INST_OPCODE ip // extract opcode from rINST
6678 GOTO_OPCODE ip // jump to next instruction
6679
6680
6681/* ------------------------------ */
6682 .balign 128
6683.L_op_iget_byte_quick: /* 0xf0 */
6684/* File: arm64/op_iget_byte_quick.S */
6685/* File: arm64/op_iget_quick.S */
6686 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6687 /* op vA, vB, offset//CCCC */
6688 lsr w2, wINST, #12 // w2<- B
6689 FETCH w1, 1 // w1<- field byte offset
6690 GET_VREG w3, w2 // w3<- object we're operating on
6691 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006692 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006693 ldrsb w0, [x3, x1] // w0<- obj.field
6694 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6695
6696 SET_VREG w0, w2 // fp[A]<- w0
6697 GET_INST_OPCODE ip // extract opcode from rINST
6698 GOTO_OPCODE ip // jump to next instruction
6699
6700
6701/* ------------------------------ */
6702 .balign 128
6703.L_op_iget_char_quick: /* 0xf1 */
6704/* File: arm64/op_iget_char_quick.S */
6705/* File: arm64/op_iget_quick.S */
6706 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6707 /* op vA, vB, offset//CCCC */
6708 lsr w2, wINST, #12 // w2<- B
6709 FETCH w1, 1 // w1<- field byte offset
6710 GET_VREG w3, w2 // w3<- object we're operating on
6711 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006712 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006713 ldrh w0, [x3, x1] // w0<- obj.field
6714 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6715
6716 SET_VREG w0, w2 // fp[A]<- w0
6717 GET_INST_OPCODE ip // extract opcode from rINST
6718 GOTO_OPCODE ip // jump to next instruction
6719
6720
6721/* ------------------------------ */
6722 .balign 128
6723.L_op_iget_short_quick: /* 0xf2 */
6724/* File: arm64/op_iget_short_quick.S */
6725/* File: arm64/op_iget_quick.S */
6726 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6727 /* op vA, vB, offset//CCCC */
6728 lsr w2, wINST, #12 // w2<- B
6729 FETCH w1, 1 // w1<- field byte offset
6730 GET_VREG w3, w2 // w3<- object we're operating on
6731 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006732 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006733 ldrsh w0, [x3, x1] // w0<- obj.field
6734 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6735
6736 SET_VREG w0, w2 // fp[A]<- w0
6737 GET_INST_OPCODE ip // extract opcode from rINST
6738 GOTO_OPCODE ip // jump to next instruction
6739
6740
6741/* ------------------------------ */
6742 .balign 128
6743.L_op_invoke_lambda: /* 0xf3 */
6744/* Transfer stub to alternate interpreter */
6745 b MterpFallback
6746
6747
6748/* ------------------------------ */
6749 .balign 128
6750.L_op_unused_f4: /* 0xf4 */
6751/* File: arm64/op_unused_f4.S */
6752/* File: arm64/unused.S */
6753/*
6754 * Bail to reference interpreter to throw.
6755 */
6756 b MterpFallback
6757
6758
6759/* ------------------------------ */
6760 .balign 128
6761.L_op_capture_variable: /* 0xf5 */
6762/* Transfer stub to alternate interpreter */
6763 b MterpFallback
6764
6765
6766/* ------------------------------ */
6767 .balign 128
6768.L_op_create_lambda: /* 0xf6 */
6769/* Transfer stub to alternate interpreter */
6770 b MterpFallback
6771
6772
6773/* ------------------------------ */
6774 .balign 128
6775.L_op_liberate_variable: /* 0xf7 */
6776/* Transfer stub to alternate interpreter */
6777 b MterpFallback
6778
6779
6780/* ------------------------------ */
6781 .balign 128
6782.L_op_box_lambda: /* 0xf8 */
6783/* Transfer stub to alternate interpreter */
6784 b MterpFallback
6785
6786
6787/* ------------------------------ */
6788 .balign 128
6789.L_op_unbox_lambda: /* 0xf9 */
6790/* Transfer stub to alternate interpreter */
6791 b MterpFallback
6792
6793
6794/* ------------------------------ */
6795 .balign 128
6796.L_op_unused_fa: /* 0xfa */
6797/* File: arm64/op_unused_fa.S */
6798/* File: arm64/unused.S */
6799/*
6800 * Bail to reference interpreter to throw.
6801 */
6802 b MterpFallback
6803
6804
6805/* ------------------------------ */
6806 .balign 128
6807.L_op_unused_fb: /* 0xfb */
6808/* File: arm64/op_unused_fb.S */
6809/* File: arm64/unused.S */
6810/*
6811 * Bail to reference interpreter to throw.
6812 */
6813 b MterpFallback
6814
6815
6816/* ------------------------------ */
6817 .balign 128
6818.L_op_unused_fc: /* 0xfc */
6819/* File: arm64/op_unused_fc.S */
6820/* File: arm64/unused.S */
6821/*
6822 * Bail to reference interpreter to throw.
6823 */
6824 b MterpFallback
6825
6826
6827/* ------------------------------ */
6828 .balign 128
6829.L_op_unused_fd: /* 0xfd */
6830/* File: arm64/op_unused_fd.S */
6831/* File: arm64/unused.S */
6832/*
6833 * Bail to reference interpreter to throw.
6834 */
6835 b MterpFallback
6836
6837
6838/* ------------------------------ */
6839 .balign 128
6840.L_op_unused_fe: /* 0xfe */
6841/* File: arm64/op_unused_fe.S */
6842/* File: arm64/unused.S */
6843/*
6844 * Bail to reference interpreter to throw.
6845 */
6846 b MterpFallback
6847
6848
6849/* ------------------------------ */
6850 .balign 128
6851.L_op_unused_ff: /* 0xff */
6852/* File: arm64/op_unused_ff.S */
6853/* File: arm64/unused.S */
6854/*
6855 * Bail to reference interpreter to throw.
6856 */
6857 b MterpFallback
6858
6859
6860 .balign 128
6861 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
6862 .global artMterpAsmInstructionEnd
6863artMterpAsmInstructionEnd:
6864
6865/*
6866 * ===========================================================================
6867 * Sister implementations
6868 * ===========================================================================
6869 */
6870 .global artMterpAsmSisterStart
6871 .type artMterpAsmSisterStart, %function
6872 .text
6873 .balign 4
6874artMterpAsmSisterStart:
6875
6876 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
6877 .global artMterpAsmSisterEnd
6878artMterpAsmSisterEnd:
6879
Vladimir Marko20421b92016-07-26 16:38:11 +01006880/* File: arm64/footer.S */
6881/*
6882 * ===========================================================================
6883 * Common subroutines and data
6884 * ===========================================================================
6885 */
6886
6887
6888/*
6889 * We've detected a condition that will result in an exception, but the exception
6890 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
6891 * TUNING: for consistency, we may want to just go ahead and handle these here.
6892 */
6893common_errDivideByZero:
6894 EXPORT_PC
6895#if MTERP_LOGGING
6896 mov x0, xSELF
6897 add x1, xFP, #OFF_FP_SHADOWFRAME
6898 bl MterpLogDivideByZeroException
6899#endif
6900 b MterpCommonFallback
6901
6902common_errArrayIndex:
6903 EXPORT_PC
6904#if MTERP_LOGGING
6905 mov x0, xSELF
6906 add x1, xFP, #OFF_FP_SHADOWFRAME
6907 bl MterpLogArrayIndexException
6908#endif
6909 b MterpCommonFallback
6910
6911common_errNegativeArraySize:
6912 EXPORT_PC
6913#if MTERP_LOGGING
6914 mov x0, xSELF
6915 add x1, xFP, #OFF_FP_SHADOWFRAME
6916 bl MterpLogNegativeArraySizeException
6917#endif
6918 b MterpCommonFallback
6919
6920common_errNoSuchMethod:
6921 EXPORT_PC
6922#if MTERP_LOGGING
6923 mov x0, xSELF
6924 add x1, xFP, #OFF_FP_SHADOWFRAME
6925 bl MterpLogNoSuchMethodException
6926#endif
6927 b MterpCommonFallback
6928
6929common_errNullObject:
6930 EXPORT_PC
6931#if MTERP_LOGGING
6932 mov x0, xSELF
6933 add x1, xFP, #OFF_FP_SHADOWFRAME
6934 bl MterpLogNullObjectException
6935#endif
6936 b MterpCommonFallback
6937
6938common_exceptionThrown:
6939 EXPORT_PC
6940#if MTERP_LOGGING
6941 mov x0, xSELF
6942 add x1, xFP, #OFF_FP_SHADOWFRAME
6943 bl MterpLogExceptionThrownException
6944#endif
6945 b MterpCommonFallback
6946
6947MterpSuspendFallback:
6948 EXPORT_PC
6949#if MTERP_LOGGING
6950 mov x0, xSELF
6951 add x1, xFP, #OFF_FP_SHADOWFRAME
6952 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
6953 bl MterpLogSuspendFallback
6954#endif
6955 b MterpCommonFallback
6956
6957/*
6958 * If we're here, something is out of the ordinary. If there is a pending
6959 * exception, handle it. Otherwise, roll back and retry with the reference
6960 * interpreter.
6961 */
6962MterpPossibleException:
6963 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
6964 cbz x0, MterpFallback // If not, fall back to reference interpreter.
6965 /* intentional fallthrough - handle pending exception. */
6966/*
6967 * On return from a runtime helper routine, we've found a pending exception.
6968 * Can we handle it here - or need to bail out to caller?
6969 *
6970 */
6971MterpException:
6972 mov x0, xSELF
6973 add x1, xFP, #OFF_FP_SHADOWFRAME
6974 bl MterpHandleException // (self, shadow_frame)
6975 cbz w0, MterpExceptionReturn // no local catch, back to caller.
6976 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
6977 ldr w1, [xFP, #OFF_FP_DEX_PC]
6978 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
6979 add xPC, x0, #CODEITEM_INSNS_OFFSET
6980 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
6981 /* Do we need to switch interpreters? */
6982 bl MterpShouldSwitchInterpreters
6983 cbnz w0, MterpFallback
6984 /* resume execution at catch block */
6985 EXPORT_PC
6986 FETCH_INST
6987 GET_INST_OPCODE ip
6988 GOTO_OPCODE ip
6989 /* NOTE: no fallthrough */
6990/*
6991 * Common handling for branches with support for Jit profiling.
6992 * On entry:
6993 * wINST <= signed offset
6994 * wPROFILE <= signed hotness countdown (expanded to 32 bits)
6995 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
6996 *
6997 * We have quite a few different cases for branch profiling, OSR detection and
6998 * suspend check support here.
6999 *
7000 * Taken backward branches:
7001 * If profiling active, do hotness countdown and report if we hit zero.
7002 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
7003 * Is there a pending suspend request? If so, suspend.
7004 *
7005 * Taken forward branches and not-taken backward branches:
7006 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
7007 *
7008 * Our most common case is expected to be a taken backward branch with active jit profiling,
7009 * but no full OSR check and no pending suspend request.
7010 * Next most common case is not-taken branch with no full OSR check.
7011 *
7012 */
7013MterpCommonTakenBranchNoFlags:
7014 cmp wINST, #0
7015 b.gt .L_forward_branch // don't add forward branches to hotness
7016 tbnz wPROFILE, #31, .L_no_count_backwards // go if negative
7017 subs wPROFILE, wPROFILE, #1 // countdown
7018 b.eq .L_add_batch // counted down to zero - report
7019.L_resume_backward_branch:
7020 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
7021 add w2, wINST, wINST // w2<- byte offset
7022 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
7023 REFRESH_IBASE
7024 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
7025 b.ne .L_suspend_request_pending
7026 GET_INST_OPCODE ip // extract opcode from wINST
7027 GOTO_OPCODE ip // jump to next instruction
7028
7029.L_suspend_request_pending:
7030 EXPORT_PC
7031 mov x0, xSELF
7032 bl MterpSuspendCheck // (self)
7033 cbnz x0, MterpFallback
7034 REFRESH_IBASE // might have changed during suspend
7035 GET_INST_OPCODE ip // extract opcode from wINST
7036 GOTO_OPCODE ip // jump to next instruction
7037
7038.L_no_count_backwards:
7039 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
7040 b.ne .L_resume_backward_branch
7041 mov x0, xSELF
7042 add x1, xFP, #OFF_FP_SHADOWFRAME
7043 mov x2, xINST
7044 EXPORT_PC
7045 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7046 cbnz x0, MterpOnStackReplacement
7047 b .L_resume_backward_branch
7048
7049.L_forward_branch:
7050 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
7051 b.eq .L_check_osr_forward
7052.L_resume_forward_branch:
7053 add w2, wINST, wINST // w2<- byte offset
7054 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
7055 GET_INST_OPCODE ip // extract opcode from wINST
7056 GOTO_OPCODE ip // jump to next instruction
7057
7058.L_check_osr_forward:
7059 mov x0, xSELF
7060 add x1, xFP, #OFF_FP_SHADOWFRAME
7061 mov x2, xINST
7062 EXPORT_PC
7063 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7064 cbnz x0, MterpOnStackReplacement
7065 b .L_resume_forward_branch
7066
7067.L_add_batch:
7068 add x1, xFP, #OFF_FP_SHADOWFRAME
7069 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
7070 ldr x0, [xFP, #OFF_FP_METHOD]
7071 mov x2, xSELF
7072 bl MterpAddHotnessBatch // (method, shadow_frame, self)
7073 mov wPROFILE, w0 // restore new hotness countdown to wPROFILE
7074 b .L_no_count_backwards
7075
7076/*
7077 * Entered from the conditional branch handlers when OSR check request active on
7078 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
7079 */
7080.L_check_not_taken_osr:
7081 mov x0, xSELF
7082 add x1, xFP, #OFF_FP_SHADOWFRAME
7083 mov x2, #2
7084 EXPORT_PC
7085 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7086 cbnz x0, MterpOnStackReplacement
7087 FETCH_ADVANCE_INST 2
7088 GET_INST_OPCODE ip // extract opcode from wINST
7089 GOTO_OPCODE ip // jump to next instruction
7090
7091
7092/*
7093 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
7094 * still needs to get the opcode and branch to it, and flags are in lr.
7095 */
7096MterpCheckSuspendAndContinue:
7097 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
7098 ands w7, w7, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
7099 b.ne check1
7100 GET_INST_OPCODE ip // extract opcode from wINST
7101 GOTO_OPCODE ip // jump to next instruction
7102check1:
7103 EXPORT_PC
7104 mov x0, xSELF
7105 bl MterpSuspendCheck // (self)
7106 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
7107 GET_INST_OPCODE ip // extract opcode from wINST
7108 GOTO_OPCODE ip // jump to next instruction
7109
7110/*
7111 * On-stack replacement has happened, and now we've returned from the compiled method.
7112 */
7113MterpOnStackReplacement:
7114#if MTERP_LOGGING
7115 mov x0, xSELF
7116 add x1, xFP, #OFF_FP_SHADOWFRAME
7117 sxtw x2, wINST
7118 bl MterpLogOSR
7119#endif
7120 mov x0, #1 // Signal normal return
7121 b MterpDone
7122
7123/*
7124 * Bail out to reference interpreter.
7125 */
7126MterpFallback:
7127 EXPORT_PC
7128#if MTERP_LOGGING
7129 mov x0, xSELF
7130 add x1, xFP, #OFF_FP_SHADOWFRAME
7131 bl MterpLogFallback
7132#endif
7133MterpCommonFallback:
7134 mov x0, #0 // signal retry with reference interpreter.
7135 b MterpDone
7136
7137/*
7138 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
7139 * SP and LR. Here we restore SP, restore the registers, and then restore
7140 * LR to PC.
7141 *
7142 * On entry:
7143 * uint32_t* xFP (should still be live, pointer to base of vregs)
7144 */
7145MterpExceptionReturn:
7146 mov x0, #1 // signal return to caller.
7147 b MterpDone
7148MterpReturn:
7149 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
7150 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
7151 str x0, [x2]
7152 mov x0, xSELF
7153 ands lr, lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
7154 b.eq check2
7155 bl MterpSuspendCheck // (self)
7156check2:
7157 mov x0, #1 // signal return to caller.
7158MterpDone:
7159/*
7160 * At this point, we expect wPROFILE to be non-zero. If negative, hotness is disabled or we're
7161 * checking for OSR. If greater than zero, we might have unreported hotness to register
7162 * (the difference between the ending wPROFILE and the cached hotness counter). wPROFILE
7163 * should only reach zero immediately after a hotness decrement, and is then reset to either
7164 * a negative special state or the new non-zero countdown value.
7165 */
7166 cmp wPROFILE, #0
7167 bgt MterpProfileActive // if > 0, we may have some counts to report.
7168 ldp fp, lr, [sp, #64]
7169 ldp xPC, xFP, [sp, #48]
7170 ldp xSELF, xINST, [sp, #32]
7171 ldp xIBASE, xREFS, [sp, #16]
7172 ldp xPROFILE, x27, [sp], #80
7173 ret
7174
7175MterpProfileActive:
7176 mov xINST, x0 // stash return value
7177 /* Report cached hotness counts */
7178 ldr x0, [xFP, #OFF_FP_METHOD]
7179 add x1, xFP, #OFF_FP_SHADOWFRAME
7180 mov x2, xSELF
7181 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
7182 bl MterpAddHotnessBatch // (method, shadow_frame, self)
7183 mov x0, xINST // restore return value
7184 ldp fp, lr, [sp, #64]
7185 ldp xPC, xFP, [sp, #48]
7186 ldp xSELF, xINST, [sp, #32]
7187 ldp xIBASE, xREFS, [sp, #16]
7188 ldp xPROFILE, x27, [sp], #80
7189 ret
7190
7191 .cfi_endproc
7192 .size ExecuteMterpImpl, .-ExecuteMterpImpl
7193
7194
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007195
7196 .global artMterpAsmAltInstructionStart
7197 .type artMterpAsmAltInstructionStart, %function
7198 .text
7199
7200artMterpAsmAltInstructionStart = .L_ALT_op_nop
7201/* ------------------------------ */
7202 .balign 128
7203.L_ALT_op_nop: /* 0x00 */
7204/* File: arm64/alt_stub.S */
7205/*
7206 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7207 * any interesting requests and then jump to the real instruction
7208 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7209 */
7210 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007211 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7212 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
7213 mov x0, xSELF
7214 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007215 mov x2, xPC
7216 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007217
7218/* ------------------------------ */
7219 .balign 128
7220.L_ALT_op_move: /* 0x01 */
7221/* File: arm64/alt_stub.S */
7222/*
7223 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7224 * any interesting requests and then jump to the real instruction
7225 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7226 */
7227 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007228 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7229 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
7230 mov x0, xSELF
7231 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007232 mov x2, xPC
7233 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007234
7235/* ------------------------------ */
7236 .balign 128
7237.L_ALT_op_move_from16: /* 0x02 */
7238/* File: arm64/alt_stub.S */
7239/*
7240 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7241 * any interesting requests and then jump to the real instruction
7242 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7243 */
7244 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007245 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7246 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
7247 mov x0, xSELF
7248 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007249 mov x2, xPC
7250 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007251
7252/* ------------------------------ */
7253 .balign 128
7254.L_ALT_op_move_16: /* 0x03 */
7255/* File: arm64/alt_stub.S */
7256/*
7257 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7258 * any interesting requests and then jump to the real instruction
7259 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7260 */
7261 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007262 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7263 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
7264 mov x0, xSELF
7265 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007266 mov x2, xPC
7267 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007268
7269/* ------------------------------ */
7270 .balign 128
7271.L_ALT_op_move_wide: /* 0x04 */
7272/* File: arm64/alt_stub.S */
7273/*
7274 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7275 * any interesting requests and then jump to the real instruction
7276 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7277 */
7278 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007279 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7280 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
7281 mov x0, xSELF
7282 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007283 mov x2, xPC
7284 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007285
7286/* ------------------------------ */
7287 .balign 128
7288.L_ALT_op_move_wide_from16: /* 0x05 */
7289/* File: arm64/alt_stub.S */
7290/*
7291 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7292 * any interesting requests and then jump to the real instruction
7293 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7294 */
7295 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007296 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7297 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
7298 mov x0, xSELF
7299 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007300 mov x2, xPC
7301 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007302
7303/* ------------------------------ */
7304 .balign 128
7305.L_ALT_op_move_wide_16: /* 0x06 */
7306/* File: arm64/alt_stub.S */
7307/*
7308 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7309 * any interesting requests and then jump to the real instruction
7310 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7311 */
7312 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007313 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7314 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7315 mov x0, xSELF
7316 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007317 mov x2, xPC
7318 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007319
7320/* ------------------------------ */
7321 .balign 128
7322.L_ALT_op_move_object: /* 0x07 */
7323/* File: arm64/alt_stub.S */
7324/*
7325 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7326 * any interesting requests and then jump to the real instruction
7327 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7328 */
7329 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007330 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7331 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7332 mov x0, xSELF
7333 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007334 mov x2, xPC
7335 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007336
7337/* ------------------------------ */
7338 .balign 128
7339.L_ALT_op_move_object_from16: /* 0x08 */
7340/* File: arm64/alt_stub.S */
7341/*
7342 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7343 * any interesting requests and then jump to the real instruction
7344 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7345 */
7346 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007347 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7348 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7349 mov x0, xSELF
7350 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007351 mov x2, xPC
7352 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007353
7354/* ------------------------------ */
7355 .balign 128
7356.L_ALT_op_move_object_16: /* 0x09 */
7357/* File: arm64/alt_stub.S */
7358/*
7359 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7360 * any interesting requests and then jump to the real instruction
7361 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7362 */
7363 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007364 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7365 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7366 mov x0, xSELF
7367 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007368 mov x2, xPC
7369 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007370
7371/* ------------------------------ */
7372 .balign 128
7373.L_ALT_op_move_result: /* 0x0a */
7374/* File: arm64/alt_stub.S */
7375/*
7376 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7377 * any interesting requests and then jump to the real instruction
7378 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7379 */
7380 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007381 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7382 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7383 mov x0, xSELF
7384 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007385 mov x2, xPC
7386 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007387
7388/* ------------------------------ */
7389 .balign 128
7390.L_ALT_op_move_result_wide: /* 0x0b */
7391/* File: arm64/alt_stub.S */
7392/*
7393 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7394 * any interesting requests and then jump to the real instruction
7395 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7396 */
7397 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007398 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7399 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7400 mov x0, xSELF
7401 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007402 mov x2, xPC
7403 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007404
7405/* ------------------------------ */
7406 .balign 128
7407.L_ALT_op_move_result_object: /* 0x0c */
7408/* File: arm64/alt_stub.S */
7409/*
7410 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7411 * any interesting requests and then jump to the real instruction
7412 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7413 */
7414 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007415 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7416 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7417 mov x0, xSELF
7418 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007419 mov x2, xPC
7420 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007421
7422/* ------------------------------ */
7423 .balign 128
7424.L_ALT_op_move_exception: /* 0x0d */
7425/* File: arm64/alt_stub.S */
7426/*
7427 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7428 * any interesting requests and then jump to the real instruction
7429 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7430 */
7431 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007432 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7433 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7434 mov x0, xSELF
7435 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007436 mov x2, xPC
7437 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007438
7439/* ------------------------------ */
7440 .balign 128
7441.L_ALT_op_return_void: /* 0x0e */
7442/* File: arm64/alt_stub.S */
7443/*
7444 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7445 * any interesting requests and then jump to the real instruction
7446 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7447 */
7448 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007449 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7450 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7451 mov x0, xSELF
7452 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007453 mov x2, xPC
7454 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007455
7456/* ------------------------------ */
7457 .balign 128
7458.L_ALT_op_return: /* 0x0f */
7459/* File: arm64/alt_stub.S */
7460/*
7461 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7462 * any interesting requests and then jump to the real instruction
7463 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7464 */
7465 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007466 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7467 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7468 mov x0, xSELF
7469 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007470 mov x2, xPC
7471 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007472
7473/* ------------------------------ */
7474 .balign 128
7475.L_ALT_op_return_wide: /* 0x10 */
7476/* File: arm64/alt_stub.S */
7477/*
7478 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7479 * any interesting requests and then jump to the real instruction
7480 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7481 */
7482 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007483 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7484 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7485 mov x0, xSELF
7486 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007487 mov x2, xPC
7488 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007489
7490/* ------------------------------ */
7491 .balign 128
7492.L_ALT_op_return_object: /* 0x11 */
7493/* File: arm64/alt_stub.S */
7494/*
7495 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7496 * any interesting requests and then jump to the real instruction
7497 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7498 */
7499 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007500 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7501 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7502 mov x0, xSELF
7503 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007504 mov x2, xPC
7505 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007506
7507/* ------------------------------ */
7508 .balign 128
7509.L_ALT_op_const_4: /* 0x12 */
7510/* File: arm64/alt_stub.S */
7511/*
7512 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7513 * any interesting requests and then jump to the real instruction
7514 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7515 */
7516 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007517 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7518 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7519 mov x0, xSELF
7520 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007521 mov x2, xPC
7522 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007523
7524/* ------------------------------ */
7525 .balign 128
7526.L_ALT_op_const_16: /* 0x13 */
7527/* File: arm64/alt_stub.S */
7528/*
7529 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7530 * any interesting requests and then jump to the real instruction
7531 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7532 */
7533 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007534 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7535 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7536 mov x0, xSELF
7537 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007538 mov x2, xPC
7539 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007540
7541/* ------------------------------ */
7542 .balign 128
7543.L_ALT_op_const: /* 0x14 */
7544/* File: arm64/alt_stub.S */
7545/*
7546 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7547 * any interesting requests and then jump to the real instruction
7548 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7549 */
7550 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007551 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7552 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7553 mov x0, xSELF
7554 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007555 mov x2, xPC
7556 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007557
7558/* ------------------------------ */
7559 .balign 128
7560.L_ALT_op_const_high16: /* 0x15 */
7561/* File: arm64/alt_stub.S */
7562/*
7563 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7564 * any interesting requests and then jump to the real instruction
7565 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7566 */
7567 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007568 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7569 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7570 mov x0, xSELF
7571 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007572 mov x2, xPC
7573 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007574
7575/* ------------------------------ */
7576 .balign 128
7577.L_ALT_op_const_wide_16: /* 0x16 */
7578/* File: arm64/alt_stub.S */
7579/*
7580 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7581 * any interesting requests and then jump to the real instruction
7582 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7583 */
7584 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007585 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7586 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7587 mov x0, xSELF
7588 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007589 mov x2, xPC
7590 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007591
7592/* ------------------------------ */
7593 .balign 128
7594.L_ALT_op_const_wide_32: /* 0x17 */
7595/* File: arm64/alt_stub.S */
7596/*
7597 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7598 * any interesting requests and then jump to the real instruction
7599 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7600 */
7601 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007602 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7603 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7604 mov x0, xSELF
7605 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007606 mov x2, xPC
7607 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007608
7609/* ------------------------------ */
7610 .balign 128
7611.L_ALT_op_const_wide: /* 0x18 */
7612/* File: arm64/alt_stub.S */
7613/*
7614 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7615 * any interesting requests and then jump to the real instruction
7616 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7617 */
7618 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007619 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7620 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7621 mov x0, xSELF
7622 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007623 mov x2, xPC
7624 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007625
7626/* ------------------------------ */
7627 .balign 128
7628.L_ALT_op_const_wide_high16: /* 0x19 */
7629/* File: arm64/alt_stub.S */
7630/*
7631 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7632 * any interesting requests and then jump to the real instruction
7633 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7634 */
7635 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007636 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7637 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7638 mov x0, xSELF
7639 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007640 mov x2, xPC
7641 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007642
7643/* ------------------------------ */
7644 .balign 128
7645.L_ALT_op_const_string: /* 0x1a */
7646/* File: arm64/alt_stub.S */
7647/*
7648 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7649 * any interesting requests and then jump to the real instruction
7650 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7651 */
7652 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007653 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7654 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7655 mov x0, xSELF
7656 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007657 mov x2, xPC
7658 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007659
7660/* ------------------------------ */
7661 .balign 128
7662.L_ALT_op_const_string_jumbo: /* 0x1b */
7663/* File: arm64/alt_stub.S */
7664/*
7665 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7666 * any interesting requests and then jump to the real instruction
7667 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7668 */
7669 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007670 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7671 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7672 mov x0, xSELF
7673 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007674 mov x2, xPC
7675 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007676
7677/* ------------------------------ */
7678 .balign 128
7679.L_ALT_op_const_class: /* 0x1c */
7680/* File: arm64/alt_stub.S */
7681/*
7682 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7683 * any interesting requests and then jump to the real instruction
7684 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7685 */
7686 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007687 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7688 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7689 mov x0, xSELF
7690 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007691 mov x2, xPC
7692 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007693
7694/* ------------------------------ */
7695 .balign 128
7696.L_ALT_op_monitor_enter: /* 0x1d */
7697/* File: arm64/alt_stub.S */
7698/*
7699 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7700 * any interesting requests and then jump to the real instruction
7701 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7702 */
7703 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007704 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7705 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7706 mov x0, xSELF
7707 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007708 mov x2, xPC
7709 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007710
7711/* ------------------------------ */
7712 .balign 128
7713.L_ALT_op_monitor_exit: /* 0x1e */
7714/* File: arm64/alt_stub.S */
7715/*
7716 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7717 * any interesting requests and then jump to the real instruction
7718 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7719 */
7720 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007721 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7722 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7723 mov x0, xSELF
7724 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007725 mov x2, xPC
7726 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007727
7728/* ------------------------------ */
7729 .balign 128
7730.L_ALT_op_check_cast: /* 0x1f */
7731/* File: arm64/alt_stub.S */
7732/*
7733 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7734 * any interesting requests and then jump to the real instruction
7735 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7736 */
7737 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007738 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7739 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7740 mov x0, xSELF
7741 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007742 mov x2, xPC
7743 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007744
7745/* ------------------------------ */
7746 .balign 128
7747.L_ALT_op_instance_of: /* 0x20 */
7748/* File: arm64/alt_stub.S */
7749/*
7750 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7751 * any interesting requests and then jump to the real instruction
7752 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7753 */
7754 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007755 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7756 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7757 mov x0, xSELF
7758 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007759 mov x2, xPC
7760 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007761
7762/* ------------------------------ */
7763 .balign 128
7764.L_ALT_op_array_length: /* 0x21 */
7765/* File: arm64/alt_stub.S */
7766/*
7767 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7768 * any interesting requests and then jump to the real instruction
7769 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7770 */
7771 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007772 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7773 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7774 mov x0, xSELF
7775 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007776 mov x2, xPC
7777 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007778
7779/* ------------------------------ */
7780 .balign 128
7781.L_ALT_op_new_instance: /* 0x22 */
7782/* File: arm64/alt_stub.S */
7783/*
7784 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7785 * any interesting requests and then jump to the real instruction
7786 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7787 */
7788 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007789 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7790 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7791 mov x0, xSELF
7792 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007793 mov x2, xPC
7794 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007795
7796/* ------------------------------ */
7797 .balign 128
7798.L_ALT_op_new_array: /* 0x23 */
7799/* File: arm64/alt_stub.S */
7800/*
7801 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7802 * any interesting requests and then jump to the real instruction
7803 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7804 */
7805 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007806 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7807 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7808 mov x0, xSELF
7809 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007810 mov x2, xPC
7811 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007812
7813/* ------------------------------ */
7814 .balign 128
7815.L_ALT_op_filled_new_array: /* 0x24 */
7816/* File: arm64/alt_stub.S */
7817/*
7818 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7819 * any interesting requests and then jump to the real instruction
7820 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7821 */
7822 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007823 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7824 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7825 mov x0, xSELF
7826 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007827 mov x2, xPC
7828 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007829
7830/* ------------------------------ */
7831 .balign 128
7832.L_ALT_op_filled_new_array_range: /* 0x25 */
7833/* File: arm64/alt_stub.S */
7834/*
7835 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7836 * any interesting requests and then jump to the real instruction
7837 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7838 */
7839 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007840 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7841 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7842 mov x0, xSELF
7843 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007844 mov x2, xPC
7845 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007846
7847/* ------------------------------ */
7848 .balign 128
7849.L_ALT_op_fill_array_data: /* 0x26 */
7850/* File: arm64/alt_stub.S */
7851/*
7852 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7853 * any interesting requests and then jump to the real instruction
7854 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7855 */
7856 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007857 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7858 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7859 mov x0, xSELF
7860 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007861 mov x2, xPC
7862 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007863
7864/* ------------------------------ */
7865 .balign 128
7866.L_ALT_op_throw: /* 0x27 */
7867/* File: arm64/alt_stub.S */
7868/*
7869 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7870 * any interesting requests and then jump to the real instruction
7871 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7872 */
7873 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007874 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7875 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
7876 mov x0, xSELF
7877 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007878 mov x2, xPC
7879 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007880
7881/* ------------------------------ */
7882 .balign 128
7883.L_ALT_op_goto: /* 0x28 */
7884/* File: arm64/alt_stub.S */
7885/*
7886 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7887 * any interesting requests and then jump to the real instruction
7888 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7889 */
7890 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007891 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7892 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
7893 mov x0, xSELF
7894 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007895 mov x2, xPC
7896 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007897
7898/* ------------------------------ */
7899 .balign 128
7900.L_ALT_op_goto_16: /* 0x29 */
7901/* File: arm64/alt_stub.S */
7902/*
7903 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7904 * any interesting requests and then jump to the real instruction
7905 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7906 */
7907 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007908 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7909 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
7910 mov x0, xSELF
7911 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007912 mov x2, xPC
7913 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007914
7915/* ------------------------------ */
7916 .balign 128
7917.L_ALT_op_goto_32: /* 0x2a */
7918/* File: arm64/alt_stub.S */
7919/*
7920 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7921 * any interesting requests and then jump to the real instruction
7922 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7923 */
7924 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007925 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7926 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
7927 mov x0, xSELF
7928 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007929 mov x2, xPC
7930 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007931
7932/* ------------------------------ */
7933 .balign 128
7934.L_ALT_op_packed_switch: /* 0x2b */
7935/* File: arm64/alt_stub.S */
7936/*
7937 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7938 * any interesting requests and then jump to the real instruction
7939 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7940 */
7941 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007942 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7943 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
7944 mov x0, xSELF
7945 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007946 mov x2, xPC
7947 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007948
7949/* ------------------------------ */
7950 .balign 128
7951.L_ALT_op_sparse_switch: /* 0x2c */
7952/* File: arm64/alt_stub.S */
7953/*
7954 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7955 * any interesting requests and then jump to the real instruction
7956 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7957 */
7958 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007959 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7960 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
7961 mov x0, xSELF
7962 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007963 mov x2, xPC
7964 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007965
7966/* ------------------------------ */
7967 .balign 128
7968.L_ALT_op_cmpl_float: /* 0x2d */
7969/* File: arm64/alt_stub.S */
7970/*
7971 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7972 * any interesting requests and then jump to the real instruction
7973 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7974 */
7975 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007976 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7977 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
7978 mov x0, xSELF
7979 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007980 mov x2, xPC
7981 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007982
7983/* ------------------------------ */
7984 .balign 128
7985.L_ALT_op_cmpg_float: /* 0x2e */
7986/* File: arm64/alt_stub.S */
7987/*
7988 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7989 * any interesting requests and then jump to the real instruction
7990 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7991 */
7992 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007993 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7994 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
7995 mov x0, xSELF
7996 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007997 mov x2, xPC
7998 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007999
8000/* ------------------------------ */
8001 .balign 128
8002.L_ALT_op_cmpl_double: /* 0x2f */
8003/* File: arm64/alt_stub.S */
8004/*
8005 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8006 * any interesting requests and then jump to the real instruction
8007 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8008 */
8009 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008010 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8011 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
8012 mov x0, xSELF
8013 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008014 mov x2, xPC
8015 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008016
8017/* ------------------------------ */
8018 .balign 128
8019.L_ALT_op_cmpg_double: /* 0x30 */
8020/* File: arm64/alt_stub.S */
8021/*
8022 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8023 * any interesting requests and then jump to the real instruction
8024 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8025 */
8026 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008027 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8028 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
8029 mov x0, xSELF
8030 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008031 mov x2, xPC
8032 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008033
8034/* ------------------------------ */
8035 .balign 128
8036.L_ALT_op_cmp_long: /* 0x31 */
8037/* File: arm64/alt_stub.S */
8038/*
8039 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8040 * any interesting requests and then jump to the real instruction
8041 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8042 */
8043 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008044 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8045 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
8046 mov x0, xSELF
8047 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008048 mov x2, xPC
8049 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008050
8051/* ------------------------------ */
8052 .balign 128
8053.L_ALT_op_if_eq: /* 0x32 */
8054/* File: arm64/alt_stub.S */
8055/*
8056 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8057 * any interesting requests and then jump to the real instruction
8058 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8059 */
8060 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008061 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8062 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
8063 mov x0, xSELF
8064 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008065 mov x2, xPC
8066 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008067
8068/* ------------------------------ */
8069 .balign 128
8070.L_ALT_op_if_ne: /* 0x33 */
8071/* File: arm64/alt_stub.S */
8072/*
8073 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8074 * any interesting requests and then jump to the real instruction
8075 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8076 */
8077 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008078 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8079 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
8080 mov x0, xSELF
8081 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008082 mov x2, xPC
8083 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008084
8085/* ------------------------------ */
8086 .balign 128
8087.L_ALT_op_if_lt: /* 0x34 */
8088/* File: arm64/alt_stub.S */
8089/*
8090 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8091 * any interesting requests and then jump to the real instruction
8092 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8093 */
8094 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008095 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8096 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
8097 mov x0, xSELF
8098 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008099 mov x2, xPC
8100 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008101
8102/* ------------------------------ */
8103 .balign 128
8104.L_ALT_op_if_ge: /* 0x35 */
8105/* File: arm64/alt_stub.S */
8106/*
8107 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8108 * any interesting requests and then jump to the real instruction
8109 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8110 */
8111 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008112 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8113 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
8114 mov x0, xSELF
8115 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008116 mov x2, xPC
8117 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008118
8119/* ------------------------------ */
8120 .balign 128
8121.L_ALT_op_if_gt: /* 0x36 */
8122/* File: arm64/alt_stub.S */
8123/*
8124 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8125 * any interesting requests and then jump to the real instruction
8126 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8127 */
8128 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008129 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8130 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
8131 mov x0, xSELF
8132 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008133 mov x2, xPC
8134 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008135
8136/* ------------------------------ */
8137 .balign 128
8138.L_ALT_op_if_le: /* 0x37 */
8139/* File: arm64/alt_stub.S */
8140/*
8141 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8142 * any interesting requests and then jump to the real instruction
8143 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8144 */
8145 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008146 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8147 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
8148 mov x0, xSELF
8149 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008150 mov x2, xPC
8151 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008152
8153/* ------------------------------ */
8154 .balign 128
8155.L_ALT_op_if_eqz: /* 0x38 */
8156/* File: arm64/alt_stub.S */
8157/*
8158 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8159 * any interesting requests and then jump to the real instruction
8160 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8161 */
8162 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008163 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8164 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
8165 mov x0, xSELF
8166 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008167 mov x2, xPC
8168 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008169
8170/* ------------------------------ */
8171 .balign 128
8172.L_ALT_op_if_nez: /* 0x39 */
8173/* File: arm64/alt_stub.S */
8174/*
8175 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8176 * any interesting requests and then jump to the real instruction
8177 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8178 */
8179 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008180 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8181 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
8182 mov x0, xSELF
8183 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008184 mov x2, xPC
8185 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008186
8187/* ------------------------------ */
8188 .balign 128
8189.L_ALT_op_if_ltz: /* 0x3a */
8190/* File: arm64/alt_stub.S */
8191/*
8192 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8193 * any interesting requests and then jump to the real instruction
8194 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8195 */
8196 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008197 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8198 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
8199 mov x0, xSELF
8200 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008201 mov x2, xPC
8202 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008203
8204/* ------------------------------ */
8205 .balign 128
8206.L_ALT_op_if_gez: /* 0x3b */
8207/* File: arm64/alt_stub.S */
8208/*
8209 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8210 * any interesting requests and then jump to the real instruction
8211 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8212 */
8213 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008214 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8215 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
8216 mov x0, xSELF
8217 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008218 mov x2, xPC
8219 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008220
8221/* ------------------------------ */
8222 .balign 128
8223.L_ALT_op_if_gtz: /* 0x3c */
8224/* File: arm64/alt_stub.S */
8225/*
8226 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8227 * any interesting requests and then jump to the real instruction
8228 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8229 */
8230 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008231 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8232 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
8233 mov x0, xSELF
8234 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008235 mov x2, xPC
8236 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008237
8238/* ------------------------------ */
8239 .balign 128
8240.L_ALT_op_if_lez: /* 0x3d */
8241/* File: arm64/alt_stub.S */
8242/*
8243 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8244 * any interesting requests and then jump to the real instruction
8245 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8246 */
8247 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008248 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8249 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
8250 mov x0, xSELF
8251 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008252 mov x2, xPC
8253 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008254
8255/* ------------------------------ */
8256 .balign 128
8257.L_ALT_op_unused_3e: /* 0x3e */
8258/* File: arm64/alt_stub.S */
8259/*
8260 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8261 * any interesting requests and then jump to the real instruction
8262 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8263 */
8264 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008265 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8266 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
8267 mov x0, xSELF
8268 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008269 mov x2, xPC
8270 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008271
8272/* ------------------------------ */
8273 .balign 128
8274.L_ALT_op_unused_3f: /* 0x3f */
8275/* File: arm64/alt_stub.S */
8276/*
8277 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8278 * any interesting requests and then jump to the real instruction
8279 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8280 */
8281 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008282 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8283 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
8284 mov x0, xSELF
8285 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008286 mov x2, xPC
8287 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008288
8289/* ------------------------------ */
8290 .balign 128
8291.L_ALT_op_unused_40: /* 0x40 */
8292/* File: arm64/alt_stub.S */
8293/*
8294 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8295 * any interesting requests and then jump to the real instruction
8296 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8297 */
8298 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008299 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8300 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
8301 mov x0, xSELF
8302 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008303 mov x2, xPC
8304 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008305
8306/* ------------------------------ */
8307 .balign 128
8308.L_ALT_op_unused_41: /* 0x41 */
8309/* File: arm64/alt_stub.S */
8310/*
8311 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8312 * any interesting requests and then jump to the real instruction
8313 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8314 */
8315 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008316 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8317 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8318 mov x0, xSELF
8319 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008320 mov x2, xPC
8321 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008322
8323/* ------------------------------ */
8324 .balign 128
8325.L_ALT_op_unused_42: /* 0x42 */
8326/* File: arm64/alt_stub.S */
8327/*
8328 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8329 * any interesting requests and then jump to the real instruction
8330 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8331 */
8332 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008333 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8334 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8335 mov x0, xSELF
8336 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008337 mov x2, xPC
8338 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008339
8340/* ------------------------------ */
8341 .balign 128
8342.L_ALT_op_unused_43: /* 0x43 */
8343/* File: arm64/alt_stub.S */
8344/*
8345 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8346 * any interesting requests and then jump to the real instruction
8347 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8348 */
8349 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008350 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8351 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8352 mov x0, xSELF
8353 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008354 mov x2, xPC
8355 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008356
8357/* ------------------------------ */
8358 .balign 128
8359.L_ALT_op_aget: /* 0x44 */
8360/* File: arm64/alt_stub.S */
8361/*
8362 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8363 * any interesting requests and then jump to the real instruction
8364 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8365 */
8366 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008367 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8368 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8369 mov x0, xSELF
8370 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008371 mov x2, xPC
8372 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008373
8374/* ------------------------------ */
8375 .balign 128
8376.L_ALT_op_aget_wide: /* 0x45 */
8377/* File: arm64/alt_stub.S */
8378/*
8379 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8380 * any interesting requests and then jump to the real instruction
8381 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8382 */
8383 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008384 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8385 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8386 mov x0, xSELF
8387 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008388 mov x2, xPC
8389 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008390
8391/* ------------------------------ */
8392 .balign 128
8393.L_ALT_op_aget_object: /* 0x46 */
8394/* File: arm64/alt_stub.S */
8395/*
8396 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8397 * any interesting requests and then jump to the real instruction
8398 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8399 */
8400 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008401 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8402 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8403 mov x0, xSELF
8404 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008405 mov x2, xPC
8406 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008407
8408/* ------------------------------ */
8409 .balign 128
8410.L_ALT_op_aget_boolean: /* 0x47 */
8411/* File: arm64/alt_stub.S */
8412/*
8413 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8414 * any interesting requests and then jump to the real instruction
8415 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8416 */
8417 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008418 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8419 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8420 mov x0, xSELF
8421 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008422 mov x2, xPC
8423 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008424
8425/* ------------------------------ */
8426 .balign 128
8427.L_ALT_op_aget_byte: /* 0x48 */
8428/* File: arm64/alt_stub.S */
8429/*
8430 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8431 * any interesting requests and then jump to the real instruction
8432 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8433 */
8434 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008435 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8436 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8437 mov x0, xSELF
8438 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008439 mov x2, xPC
8440 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008441
8442/* ------------------------------ */
8443 .balign 128
8444.L_ALT_op_aget_char: /* 0x49 */
8445/* File: arm64/alt_stub.S */
8446/*
8447 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8448 * any interesting requests and then jump to the real instruction
8449 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8450 */
8451 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008452 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8453 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8454 mov x0, xSELF
8455 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008456 mov x2, xPC
8457 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008458
8459/* ------------------------------ */
8460 .balign 128
8461.L_ALT_op_aget_short: /* 0x4a */
8462/* File: arm64/alt_stub.S */
8463/*
8464 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8465 * any interesting requests and then jump to the real instruction
8466 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8467 */
8468 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008469 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8470 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8471 mov x0, xSELF
8472 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008473 mov x2, xPC
8474 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008475
8476/* ------------------------------ */
8477 .balign 128
8478.L_ALT_op_aput: /* 0x4b */
8479/* File: arm64/alt_stub.S */
8480/*
8481 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8482 * any interesting requests and then jump to the real instruction
8483 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8484 */
8485 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008486 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8487 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8488 mov x0, xSELF
8489 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008490 mov x2, xPC
8491 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008492
8493/* ------------------------------ */
8494 .balign 128
8495.L_ALT_op_aput_wide: /* 0x4c */
8496/* File: arm64/alt_stub.S */
8497/*
8498 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8499 * any interesting requests and then jump to the real instruction
8500 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8501 */
8502 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008503 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8504 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8505 mov x0, xSELF
8506 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008507 mov x2, xPC
8508 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008509
8510/* ------------------------------ */
8511 .balign 128
8512.L_ALT_op_aput_object: /* 0x4d */
8513/* File: arm64/alt_stub.S */
8514/*
8515 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8516 * any interesting requests and then jump to the real instruction
8517 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8518 */
8519 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008520 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8521 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8522 mov x0, xSELF
8523 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008524 mov x2, xPC
8525 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008526
8527/* ------------------------------ */
8528 .balign 128
8529.L_ALT_op_aput_boolean: /* 0x4e */
8530/* File: arm64/alt_stub.S */
8531/*
8532 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8533 * any interesting requests and then jump to the real instruction
8534 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8535 */
8536 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008537 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8538 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8539 mov x0, xSELF
8540 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008541 mov x2, xPC
8542 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008543
8544/* ------------------------------ */
8545 .balign 128
8546.L_ALT_op_aput_byte: /* 0x4f */
8547/* File: arm64/alt_stub.S */
8548/*
8549 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8550 * any interesting requests and then jump to the real instruction
8551 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8552 */
8553 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008554 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8555 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8556 mov x0, xSELF
8557 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008558 mov x2, xPC
8559 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008560
8561/* ------------------------------ */
8562 .balign 128
8563.L_ALT_op_aput_char: /* 0x50 */
8564/* File: arm64/alt_stub.S */
8565/*
8566 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8567 * any interesting requests and then jump to the real instruction
8568 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8569 */
8570 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008571 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8572 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8573 mov x0, xSELF
8574 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008575 mov x2, xPC
8576 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008577
8578/* ------------------------------ */
8579 .balign 128
8580.L_ALT_op_aput_short: /* 0x51 */
8581/* File: arm64/alt_stub.S */
8582/*
8583 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8584 * any interesting requests and then jump to the real instruction
8585 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8586 */
8587 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008588 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8589 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8590 mov x0, xSELF
8591 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008592 mov x2, xPC
8593 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008594
8595/* ------------------------------ */
8596 .balign 128
8597.L_ALT_op_iget: /* 0x52 */
8598/* File: arm64/alt_stub.S */
8599/*
8600 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8601 * any interesting requests and then jump to the real instruction
8602 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8603 */
8604 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008605 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8606 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8607 mov x0, xSELF
8608 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008609 mov x2, xPC
8610 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008611
8612/* ------------------------------ */
8613 .balign 128
8614.L_ALT_op_iget_wide: /* 0x53 */
8615/* File: arm64/alt_stub.S */
8616/*
8617 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8618 * any interesting requests and then jump to the real instruction
8619 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8620 */
8621 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008622 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8623 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8624 mov x0, xSELF
8625 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008626 mov x2, xPC
8627 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008628
8629/* ------------------------------ */
8630 .balign 128
8631.L_ALT_op_iget_object: /* 0x54 */
8632/* File: arm64/alt_stub.S */
8633/*
8634 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8635 * any interesting requests and then jump to the real instruction
8636 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8637 */
8638 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008639 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8640 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8641 mov x0, xSELF
8642 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008643 mov x2, xPC
8644 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008645
8646/* ------------------------------ */
8647 .balign 128
8648.L_ALT_op_iget_boolean: /* 0x55 */
8649/* File: arm64/alt_stub.S */
8650/*
8651 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8652 * any interesting requests and then jump to the real instruction
8653 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8654 */
8655 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008656 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8657 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8658 mov x0, xSELF
8659 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008660 mov x2, xPC
8661 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008662
8663/* ------------------------------ */
8664 .balign 128
8665.L_ALT_op_iget_byte: /* 0x56 */
8666/* File: arm64/alt_stub.S */
8667/*
8668 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8669 * any interesting requests and then jump to the real instruction
8670 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8671 */
8672 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008673 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8674 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8675 mov x0, xSELF
8676 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008677 mov x2, xPC
8678 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008679
8680/* ------------------------------ */
8681 .balign 128
8682.L_ALT_op_iget_char: /* 0x57 */
8683/* File: arm64/alt_stub.S */
8684/*
8685 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8686 * any interesting requests and then jump to the real instruction
8687 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8688 */
8689 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008690 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8691 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8692 mov x0, xSELF
8693 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008694 mov x2, xPC
8695 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008696
8697/* ------------------------------ */
8698 .balign 128
8699.L_ALT_op_iget_short: /* 0x58 */
8700/* File: arm64/alt_stub.S */
8701/*
8702 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8703 * any interesting requests and then jump to the real instruction
8704 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8705 */
8706 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008707 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8708 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8709 mov x0, xSELF
8710 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008711 mov x2, xPC
8712 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008713
8714/* ------------------------------ */
8715 .balign 128
8716.L_ALT_op_iput: /* 0x59 */
8717/* File: arm64/alt_stub.S */
8718/*
8719 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8720 * any interesting requests and then jump to the real instruction
8721 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8722 */
8723 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008724 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8725 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8726 mov x0, xSELF
8727 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008728 mov x2, xPC
8729 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008730
8731/* ------------------------------ */
8732 .balign 128
8733.L_ALT_op_iput_wide: /* 0x5a */
8734/* File: arm64/alt_stub.S */
8735/*
8736 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8737 * any interesting requests and then jump to the real instruction
8738 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8739 */
8740 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008741 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8742 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8743 mov x0, xSELF
8744 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008745 mov x2, xPC
8746 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008747
8748/* ------------------------------ */
8749 .balign 128
8750.L_ALT_op_iput_object: /* 0x5b */
8751/* File: arm64/alt_stub.S */
8752/*
8753 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8754 * any interesting requests and then jump to the real instruction
8755 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8756 */
8757 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008758 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8759 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8760 mov x0, xSELF
8761 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008762 mov x2, xPC
8763 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008764
8765/* ------------------------------ */
8766 .balign 128
8767.L_ALT_op_iput_boolean: /* 0x5c */
8768/* File: arm64/alt_stub.S */
8769/*
8770 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8771 * any interesting requests and then jump to the real instruction
8772 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8773 */
8774 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008775 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8776 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8777 mov x0, xSELF
8778 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008779 mov x2, xPC
8780 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008781
8782/* ------------------------------ */
8783 .balign 128
8784.L_ALT_op_iput_byte: /* 0x5d */
8785/* File: arm64/alt_stub.S */
8786/*
8787 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8788 * any interesting requests and then jump to the real instruction
8789 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8790 */
8791 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008792 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8793 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8794 mov x0, xSELF
8795 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008796 mov x2, xPC
8797 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008798
8799/* ------------------------------ */
8800 .balign 128
8801.L_ALT_op_iput_char: /* 0x5e */
8802/* File: arm64/alt_stub.S */
8803/*
8804 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8805 * any interesting requests and then jump to the real instruction
8806 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8807 */
8808 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008809 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8810 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8811 mov x0, xSELF
8812 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008813 mov x2, xPC
8814 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008815
8816/* ------------------------------ */
8817 .balign 128
8818.L_ALT_op_iput_short: /* 0x5f */
8819/* File: arm64/alt_stub.S */
8820/*
8821 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8822 * any interesting requests and then jump to the real instruction
8823 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8824 */
8825 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008826 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8827 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8828 mov x0, xSELF
8829 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008830 mov x2, xPC
8831 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008832
8833/* ------------------------------ */
8834 .balign 128
8835.L_ALT_op_sget: /* 0x60 */
8836/* File: arm64/alt_stub.S */
8837/*
8838 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8839 * any interesting requests and then jump to the real instruction
8840 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8841 */
8842 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008843 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8844 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8845 mov x0, xSELF
8846 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008847 mov x2, xPC
8848 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008849
8850/* ------------------------------ */
8851 .balign 128
8852.L_ALT_op_sget_wide: /* 0x61 */
8853/* File: arm64/alt_stub.S */
8854/*
8855 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8856 * any interesting requests and then jump to the real instruction
8857 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8858 */
8859 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008860 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8861 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8862 mov x0, xSELF
8863 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008864 mov x2, xPC
8865 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008866
8867/* ------------------------------ */
8868 .balign 128
8869.L_ALT_op_sget_object: /* 0x62 */
8870/* File: arm64/alt_stub.S */
8871/*
8872 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8873 * any interesting requests and then jump to the real instruction
8874 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8875 */
8876 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008877 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8878 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
8879 mov x0, xSELF
8880 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008881 mov x2, xPC
8882 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008883
8884/* ------------------------------ */
8885 .balign 128
8886.L_ALT_op_sget_boolean: /* 0x63 */
8887/* File: arm64/alt_stub.S */
8888/*
8889 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8890 * any interesting requests and then jump to the real instruction
8891 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8892 */
8893 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008894 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8895 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
8896 mov x0, xSELF
8897 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008898 mov x2, xPC
8899 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008900
8901/* ------------------------------ */
8902 .balign 128
8903.L_ALT_op_sget_byte: /* 0x64 */
8904/* File: arm64/alt_stub.S */
8905/*
8906 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8907 * any interesting requests and then jump to the real instruction
8908 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8909 */
8910 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008911 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8912 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
8913 mov x0, xSELF
8914 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008915 mov x2, xPC
8916 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008917
8918/* ------------------------------ */
8919 .balign 128
8920.L_ALT_op_sget_char: /* 0x65 */
8921/* File: arm64/alt_stub.S */
8922/*
8923 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8924 * any interesting requests and then jump to the real instruction
8925 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8926 */
8927 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008928 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8929 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
8930 mov x0, xSELF
8931 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008932 mov x2, xPC
8933 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008934
8935/* ------------------------------ */
8936 .balign 128
8937.L_ALT_op_sget_short: /* 0x66 */
8938/* File: arm64/alt_stub.S */
8939/*
8940 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8941 * any interesting requests and then jump to the real instruction
8942 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8943 */
8944 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008945 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8946 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
8947 mov x0, xSELF
8948 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008949 mov x2, xPC
8950 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008951
8952/* ------------------------------ */
8953 .balign 128
8954.L_ALT_op_sput: /* 0x67 */
8955/* File: arm64/alt_stub.S */
8956/*
8957 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8958 * any interesting requests and then jump to the real instruction
8959 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8960 */
8961 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008962 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8963 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
8964 mov x0, xSELF
8965 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008966 mov x2, xPC
8967 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008968
8969/* ------------------------------ */
8970 .balign 128
8971.L_ALT_op_sput_wide: /* 0x68 */
8972/* File: arm64/alt_stub.S */
8973/*
8974 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8975 * any interesting requests and then jump to the real instruction
8976 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8977 */
8978 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008979 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8980 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
8981 mov x0, xSELF
8982 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008983 mov x2, xPC
8984 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008985
8986/* ------------------------------ */
8987 .balign 128
8988.L_ALT_op_sput_object: /* 0x69 */
8989/* File: arm64/alt_stub.S */
8990/*
8991 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8992 * any interesting requests and then jump to the real instruction
8993 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8994 */
8995 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008996 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8997 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
8998 mov x0, xSELF
8999 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009000 mov x2, xPC
9001 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009002
9003/* ------------------------------ */
9004 .balign 128
9005.L_ALT_op_sput_boolean: /* 0x6a */
9006/* File: arm64/alt_stub.S */
9007/*
9008 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9009 * any interesting requests and then jump to the real instruction
9010 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9011 */
9012 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009013 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9014 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
9015 mov x0, xSELF
9016 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009017 mov x2, xPC
9018 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009019
9020/* ------------------------------ */
9021 .balign 128
9022.L_ALT_op_sput_byte: /* 0x6b */
9023/* File: arm64/alt_stub.S */
9024/*
9025 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9026 * any interesting requests and then jump to the real instruction
9027 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9028 */
9029 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009030 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9031 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
9032 mov x0, xSELF
9033 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009034 mov x2, xPC
9035 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009036
9037/* ------------------------------ */
9038 .balign 128
9039.L_ALT_op_sput_char: /* 0x6c */
9040/* File: arm64/alt_stub.S */
9041/*
9042 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9043 * any interesting requests and then jump to the real instruction
9044 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9045 */
9046 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009047 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9048 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
9049 mov x0, xSELF
9050 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009051 mov x2, xPC
9052 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009053
9054/* ------------------------------ */
9055 .balign 128
9056.L_ALT_op_sput_short: /* 0x6d */
9057/* File: arm64/alt_stub.S */
9058/*
9059 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9060 * any interesting requests and then jump to the real instruction
9061 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9062 */
9063 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009064 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9065 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
9066 mov x0, xSELF
9067 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009068 mov x2, xPC
9069 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009070
9071/* ------------------------------ */
9072 .balign 128
9073.L_ALT_op_invoke_virtual: /* 0x6e */
9074/* File: arm64/alt_stub.S */
9075/*
9076 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9077 * any interesting requests and then jump to the real instruction
9078 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9079 */
9080 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009081 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9082 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
9083 mov x0, xSELF
9084 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009085 mov x2, xPC
9086 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009087
9088/* ------------------------------ */
9089 .balign 128
9090.L_ALT_op_invoke_super: /* 0x6f */
9091/* File: arm64/alt_stub.S */
9092/*
9093 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9094 * any interesting requests and then jump to the real instruction
9095 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9096 */
9097 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009098 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9099 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
9100 mov x0, xSELF
9101 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009102 mov x2, xPC
9103 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009104
9105/* ------------------------------ */
9106 .balign 128
9107.L_ALT_op_invoke_direct: /* 0x70 */
9108/* File: arm64/alt_stub.S */
9109/*
9110 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9111 * any interesting requests and then jump to the real instruction
9112 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9113 */
9114 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009115 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9116 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
9117 mov x0, xSELF
9118 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009119 mov x2, xPC
9120 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009121
9122/* ------------------------------ */
9123 .balign 128
9124.L_ALT_op_invoke_static: /* 0x71 */
9125/* File: arm64/alt_stub.S */
9126/*
9127 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9128 * any interesting requests and then jump to the real instruction
9129 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9130 */
9131 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009132 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9133 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
9134 mov x0, xSELF
9135 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009136 mov x2, xPC
9137 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009138
9139/* ------------------------------ */
9140 .balign 128
9141.L_ALT_op_invoke_interface: /* 0x72 */
9142/* File: arm64/alt_stub.S */
9143/*
9144 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9145 * any interesting requests and then jump to the real instruction
9146 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9147 */
9148 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009149 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9150 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
9151 mov x0, xSELF
9152 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009153 mov x2, xPC
9154 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009155
9156/* ------------------------------ */
9157 .balign 128
9158.L_ALT_op_return_void_no_barrier: /* 0x73 */
9159/* File: arm64/alt_stub.S */
9160/*
9161 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9162 * any interesting requests and then jump to the real instruction
9163 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9164 */
9165 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009166 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9167 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
9168 mov x0, xSELF
9169 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009170 mov x2, xPC
9171 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009172
9173/* ------------------------------ */
9174 .balign 128
9175.L_ALT_op_invoke_virtual_range: /* 0x74 */
9176/* File: arm64/alt_stub.S */
9177/*
9178 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9179 * any interesting requests and then jump to the real instruction
9180 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9181 */
9182 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009183 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9184 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
9185 mov x0, xSELF
9186 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009187 mov x2, xPC
9188 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009189
9190/* ------------------------------ */
9191 .balign 128
9192.L_ALT_op_invoke_super_range: /* 0x75 */
9193/* File: arm64/alt_stub.S */
9194/*
9195 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9196 * any interesting requests and then jump to the real instruction
9197 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9198 */
9199 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009200 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9201 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
9202 mov x0, xSELF
9203 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009204 mov x2, xPC
9205 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009206
9207/* ------------------------------ */
9208 .balign 128
9209.L_ALT_op_invoke_direct_range: /* 0x76 */
9210/* File: arm64/alt_stub.S */
9211/*
9212 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9213 * any interesting requests and then jump to the real instruction
9214 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9215 */
9216 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009217 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9218 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
9219 mov x0, xSELF
9220 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009221 mov x2, xPC
9222 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009223
9224/* ------------------------------ */
9225 .balign 128
9226.L_ALT_op_invoke_static_range: /* 0x77 */
9227/* File: arm64/alt_stub.S */
9228/*
9229 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9230 * any interesting requests and then jump to the real instruction
9231 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9232 */
9233 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009234 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9235 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
9236 mov x0, xSELF
9237 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009238 mov x2, xPC
9239 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009240
9241/* ------------------------------ */
9242 .balign 128
9243.L_ALT_op_invoke_interface_range: /* 0x78 */
9244/* File: arm64/alt_stub.S */
9245/*
9246 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9247 * any interesting requests and then jump to the real instruction
9248 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9249 */
9250 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009251 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9252 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
9253 mov x0, xSELF
9254 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009255 mov x2, xPC
9256 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009257
9258/* ------------------------------ */
9259 .balign 128
9260.L_ALT_op_unused_79: /* 0x79 */
9261/* File: arm64/alt_stub.S */
9262/*
9263 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9264 * any interesting requests and then jump to the real instruction
9265 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9266 */
9267 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009268 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9269 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
9270 mov x0, xSELF
9271 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009272 mov x2, xPC
9273 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009274
9275/* ------------------------------ */
9276 .balign 128
9277.L_ALT_op_unused_7a: /* 0x7a */
9278/* File: arm64/alt_stub.S */
9279/*
9280 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9281 * any interesting requests and then jump to the real instruction
9282 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9283 */
9284 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009285 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9286 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
9287 mov x0, xSELF
9288 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009289 mov x2, xPC
9290 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009291
9292/* ------------------------------ */
9293 .balign 128
9294.L_ALT_op_neg_int: /* 0x7b */
9295/* File: arm64/alt_stub.S */
9296/*
9297 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9298 * any interesting requests and then jump to the real instruction
9299 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9300 */
9301 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009302 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9303 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
9304 mov x0, xSELF
9305 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009306 mov x2, xPC
9307 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009308
9309/* ------------------------------ */
9310 .balign 128
9311.L_ALT_op_not_int: /* 0x7c */
9312/* File: arm64/alt_stub.S */
9313/*
9314 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9315 * any interesting requests and then jump to the real instruction
9316 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9317 */
9318 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009319 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9320 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9321 mov x0, xSELF
9322 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009323 mov x2, xPC
9324 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009325
9326/* ------------------------------ */
9327 .balign 128
9328.L_ALT_op_neg_long: /* 0x7d */
9329/* File: arm64/alt_stub.S */
9330/*
9331 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9332 * any interesting requests and then jump to the real instruction
9333 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9334 */
9335 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009336 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9337 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9338 mov x0, xSELF
9339 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009340 mov x2, xPC
9341 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009342
9343/* ------------------------------ */
9344 .balign 128
9345.L_ALT_op_not_long: /* 0x7e */
9346/* File: arm64/alt_stub.S */
9347/*
9348 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9349 * any interesting requests and then jump to the real instruction
9350 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9351 */
9352 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009353 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9354 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9355 mov x0, xSELF
9356 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009357 mov x2, xPC
9358 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009359
9360/* ------------------------------ */
9361 .balign 128
9362.L_ALT_op_neg_float: /* 0x7f */
9363/* File: arm64/alt_stub.S */
9364/*
9365 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9366 * any interesting requests and then jump to the real instruction
9367 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9368 */
9369 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009370 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9371 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9372 mov x0, xSELF
9373 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009374 mov x2, xPC
9375 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009376
9377/* ------------------------------ */
9378 .balign 128
9379.L_ALT_op_neg_double: /* 0x80 */
9380/* File: arm64/alt_stub.S */
9381/*
9382 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9383 * any interesting requests and then jump to the real instruction
9384 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9385 */
9386 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009387 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9388 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9389 mov x0, xSELF
9390 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009391 mov x2, xPC
9392 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009393
9394/* ------------------------------ */
9395 .balign 128
9396.L_ALT_op_int_to_long: /* 0x81 */
9397/* File: arm64/alt_stub.S */
9398/*
9399 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9400 * any interesting requests and then jump to the real instruction
9401 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9402 */
9403 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009404 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9405 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9406 mov x0, xSELF
9407 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009408 mov x2, xPC
9409 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009410
9411/* ------------------------------ */
9412 .balign 128
9413.L_ALT_op_int_to_float: /* 0x82 */
9414/* File: arm64/alt_stub.S */
9415/*
9416 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9417 * any interesting requests and then jump to the real instruction
9418 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9419 */
9420 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009421 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9422 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9423 mov x0, xSELF
9424 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009425 mov x2, xPC
9426 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009427
9428/* ------------------------------ */
9429 .balign 128
9430.L_ALT_op_int_to_double: /* 0x83 */
9431/* File: arm64/alt_stub.S */
9432/*
9433 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9434 * any interesting requests and then jump to the real instruction
9435 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9436 */
9437 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009438 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9439 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9440 mov x0, xSELF
9441 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009442 mov x2, xPC
9443 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009444
9445/* ------------------------------ */
9446 .balign 128
9447.L_ALT_op_long_to_int: /* 0x84 */
9448/* File: arm64/alt_stub.S */
9449/*
9450 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9451 * any interesting requests and then jump to the real instruction
9452 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9453 */
9454 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009455 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9456 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9457 mov x0, xSELF
9458 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009459 mov x2, xPC
9460 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009461
9462/* ------------------------------ */
9463 .balign 128
9464.L_ALT_op_long_to_float: /* 0x85 */
9465/* File: arm64/alt_stub.S */
9466/*
9467 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9468 * any interesting requests and then jump to the real instruction
9469 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9470 */
9471 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009472 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9473 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9474 mov x0, xSELF
9475 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009476 mov x2, xPC
9477 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009478
9479/* ------------------------------ */
9480 .balign 128
9481.L_ALT_op_long_to_double: /* 0x86 */
9482/* File: arm64/alt_stub.S */
9483/*
9484 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9485 * any interesting requests and then jump to the real instruction
9486 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9487 */
9488 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009489 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9490 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9491 mov x0, xSELF
9492 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009493 mov x2, xPC
9494 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009495
9496/* ------------------------------ */
9497 .balign 128
9498.L_ALT_op_float_to_int: /* 0x87 */
9499/* File: arm64/alt_stub.S */
9500/*
9501 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9502 * any interesting requests and then jump to the real instruction
9503 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9504 */
9505 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009506 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9507 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9508 mov x0, xSELF
9509 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009510 mov x2, xPC
9511 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009512
9513/* ------------------------------ */
9514 .balign 128
9515.L_ALT_op_float_to_long: /* 0x88 */
9516/* File: arm64/alt_stub.S */
9517/*
9518 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9519 * any interesting requests and then jump to the real instruction
9520 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9521 */
9522 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009523 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9524 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9525 mov x0, xSELF
9526 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009527 mov x2, xPC
9528 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009529
9530/* ------------------------------ */
9531 .balign 128
9532.L_ALT_op_float_to_double: /* 0x89 */
9533/* File: arm64/alt_stub.S */
9534/*
9535 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9536 * any interesting requests and then jump to the real instruction
9537 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9538 */
9539 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009540 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9541 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9542 mov x0, xSELF
9543 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009544 mov x2, xPC
9545 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009546
9547/* ------------------------------ */
9548 .balign 128
9549.L_ALT_op_double_to_int: /* 0x8a */
9550/* File: arm64/alt_stub.S */
9551/*
9552 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9553 * any interesting requests and then jump to the real instruction
9554 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9555 */
9556 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009557 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9558 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9559 mov x0, xSELF
9560 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009561 mov x2, xPC
9562 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009563
9564/* ------------------------------ */
9565 .balign 128
9566.L_ALT_op_double_to_long: /* 0x8b */
9567/* File: arm64/alt_stub.S */
9568/*
9569 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9570 * any interesting requests and then jump to the real instruction
9571 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9572 */
9573 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009574 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9575 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9576 mov x0, xSELF
9577 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009578 mov x2, xPC
9579 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009580
9581/* ------------------------------ */
9582 .balign 128
9583.L_ALT_op_double_to_float: /* 0x8c */
9584/* File: arm64/alt_stub.S */
9585/*
9586 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9587 * any interesting requests and then jump to the real instruction
9588 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9589 */
9590 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009591 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9592 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9593 mov x0, xSELF
9594 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009595 mov x2, xPC
9596 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009597
9598/* ------------------------------ */
9599 .balign 128
9600.L_ALT_op_int_to_byte: /* 0x8d */
9601/* File: arm64/alt_stub.S */
9602/*
9603 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9604 * any interesting requests and then jump to the real instruction
9605 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9606 */
9607 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009608 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9609 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9610 mov x0, xSELF
9611 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009612 mov x2, xPC
9613 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009614
9615/* ------------------------------ */
9616 .balign 128
9617.L_ALT_op_int_to_char: /* 0x8e */
9618/* File: arm64/alt_stub.S */
9619/*
9620 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9621 * any interesting requests and then jump to the real instruction
9622 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9623 */
9624 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009625 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9626 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9627 mov x0, xSELF
9628 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009629 mov x2, xPC
9630 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009631
9632/* ------------------------------ */
9633 .balign 128
9634.L_ALT_op_int_to_short: /* 0x8f */
9635/* File: arm64/alt_stub.S */
9636/*
9637 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9638 * any interesting requests and then jump to the real instruction
9639 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9640 */
9641 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009642 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9643 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9644 mov x0, xSELF
9645 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009646 mov x2, xPC
9647 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009648
9649/* ------------------------------ */
9650 .balign 128
9651.L_ALT_op_add_int: /* 0x90 */
9652/* File: arm64/alt_stub.S */
9653/*
9654 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9655 * any interesting requests and then jump to the real instruction
9656 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9657 */
9658 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009659 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9660 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9661 mov x0, xSELF
9662 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009663 mov x2, xPC
9664 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009665
9666/* ------------------------------ */
9667 .balign 128
9668.L_ALT_op_sub_int: /* 0x91 */
9669/* File: arm64/alt_stub.S */
9670/*
9671 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9672 * any interesting requests and then jump to the real instruction
9673 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9674 */
9675 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009676 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9677 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9678 mov x0, xSELF
9679 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009680 mov x2, xPC
9681 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009682
9683/* ------------------------------ */
9684 .balign 128
9685.L_ALT_op_mul_int: /* 0x92 */
9686/* File: arm64/alt_stub.S */
9687/*
9688 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9689 * any interesting requests and then jump to the real instruction
9690 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9691 */
9692 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009693 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9694 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9695 mov x0, xSELF
9696 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009697 mov x2, xPC
9698 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009699
9700/* ------------------------------ */
9701 .balign 128
9702.L_ALT_op_div_int: /* 0x93 */
9703/* File: arm64/alt_stub.S */
9704/*
9705 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9706 * any interesting requests and then jump to the real instruction
9707 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9708 */
9709 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009710 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9711 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9712 mov x0, xSELF
9713 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009714 mov x2, xPC
9715 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009716
9717/* ------------------------------ */
9718 .balign 128
9719.L_ALT_op_rem_int: /* 0x94 */
9720/* File: arm64/alt_stub.S */
9721/*
9722 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9723 * any interesting requests and then jump to the real instruction
9724 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9725 */
9726 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009727 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9728 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9729 mov x0, xSELF
9730 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009731 mov x2, xPC
9732 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009733
9734/* ------------------------------ */
9735 .balign 128
9736.L_ALT_op_and_int: /* 0x95 */
9737/* File: arm64/alt_stub.S */
9738/*
9739 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9740 * any interesting requests and then jump to the real instruction
9741 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9742 */
9743 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009744 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9745 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9746 mov x0, xSELF
9747 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009748 mov x2, xPC
9749 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009750
9751/* ------------------------------ */
9752 .balign 128
9753.L_ALT_op_or_int: /* 0x96 */
9754/* File: arm64/alt_stub.S */
9755/*
9756 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9757 * any interesting requests and then jump to the real instruction
9758 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9759 */
9760 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009761 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9762 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9763 mov x0, xSELF
9764 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009765 mov x2, xPC
9766 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009767
9768/* ------------------------------ */
9769 .balign 128
9770.L_ALT_op_xor_int: /* 0x97 */
9771/* File: arm64/alt_stub.S */
9772/*
9773 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9774 * any interesting requests and then jump to the real instruction
9775 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9776 */
9777 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009778 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9779 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9780 mov x0, xSELF
9781 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009782 mov x2, xPC
9783 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009784
9785/* ------------------------------ */
9786 .balign 128
9787.L_ALT_op_shl_int: /* 0x98 */
9788/* File: arm64/alt_stub.S */
9789/*
9790 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9791 * any interesting requests and then jump to the real instruction
9792 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9793 */
9794 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009795 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9796 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9797 mov x0, xSELF
9798 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009799 mov x2, xPC
9800 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009801
9802/* ------------------------------ */
9803 .balign 128
9804.L_ALT_op_shr_int: /* 0x99 */
9805/* File: arm64/alt_stub.S */
9806/*
9807 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9808 * any interesting requests and then jump to the real instruction
9809 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9810 */
9811 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009812 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9813 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9814 mov x0, xSELF
9815 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009816 mov x2, xPC
9817 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009818
9819/* ------------------------------ */
9820 .balign 128
9821.L_ALT_op_ushr_int: /* 0x9a */
9822/* File: arm64/alt_stub.S */
9823/*
9824 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9825 * any interesting requests and then jump to the real instruction
9826 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9827 */
9828 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009829 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9830 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9831 mov x0, xSELF
9832 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009833 mov x2, xPC
9834 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009835
9836/* ------------------------------ */
9837 .balign 128
9838.L_ALT_op_add_long: /* 0x9b */
9839/* File: arm64/alt_stub.S */
9840/*
9841 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9842 * any interesting requests and then jump to the real instruction
9843 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9844 */
9845 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009846 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9847 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9848 mov x0, xSELF
9849 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009850 mov x2, xPC
9851 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009852
9853/* ------------------------------ */
9854 .balign 128
9855.L_ALT_op_sub_long: /* 0x9c */
9856/* File: arm64/alt_stub.S */
9857/*
9858 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9859 * any interesting requests and then jump to the real instruction
9860 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9861 */
9862 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009863 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9864 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9865 mov x0, xSELF
9866 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009867 mov x2, xPC
9868 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009869
9870/* ------------------------------ */
9871 .balign 128
9872.L_ALT_op_mul_long: /* 0x9d */
9873/* File: arm64/alt_stub.S */
9874/*
9875 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9876 * any interesting requests and then jump to the real instruction
9877 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9878 */
9879 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009880 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9881 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
9882 mov x0, xSELF
9883 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009884 mov x2, xPC
9885 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009886
9887/* ------------------------------ */
9888 .balign 128
9889.L_ALT_op_div_long: /* 0x9e */
9890/* File: arm64/alt_stub.S */
9891/*
9892 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9893 * any interesting requests and then jump to the real instruction
9894 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9895 */
9896 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009897 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9898 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
9899 mov x0, xSELF
9900 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009901 mov x2, xPC
9902 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009903
9904/* ------------------------------ */
9905 .balign 128
9906.L_ALT_op_rem_long: /* 0x9f */
9907/* File: arm64/alt_stub.S */
9908/*
9909 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9910 * any interesting requests and then jump to the real instruction
9911 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9912 */
9913 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009914 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9915 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
9916 mov x0, xSELF
9917 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009918 mov x2, xPC
9919 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009920
9921/* ------------------------------ */
9922 .balign 128
9923.L_ALT_op_and_long: /* 0xa0 */
9924/* File: arm64/alt_stub.S */
9925/*
9926 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9927 * any interesting requests and then jump to the real instruction
9928 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9929 */
9930 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009931 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9932 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
9933 mov x0, xSELF
9934 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009935 mov x2, xPC
9936 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009937
9938/* ------------------------------ */
9939 .balign 128
9940.L_ALT_op_or_long: /* 0xa1 */
9941/* File: arm64/alt_stub.S */
9942/*
9943 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9944 * any interesting requests and then jump to the real instruction
9945 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9946 */
9947 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009948 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9949 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
9950 mov x0, xSELF
9951 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009952 mov x2, xPC
9953 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009954
9955/* ------------------------------ */
9956 .balign 128
9957.L_ALT_op_xor_long: /* 0xa2 */
9958/* File: arm64/alt_stub.S */
9959/*
9960 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9961 * any interesting requests and then jump to the real instruction
9962 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9963 */
9964 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009965 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9966 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
9967 mov x0, xSELF
9968 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009969 mov x2, xPC
9970 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009971
9972/* ------------------------------ */
9973 .balign 128
9974.L_ALT_op_shl_long: /* 0xa3 */
9975/* File: arm64/alt_stub.S */
9976/*
9977 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9978 * any interesting requests and then jump to the real instruction
9979 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9980 */
9981 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009982 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9983 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
9984 mov x0, xSELF
9985 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009986 mov x2, xPC
9987 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009988
9989/* ------------------------------ */
9990 .balign 128
9991.L_ALT_op_shr_long: /* 0xa4 */
9992/* File: arm64/alt_stub.S */
9993/*
9994 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9995 * any interesting requests and then jump to the real instruction
9996 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9997 */
9998 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009999 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10000 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
10001 mov x0, xSELF
10002 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010003 mov x2, xPC
10004 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010005
10006/* ------------------------------ */
10007 .balign 128
10008.L_ALT_op_ushr_long: /* 0xa5 */
10009/* File: arm64/alt_stub.S */
10010/*
10011 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10012 * any interesting requests and then jump to the real instruction
10013 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10014 */
10015 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010016 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10017 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
10018 mov x0, xSELF
10019 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010020 mov x2, xPC
10021 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010022
10023/* ------------------------------ */
10024 .balign 128
10025.L_ALT_op_add_float: /* 0xa6 */
10026/* File: arm64/alt_stub.S */
10027/*
10028 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10029 * any interesting requests and then jump to the real instruction
10030 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10031 */
10032 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010033 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10034 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
10035 mov x0, xSELF
10036 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010037 mov x2, xPC
10038 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010039
10040/* ------------------------------ */
10041 .balign 128
10042.L_ALT_op_sub_float: /* 0xa7 */
10043/* File: arm64/alt_stub.S */
10044/*
10045 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10046 * any interesting requests and then jump to the real instruction
10047 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10048 */
10049 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010050 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10051 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
10052 mov x0, xSELF
10053 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010054 mov x2, xPC
10055 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010056
10057/* ------------------------------ */
10058 .balign 128
10059.L_ALT_op_mul_float: /* 0xa8 */
10060/* File: arm64/alt_stub.S */
10061/*
10062 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10063 * any interesting requests and then jump to the real instruction
10064 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10065 */
10066 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010067 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10068 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
10069 mov x0, xSELF
10070 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010071 mov x2, xPC
10072 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010073
10074/* ------------------------------ */
10075 .balign 128
10076.L_ALT_op_div_float: /* 0xa9 */
10077/* File: arm64/alt_stub.S */
10078/*
10079 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10080 * any interesting requests and then jump to the real instruction
10081 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10082 */
10083 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010084 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10085 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
10086 mov x0, xSELF
10087 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010088 mov x2, xPC
10089 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010090
10091/* ------------------------------ */
10092 .balign 128
10093.L_ALT_op_rem_float: /* 0xaa */
10094/* File: arm64/alt_stub.S */
10095/*
10096 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10097 * any interesting requests and then jump to the real instruction
10098 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10099 */
10100 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010101 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10102 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
10103 mov x0, xSELF
10104 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010105 mov x2, xPC
10106 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010107
10108/* ------------------------------ */
10109 .balign 128
10110.L_ALT_op_add_double: /* 0xab */
10111/* File: arm64/alt_stub.S */
10112/*
10113 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10114 * any interesting requests and then jump to the real instruction
10115 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10116 */
10117 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010118 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10119 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
10120 mov x0, xSELF
10121 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010122 mov x2, xPC
10123 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010124
10125/* ------------------------------ */
10126 .balign 128
10127.L_ALT_op_sub_double: /* 0xac */
10128/* File: arm64/alt_stub.S */
10129/*
10130 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10131 * any interesting requests and then jump to the real instruction
10132 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10133 */
10134 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010135 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10136 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
10137 mov x0, xSELF
10138 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010139 mov x2, xPC
10140 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010141
10142/* ------------------------------ */
10143 .balign 128
10144.L_ALT_op_mul_double: /* 0xad */
10145/* File: arm64/alt_stub.S */
10146/*
10147 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10148 * any interesting requests and then jump to the real instruction
10149 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10150 */
10151 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010152 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10153 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
10154 mov x0, xSELF
10155 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010156 mov x2, xPC
10157 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010158
10159/* ------------------------------ */
10160 .balign 128
10161.L_ALT_op_div_double: /* 0xae */
10162/* File: arm64/alt_stub.S */
10163/*
10164 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10165 * any interesting requests and then jump to the real instruction
10166 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10167 */
10168 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010169 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10170 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
10171 mov x0, xSELF
10172 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010173 mov x2, xPC
10174 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010175
10176/* ------------------------------ */
10177 .balign 128
10178.L_ALT_op_rem_double: /* 0xaf */
10179/* File: arm64/alt_stub.S */
10180/*
10181 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10182 * any interesting requests and then jump to the real instruction
10183 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10184 */
10185 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010186 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10187 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
10188 mov x0, xSELF
10189 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010190 mov x2, xPC
10191 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010192
10193/* ------------------------------ */
10194 .balign 128
10195.L_ALT_op_add_int_2addr: /* 0xb0 */
10196/* File: arm64/alt_stub.S */
10197/*
10198 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10199 * any interesting requests and then jump to the real instruction
10200 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10201 */
10202 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010203 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10204 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
10205 mov x0, xSELF
10206 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010207 mov x2, xPC
10208 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010209
10210/* ------------------------------ */
10211 .balign 128
10212.L_ALT_op_sub_int_2addr: /* 0xb1 */
10213/* File: arm64/alt_stub.S */
10214/*
10215 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10216 * any interesting requests and then jump to the real instruction
10217 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10218 */
10219 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010220 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10221 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
10222 mov x0, xSELF
10223 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010224 mov x2, xPC
10225 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010226
10227/* ------------------------------ */
10228 .balign 128
10229.L_ALT_op_mul_int_2addr: /* 0xb2 */
10230/* File: arm64/alt_stub.S */
10231/*
10232 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10233 * any interesting requests and then jump to the real instruction
10234 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10235 */
10236 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010237 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10238 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
10239 mov x0, xSELF
10240 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010241 mov x2, xPC
10242 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010243
10244/* ------------------------------ */
10245 .balign 128
10246.L_ALT_op_div_int_2addr: /* 0xb3 */
10247/* File: arm64/alt_stub.S */
10248/*
10249 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10250 * any interesting requests and then jump to the real instruction
10251 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10252 */
10253 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010254 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10255 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
10256 mov x0, xSELF
10257 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010258 mov x2, xPC
10259 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010260
10261/* ------------------------------ */
10262 .balign 128
10263.L_ALT_op_rem_int_2addr: /* 0xb4 */
10264/* File: arm64/alt_stub.S */
10265/*
10266 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10267 * any interesting requests and then jump to the real instruction
10268 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10269 */
10270 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010271 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10272 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
10273 mov x0, xSELF
10274 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010275 mov x2, xPC
10276 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010277
10278/* ------------------------------ */
10279 .balign 128
10280.L_ALT_op_and_int_2addr: /* 0xb5 */
10281/* File: arm64/alt_stub.S */
10282/*
10283 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10284 * any interesting requests and then jump to the real instruction
10285 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10286 */
10287 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010288 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10289 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
10290 mov x0, xSELF
10291 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010292 mov x2, xPC
10293 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010294
10295/* ------------------------------ */
10296 .balign 128
10297.L_ALT_op_or_int_2addr: /* 0xb6 */
10298/* File: arm64/alt_stub.S */
10299/*
10300 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10301 * any interesting requests and then jump to the real instruction
10302 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10303 */
10304 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010305 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10306 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10307 mov x0, xSELF
10308 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010309 mov x2, xPC
10310 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010311
10312/* ------------------------------ */
10313 .balign 128
10314.L_ALT_op_xor_int_2addr: /* 0xb7 */
10315/* File: arm64/alt_stub.S */
10316/*
10317 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10318 * any interesting requests and then jump to the real instruction
10319 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10320 */
10321 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010322 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10323 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10324 mov x0, xSELF
10325 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010326 mov x2, xPC
10327 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010328
10329/* ------------------------------ */
10330 .balign 128
10331.L_ALT_op_shl_int_2addr: /* 0xb8 */
10332/* File: arm64/alt_stub.S */
10333/*
10334 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10335 * any interesting requests and then jump to the real instruction
10336 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10337 */
10338 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010339 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10340 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10341 mov x0, xSELF
10342 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010343 mov x2, xPC
10344 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010345
10346/* ------------------------------ */
10347 .balign 128
10348.L_ALT_op_shr_int_2addr: /* 0xb9 */
10349/* File: arm64/alt_stub.S */
10350/*
10351 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10352 * any interesting requests and then jump to the real instruction
10353 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10354 */
10355 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010356 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10357 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10358 mov x0, xSELF
10359 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010360 mov x2, xPC
10361 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010362
10363/* ------------------------------ */
10364 .balign 128
10365.L_ALT_op_ushr_int_2addr: /* 0xba */
10366/* File: arm64/alt_stub.S */
10367/*
10368 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10369 * any interesting requests and then jump to the real instruction
10370 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10371 */
10372 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010373 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10374 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10375 mov x0, xSELF
10376 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010377 mov x2, xPC
10378 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010379
10380/* ------------------------------ */
10381 .balign 128
10382.L_ALT_op_add_long_2addr: /* 0xbb */
10383/* File: arm64/alt_stub.S */
10384/*
10385 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10386 * any interesting requests and then jump to the real instruction
10387 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10388 */
10389 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010390 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10391 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10392 mov x0, xSELF
10393 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010394 mov x2, xPC
10395 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010396
10397/* ------------------------------ */
10398 .balign 128
10399.L_ALT_op_sub_long_2addr: /* 0xbc */
10400/* File: arm64/alt_stub.S */
10401/*
10402 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10403 * any interesting requests and then jump to the real instruction
10404 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10405 */
10406 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010407 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10408 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10409 mov x0, xSELF
10410 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010411 mov x2, xPC
10412 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010413
10414/* ------------------------------ */
10415 .balign 128
10416.L_ALT_op_mul_long_2addr: /* 0xbd */
10417/* File: arm64/alt_stub.S */
10418/*
10419 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10420 * any interesting requests and then jump to the real instruction
10421 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10422 */
10423 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010424 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10425 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10426 mov x0, xSELF
10427 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010428 mov x2, xPC
10429 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010430
10431/* ------------------------------ */
10432 .balign 128
10433.L_ALT_op_div_long_2addr: /* 0xbe */
10434/* File: arm64/alt_stub.S */
10435/*
10436 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10437 * any interesting requests and then jump to the real instruction
10438 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10439 */
10440 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010441 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10442 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10443 mov x0, xSELF
10444 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010445 mov x2, xPC
10446 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010447
10448/* ------------------------------ */
10449 .balign 128
10450.L_ALT_op_rem_long_2addr: /* 0xbf */
10451/* File: arm64/alt_stub.S */
10452/*
10453 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10454 * any interesting requests and then jump to the real instruction
10455 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10456 */
10457 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010458 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10459 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10460 mov x0, xSELF
10461 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010462 mov x2, xPC
10463 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010464
10465/* ------------------------------ */
10466 .balign 128
10467.L_ALT_op_and_long_2addr: /* 0xc0 */
10468/* File: arm64/alt_stub.S */
10469/*
10470 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10471 * any interesting requests and then jump to the real instruction
10472 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10473 */
10474 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010475 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10476 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10477 mov x0, xSELF
10478 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010479 mov x2, xPC
10480 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010481
10482/* ------------------------------ */
10483 .balign 128
10484.L_ALT_op_or_long_2addr: /* 0xc1 */
10485/* File: arm64/alt_stub.S */
10486/*
10487 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10488 * any interesting requests and then jump to the real instruction
10489 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10490 */
10491 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010492 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10493 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10494 mov x0, xSELF
10495 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010496 mov x2, xPC
10497 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010498
10499/* ------------------------------ */
10500 .balign 128
10501.L_ALT_op_xor_long_2addr: /* 0xc2 */
10502/* File: arm64/alt_stub.S */
10503/*
10504 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10505 * any interesting requests and then jump to the real instruction
10506 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10507 */
10508 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010509 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10510 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10511 mov x0, xSELF
10512 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010513 mov x2, xPC
10514 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010515
10516/* ------------------------------ */
10517 .balign 128
10518.L_ALT_op_shl_long_2addr: /* 0xc3 */
10519/* File: arm64/alt_stub.S */
10520/*
10521 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10522 * any interesting requests and then jump to the real instruction
10523 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10524 */
10525 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010526 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10527 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10528 mov x0, xSELF
10529 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010530 mov x2, xPC
10531 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010532
10533/* ------------------------------ */
10534 .balign 128
10535.L_ALT_op_shr_long_2addr: /* 0xc4 */
10536/* File: arm64/alt_stub.S */
10537/*
10538 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10539 * any interesting requests and then jump to the real instruction
10540 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10541 */
10542 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010543 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10544 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10545 mov x0, xSELF
10546 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010547 mov x2, xPC
10548 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010549
10550/* ------------------------------ */
10551 .balign 128
10552.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10553/* File: arm64/alt_stub.S */
10554/*
10555 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10556 * any interesting requests and then jump to the real instruction
10557 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10558 */
10559 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010560 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10561 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10562 mov x0, xSELF
10563 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010564 mov x2, xPC
10565 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010566
10567/* ------------------------------ */
10568 .balign 128
10569.L_ALT_op_add_float_2addr: /* 0xc6 */
10570/* File: arm64/alt_stub.S */
10571/*
10572 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10573 * any interesting requests and then jump to the real instruction
10574 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10575 */
10576 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010577 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10578 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10579 mov x0, xSELF
10580 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010581 mov x2, xPC
10582 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010583
10584/* ------------------------------ */
10585 .balign 128
10586.L_ALT_op_sub_float_2addr: /* 0xc7 */
10587/* File: arm64/alt_stub.S */
10588/*
10589 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10590 * any interesting requests and then jump to the real instruction
10591 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10592 */
10593 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010594 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10595 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10596 mov x0, xSELF
10597 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010598 mov x2, xPC
10599 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010600
10601/* ------------------------------ */
10602 .balign 128
10603.L_ALT_op_mul_float_2addr: /* 0xc8 */
10604/* File: arm64/alt_stub.S */
10605/*
10606 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10607 * any interesting requests and then jump to the real instruction
10608 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10609 */
10610 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010611 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10612 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10613 mov x0, xSELF
10614 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010615 mov x2, xPC
10616 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010617
10618/* ------------------------------ */
10619 .balign 128
10620.L_ALT_op_div_float_2addr: /* 0xc9 */
10621/* File: arm64/alt_stub.S */
10622/*
10623 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10624 * any interesting requests and then jump to the real instruction
10625 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10626 */
10627 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010628 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10629 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10630 mov x0, xSELF
10631 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010632 mov x2, xPC
10633 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010634
10635/* ------------------------------ */
10636 .balign 128
10637.L_ALT_op_rem_float_2addr: /* 0xca */
10638/* File: arm64/alt_stub.S */
10639/*
10640 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10641 * any interesting requests and then jump to the real instruction
10642 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10643 */
10644 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010645 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10646 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10647 mov x0, xSELF
10648 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010649 mov x2, xPC
10650 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010651
10652/* ------------------------------ */
10653 .balign 128
10654.L_ALT_op_add_double_2addr: /* 0xcb */
10655/* File: arm64/alt_stub.S */
10656/*
10657 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10658 * any interesting requests and then jump to the real instruction
10659 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10660 */
10661 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010662 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10663 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10664 mov x0, xSELF
10665 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010666 mov x2, xPC
10667 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010668
10669/* ------------------------------ */
10670 .balign 128
10671.L_ALT_op_sub_double_2addr: /* 0xcc */
10672/* File: arm64/alt_stub.S */
10673/*
10674 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10675 * any interesting requests and then jump to the real instruction
10676 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10677 */
10678 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010679 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10680 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10681 mov x0, xSELF
10682 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010683 mov x2, xPC
10684 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010685
10686/* ------------------------------ */
10687 .balign 128
10688.L_ALT_op_mul_double_2addr: /* 0xcd */
10689/* File: arm64/alt_stub.S */
10690/*
10691 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10692 * any interesting requests and then jump to the real instruction
10693 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10694 */
10695 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010696 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10697 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10698 mov x0, xSELF
10699 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010700 mov x2, xPC
10701 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010702
10703/* ------------------------------ */
10704 .balign 128
10705.L_ALT_op_div_double_2addr: /* 0xce */
10706/* File: arm64/alt_stub.S */
10707/*
10708 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10709 * any interesting requests and then jump to the real instruction
10710 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10711 */
10712 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010713 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10714 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10715 mov x0, xSELF
10716 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010717 mov x2, xPC
10718 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010719
10720/* ------------------------------ */
10721 .balign 128
10722.L_ALT_op_rem_double_2addr: /* 0xcf */
10723/* File: arm64/alt_stub.S */
10724/*
10725 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10726 * any interesting requests and then jump to the real instruction
10727 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10728 */
10729 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010730 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10731 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10732 mov x0, xSELF
10733 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010734 mov x2, xPC
10735 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010736
10737/* ------------------------------ */
10738 .balign 128
10739.L_ALT_op_add_int_lit16: /* 0xd0 */
10740/* File: arm64/alt_stub.S */
10741/*
10742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10743 * any interesting requests and then jump to the real instruction
10744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10745 */
10746 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010747 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10748 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10749 mov x0, xSELF
10750 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010751 mov x2, xPC
10752 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010753
10754/* ------------------------------ */
10755 .balign 128
10756.L_ALT_op_rsub_int: /* 0xd1 */
10757/* File: arm64/alt_stub.S */
10758/*
10759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10760 * any interesting requests and then jump to the real instruction
10761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10762 */
10763 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010764 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10765 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10766 mov x0, xSELF
10767 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010768 mov x2, xPC
10769 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010770
10771/* ------------------------------ */
10772 .balign 128
10773.L_ALT_op_mul_int_lit16: /* 0xd2 */
10774/* File: arm64/alt_stub.S */
10775/*
10776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10777 * any interesting requests and then jump to the real instruction
10778 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10779 */
10780 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010781 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10782 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10783 mov x0, xSELF
10784 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010785 mov x2, xPC
10786 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010787
10788/* ------------------------------ */
10789 .balign 128
10790.L_ALT_op_div_int_lit16: /* 0xd3 */
10791/* File: arm64/alt_stub.S */
10792/*
10793 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10794 * any interesting requests and then jump to the real instruction
10795 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10796 */
10797 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010798 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10799 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10800 mov x0, xSELF
10801 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010802 mov x2, xPC
10803 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010804
10805/* ------------------------------ */
10806 .balign 128
10807.L_ALT_op_rem_int_lit16: /* 0xd4 */
10808/* File: arm64/alt_stub.S */
10809/*
10810 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10811 * any interesting requests and then jump to the real instruction
10812 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10813 */
10814 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010815 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10816 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10817 mov x0, xSELF
10818 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010819 mov x2, xPC
10820 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010821
10822/* ------------------------------ */
10823 .balign 128
10824.L_ALT_op_and_int_lit16: /* 0xd5 */
10825/* File: arm64/alt_stub.S */
10826/*
10827 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10828 * any interesting requests and then jump to the real instruction
10829 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10830 */
10831 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010832 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10833 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10834 mov x0, xSELF
10835 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010836 mov x2, xPC
10837 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010838
10839/* ------------------------------ */
10840 .balign 128
10841.L_ALT_op_or_int_lit16: /* 0xd6 */
10842/* File: arm64/alt_stub.S */
10843/*
10844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10845 * any interesting requests and then jump to the real instruction
10846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10847 */
10848 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010849 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10850 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10851 mov x0, xSELF
10852 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010853 mov x2, xPC
10854 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010855
10856/* ------------------------------ */
10857 .balign 128
10858.L_ALT_op_xor_int_lit16: /* 0xd7 */
10859/* File: arm64/alt_stub.S */
10860/*
10861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10862 * any interesting requests and then jump to the real instruction
10863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10864 */
10865 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010866 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10867 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10868 mov x0, xSELF
10869 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010870 mov x2, xPC
10871 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010872
10873/* ------------------------------ */
10874 .balign 128
10875.L_ALT_op_add_int_lit8: /* 0xd8 */
10876/* File: arm64/alt_stub.S */
10877/*
10878 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10879 * any interesting requests and then jump to the real instruction
10880 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10881 */
10882 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010883 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10884 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
10885 mov x0, xSELF
10886 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010887 mov x2, xPC
10888 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010889
10890/* ------------------------------ */
10891 .balign 128
10892.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10893/* File: arm64/alt_stub.S */
10894/*
10895 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10896 * any interesting requests and then jump to the real instruction
10897 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10898 */
10899 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010900 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10901 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
10902 mov x0, xSELF
10903 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010904 mov x2, xPC
10905 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010906
10907/* ------------------------------ */
10908 .balign 128
10909.L_ALT_op_mul_int_lit8: /* 0xda */
10910/* File: arm64/alt_stub.S */
10911/*
10912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10913 * any interesting requests and then jump to the real instruction
10914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10915 */
10916 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010917 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10918 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
10919 mov x0, xSELF
10920 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010921 mov x2, xPC
10922 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010923
10924/* ------------------------------ */
10925 .balign 128
10926.L_ALT_op_div_int_lit8: /* 0xdb */
10927/* File: arm64/alt_stub.S */
10928/*
10929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10930 * any interesting requests and then jump to the real instruction
10931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10932 */
10933 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010934 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10935 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
10936 mov x0, xSELF
10937 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010938 mov x2, xPC
10939 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010940
10941/* ------------------------------ */
10942 .balign 128
10943.L_ALT_op_rem_int_lit8: /* 0xdc */
10944/* File: arm64/alt_stub.S */
10945/*
10946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10947 * any interesting requests and then jump to the real instruction
10948 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10949 */
10950 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010951 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10952 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
10953 mov x0, xSELF
10954 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010955 mov x2, xPC
10956 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010957
10958/* ------------------------------ */
10959 .balign 128
10960.L_ALT_op_and_int_lit8: /* 0xdd */
10961/* File: arm64/alt_stub.S */
10962/*
10963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10964 * any interesting requests and then jump to the real instruction
10965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10966 */
10967 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010968 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10969 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
10970 mov x0, xSELF
10971 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010972 mov x2, xPC
10973 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010974
10975/* ------------------------------ */
10976 .balign 128
10977.L_ALT_op_or_int_lit8: /* 0xde */
10978/* File: arm64/alt_stub.S */
10979/*
10980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10981 * any interesting requests and then jump to the real instruction
10982 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10983 */
10984 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010985 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10986 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
10987 mov x0, xSELF
10988 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010989 mov x2, xPC
10990 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010991
10992/* ------------------------------ */
10993 .balign 128
10994.L_ALT_op_xor_int_lit8: /* 0xdf */
10995/* File: arm64/alt_stub.S */
10996/*
10997 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10998 * any interesting requests and then jump to the real instruction
10999 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11000 */
11001 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011002 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11003 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
11004 mov x0, xSELF
11005 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011006 mov x2, xPC
11007 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011008
11009/* ------------------------------ */
11010 .balign 128
11011.L_ALT_op_shl_int_lit8: /* 0xe0 */
11012/* File: arm64/alt_stub.S */
11013/*
11014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11015 * any interesting requests and then jump to the real instruction
11016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11017 */
11018 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011019 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11020 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
11021 mov x0, xSELF
11022 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011023 mov x2, xPC
11024 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011025
11026/* ------------------------------ */
11027 .balign 128
11028.L_ALT_op_shr_int_lit8: /* 0xe1 */
11029/* File: arm64/alt_stub.S */
11030/*
11031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11032 * any interesting requests and then jump to the real instruction
11033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11034 */
11035 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011036 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11037 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
11038 mov x0, xSELF
11039 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011040 mov x2, xPC
11041 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011042
11043/* ------------------------------ */
11044 .balign 128
11045.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11046/* File: arm64/alt_stub.S */
11047/*
11048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11049 * any interesting requests and then jump to the real instruction
11050 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11051 */
11052 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011053 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11054 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
11055 mov x0, xSELF
11056 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011057 mov x2, xPC
11058 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011059
11060/* ------------------------------ */
11061 .balign 128
11062.L_ALT_op_iget_quick: /* 0xe3 */
11063/* File: arm64/alt_stub.S */
11064/*
11065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11066 * any interesting requests and then jump to the real instruction
11067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11068 */
11069 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011070 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11071 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
11072 mov x0, xSELF
11073 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011074 mov x2, xPC
11075 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011076
11077/* ------------------------------ */
11078 .balign 128
11079.L_ALT_op_iget_wide_quick: /* 0xe4 */
11080/* File: arm64/alt_stub.S */
11081/*
11082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11083 * any interesting requests and then jump to the real instruction
11084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11085 */
11086 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011087 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11088 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
11089 mov x0, xSELF
11090 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011091 mov x2, xPC
11092 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011093
11094/* ------------------------------ */
11095 .balign 128
11096.L_ALT_op_iget_object_quick: /* 0xe5 */
11097/* File: arm64/alt_stub.S */
11098/*
11099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11100 * any interesting requests and then jump to the real instruction
11101 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11102 */
11103 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011104 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11105 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
11106 mov x0, xSELF
11107 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011108 mov x2, xPC
11109 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011110
11111/* ------------------------------ */
11112 .balign 128
11113.L_ALT_op_iput_quick: /* 0xe6 */
11114/* File: arm64/alt_stub.S */
11115/*
11116 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11117 * any interesting requests and then jump to the real instruction
11118 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11119 */
11120 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011121 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11122 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
11123 mov x0, xSELF
11124 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011125 mov x2, xPC
11126 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011127
11128/* ------------------------------ */
11129 .balign 128
11130.L_ALT_op_iput_wide_quick: /* 0xe7 */
11131/* File: arm64/alt_stub.S */
11132/*
11133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11134 * any interesting requests and then jump to the real instruction
11135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11136 */
11137 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011138 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11139 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
11140 mov x0, xSELF
11141 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011142 mov x2, xPC
11143 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011144
11145/* ------------------------------ */
11146 .balign 128
11147.L_ALT_op_iput_object_quick: /* 0xe8 */
11148/* File: arm64/alt_stub.S */
11149/*
11150 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11151 * any interesting requests and then jump to the real instruction
11152 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11153 */
11154 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011155 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11156 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
11157 mov x0, xSELF
11158 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011159 mov x2, xPC
11160 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011161
11162/* ------------------------------ */
11163 .balign 128
11164.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11165/* File: arm64/alt_stub.S */
11166/*
11167 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11168 * any interesting requests and then jump to the real instruction
11169 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11170 */
11171 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011172 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11173 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
11174 mov x0, xSELF
11175 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011176 mov x2, xPC
11177 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011178
11179/* ------------------------------ */
11180 .balign 128
11181.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11182/* File: arm64/alt_stub.S */
11183/*
11184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11185 * any interesting requests and then jump to the real instruction
11186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11187 */
11188 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011189 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11190 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
11191 mov x0, xSELF
11192 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011193 mov x2, xPC
11194 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011195
11196/* ------------------------------ */
11197 .balign 128
11198.L_ALT_op_iput_boolean_quick: /* 0xeb */
11199/* File: arm64/alt_stub.S */
11200/*
11201 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11202 * any interesting requests and then jump to the real instruction
11203 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11204 */
11205 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011206 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11207 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
11208 mov x0, xSELF
11209 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011210 mov x2, xPC
11211 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011212
11213/* ------------------------------ */
11214 .balign 128
11215.L_ALT_op_iput_byte_quick: /* 0xec */
11216/* File: arm64/alt_stub.S */
11217/*
11218 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11219 * any interesting requests and then jump to the real instruction
11220 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11221 */
11222 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011223 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11224 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
11225 mov x0, xSELF
11226 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011227 mov x2, xPC
11228 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011229
11230/* ------------------------------ */
11231 .balign 128
11232.L_ALT_op_iput_char_quick: /* 0xed */
11233/* File: arm64/alt_stub.S */
11234/*
11235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11236 * any interesting requests and then jump to the real instruction
11237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11238 */
11239 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011240 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11241 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
11242 mov x0, xSELF
11243 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011244 mov x2, xPC
11245 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011246
11247/* ------------------------------ */
11248 .balign 128
11249.L_ALT_op_iput_short_quick: /* 0xee */
11250/* File: arm64/alt_stub.S */
11251/*
11252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11253 * any interesting requests and then jump to the real instruction
11254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11255 */
11256 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011257 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11258 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
11259 mov x0, xSELF
11260 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011261 mov x2, xPC
11262 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011263
11264/* ------------------------------ */
11265 .balign 128
11266.L_ALT_op_iget_boolean_quick: /* 0xef */
11267/* File: arm64/alt_stub.S */
11268/*
11269 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11270 * any interesting requests and then jump to the real instruction
11271 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11272 */
11273 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011274 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11275 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
11276 mov x0, xSELF
11277 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011278 mov x2, xPC
11279 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011280
11281/* ------------------------------ */
11282 .balign 128
11283.L_ALT_op_iget_byte_quick: /* 0xf0 */
11284/* File: arm64/alt_stub.S */
11285/*
11286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11287 * any interesting requests and then jump to the real instruction
11288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11289 */
11290 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011291 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11292 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
11293 mov x0, xSELF
11294 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011295 mov x2, xPC
11296 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011297
11298/* ------------------------------ */
11299 .balign 128
11300.L_ALT_op_iget_char_quick: /* 0xf1 */
11301/* File: arm64/alt_stub.S */
11302/*
11303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11304 * any interesting requests and then jump to the real instruction
11305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11306 */
11307 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011308 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11309 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11310 mov x0, xSELF
11311 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011312 mov x2, xPC
11313 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011314
11315/* ------------------------------ */
11316 .balign 128
11317.L_ALT_op_iget_short_quick: /* 0xf2 */
11318/* File: arm64/alt_stub.S */
11319/*
11320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11321 * any interesting requests and then jump to the real instruction
11322 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11323 */
11324 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011325 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11326 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11327 mov x0, xSELF
11328 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011329 mov x2, xPC
11330 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011331
11332/* ------------------------------ */
11333 .balign 128
11334.L_ALT_op_invoke_lambda: /* 0xf3 */
11335/* File: arm64/alt_stub.S */
11336/*
11337 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11338 * any interesting requests and then jump to the real instruction
11339 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11340 */
11341 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011342 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11343 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11344 mov x0, xSELF
11345 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011346 mov x2, xPC
11347 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011348
11349/* ------------------------------ */
11350 .balign 128
11351.L_ALT_op_unused_f4: /* 0xf4 */
11352/* File: arm64/alt_stub.S */
11353/*
11354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11355 * any interesting requests and then jump to the real instruction
11356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11357 */
11358 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011359 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11360 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11361 mov x0, xSELF
11362 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011363 mov x2, xPC
11364 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011365
11366/* ------------------------------ */
11367 .balign 128
11368.L_ALT_op_capture_variable: /* 0xf5 */
11369/* File: arm64/alt_stub.S */
11370/*
11371 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11372 * any interesting requests and then jump to the real instruction
11373 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11374 */
11375 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011376 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11377 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11378 mov x0, xSELF
11379 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011380 mov x2, xPC
11381 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011382
11383/* ------------------------------ */
11384 .balign 128
11385.L_ALT_op_create_lambda: /* 0xf6 */
11386/* File: arm64/alt_stub.S */
11387/*
11388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11389 * any interesting requests and then jump to the real instruction
11390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11391 */
11392 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011393 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11394 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11395 mov x0, xSELF
11396 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011397 mov x2, xPC
11398 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011399
11400/* ------------------------------ */
11401 .balign 128
11402.L_ALT_op_liberate_variable: /* 0xf7 */
11403/* File: arm64/alt_stub.S */
11404/*
11405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11406 * any interesting requests and then jump to the real instruction
11407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11408 */
11409 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011410 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11411 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11412 mov x0, xSELF
11413 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011414 mov x2, xPC
11415 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011416
11417/* ------------------------------ */
11418 .balign 128
11419.L_ALT_op_box_lambda: /* 0xf8 */
11420/* File: arm64/alt_stub.S */
11421/*
11422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11423 * any interesting requests and then jump to the real instruction
11424 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11425 */
11426 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011427 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11428 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11429 mov x0, xSELF
11430 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011431 mov x2, xPC
11432 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011433
11434/* ------------------------------ */
11435 .balign 128
11436.L_ALT_op_unbox_lambda: /* 0xf9 */
11437/* File: arm64/alt_stub.S */
11438/*
11439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11440 * any interesting requests and then jump to the real instruction
11441 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11442 */
11443 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011444 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11445 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11446 mov x0, xSELF
11447 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011448 mov x2, xPC
11449 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011450
11451/* ------------------------------ */
11452 .balign 128
11453.L_ALT_op_unused_fa: /* 0xfa */
11454/* File: arm64/alt_stub.S */
11455/*
11456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11457 * any interesting requests and then jump to the real instruction
11458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11459 */
11460 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011461 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11462 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11463 mov x0, xSELF
11464 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011465 mov x2, xPC
11466 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011467
11468/* ------------------------------ */
11469 .balign 128
11470.L_ALT_op_unused_fb: /* 0xfb */
11471/* File: arm64/alt_stub.S */
11472/*
11473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11474 * any interesting requests and then jump to the real instruction
11475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11476 */
11477 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011478 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11479 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11480 mov x0, xSELF
11481 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011482 mov x2, xPC
11483 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011484
11485/* ------------------------------ */
11486 .balign 128
11487.L_ALT_op_unused_fc: /* 0xfc */
11488/* File: arm64/alt_stub.S */
11489/*
11490 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11491 * any interesting requests and then jump to the real instruction
11492 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11493 */
11494 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011495 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11496 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11497 mov x0, xSELF
11498 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011499 mov x2, xPC
11500 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011501
11502/* ------------------------------ */
11503 .balign 128
11504.L_ALT_op_unused_fd: /* 0xfd */
11505/* File: arm64/alt_stub.S */
11506/*
11507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11508 * any interesting requests and then jump to the real instruction
11509 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11510 */
11511 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011512 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11513 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11514 mov x0, xSELF
11515 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011516 mov x2, xPC
11517 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011518
11519/* ------------------------------ */
11520 .balign 128
11521.L_ALT_op_unused_fe: /* 0xfe */
11522/* File: arm64/alt_stub.S */
11523/*
11524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11525 * any interesting requests and then jump to the real instruction
11526 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11527 */
11528 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011529 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11530 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11531 mov x0, xSELF
11532 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011533 mov x2, xPC
11534 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011535
11536/* ------------------------------ */
11537 .balign 128
11538.L_ALT_op_unused_ff: /* 0xff */
11539/* File: arm64/alt_stub.S */
11540/*
11541 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11542 * any interesting requests and then jump to the real instruction
11543 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11544 */
11545 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011546 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11547 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11548 mov x0, xSELF
11549 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011550 mov x2, xPC
11551 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011552
11553 .balign 128
11554 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11555 .global artMterpAsmAltInstructionEnd
11556artMterpAsmAltInstructionEnd: