blob: 42f8c1b08db65a0c5fd060a85729e4fed980e8ac [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
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700619 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000620 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
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700642 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000643 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
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700665 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000666 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
Hiroshi Yamauchi30493242016-11-03 13:06:52 -0700690 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +0000691 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
Hiroshi Yamauchi30493242016-11-03 13:06:52 -07003036 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003037 b.ne .Lop_return_void_no_barrier_check
3038.Lop_return_void_no_barrier_return:
3039 mov x0, #0
3040 b MterpReturn
3041.Lop_return_void_no_barrier_check:
3042 bl MterpSuspendCheck // (self)
3043 b .Lop_return_void_no_barrier_return
3044
3045/* ------------------------------ */
3046 .balign 128
3047.L_op_invoke_virtual_range: /* 0x74 */
3048/* File: arm64/op_invoke_virtual_range.S */
3049/* File: arm64/invoke.S */
3050 /*
3051 * Generic invoke handler wrapper.
3052 */
3053 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3054 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3055 .extern MterpInvokeVirtualRange
3056 EXPORT_PC
3057 mov x0, xSELF
3058 add x1, xFP, #OFF_FP_SHADOWFRAME
3059 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003060 mov x3, xINST
3061 bl MterpInvokeVirtualRange
3062 cbz w0, MterpException
3063 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003064 bl MterpShouldSwitchInterpreters
3065 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003066 GET_INST_OPCODE ip
3067 GOTO_OPCODE ip
3068
3069
3070
3071/* ------------------------------ */
3072 .balign 128
3073.L_op_invoke_super_range: /* 0x75 */
3074/* File: arm64/op_invoke_super_range.S */
3075/* File: arm64/invoke.S */
3076 /*
3077 * Generic invoke handler wrapper.
3078 */
3079 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3080 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3081 .extern MterpInvokeSuperRange
3082 EXPORT_PC
3083 mov x0, xSELF
3084 add x1, xFP, #OFF_FP_SHADOWFRAME
3085 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003086 mov x3, xINST
3087 bl MterpInvokeSuperRange
3088 cbz w0, MterpException
3089 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003090 bl MterpShouldSwitchInterpreters
3091 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003092 GET_INST_OPCODE ip
3093 GOTO_OPCODE ip
3094
3095
3096
3097/* ------------------------------ */
3098 .balign 128
3099.L_op_invoke_direct_range: /* 0x76 */
3100/* File: arm64/op_invoke_direct_range.S */
3101/* File: arm64/invoke.S */
3102 /*
3103 * Generic invoke handler wrapper.
3104 */
3105 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3106 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3107 .extern MterpInvokeDirectRange
3108 EXPORT_PC
3109 mov x0, xSELF
3110 add x1, xFP, #OFF_FP_SHADOWFRAME
3111 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003112 mov x3, xINST
3113 bl MterpInvokeDirectRange
3114 cbz w0, MterpException
3115 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003116 bl MterpShouldSwitchInterpreters
3117 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003118 GET_INST_OPCODE ip
3119 GOTO_OPCODE ip
3120
3121
3122
3123/* ------------------------------ */
3124 .balign 128
3125.L_op_invoke_static_range: /* 0x77 */
3126/* File: arm64/op_invoke_static_range.S */
3127/* File: arm64/invoke.S */
3128 /*
3129 * Generic invoke handler wrapper.
3130 */
3131 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3132 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3133 .extern MterpInvokeStaticRange
3134 EXPORT_PC
3135 mov x0, xSELF
3136 add x1, xFP, #OFF_FP_SHADOWFRAME
3137 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003138 mov x3, xINST
3139 bl MterpInvokeStaticRange
3140 cbz w0, MterpException
3141 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003142 bl MterpShouldSwitchInterpreters
3143 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003144 GET_INST_OPCODE ip
3145 GOTO_OPCODE ip
3146
3147
3148
3149/* ------------------------------ */
3150 .balign 128
3151.L_op_invoke_interface_range: /* 0x78 */
3152/* File: arm64/op_invoke_interface_range.S */
3153/* File: arm64/invoke.S */
3154 /*
3155 * Generic invoke handler wrapper.
3156 */
3157 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3158 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3159 .extern MterpInvokeInterfaceRange
3160 EXPORT_PC
3161 mov x0, xSELF
3162 add x1, xFP, #OFF_FP_SHADOWFRAME
3163 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003164 mov x3, xINST
3165 bl MterpInvokeInterfaceRange
3166 cbz w0, MterpException
3167 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00003168 bl MterpShouldSwitchInterpreters
3169 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003170 GET_INST_OPCODE ip
3171 GOTO_OPCODE ip
3172
3173
3174
3175/* ------------------------------ */
3176 .balign 128
3177.L_op_unused_79: /* 0x79 */
3178/* File: arm64/op_unused_79.S */
3179/* File: arm64/unused.S */
3180/*
3181 * Bail to reference interpreter to throw.
3182 */
3183 b MterpFallback
3184
3185
3186/* ------------------------------ */
3187 .balign 128
3188.L_op_unused_7a: /* 0x7a */
3189/* File: arm64/op_unused_7a.S */
3190/* File: arm64/unused.S */
3191/*
3192 * Bail to reference interpreter to throw.
3193 */
3194 b MterpFallback
3195
3196
3197/* ------------------------------ */
3198 .balign 128
3199.L_op_neg_int: /* 0x7b */
3200/* File: arm64/op_neg_int.S */
3201/* File: arm64/unop.S */
3202 /*
3203 * Generic 32-bit unary operation. Provide an "instr" line that
3204 * specifies an instruction that performs "result = op w0".
3205 * This could be an ARM instruction or a function call.
3206 *
3207 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3208 * int-to-byte, int-to-char, int-to-short
3209 */
3210 /* unop vA, vB */
3211 lsr w3, wINST, #12 // w3<- B
3212 GET_VREG w0, w3 // w0<- vB
3213 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003214 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3215 sub w0, wzr, w0 // w0<- op, w0-w3 changed
3216 GET_INST_OPCODE ip // extract opcode from rINST
3217 SET_VREG w0, w9 // vAA<- w0
3218 GOTO_OPCODE ip // jump to next instruction
3219 /* 8-9 instructions */
3220
3221
3222/* ------------------------------ */
3223 .balign 128
3224.L_op_not_int: /* 0x7c */
3225/* File: arm64/op_not_int.S */
3226/* File: arm64/unop.S */
3227 /*
3228 * Generic 32-bit unary operation. Provide an "instr" line that
3229 * specifies an instruction that performs "result = op w0".
3230 * This could be an ARM instruction or a function call.
3231 *
3232 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3233 * int-to-byte, int-to-char, int-to-short
3234 */
3235 /* unop vA, vB */
3236 lsr w3, wINST, #12 // w3<- B
3237 GET_VREG w0, w3 // w0<- vB
3238 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003239 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3240 mvn w0, w0 // w0<- op, w0-w3 changed
3241 GET_INST_OPCODE ip // extract opcode from rINST
3242 SET_VREG w0, w9 // vAA<- w0
3243 GOTO_OPCODE ip // jump to next instruction
3244 /* 8-9 instructions */
3245
3246
3247/* ------------------------------ */
3248 .balign 128
3249.L_op_neg_long: /* 0x7d */
3250/* File: arm64/op_neg_long.S */
3251/* File: arm64/unopWide.S */
3252 /*
3253 * Generic 64-bit unary operation. Provide an "instr" line that
3254 * specifies an instruction that performs "result = op x0".
3255 *
3256 * For: neg-long, not-long
3257 */
3258 /* unop vA, vB */
3259 lsr w3, wINST, #12 // w3<- B
3260 ubfx w4, wINST, #8, #4 // w4<- A
3261 GET_VREG_WIDE x0, w3
3262 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003263 sub x0, xzr, x0
3264 GET_INST_OPCODE ip // extract opcode from wINST
3265 SET_VREG_WIDE x0, w4
3266 GOTO_OPCODE ip // jump to next instruction
3267 /* 10-11 instructions */
3268
3269
3270/* ------------------------------ */
3271 .balign 128
3272.L_op_not_long: /* 0x7e */
3273/* File: arm64/op_not_long.S */
3274/* File: arm64/unopWide.S */
3275 /*
3276 * Generic 64-bit unary operation. Provide an "instr" line that
3277 * specifies an instruction that performs "result = op x0".
3278 *
3279 * For: neg-long, not-long
3280 */
3281 /* unop vA, vB */
3282 lsr w3, wINST, #12 // w3<- B
3283 ubfx w4, wINST, #8, #4 // w4<- A
3284 GET_VREG_WIDE x0, w3
3285 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003286 mvn x0, x0
3287 GET_INST_OPCODE ip // extract opcode from wINST
3288 SET_VREG_WIDE x0, w4
3289 GOTO_OPCODE ip // jump to next instruction
3290 /* 10-11 instructions */
3291
3292
3293/* ------------------------------ */
3294 .balign 128
3295.L_op_neg_float: /* 0x7f */
3296/* File: arm64/op_neg_float.S */
3297/* File: arm64/unop.S */
3298 /*
3299 * Generic 32-bit unary operation. Provide an "instr" line that
3300 * specifies an instruction that performs "result = op w0".
3301 * This could be an ARM instruction or a function call.
3302 *
3303 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3304 * int-to-byte, int-to-char, int-to-short
3305 */
3306 /* unop vA, vB */
3307 lsr w3, wINST, #12 // w3<- B
3308 GET_VREG w0, w3 // w0<- vB
3309 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003310 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003311 eor w0, w0, #0x80000000 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003312 GET_INST_OPCODE ip // extract opcode from rINST
3313 SET_VREG w0, w9 // vAA<- w0
3314 GOTO_OPCODE ip // jump to next instruction
3315 /* 8-9 instructions */
3316
3317
3318/* ------------------------------ */
3319 .balign 128
3320.L_op_neg_double: /* 0x80 */
3321/* File: arm64/op_neg_double.S */
3322/* File: arm64/unopWide.S */
3323 /*
3324 * Generic 64-bit unary operation. Provide an "instr" line that
3325 * specifies an instruction that performs "result = op x0".
3326 *
3327 * For: neg-long, not-long
3328 */
3329 /* unop vA, vB */
3330 lsr w3, wINST, #12 // w3<- B
3331 ubfx w4, wINST, #8, #4 // w4<- A
3332 GET_VREG_WIDE x0, w3
3333 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003334 eor x0, x0, #0x8000000000000000
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003335 GET_INST_OPCODE ip // extract opcode from wINST
3336 SET_VREG_WIDE x0, w4
3337 GOTO_OPCODE ip // jump to next instruction
3338 /* 10-11 instructions */
3339
3340
3341/* ------------------------------ */
3342 .balign 128
3343.L_op_int_to_long: /* 0x81 */
3344/* File: arm64/op_int_to_long.S */
Vladimir Markoc4165022016-07-28 14:04:18 +01003345 /* int-to-long vA, vB */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003346 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003347 ubfx w4, wINST, #8, #4 // w4<- A
Vladimir Marko20421b92016-07-26 16:38:11 +01003348 GET_VREG_S x0, w3 // x0<- sign_extend(fp[B])
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003349 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003350 GET_INST_OPCODE ip // extract opcode from wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003351 SET_VREG_WIDE x0, w4 // fp[A]<- x0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003352 GOTO_OPCODE ip // jump to next instruction
3353
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003354/* ------------------------------ */
3355 .balign 128
3356.L_op_int_to_float: /* 0x82 */
3357/* File: arm64/op_int_to_float.S */
3358/* File: arm64/funopNarrow.S */
3359 /*
3360 * Generic 32bit-to-32bit floating point unary operation. Provide an
3361 * "instr" line that specifies an instruction that performs "s0 = op w0".
3362 *
3363 * For: int-to-float, float-to-int
3364 * TODO: refactor all of the conversions - parameterize width and use same template.
3365 */
3366 /* unop vA, vB */
3367 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003368 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003369 GET_VREG w0, w3
3370 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003371 scvtf s0, w0 // d0<- op
3372 GET_INST_OPCODE ip // extract opcode from wINST
3373 SET_VREG s0, w4 // vA<- d0
3374 GOTO_OPCODE ip // jump to next instruction
3375
3376
3377/* ------------------------------ */
3378 .balign 128
3379.L_op_int_to_double: /* 0x83 */
3380/* File: arm64/op_int_to_double.S */
3381/* File: arm64/funopWider.S */
3382 /*
3383 * Generic 32bit-to-64bit floating point unary operation. Provide an
3384 * "instr" line that specifies an instruction that performs "d0 = op w0".
3385 *
3386 * For: int-to-double, float-to-double, float-to-long
3387 */
3388 /* unop vA, vB */
3389 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003390 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003391 GET_VREG w0, w3
3392 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003393 scvtf d0, w0 // d0<- op
3394 GET_INST_OPCODE ip // extract opcode from wINST
3395 SET_VREG_WIDE d0, w4 // vA<- d0
3396 GOTO_OPCODE ip // jump to next instruction
3397
3398
3399/* ------------------------------ */
3400 .balign 128
3401.L_op_long_to_int: /* 0x84 */
3402/* File: arm64/op_long_to_int.S */
Vladimir Marko20421b92016-07-26 16:38:11 +01003403/* we ignore the high word, making this equivalent to a 32-bit reg move */
3404/* File: arm64/op_move.S */
3405 /* for move, move-object, long-to-int */
3406 /* op vA, vB */
3407 lsr w1, wINST, #12 // x1<- B from 15:12
3408 ubfx w0, wINST, #8, #4 // x0<- A from 11:8
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003409 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01003410 GET_VREG w2, w1 // x2<- fp[B]
3411 GET_INST_OPCODE ip // ip<- opcode from wINST
3412 .if 0
3413 SET_VREG_OBJECT w2, w0 // fp[A]<- x2
3414 .else
3415 SET_VREG w2, w0 // fp[A]<- x2
3416 .endif
3417 GOTO_OPCODE ip // execute next instruction
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003418
3419
3420/* ------------------------------ */
3421 .balign 128
3422.L_op_long_to_float: /* 0x85 */
3423/* File: arm64/op_long_to_float.S */
3424/* File: arm64/funopNarrower.S */
3425 /*
3426 * Generic 64bit-to-32bit floating point unary operation. Provide an
3427 * "instr" line that specifies an instruction that performs "s0 = op x0".
3428 *
3429 * For: int-to-double, float-to-double, float-to-long
3430 */
3431 /* unop vA, vB */
3432 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003433 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003434 GET_VREG_WIDE x0, w3
3435 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003436 scvtf s0, x0 // d0<- op
3437 GET_INST_OPCODE ip // extract opcode from wINST
3438 SET_VREG s0, w4 // vA<- d0
3439 GOTO_OPCODE ip // jump to next instruction
3440
3441
3442/* ------------------------------ */
3443 .balign 128
3444.L_op_long_to_double: /* 0x86 */
3445/* File: arm64/op_long_to_double.S */
3446/* File: arm64/funopWide.S */
3447 /*
3448 * Generic 64bit-to-64bit floating point unary operation. Provide an
3449 * "instr" line that specifies an instruction that performs "d0 = op x0".
3450 *
3451 * For: long-to-double, double-to-long
3452 */
3453 /* unop vA, vB */
3454 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003455 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003456 GET_VREG_WIDE x0, w3
3457 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003458 scvtf d0, x0 // d0<- op
3459 GET_INST_OPCODE ip // extract opcode from wINST
3460 SET_VREG_WIDE d0, w4 // vA<- d0
3461 GOTO_OPCODE ip // jump to next instruction
3462
3463
3464/* ------------------------------ */
3465 .balign 128
3466.L_op_float_to_int: /* 0x87 */
3467/* File: arm64/op_float_to_int.S */
3468/* File: arm64/funopNarrow.S */
3469 /*
3470 * Generic 32bit-to-32bit floating point unary operation. Provide an
3471 * "instr" line that specifies an instruction that performs "w0 = op s0".
3472 *
3473 * For: int-to-float, float-to-int
3474 * TODO: refactor all of the conversions - parameterize width and use same template.
3475 */
3476 /* unop vA, vB */
3477 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003478 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003479 GET_VREG s0, w3
3480 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003481 fcvtzs w0, s0 // d0<- op
3482 GET_INST_OPCODE ip // extract opcode from wINST
3483 SET_VREG w0, w4 // vA<- d0
3484 GOTO_OPCODE ip // jump to next instruction
3485
3486
3487/* ------------------------------ */
3488 .balign 128
3489.L_op_float_to_long: /* 0x88 */
3490/* File: arm64/op_float_to_long.S */
3491/* File: arm64/funopWider.S */
3492 /*
3493 * Generic 32bit-to-64bit floating point unary operation. Provide an
3494 * "instr" line that specifies an instruction that performs "x0 = op s0".
3495 *
3496 * For: int-to-double, float-to-double, float-to-long
3497 */
3498 /* unop vA, vB */
3499 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003500 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003501 GET_VREG s0, w3
3502 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003503 fcvtzs x0, s0 // d0<- op
3504 GET_INST_OPCODE ip // extract opcode from wINST
3505 SET_VREG_WIDE x0, w4 // vA<- d0
3506 GOTO_OPCODE ip // jump to next instruction
3507
3508
3509/* ------------------------------ */
3510 .balign 128
3511.L_op_float_to_double: /* 0x89 */
3512/* File: arm64/op_float_to_double.S */
3513/* File: arm64/funopWider.S */
3514 /*
3515 * Generic 32bit-to-64bit floating point unary operation. Provide an
3516 * "instr" line that specifies an instruction that performs "d0 = op s0".
3517 *
3518 * For: int-to-double, float-to-double, float-to-long
3519 */
3520 /* unop vA, vB */
3521 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003522 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003523 GET_VREG s0, w3
3524 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003525 fcvt d0, s0 // d0<- op
3526 GET_INST_OPCODE ip // extract opcode from wINST
3527 SET_VREG_WIDE d0, w4 // vA<- d0
3528 GOTO_OPCODE ip // jump to next instruction
3529
3530
3531/* ------------------------------ */
3532 .balign 128
3533.L_op_double_to_int: /* 0x8a */
3534/* File: arm64/op_double_to_int.S */
3535/* File: arm64/funopNarrower.S */
3536 /*
3537 * Generic 64bit-to-32bit floating point unary operation. Provide an
3538 * "instr" line that specifies an instruction that performs "w0 = op d0".
3539 *
3540 * For: int-to-double, float-to-double, float-to-long
3541 */
3542 /* unop vA, vB */
3543 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003544 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003545 GET_VREG_WIDE d0, w3
3546 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003547 fcvtzs w0, d0 // d0<- op
3548 GET_INST_OPCODE ip // extract opcode from wINST
3549 SET_VREG w0, w4 // vA<- d0
3550 GOTO_OPCODE ip // jump to next instruction
3551
3552
3553/* ------------------------------ */
3554 .balign 128
3555.L_op_double_to_long: /* 0x8b */
3556/* File: arm64/op_double_to_long.S */
3557/* File: arm64/funopWide.S */
3558 /*
3559 * Generic 64bit-to-64bit floating point unary operation. Provide an
3560 * "instr" line that specifies an instruction that performs "x0 = op d0".
3561 *
3562 * For: long-to-double, double-to-long
3563 */
3564 /* unop vA, vB */
3565 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003566 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003567 GET_VREG_WIDE d0, w3
3568 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003569 fcvtzs x0, d0 // d0<- op
3570 GET_INST_OPCODE ip // extract opcode from wINST
3571 SET_VREG_WIDE x0, w4 // vA<- d0
3572 GOTO_OPCODE ip // jump to next instruction
3573
3574
3575/* ------------------------------ */
3576 .balign 128
3577.L_op_double_to_float: /* 0x8c */
3578/* File: arm64/op_double_to_float.S */
3579/* File: arm64/funopNarrower.S */
3580 /*
3581 * Generic 64bit-to-32bit floating point unary operation. Provide an
3582 * "instr" line that specifies an instruction that performs "s0 = op d0".
3583 *
3584 * For: int-to-double, float-to-double, float-to-long
3585 */
3586 /* unop vA, vB */
3587 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01003588 ubfx w4, wINST, #8, #4 // w4<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003589 GET_VREG_WIDE d0, w3
3590 FETCH_ADVANCE_INST 1 // advance rPC, load wINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003591 fcvt s0, d0 // d0<- op
3592 GET_INST_OPCODE ip // extract opcode from wINST
3593 SET_VREG s0, w4 // vA<- d0
3594 GOTO_OPCODE ip // jump to next instruction
3595
3596
3597/* ------------------------------ */
3598 .balign 128
3599.L_op_int_to_byte: /* 0x8d */
3600/* File: arm64/op_int_to_byte.S */
3601/* File: arm64/unop.S */
3602 /*
3603 * Generic 32-bit unary operation. Provide an "instr" line that
3604 * specifies an instruction that performs "result = op w0".
3605 * This could be an ARM instruction or a function call.
3606 *
3607 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3608 * int-to-byte, int-to-char, int-to-short
3609 */
3610 /* unop vA, vB */
3611 lsr w3, wINST, #12 // w3<- B
3612 GET_VREG w0, w3 // w0<- vB
3613 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003614 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3615 sxtb w0, w0 // w0<- op, w0-w3 changed
3616 GET_INST_OPCODE ip // extract opcode from rINST
3617 SET_VREG w0, w9 // vAA<- w0
3618 GOTO_OPCODE ip // jump to next instruction
3619 /* 8-9 instructions */
3620
3621
3622/* ------------------------------ */
3623 .balign 128
3624.L_op_int_to_char: /* 0x8e */
3625/* File: arm64/op_int_to_char.S */
3626/* File: arm64/unop.S */
3627 /*
3628 * Generic 32-bit unary operation. Provide an "instr" line that
3629 * specifies an instruction that performs "result = op w0".
3630 * This could be an ARM instruction or a function call.
3631 *
3632 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3633 * int-to-byte, int-to-char, int-to-short
3634 */
3635 /* unop vA, vB */
3636 lsr w3, wINST, #12 // w3<- B
3637 GET_VREG w0, w3 // w0<- vB
3638 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003639 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3640 uxth w0, w0 // w0<- op, w0-w3 changed
3641 GET_INST_OPCODE ip // extract opcode from rINST
3642 SET_VREG w0, w9 // vAA<- w0
3643 GOTO_OPCODE ip // jump to next instruction
3644 /* 8-9 instructions */
3645
3646
3647/* ------------------------------ */
3648 .balign 128
3649.L_op_int_to_short: /* 0x8f */
3650/* File: arm64/op_int_to_short.S */
3651/* File: arm64/unop.S */
3652 /*
3653 * Generic 32-bit unary operation. Provide an "instr" line that
3654 * specifies an instruction that performs "result = op w0".
3655 * This could be an ARM instruction or a function call.
3656 *
3657 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3658 * int-to-byte, int-to-char, int-to-short
3659 */
3660 /* unop vA, vB */
3661 lsr w3, wINST, #12 // w3<- B
3662 GET_VREG w0, w3 // w0<- vB
3663 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00003664 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
3665 sxth w0, w0 // w0<- op, w0-w3 changed
3666 GET_INST_OPCODE ip // extract opcode from rINST
3667 SET_VREG w0, w9 // vAA<- w0
3668 GOTO_OPCODE ip // jump to next instruction
3669 /* 8-9 instructions */
3670
3671
3672/* ------------------------------ */
3673 .balign 128
3674.L_op_add_int: /* 0x90 */
3675/* File: arm64/op_add_int.S */
3676/* File: arm64/binop.S */
3677 /*
3678 * Generic 32-bit binary operation. Provide an "instr" line that
3679 * specifies an instruction that performs "result = w0 op w1".
3680 * This could be an ARM instruction or a function call. (If the result
3681 * comes back in a register other than w0, you can override "result".)
3682 *
3683 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3684 * vCC (w1). Useful for integer division and modulus. Note that we
3685 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3686 * handles it correctly.
3687 *
3688 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3689 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3690 * mul-float, div-float, rem-float
3691 */
3692 /* binop vAA, vBB, vCC */
3693 FETCH w0, 1 // w0<- CCBB
3694 lsr w9, wINST, #8 // w9<- AA
3695 lsr w3, w0, #8 // w3<- CC
3696 and w2, w0, #255 // w2<- BB
3697 GET_VREG w1, w3 // w1<- vCC
3698 GET_VREG w0, w2 // w0<- vBB
3699 .if 0
3700 cbz w1, common_errDivideByZero // is second operand zero?
3701 .endif
3702 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3703 // optional op; may set condition codes
3704 add w0, w0, w1 // w0<- op, w0-w3 changed
3705 GET_INST_OPCODE ip // extract opcode from rINST
3706 SET_VREG w0, w9 // vAA<- w0
3707 GOTO_OPCODE ip // jump to next instruction
3708 /* 11-14 instructions */
3709
3710
3711/* ------------------------------ */
3712 .balign 128
3713.L_op_sub_int: /* 0x91 */
3714/* File: arm64/op_sub_int.S */
3715/* File: arm64/binop.S */
3716 /*
3717 * Generic 32-bit binary operation. Provide an "instr" line that
3718 * specifies an instruction that performs "result = w0 op w1".
3719 * This could be an ARM instruction or a function call. (If the result
3720 * comes back in a register other than w0, you can override "result".)
3721 *
3722 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3723 * vCC (w1). Useful for integer division and modulus. Note that we
3724 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3725 * handles it correctly.
3726 *
3727 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3728 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3729 * mul-float, div-float, rem-float
3730 */
3731 /* binop vAA, vBB, vCC */
3732 FETCH w0, 1 // w0<- CCBB
3733 lsr w9, wINST, #8 // w9<- AA
3734 lsr w3, w0, #8 // w3<- CC
3735 and w2, w0, #255 // w2<- BB
3736 GET_VREG w1, w3 // w1<- vCC
3737 GET_VREG w0, w2 // w0<- vBB
3738 .if 0
3739 cbz w1, common_errDivideByZero // is second operand zero?
3740 .endif
3741 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3742 // optional op; may set condition codes
3743 sub w0, w0, w1 // w0<- op, w0-w3 changed
3744 GET_INST_OPCODE ip // extract opcode from rINST
3745 SET_VREG w0, w9 // vAA<- w0
3746 GOTO_OPCODE ip // jump to next instruction
3747 /* 11-14 instructions */
3748
3749
3750/* ------------------------------ */
3751 .balign 128
3752.L_op_mul_int: /* 0x92 */
3753/* File: arm64/op_mul_int.S */
3754/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
3755/* File: arm64/binop.S */
3756 /*
3757 * Generic 32-bit binary operation. Provide an "instr" line that
3758 * specifies an instruction that performs "result = w0 op w1".
3759 * This could be an ARM instruction or a function call. (If the result
3760 * comes back in a register other than w0, you can override "result".)
3761 *
3762 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3763 * vCC (w1). Useful for integer division and modulus. Note that we
3764 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3765 * handles it correctly.
3766 *
3767 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3768 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3769 * mul-float, div-float, rem-float
3770 */
3771 /* binop vAA, vBB, vCC */
3772 FETCH w0, 1 // w0<- CCBB
3773 lsr w9, wINST, #8 // w9<- AA
3774 lsr w3, w0, #8 // w3<- CC
3775 and w2, w0, #255 // w2<- BB
3776 GET_VREG w1, w3 // w1<- vCC
3777 GET_VREG w0, w2 // w0<- vBB
3778 .if 0
3779 cbz w1, common_errDivideByZero // is second operand zero?
3780 .endif
3781 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3782 // optional op; may set condition codes
3783 mul w0, w1, w0 // w0<- op, w0-w3 changed
3784 GET_INST_OPCODE ip // extract opcode from rINST
3785 SET_VREG w0, w9 // vAA<- w0
3786 GOTO_OPCODE ip // jump to next instruction
3787 /* 11-14 instructions */
3788
3789
3790/* ------------------------------ */
3791 .balign 128
3792.L_op_div_int: /* 0x93 */
3793/* File: arm64/op_div_int.S */
3794/* File: arm64/binop.S */
3795 /*
3796 * Generic 32-bit binary operation. Provide an "instr" line that
3797 * specifies an instruction that performs "result = w0 op w1".
3798 * This could be an ARM instruction or a function call. (If the result
3799 * comes back in a register other than w0, you can override "result".)
3800 *
3801 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3802 * vCC (w1). Useful for integer division and modulus. Note that we
3803 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3804 * handles it correctly.
3805 *
3806 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3807 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3808 * mul-float, div-float, rem-float
3809 */
3810 /* binop vAA, vBB, vCC */
3811 FETCH w0, 1 // w0<- CCBB
3812 lsr w9, wINST, #8 // w9<- AA
3813 lsr w3, w0, #8 // w3<- CC
3814 and w2, w0, #255 // w2<- BB
3815 GET_VREG w1, w3 // w1<- vCC
3816 GET_VREG w0, w2 // w0<- vBB
3817 .if 1
3818 cbz w1, common_errDivideByZero // is second operand zero?
3819 .endif
3820 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3821 // optional op; may set condition codes
3822 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
3823 GET_INST_OPCODE ip // extract opcode from rINST
3824 SET_VREG w0, w9 // vAA<- w0
3825 GOTO_OPCODE ip // jump to next instruction
3826 /* 11-14 instructions */
3827
3828
3829/* ------------------------------ */
3830 .balign 128
3831.L_op_rem_int: /* 0x94 */
3832/* File: arm64/op_rem_int.S */
3833/* File: arm64/binop.S */
3834 /*
3835 * Generic 32-bit binary operation. Provide an "instr" line that
3836 * specifies an instruction that performs "result = w0 op w1".
3837 * This could be an ARM instruction or a function call. (If the result
3838 * comes back in a register other than w0, you can override "result".)
3839 *
3840 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3841 * vCC (w1). Useful for integer division and modulus. Note that we
3842 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3843 * handles it correctly.
3844 *
3845 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3846 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3847 * mul-float, div-float, rem-float
3848 */
3849 /* binop vAA, vBB, vCC */
3850 FETCH w0, 1 // w0<- CCBB
3851 lsr w9, wINST, #8 // w9<- AA
3852 lsr w3, w0, #8 // w3<- CC
3853 and w2, w0, #255 // w2<- BB
3854 GET_VREG w1, w3 // w1<- vCC
3855 GET_VREG w0, w2 // w0<- vBB
3856 .if 1
3857 cbz w1, common_errDivideByZero // is second operand zero?
3858 .endif
3859 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3860 sdiv w2, w0, w1 // optional op; may set condition codes
3861 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
3862 GET_INST_OPCODE ip // extract opcode from rINST
3863 SET_VREG w0, w9 // vAA<- w0
3864 GOTO_OPCODE ip // jump to next instruction
3865 /* 11-14 instructions */
3866
3867
3868/* ------------------------------ */
3869 .balign 128
3870.L_op_and_int: /* 0x95 */
3871/* File: arm64/op_and_int.S */
3872/* File: arm64/binop.S */
3873 /*
3874 * Generic 32-bit binary operation. Provide an "instr" line that
3875 * specifies an instruction that performs "result = w0 op w1".
3876 * This could be an ARM instruction or a function call. (If the result
3877 * comes back in a register other than w0, you can override "result".)
3878 *
3879 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3880 * vCC (w1). Useful for integer division and modulus. Note that we
3881 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3882 * handles it correctly.
3883 *
3884 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3885 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3886 * mul-float, div-float, rem-float
3887 */
3888 /* binop vAA, vBB, vCC */
3889 FETCH w0, 1 // w0<- CCBB
3890 lsr w9, wINST, #8 // w9<- AA
3891 lsr w3, w0, #8 // w3<- CC
3892 and w2, w0, #255 // w2<- BB
3893 GET_VREG w1, w3 // w1<- vCC
3894 GET_VREG w0, w2 // w0<- vBB
3895 .if 0
3896 cbz w1, common_errDivideByZero // is second operand zero?
3897 .endif
3898 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3899 // optional op; may set condition codes
3900 and w0, w0, w1 // w0<- op, w0-w3 changed
3901 GET_INST_OPCODE ip // extract opcode from rINST
3902 SET_VREG w0, w9 // vAA<- w0
3903 GOTO_OPCODE ip // jump to next instruction
3904 /* 11-14 instructions */
3905
3906
3907/* ------------------------------ */
3908 .balign 128
3909.L_op_or_int: /* 0x96 */
3910/* File: arm64/op_or_int.S */
3911/* File: arm64/binop.S */
3912 /*
3913 * Generic 32-bit binary operation. Provide an "instr" line that
3914 * specifies an instruction that performs "result = w0 op w1".
3915 * This could be an ARM instruction or a function call. (If the result
3916 * comes back in a register other than w0, you can override "result".)
3917 *
3918 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3919 * vCC (w1). Useful for integer division and modulus. Note that we
3920 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3921 * handles it correctly.
3922 *
3923 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3924 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3925 * mul-float, div-float, rem-float
3926 */
3927 /* binop vAA, vBB, vCC */
3928 FETCH w0, 1 // w0<- CCBB
3929 lsr w9, wINST, #8 // w9<- AA
3930 lsr w3, w0, #8 // w3<- CC
3931 and w2, w0, #255 // w2<- BB
3932 GET_VREG w1, w3 // w1<- vCC
3933 GET_VREG w0, w2 // w0<- vBB
3934 .if 0
3935 cbz w1, common_errDivideByZero // is second operand zero?
3936 .endif
3937 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3938 // optional op; may set condition codes
3939 orr w0, w0, w1 // w0<- op, w0-w3 changed
3940 GET_INST_OPCODE ip // extract opcode from rINST
3941 SET_VREG w0, w9 // vAA<- w0
3942 GOTO_OPCODE ip // jump to next instruction
3943 /* 11-14 instructions */
3944
3945
3946/* ------------------------------ */
3947 .balign 128
3948.L_op_xor_int: /* 0x97 */
3949/* File: arm64/op_xor_int.S */
3950/* File: arm64/binop.S */
3951 /*
3952 * Generic 32-bit binary operation. Provide an "instr" line that
3953 * specifies an instruction that performs "result = w0 op w1".
3954 * This could be an ARM instruction or a function call. (If the result
3955 * comes back in a register other than w0, you can override "result".)
3956 *
3957 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3958 * vCC (w1). Useful for integer division and modulus. Note that we
3959 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3960 * handles it correctly.
3961 *
3962 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3963 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3964 * mul-float, div-float, rem-float
3965 */
3966 /* binop vAA, vBB, vCC */
3967 FETCH w0, 1 // w0<- CCBB
3968 lsr w9, wINST, #8 // w9<- AA
3969 lsr w3, w0, #8 // w3<- CC
3970 and w2, w0, #255 // w2<- BB
3971 GET_VREG w1, w3 // w1<- vCC
3972 GET_VREG w0, w2 // w0<- vBB
3973 .if 0
3974 cbz w1, common_errDivideByZero // is second operand zero?
3975 .endif
3976 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
3977 // optional op; may set condition codes
3978 eor w0, w0, w1 // w0<- op, w0-w3 changed
3979 GET_INST_OPCODE ip // extract opcode from rINST
3980 SET_VREG w0, w9 // vAA<- w0
3981 GOTO_OPCODE ip // jump to next instruction
3982 /* 11-14 instructions */
3983
3984
3985/* ------------------------------ */
3986 .balign 128
3987.L_op_shl_int: /* 0x98 */
3988/* File: arm64/op_shl_int.S */
3989/* File: arm64/binop.S */
3990 /*
3991 * Generic 32-bit binary operation. Provide an "instr" line that
3992 * specifies an instruction that performs "result = w0 op w1".
3993 * This could be an ARM instruction or a function call. (If the result
3994 * comes back in a register other than w0, you can override "result".)
3995 *
3996 * If "chkzero" is set to 1, we perform a divide-by-zero check on
3997 * vCC (w1). Useful for integer division and modulus. Note that we
3998 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3999 * handles it correctly.
4000 *
4001 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4002 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4003 * mul-float, div-float, rem-float
4004 */
4005 /* binop vAA, vBB, vCC */
4006 FETCH w0, 1 // w0<- CCBB
4007 lsr w9, wINST, #8 // w9<- AA
4008 lsr w3, w0, #8 // w3<- CC
4009 and w2, w0, #255 // w2<- BB
4010 GET_VREG w1, w3 // w1<- vCC
4011 GET_VREG w0, w2 // w0<- vBB
4012 .if 0
4013 cbz w1, common_errDivideByZero // is second operand zero?
4014 .endif
4015 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004016 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004017 lsl w0, w0, w1 // w0<- op, w0-w3 changed
4018 GET_INST_OPCODE ip // extract opcode from rINST
4019 SET_VREG w0, w9 // vAA<- w0
4020 GOTO_OPCODE ip // jump to next instruction
4021 /* 11-14 instructions */
4022
4023
4024/* ------------------------------ */
4025 .balign 128
4026.L_op_shr_int: /* 0x99 */
4027/* File: arm64/op_shr_int.S */
4028/* File: arm64/binop.S */
4029 /*
4030 * Generic 32-bit binary operation. Provide an "instr" line that
4031 * specifies an instruction that performs "result = w0 op w1".
4032 * This could be an ARM instruction or a function call. (If the result
4033 * comes back in a register other than w0, you can override "result".)
4034 *
4035 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4036 * vCC (w1). Useful for integer division and modulus. Note that we
4037 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4038 * handles it correctly.
4039 *
4040 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4041 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4042 * mul-float, div-float, rem-float
4043 */
4044 /* binop vAA, vBB, vCC */
4045 FETCH w0, 1 // w0<- CCBB
4046 lsr w9, wINST, #8 // w9<- AA
4047 lsr w3, w0, #8 // w3<- CC
4048 and w2, w0, #255 // w2<- BB
4049 GET_VREG w1, w3 // w1<- vCC
4050 GET_VREG w0, w2 // w0<- vBB
4051 .if 0
4052 cbz w1, common_errDivideByZero // is second operand zero?
4053 .endif
4054 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004055 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004056 asr w0, w0, w1 // w0<- op, w0-w3 changed
4057 GET_INST_OPCODE ip // extract opcode from rINST
4058 SET_VREG w0, w9 // vAA<- w0
4059 GOTO_OPCODE ip // jump to next instruction
4060 /* 11-14 instructions */
4061
4062
4063/* ------------------------------ */
4064 .balign 128
4065.L_op_ushr_int: /* 0x9a */
4066/* File: arm64/op_ushr_int.S */
4067/* File: arm64/binop.S */
4068 /*
4069 * Generic 32-bit binary operation. Provide an "instr" line that
4070 * specifies an instruction that performs "result = w0 op w1".
4071 * This could be an ARM instruction or a function call. (If the result
4072 * comes back in a register other than w0, you can override "result".)
4073 *
4074 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4075 * vCC (w1). Useful for integer division and modulus. Note that we
4076 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4077 * handles it correctly.
4078 *
4079 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4080 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4081 * mul-float, div-float, rem-float
4082 */
4083 /* binop vAA, vBB, vCC */
4084 FETCH w0, 1 // w0<- CCBB
4085 lsr w9, wINST, #8 // w9<- AA
4086 lsr w3, w0, #8 // w3<- CC
4087 and w2, w0, #255 // w2<- BB
4088 GET_VREG w1, w3 // w1<- vCC
4089 GET_VREG w0, w2 // w0<- vBB
4090 .if 0
4091 cbz w1, common_errDivideByZero // is second operand zero?
4092 .endif
4093 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004094 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004095 lsr w0, w0, w1 // w0<- op, w0-w3 changed
4096 GET_INST_OPCODE ip // extract opcode from rINST
4097 SET_VREG w0, w9 // vAA<- w0
4098 GOTO_OPCODE ip // jump to next instruction
4099 /* 11-14 instructions */
4100
4101
4102/* ------------------------------ */
4103 .balign 128
4104.L_op_add_long: /* 0x9b */
4105/* File: arm64/op_add_long.S */
4106/* File: arm64/binopWide.S */
4107 /*
4108 * Generic 64-bit binary operation. Provide an "instr" line that
4109 * specifies an instruction that performs "result = x1 op x2".
4110 * This could be an ARM instruction or a function call. (If the result
4111 * comes back in a register other than x0, you can override "result".)
4112 *
4113 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4114 * vCC (w1). Useful for integer division and modulus.
4115 *
4116 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4117 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4118 */
4119 /* binop vAA, vBB, vCC */
4120 FETCH w0, 1 // w0<- CCBB
4121 lsr w4, wINST, #8 // w4<- AA
4122 lsr w2, w0, #8 // w2<- CC
4123 and w1, w0, #255 // w1<- BB
4124 GET_VREG_WIDE x2, w2 // w2<- vCC
4125 GET_VREG_WIDE x1, w1 // w1<- vBB
4126 .if 0
4127 cbz x2, common_errDivideByZero // is second operand zero?
4128 .endif
4129 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4130
4131 add x0, x1, x2 // x0<- op, w0-w4 changed
4132 GET_INST_OPCODE ip // extract opcode from rINST
4133 SET_VREG_WIDE x0, w4 // vAA<- x0
4134 GOTO_OPCODE ip // jump to next instruction
4135 /* 11-14 instructions */
4136
4137
4138/* ------------------------------ */
4139 .balign 128
4140.L_op_sub_long: /* 0x9c */
4141/* File: arm64/op_sub_long.S */
4142/* File: arm64/binopWide.S */
4143 /*
4144 * Generic 64-bit binary operation. Provide an "instr" line that
4145 * specifies an instruction that performs "result = x1 op x2".
4146 * This could be an ARM instruction or a function call. (If the result
4147 * comes back in a register other than x0, you can override "result".)
4148 *
4149 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4150 * vCC (w1). Useful for integer division and modulus.
4151 *
4152 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4153 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4154 */
4155 /* binop vAA, vBB, vCC */
4156 FETCH w0, 1 // w0<- CCBB
4157 lsr w4, wINST, #8 // w4<- AA
4158 lsr w2, w0, #8 // w2<- CC
4159 and w1, w0, #255 // w1<- BB
4160 GET_VREG_WIDE x2, w2 // w2<- vCC
4161 GET_VREG_WIDE x1, w1 // w1<- vBB
4162 .if 0
4163 cbz x2, common_errDivideByZero // is second operand zero?
4164 .endif
4165 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4166
4167 sub x0, x1, x2 // x0<- op, w0-w4 changed
4168 GET_INST_OPCODE ip // extract opcode from rINST
4169 SET_VREG_WIDE x0, w4 // vAA<- x0
4170 GOTO_OPCODE ip // jump to next instruction
4171 /* 11-14 instructions */
4172
4173
4174/* ------------------------------ */
4175 .balign 128
4176.L_op_mul_long: /* 0x9d */
4177/* File: arm64/op_mul_long.S */
4178/* File: arm64/binopWide.S */
4179 /*
4180 * Generic 64-bit binary operation. Provide an "instr" line that
4181 * specifies an instruction that performs "result = x1 op x2".
4182 * This could be an ARM instruction or a function call. (If the result
4183 * comes back in a register other than x0, you can override "result".)
4184 *
4185 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4186 * vCC (w1). Useful for integer division and modulus.
4187 *
4188 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4189 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4190 */
4191 /* binop vAA, vBB, vCC */
4192 FETCH w0, 1 // w0<- CCBB
4193 lsr w4, wINST, #8 // w4<- AA
4194 lsr w2, w0, #8 // w2<- CC
4195 and w1, w0, #255 // w1<- BB
4196 GET_VREG_WIDE x2, w2 // w2<- vCC
4197 GET_VREG_WIDE x1, w1 // w1<- vBB
4198 .if 0
4199 cbz x2, common_errDivideByZero // is second operand zero?
4200 .endif
4201 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4202
4203 mul x0, x1, x2 // x0<- op, w0-w4 changed
4204 GET_INST_OPCODE ip // extract opcode from rINST
4205 SET_VREG_WIDE x0, w4 // vAA<- x0
4206 GOTO_OPCODE ip // jump to next instruction
4207 /* 11-14 instructions */
4208
4209
4210/* ------------------------------ */
4211 .balign 128
4212.L_op_div_long: /* 0x9e */
4213/* File: arm64/op_div_long.S */
4214/* File: arm64/binopWide.S */
4215 /*
4216 * Generic 64-bit binary operation. Provide an "instr" line that
4217 * specifies an instruction that performs "result = x1 op x2".
4218 * This could be an ARM instruction or a function call. (If the result
4219 * comes back in a register other than x0, you can override "result".)
4220 *
4221 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4222 * vCC (w1). Useful for integer division and modulus.
4223 *
4224 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4225 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4226 */
4227 /* binop vAA, vBB, vCC */
4228 FETCH w0, 1 // w0<- CCBB
4229 lsr w4, wINST, #8 // w4<- AA
4230 lsr w2, w0, #8 // w2<- CC
4231 and w1, w0, #255 // w1<- BB
4232 GET_VREG_WIDE x2, w2 // w2<- vCC
4233 GET_VREG_WIDE x1, w1 // w1<- vBB
4234 .if 1
4235 cbz x2, common_errDivideByZero // is second operand zero?
4236 .endif
4237 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4238
4239 sdiv x0, x1, x2 // x0<- op, w0-w4 changed
4240 GET_INST_OPCODE ip // extract opcode from rINST
4241 SET_VREG_WIDE x0, w4 // vAA<- x0
4242 GOTO_OPCODE ip // jump to next instruction
4243 /* 11-14 instructions */
4244
4245
4246/* ------------------------------ */
4247 .balign 128
4248.L_op_rem_long: /* 0x9f */
4249/* File: arm64/op_rem_long.S */
4250/* File: arm64/binopWide.S */
4251 /*
4252 * Generic 64-bit binary operation. Provide an "instr" line that
4253 * specifies an instruction that performs "result = x1 op x2".
4254 * This could be an ARM instruction or a function call. (If the result
4255 * comes back in a register other than x0, you can override "result".)
4256 *
4257 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4258 * vCC (w1). Useful for integer division and modulus.
4259 *
4260 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4261 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4262 */
4263 /* binop vAA, vBB, vCC */
4264 FETCH w0, 1 // w0<- CCBB
4265 lsr w4, wINST, #8 // w4<- AA
4266 lsr w2, w0, #8 // w2<- CC
4267 and w1, w0, #255 // w1<- BB
4268 GET_VREG_WIDE x2, w2 // w2<- vCC
4269 GET_VREG_WIDE x1, w1 // w1<- vBB
4270 .if 1
4271 cbz x2, common_errDivideByZero // is second operand zero?
4272 .endif
4273 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4274 sdiv x3, x1, x2
4275 msub x0, x3, x2, x1 // x0<- op, w0-w4 changed
4276 GET_INST_OPCODE ip // extract opcode from rINST
4277 SET_VREG_WIDE x0, w4 // vAA<- x0
4278 GOTO_OPCODE ip // jump to next instruction
4279 /* 11-14 instructions */
4280
4281
4282/* ------------------------------ */
4283 .balign 128
4284.L_op_and_long: /* 0xa0 */
4285/* File: arm64/op_and_long.S */
4286/* File: arm64/binopWide.S */
4287 /*
4288 * Generic 64-bit binary operation. Provide an "instr" line that
4289 * specifies an instruction that performs "result = x1 op x2".
4290 * This could be an ARM instruction or a function call. (If the result
4291 * comes back in a register other than x0, you can override "result".)
4292 *
4293 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4294 * vCC (w1). Useful for integer division and modulus.
4295 *
4296 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4297 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4298 */
4299 /* binop vAA, vBB, vCC */
4300 FETCH w0, 1 // w0<- CCBB
4301 lsr w4, wINST, #8 // w4<- AA
4302 lsr w2, w0, #8 // w2<- CC
4303 and w1, w0, #255 // w1<- BB
4304 GET_VREG_WIDE x2, w2 // w2<- vCC
4305 GET_VREG_WIDE x1, w1 // w1<- vBB
4306 .if 0
4307 cbz x2, common_errDivideByZero // is second operand zero?
4308 .endif
4309 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4310
4311 and x0, x1, x2 // x0<- op, w0-w4 changed
4312 GET_INST_OPCODE ip // extract opcode from rINST
4313 SET_VREG_WIDE x0, w4 // vAA<- x0
4314 GOTO_OPCODE ip // jump to next instruction
4315 /* 11-14 instructions */
4316
4317
4318/* ------------------------------ */
4319 .balign 128
4320.L_op_or_long: /* 0xa1 */
4321/* File: arm64/op_or_long.S */
4322/* File: arm64/binopWide.S */
4323 /*
4324 * Generic 64-bit binary operation. Provide an "instr" line that
4325 * specifies an instruction that performs "result = x1 op x2".
4326 * This could be an ARM instruction or a function call. (If the result
4327 * comes back in a register other than x0, you can override "result".)
4328 *
4329 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4330 * vCC (w1). Useful for integer division and modulus.
4331 *
4332 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4333 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4334 */
4335 /* binop vAA, vBB, vCC */
4336 FETCH w0, 1 // w0<- CCBB
4337 lsr w4, wINST, #8 // w4<- AA
4338 lsr w2, w0, #8 // w2<- CC
4339 and w1, w0, #255 // w1<- BB
4340 GET_VREG_WIDE x2, w2 // w2<- vCC
4341 GET_VREG_WIDE x1, w1 // w1<- vBB
4342 .if 0
4343 cbz x2, common_errDivideByZero // is second operand zero?
4344 .endif
4345 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4346
4347 orr x0, x1, x2 // x0<- op, w0-w4 changed
4348 GET_INST_OPCODE ip // extract opcode from rINST
4349 SET_VREG_WIDE x0, w4 // vAA<- x0
4350 GOTO_OPCODE ip // jump to next instruction
4351 /* 11-14 instructions */
4352
4353
4354/* ------------------------------ */
4355 .balign 128
4356.L_op_xor_long: /* 0xa2 */
4357/* File: arm64/op_xor_long.S */
4358/* File: arm64/binopWide.S */
4359 /*
4360 * Generic 64-bit binary operation. Provide an "instr" line that
4361 * specifies an instruction that performs "result = x1 op x2".
4362 * This could be an ARM instruction or a function call. (If the result
4363 * comes back in a register other than x0, you can override "result".)
4364 *
4365 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4366 * vCC (w1). Useful for integer division and modulus.
4367 *
4368 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4369 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4370 */
4371 /* binop vAA, vBB, vCC */
4372 FETCH w0, 1 // w0<- CCBB
4373 lsr w4, wINST, #8 // w4<- AA
4374 lsr w2, w0, #8 // w2<- CC
4375 and w1, w0, #255 // w1<- BB
4376 GET_VREG_WIDE x2, w2 // w2<- vCC
4377 GET_VREG_WIDE x1, w1 // w1<- vBB
4378 .if 0
4379 cbz x2, common_errDivideByZero // is second operand zero?
4380 .endif
4381 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4382
4383 eor x0, x1, x2 // x0<- op, w0-w4 changed
4384 GET_INST_OPCODE ip // extract opcode from rINST
4385 SET_VREG_WIDE x0, w4 // vAA<- x0
4386 GOTO_OPCODE ip // jump to next instruction
4387 /* 11-14 instructions */
4388
4389
4390/* ------------------------------ */
4391 .balign 128
4392.L_op_shl_long: /* 0xa3 */
4393/* File: arm64/op_shl_long.S */
4394/* File: arm64/shiftWide.S */
4395 /*
4396 * 64-bit shift operation.
4397 *
4398 * For: shl-long, shr-long, ushr-long
4399 */
4400 /* binop vAA, vBB, vCC */
4401 FETCH w0, 1 // w0<- CCBB
4402 lsr w3, wINST, #8 // w3<- AA
4403 lsr w2, w0, #8 // w2<- CC
4404 GET_VREG w2, w2 // w2<- vCC (shift count)
4405 and w1, w0, #255 // w1<- BB
4406 GET_VREG_WIDE x1, w1 // x1<- vBB
4407 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004408 lsl x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004409 GET_INST_OPCODE ip // extract opcode from rINST
4410 SET_VREG_WIDE x0, w3 // vAA<- x0
4411 GOTO_OPCODE ip // jump to next instruction
4412 /* 11-14 instructions */
4413
4414
4415/* ------------------------------ */
4416 .balign 128
4417.L_op_shr_long: /* 0xa4 */
4418/* File: arm64/op_shr_long.S */
4419/* File: arm64/shiftWide.S */
4420 /*
4421 * 64-bit shift operation.
4422 *
4423 * For: shl-long, shr-long, ushr-long
4424 */
4425 /* binop vAA, vBB, vCC */
4426 FETCH w0, 1 // w0<- CCBB
4427 lsr w3, wINST, #8 // w3<- AA
4428 lsr w2, w0, #8 // w2<- CC
4429 GET_VREG w2, w2 // w2<- vCC (shift count)
4430 and w1, w0, #255 // w1<- BB
4431 GET_VREG_WIDE x1, w1 // x1<- vBB
4432 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004433 asr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004434 GET_INST_OPCODE ip // extract opcode from rINST
4435 SET_VREG_WIDE x0, w3 // vAA<- x0
4436 GOTO_OPCODE ip // jump to next instruction
4437 /* 11-14 instructions */
4438
4439
4440/* ------------------------------ */
4441 .balign 128
4442.L_op_ushr_long: /* 0xa5 */
4443/* File: arm64/op_ushr_long.S */
4444/* File: arm64/shiftWide.S */
4445 /*
4446 * 64-bit shift operation.
4447 *
4448 * For: shl-long, shr-long, ushr-long
4449 */
4450 /* binop vAA, vBB, vCC */
4451 FETCH w0, 1 // w0<- CCBB
4452 lsr w3, wINST, #8 // w3<- AA
4453 lsr w2, w0, #8 // w2<- CC
4454 GET_VREG w2, w2 // w2<- vCC (shift count)
4455 and w1, w0, #255 // w1<- BB
4456 GET_VREG_WIDE x1, w1 // x1<- vBB
4457 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01004458 lsr x0, x1, x2 // Do the shift. Only low 6 bits of x2 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00004459 GET_INST_OPCODE ip // extract opcode from rINST
4460 SET_VREG_WIDE x0, w3 // vAA<- x0
4461 GOTO_OPCODE ip // jump to next instruction
4462 /* 11-14 instructions */
4463
4464
4465/* ------------------------------ */
4466 .balign 128
4467.L_op_add_float: /* 0xa6 */
4468/* File: arm64/op_add_float.S */
4469/* File: arm64/fbinop.S */
4470 /*:
4471 * Generic 32-bit floating-point operation.
4472 *
4473 * For: add-float, sub-float, mul-float, div-float
4474 * form: <op> s0, s0, s1
4475 */
4476 /* floatop vAA, vBB, vCC */
4477 FETCH w0, 1 // r0<- CCBB
4478 lsr w1, w0, #8 // r2<- CC
4479 and w0, w0, #255 // r1<- BB
4480 GET_VREG s1, w1
4481 GET_VREG s0, w0
4482 fadd s0, s0, s1 // s0<- op
4483 lsr w1, wINST, #8 // r1<- AA
4484 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4485 GET_INST_OPCODE ip // extract opcode from rINST
4486 SET_VREG s0, w1
4487 GOTO_OPCODE ip // jump to next instruction
4488
4489
4490/* ------------------------------ */
4491 .balign 128
4492.L_op_sub_float: /* 0xa7 */
4493/* File: arm64/op_sub_float.S */
4494/* File: arm64/fbinop.S */
4495 /*:
4496 * Generic 32-bit floating-point operation.
4497 *
4498 * For: add-float, sub-float, mul-float, div-float
4499 * form: <op> s0, s0, s1
4500 */
4501 /* floatop vAA, vBB, vCC */
4502 FETCH w0, 1 // r0<- CCBB
4503 lsr w1, w0, #8 // r2<- CC
4504 and w0, w0, #255 // r1<- BB
4505 GET_VREG s1, w1
4506 GET_VREG s0, w0
4507 fsub s0, s0, s1 // s0<- op
4508 lsr w1, wINST, #8 // r1<- AA
4509 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4510 GET_INST_OPCODE ip // extract opcode from rINST
4511 SET_VREG s0, w1
4512 GOTO_OPCODE ip // jump to next instruction
4513
4514
4515/* ------------------------------ */
4516 .balign 128
4517.L_op_mul_float: /* 0xa8 */
4518/* File: arm64/op_mul_float.S */
4519/* File: arm64/fbinop.S */
4520 /*:
4521 * Generic 32-bit floating-point operation.
4522 *
4523 * For: add-float, sub-float, mul-float, div-float
4524 * form: <op> s0, s0, s1
4525 */
4526 /* floatop vAA, vBB, vCC */
4527 FETCH w0, 1 // r0<- CCBB
4528 lsr w1, w0, #8 // r2<- CC
4529 and w0, w0, #255 // r1<- BB
4530 GET_VREG s1, w1
4531 GET_VREG s0, w0
4532 fmul s0, s0, s1 // s0<- op
4533 lsr w1, wINST, #8 // r1<- AA
4534 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4535 GET_INST_OPCODE ip // extract opcode from rINST
4536 SET_VREG s0, w1
4537 GOTO_OPCODE ip // jump to next instruction
4538
4539
4540/* ------------------------------ */
4541 .balign 128
4542.L_op_div_float: /* 0xa9 */
4543/* File: arm64/op_div_float.S */
4544/* File: arm64/fbinop.S */
4545 /*:
4546 * Generic 32-bit floating-point operation.
4547 *
4548 * For: add-float, sub-float, mul-float, div-float
4549 * form: <op> s0, s0, s1
4550 */
4551 /* floatop vAA, vBB, vCC */
4552 FETCH w0, 1 // r0<- CCBB
4553 lsr w1, w0, #8 // r2<- CC
4554 and w0, w0, #255 // r1<- BB
4555 GET_VREG s1, w1
4556 GET_VREG s0, w0
4557 fdiv s0, s0, s1 // s0<- op
4558 lsr w1, wINST, #8 // r1<- AA
4559 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4560 GET_INST_OPCODE ip // extract opcode from rINST
4561 SET_VREG s0, w1
4562 GOTO_OPCODE ip // jump to next instruction
4563
4564
4565/* ------------------------------ */
4566 .balign 128
4567.L_op_rem_float: /* 0xaa */
4568/* File: arm64/op_rem_float.S */
4569/* EABI doesn't define a float remainder function, but libm does */
4570/* File: arm64/fbinop.S */
4571 /*:
4572 * Generic 32-bit floating-point operation.
4573 *
4574 * For: add-float, sub-float, mul-float, div-float
4575 * form: <op> s0, s0, s1
4576 */
4577 /* floatop vAA, vBB, vCC */
4578 FETCH w0, 1 // r0<- CCBB
4579 lsr w1, w0, #8 // r2<- CC
4580 and w0, w0, #255 // r1<- BB
4581 GET_VREG s1, w1
4582 GET_VREG s0, w0
4583 bl fmodf // s0<- op
4584 lsr w1, wINST, #8 // r1<- AA
4585 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4586 GET_INST_OPCODE ip // extract opcode from rINST
4587 SET_VREG s0, w1
4588 GOTO_OPCODE ip // jump to next instruction
4589
4590
4591/* ------------------------------ */
4592 .balign 128
4593.L_op_add_double: /* 0xab */
4594/* File: arm64/op_add_double.S */
4595/* File: arm64/binopWide.S */
4596 /*
4597 * Generic 64-bit binary operation. Provide an "instr" line that
4598 * specifies an instruction that performs "result = x1 op x2".
4599 * This could be an ARM instruction or a function call. (If the result
4600 * comes back in a register other than x0, you can override "result".)
4601 *
4602 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4603 * vCC (w1). Useful for integer division and modulus.
4604 *
4605 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4606 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4607 */
4608 /* binop vAA, vBB, vCC */
4609 FETCH w0, 1 // w0<- CCBB
4610 lsr w4, wINST, #8 // w4<- AA
4611 lsr w2, w0, #8 // w2<- CC
4612 and w1, w0, #255 // w1<- BB
4613 GET_VREG_WIDE d2, w2 // w2<- vCC
4614 GET_VREG_WIDE d1, w1 // w1<- vBB
4615 .if 0
4616 cbz d2, common_errDivideByZero // is second operand zero?
4617 .endif
4618 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4619
4620 fadd d0, d1, d2 // d0<- op, w0-w4 changed
4621 GET_INST_OPCODE ip // extract opcode from rINST
4622 SET_VREG_WIDE d0, w4 // vAA<- d0
4623 GOTO_OPCODE ip // jump to next instruction
4624 /* 11-14 instructions */
4625
4626
4627/* ------------------------------ */
4628 .balign 128
4629.L_op_sub_double: /* 0xac */
4630/* File: arm64/op_sub_double.S */
4631/* File: arm64/binopWide.S */
4632 /*
4633 * Generic 64-bit binary operation. Provide an "instr" line that
4634 * specifies an instruction that performs "result = x1 op x2".
4635 * This could be an ARM instruction or a function call. (If the result
4636 * comes back in a register other than x0, you can override "result".)
4637 *
4638 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4639 * vCC (w1). Useful for integer division and modulus.
4640 *
4641 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4642 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4643 */
4644 /* binop vAA, vBB, vCC */
4645 FETCH w0, 1 // w0<- CCBB
4646 lsr w4, wINST, #8 // w4<- AA
4647 lsr w2, w0, #8 // w2<- CC
4648 and w1, w0, #255 // w1<- BB
4649 GET_VREG_WIDE d2, w2 // w2<- vCC
4650 GET_VREG_WIDE d1, w1 // w1<- vBB
4651 .if 0
4652 cbz d2, common_errDivideByZero // is second operand zero?
4653 .endif
4654 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4655
4656 fsub d0, d1, d2 // d0<- op, w0-w4 changed
4657 GET_INST_OPCODE ip // extract opcode from rINST
4658 SET_VREG_WIDE d0, w4 // vAA<- d0
4659 GOTO_OPCODE ip // jump to next instruction
4660 /* 11-14 instructions */
4661
4662
4663/* ------------------------------ */
4664 .balign 128
4665.L_op_mul_double: /* 0xad */
4666/* File: arm64/op_mul_double.S */
4667/* File: arm64/binopWide.S */
4668 /*
4669 * Generic 64-bit binary operation. Provide an "instr" line that
4670 * specifies an instruction that performs "result = x1 op x2".
4671 * This could be an ARM instruction or a function call. (If the result
4672 * comes back in a register other than x0, you can override "result".)
4673 *
4674 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4675 * vCC (w1). Useful for integer division and modulus.
4676 *
4677 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4678 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4679 */
4680 /* binop vAA, vBB, vCC */
4681 FETCH w0, 1 // w0<- CCBB
4682 lsr w4, wINST, #8 // w4<- AA
4683 lsr w2, w0, #8 // w2<- CC
4684 and w1, w0, #255 // w1<- BB
4685 GET_VREG_WIDE d2, w2 // w2<- vCC
4686 GET_VREG_WIDE d1, w1 // w1<- vBB
4687 .if 0
4688 cbz d2, common_errDivideByZero // is second operand zero?
4689 .endif
4690 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4691
4692 fmul d0, d1, d2 // d0<- op, w0-w4 changed
4693 GET_INST_OPCODE ip // extract opcode from rINST
4694 SET_VREG_WIDE d0, w4 // vAA<- d0
4695 GOTO_OPCODE ip // jump to next instruction
4696 /* 11-14 instructions */
4697
4698
4699/* ------------------------------ */
4700 .balign 128
4701.L_op_div_double: /* 0xae */
4702/* File: arm64/op_div_double.S */
4703/* File: arm64/binopWide.S */
4704 /*
4705 * Generic 64-bit binary operation. Provide an "instr" line that
4706 * specifies an instruction that performs "result = x1 op x2".
4707 * This could be an ARM instruction or a function call. (If the result
4708 * comes back in a register other than x0, you can override "result".)
4709 *
4710 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4711 * vCC (w1). Useful for integer division and modulus.
4712 *
4713 * For: add-long, sub-long, mul-long, div-long, rem-long, and-long, or-long,
4714 * xor-long, add-double, sub-double, mul-double, div-double, rem-double
4715 */
4716 /* binop vAA, vBB, vCC */
4717 FETCH w0, 1 // w0<- CCBB
4718 lsr w4, wINST, #8 // w4<- AA
4719 lsr w2, w0, #8 // w2<- CC
4720 and w1, w0, #255 // w1<- BB
4721 GET_VREG_WIDE d2, w2 // w2<- vCC
4722 GET_VREG_WIDE d1, w1 // w1<- vBB
4723 .if 0
4724 cbz d2, common_errDivideByZero // is second operand zero?
4725 .endif
4726 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4727
4728 fdiv d0, d1, d2 // d0<- op, w0-w4 changed
4729 GET_INST_OPCODE ip // extract opcode from rINST
4730 SET_VREG_WIDE d0, w4 // vAA<- d0
4731 GOTO_OPCODE ip // jump to next instruction
4732 /* 11-14 instructions */
4733
4734
4735/* ------------------------------ */
4736 .balign 128
4737.L_op_rem_double: /* 0xaf */
4738/* File: arm64/op_rem_double.S */
4739 /* rem vAA, vBB, vCC */
4740 FETCH w0, 1 // w0<- CCBB
4741 lsr w2, w0, #8 // w2<- CC
4742 and w1, w0, #255 // w1<- BB
4743 GET_VREG_WIDE d1, w2 // d1<- vCC
4744 GET_VREG_WIDE d0, w1 // d0<- vBB
4745 bl fmod
4746 lsr w4, wINST, #8 // w4<- AA
4747 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
4748 GET_INST_OPCODE ip // extract opcode from rINST
4749 SET_VREG_WIDE d0, w4 // vAA<- result
4750 GOTO_OPCODE ip // jump to next instruction
4751 /* 11-14 instructions */
4752
4753/* ------------------------------ */
4754 .balign 128
4755.L_op_add_int_2addr: /* 0xb0 */
4756/* File: arm64/op_add_int_2addr.S */
4757/* File: arm64/binop2addr.S */
4758 /*
4759 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4760 * that specifies an instruction that performs "result = w0 op w1".
4761 * This could be an ARM instruction or a function call. (If the result
4762 * comes back in a register other than w0, you can override "result".)
4763 *
4764 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4765 * vCC (w1). Useful for integer division and modulus.
4766 *
4767 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4768 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4769 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4770 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4771 */
4772 /* binop/2addr vA, vB */
4773 lsr w3, wINST, #12 // w3<- B
4774 ubfx w9, wINST, #8, #4 // w9<- A
4775 GET_VREG w1, w3 // w1<- vB
4776 GET_VREG w0, w9 // w0<- vA
4777 .if 0
4778 cbz w1, common_errDivideByZero
4779 .endif
4780 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4781 // optional op; may set condition codes
4782 add w0, w0, w1 // w0<- op, w0-w3 changed
4783 GET_INST_OPCODE ip // extract opcode from rINST
4784 SET_VREG w0, w9 // vAA<- w0
4785 GOTO_OPCODE ip // jump to next instruction
4786 /* 10-13 instructions */
4787
4788
4789/* ------------------------------ */
4790 .balign 128
4791.L_op_sub_int_2addr: /* 0xb1 */
4792/* File: arm64/op_sub_int_2addr.S */
4793/* File: arm64/binop2addr.S */
4794 /*
4795 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4796 * that specifies an instruction that performs "result = w0 op w1".
4797 * This could be an ARM instruction or a function call. (If the result
4798 * comes back in a register other than w0, you can override "result".)
4799 *
4800 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4801 * vCC (w1). Useful for integer division and modulus.
4802 *
4803 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4804 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4805 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4806 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4807 */
4808 /* binop/2addr vA, vB */
4809 lsr w3, wINST, #12 // w3<- B
4810 ubfx w9, wINST, #8, #4 // w9<- A
4811 GET_VREG w1, w3 // w1<- vB
4812 GET_VREG w0, w9 // w0<- vA
4813 .if 0
4814 cbz w1, common_errDivideByZero
4815 .endif
4816 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4817 // optional op; may set condition codes
4818 sub w0, w0, w1 // w0<- op, w0-w3 changed
4819 GET_INST_OPCODE ip // extract opcode from rINST
4820 SET_VREG w0, w9 // vAA<- w0
4821 GOTO_OPCODE ip // jump to next instruction
4822 /* 10-13 instructions */
4823
4824
4825/* ------------------------------ */
4826 .balign 128
4827.L_op_mul_int_2addr: /* 0xb2 */
4828/* File: arm64/op_mul_int_2addr.S */
4829/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
4830/* File: arm64/binop2addr.S */
4831 /*
4832 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4833 * that specifies an instruction that performs "result = w0 op w1".
4834 * This could be an ARM instruction or a function call. (If the result
4835 * comes back in a register other than w0, you can override "result".)
4836 *
4837 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4838 * vCC (w1). Useful for integer division and modulus.
4839 *
4840 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4841 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4842 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4843 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4844 */
4845 /* binop/2addr vA, vB */
4846 lsr w3, wINST, #12 // w3<- B
4847 ubfx w9, wINST, #8, #4 // w9<- A
4848 GET_VREG w1, w3 // w1<- vB
4849 GET_VREG w0, w9 // w0<- vA
4850 .if 0
4851 cbz w1, common_errDivideByZero
4852 .endif
4853 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4854 // optional op; may set condition codes
4855 mul w0, w1, w0 // w0<- op, w0-w3 changed
4856 GET_INST_OPCODE ip // extract opcode from rINST
4857 SET_VREG w0, w9 // vAA<- w0
4858 GOTO_OPCODE ip // jump to next instruction
4859 /* 10-13 instructions */
4860
4861
4862/* ------------------------------ */
4863 .balign 128
4864.L_op_div_int_2addr: /* 0xb3 */
4865/* File: arm64/op_div_int_2addr.S */
4866/* File: arm64/binop2addr.S */
4867 /*
4868 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4869 * that specifies an instruction that performs "result = w0 op w1".
4870 * This could be an ARM instruction or a function call. (If the result
4871 * comes back in a register other than w0, you can override "result".)
4872 *
4873 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4874 * vCC (w1). Useful for integer division and modulus.
4875 *
4876 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4877 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4878 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4879 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4880 */
4881 /* binop/2addr vA, vB */
4882 lsr w3, wINST, #12 // w3<- B
4883 ubfx w9, wINST, #8, #4 // w9<- A
4884 GET_VREG w1, w3 // w1<- vB
4885 GET_VREG w0, w9 // w0<- vA
4886 .if 1
4887 cbz w1, common_errDivideByZero
4888 .endif
4889 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4890 // optional op; may set condition codes
4891 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
4892 GET_INST_OPCODE ip // extract opcode from rINST
4893 SET_VREG w0, w9 // vAA<- w0
4894 GOTO_OPCODE ip // jump to next instruction
4895 /* 10-13 instructions */
4896
4897
4898/* ------------------------------ */
4899 .balign 128
4900.L_op_rem_int_2addr: /* 0xb4 */
4901/* File: arm64/op_rem_int_2addr.S */
4902/* File: arm64/binop2addr.S */
4903 /*
4904 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4905 * that specifies an instruction that performs "result = w0 op w1".
4906 * This could be an ARM instruction or a function call. (If the result
4907 * comes back in a register other than w0, you can override "result".)
4908 *
4909 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4910 * vCC (w1). Useful for integer division and modulus.
4911 *
4912 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4913 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4914 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4915 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4916 */
4917 /* binop/2addr vA, vB */
4918 lsr w3, wINST, #12 // w3<- B
4919 ubfx w9, wINST, #8, #4 // w9<- A
4920 GET_VREG w1, w3 // w1<- vB
4921 GET_VREG w0, w9 // w0<- vA
4922 .if 1
4923 cbz w1, common_errDivideByZero
4924 .endif
4925 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4926 sdiv w2, w0, w1 // optional op; may set condition codes
4927 msub w0, w2, w1, w0 // w0<- op, w0-w3 changed
4928 GET_INST_OPCODE ip // extract opcode from rINST
4929 SET_VREG w0, w9 // vAA<- w0
4930 GOTO_OPCODE ip // jump to next instruction
4931 /* 10-13 instructions */
4932
4933
4934/* ------------------------------ */
4935 .balign 128
4936.L_op_and_int_2addr: /* 0xb5 */
4937/* File: arm64/op_and_int_2addr.S */
4938/* File: arm64/binop2addr.S */
4939 /*
4940 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4941 * that specifies an instruction that performs "result = w0 op w1".
4942 * This could be an ARM instruction or a function call. (If the result
4943 * comes back in a register other than w0, you can override "result".)
4944 *
4945 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4946 * vCC (w1). Useful for integer division and modulus.
4947 *
4948 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4949 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4950 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4951 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4952 */
4953 /* binop/2addr vA, vB */
4954 lsr w3, wINST, #12 // w3<- B
4955 ubfx w9, wINST, #8, #4 // w9<- A
4956 GET_VREG w1, w3 // w1<- vB
4957 GET_VREG w0, w9 // w0<- vA
4958 .if 0
4959 cbz w1, common_errDivideByZero
4960 .endif
4961 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4962 // optional op; may set condition codes
4963 and w0, w0, w1 // w0<- op, w0-w3 changed
4964 GET_INST_OPCODE ip // extract opcode from rINST
4965 SET_VREG w0, w9 // vAA<- w0
4966 GOTO_OPCODE ip // jump to next instruction
4967 /* 10-13 instructions */
4968
4969
4970/* ------------------------------ */
4971 .balign 128
4972.L_op_or_int_2addr: /* 0xb6 */
4973/* File: arm64/op_or_int_2addr.S */
4974/* File: arm64/binop2addr.S */
4975 /*
4976 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
4977 * that specifies an instruction that performs "result = w0 op w1".
4978 * This could be an ARM instruction or a function call. (If the result
4979 * comes back in a register other than w0, you can override "result".)
4980 *
4981 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4982 * vCC (w1). Useful for integer division and modulus.
4983 *
4984 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
4985 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
4986 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
4987 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
4988 */
4989 /* binop/2addr vA, vB */
4990 lsr w3, wINST, #12 // w3<- B
4991 ubfx w9, wINST, #8, #4 // w9<- A
4992 GET_VREG w1, w3 // w1<- vB
4993 GET_VREG w0, w9 // w0<- vA
4994 .if 0
4995 cbz w1, common_errDivideByZero
4996 .endif
4997 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
4998 // optional op; may set condition codes
4999 orr w0, w0, w1 // w0<- op, w0-w3 changed
5000 GET_INST_OPCODE ip // extract opcode from rINST
5001 SET_VREG w0, w9 // vAA<- w0
5002 GOTO_OPCODE ip // jump to next instruction
5003 /* 10-13 instructions */
5004
5005
5006/* ------------------------------ */
5007 .balign 128
5008.L_op_xor_int_2addr: /* 0xb7 */
5009/* File: arm64/op_xor_int_2addr.S */
5010/* File: arm64/binop2addr.S */
5011 /*
5012 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5013 * that specifies an instruction that performs "result = w0 op w1".
5014 * This could be an ARM instruction or a function call. (If the result
5015 * comes back in a register other than w0, you can override "result".)
5016 *
5017 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5018 * vCC (w1). Useful for integer division and modulus.
5019 *
5020 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5021 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5022 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5023 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5024 */
5025 /* binop/2addr vA, vB */
5026 lsr w3, wINST, #12 // w3<- B
5027 ubfx w9, wINST, #8, #4 // w9<- A
5028 GET_VREG w1, w3 // w1<- vB
5029 GET_VREG w0, w9 // w0<- vA
5030 .if 0
5031 cbz w1, common_errDivideByZero
5032 .endif
5033 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5034 // optional op; may set condition codes
5035 eor w0, w0, w1 // w0<- op, w0-w3 changed
5036 GET_INST_OPCODE ip // extract opcode from rINST
5037 SET_VREG w0, w9 // vAA<- w0
5038 GOTO_OPCODE ip // jump to next instruction
5039 /* 10-13 instructions */
5040
5041
5042/* ------------------------------ */
5043 .balign 128
5044.L_op_shl_int_2addr: /* 0xb8 */
5045/* File: arm64/op_shl_int_2addr.S */
5046/* File: arm64/binop2addr.S */
5047 /*
5048 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5049 * that specifies an instruction that performs "result = w0 op w1".
5050 * This could be an ARM instruction or a function call. (If the result
5051 * comes back in a register other than w0, you can override "result".)
5052 *
5053 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5054 * vCC (w1). Useful for integer division and modulus.
5055 *
5056 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5057 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5058 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5059 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5060 */
5061 /* binop/2addr vA, vB */
5062 lsr w3, wINST, #12 // w3<- B
5063 ubfx w9, wINST, #8, #4 // w9<- A
5064 GET_VREG w1, w3 // w1<- vB
5065 GET_VREG w0, w9 // w0<- vA
5066 .if 0
5067 cbz w1, common_errDivideByZero
5068 .endif
5069 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005070 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005071 lsl w0, w0, w1 // w0<- op, w0-w3 changed
5072 GET_INST_OPCODE ip // extract opcode from rINST
5073 SET_VREG w0, w9 // vAA<- w0
5074 GOTO_OPCODE ip // jump to next instruction
5075 /* 10-13 instructions */
5076
5077
5078/* ------------------------------ */
5079 .balign 128
5080.L_op_shr_int_2addr: /* 0xb9 */
5081/* File: arm64/op_shr_int_2addr.S */
5082/* File: arm64/binop2addr.S */
5083 /*
5084 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5085 * that specifies an instruction that performs "result = w0 op w1".
5086 * This could be an ARM instruction or a function call. (If the result
5087 * comes back in a register other than w0, you can override "result".)
5088 *
5089 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5090 * vCC (w1). Useful for integer division and modulus.
5091 *
5092 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5093 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5094 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5095 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5096 */
5097 /* binop/2addr vA, vB */
5098 lsr w3, wINST, #12 // w3<- B
5099 ubfx w9, wINST, #8, #4 // w9<- A
5100 GET_VREG w1, w3 // w1<- vB
5101 GET_VREG w0, w9 // w0<- vA
5102 .if 0
5103 cbz w1, common_errDivideByZero
5104 .endif
5105 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005106 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005107 asr w0, w0, w1 // w0<- op, w0-w3 changed
5108 GET_INST_OPCODE ip // extract opcode from rINST
5109 SET_VREG w0, w9 // vAA<- w0
5110 GOTO_OPCODE ip // jump to next instruction
5111 /* 10-13 instructions */
5112
5113
5114/* ------------------------------ */
5115 .balign 128
5116.L_op_ushr_int_2addr: /* 0xba */
5117/* File: arm64/op_ushr_int_2addr.S */
5118/* File: arm64/binop2addr.S */
5119 /*
5120 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5121 * that specifies an instruction that performs "result = w0 op w1".
5122 * This could be an ARM instruction or a function call. (If the result
5123 * comes back in a register other than w0, you can override "result".)
5124 *
5125 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5126 * vCC (w1). Useful for integer division and modulus.
5127 *
5128 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5129 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5130 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5131 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5132 */
5133 /* binop/2addr vA, vB */
5134 lsr w3, wINST, #12 // w3<- B
5135 ubfx w9, wINST, #8, #4 // w9<- A
5136 GET_VREG w1, w3 // w1<- vB
5137 GET_VREG w0, w9 // w0<- vA
5138 .if 0
5139 cbz w1, common_errDivideByZero
5140 .endif
5141 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005142 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005143 lsr w0, w0, w1 // w0<- op, w0-w3 changed
5144 GET_INST_OPCODE ip // extract opcode from rINST
5145 SET_VREG w0, w9 // vAA<- w0
5146 GOTO_OPCODE ip // jump to next instruction
5147 /* 10-13 instructions */
5148
5149
5150/* ------------------------------ */
5151 .balign 128
5152.L_op_add_long_2addr: /* 0xbb */
5153/* File: arm64/op_add_long_2addr.S */
5154/* File: arm64/binopWide2addr.S */
5155 /*
5156 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5157 * that specifies an instruction that performs "x0 = x0 op x1".
5158 * This must not be a function call, as we keep w2 live across it.
5159 *
5160 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5161 * vCC (w1). Useful for integer division and modulus.
5162 *
5163 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5164 * and-long/2addr, or-long/2addr, xor-long/2addr,
5165 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5166 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5167 */
5168 /* binop/2addr vA, vB */
5169 lsr w1, wINST, #12 // w1<- B
5170 ubfx w2, wINST, #8, #4 // w2<- A
5171 GET_VREG_WIDE x1, w1 // x1<- vB
5172 GET_VREG_WIDE x0, w2 // x0<- vA
5173 .if 0
5174 cbz x1, common_errDivideByZero
5175 .endif
5176 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5177
5178 add x0, x0, x1 // result<- op
5179 GET_INST_OPCODE ip // extract opcode from rINST
5180 SET_VREG_WIDE x0, w2 // vAA<- result
5181 GOTO_OPCODE ip // jump to next instruction
5182 /* 10-13 instructions */
5183
5184
5185/* ------------------------------ */
5186 .balign 128
5187.L_op_sub_long_2addr: /* 0xbc */
5188/* File: arm64/op_sub_long_2addr.S */
5189/* File: arm64/binopWide2addr.S */
5190 /*
5191 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5192 * that specifies an instruction that performs "x0 = x0 op x1".
5193 * This must not be a function call, as we keep w2 live across it.
5194 *
5195 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5196 * vCC (w1). Useful for integer division and modulus.
5197 *
5198 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5199 * and-long/2addr, or-long/2addr, xor-long/2addr,
5200 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5201 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5202 */
5203 /* binop/2addr vA, vB */
5204 lsr w1, wINST, #12 // w1<- B
5205 ubfx w2, wINST, #8, #4 // w2<- A
5206 GET_VREG_WIDE x1, w1 // x1<- vB
5207 GET_VREG_WIDE x0, w2 // x0<- vA
5208 .if 0
5209 cbz x1, common_errDivideByZero
5210 .endif
5211 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5212
5213 sub x0, x0, x1 // result<- op
5214 GET_INST_OPCODE ip // extract opcode from rINST
5215 SET_VREG_WIDE x0, w2 // vAA<- result
5216 GOTO_OPCODE ip // jump to next instruction
5217 /* 10-13 instructions */
5218
5219
5220/* ------------------------------ */
5221 .balign 128
5222.L_op_mul_long_2addr: /* 0xbd */
5223/* File: arm64/op_mul_long_2addr.S */
5224/* File: arm64/binopWide2addr.S */
5225 /*
5226 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5227 * that specifies an instruction that performs "x0 = x0 op x1".
5228 * This must not be a function call, as we keep w2 live across it.
5229 *
5230 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5231 * vCC (w1). Useful for integer division and modulus.
5232 *
5233 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5234 * and-long/2addr, or-long/2addr, xor-long/2addr,
5235 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5236 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5237 */
5238 /* binop/2addr vA, vB */
5239 lsr w1, wINST, #12 // w1<- B
5240 ubfx w2, wINST, #8, #4 // w2<- A
5241 GET_VREG_WIDE x1, w1 // x1<- vB
5242 GET_VREG_WIDE x0, w2 // x0<- vA
5243 .if 0
5244 cbz x1, common_errDivideByZero
5245 .endif
5246 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5247
5248 mul x0, x0, x1 // result<- op
5249 GET_INST_OPCODE ip // extract opcode from rINST
5250 SET_VREG_WIDE x0, w2 // vAA<- result
5251 GOTO_OPCODE ip // jump to next instruction
5252 /* 10-13 instructions */
5253
5254
5255/* ------------------------------ */
5256 .balign 128
5257.L_op_div_long_2addr: /* 0xbe */
5258/* File: arm64/op_div_long_2addr.S */
5259/* File: arm64/binopWide2addr.S */
5260 /*
5261 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5262 * that specifies an instruction that performs "x0 = x0 op x1".
5263 * This must not be a function call, as we keep w2 live across it.
5264 *
5265 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5266 * vCC (w1). Useful for integer division and modulus.
5267 *
5268 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5269 * and-long/2addr, or-long/2addr, xor-long/2addr,
5270 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5271 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5272 */
5273 /* binop/2addr vA, vB */
5274 lsr w1, wINST, #12 // w1<- B
5275 ubfx w2, wINST, #8, #4 // w2<- A
5276 GET_VREG_WIDE x1, w1 // x1<- vB
5277 GET_VREG_WIDE x0, w2 // x0<- vA
5278 .if 1
5279 cbz x1, common_errDivideByZero
5280 .endif
5281 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5282
5283 sdiv x0, x0, x1 // result<- op
5284 GET_INST_OPCODE ip // extract opcode from rINST
5285 SET_VREG_WIDE x0, w2 // vAA<- result
5286 GOTO_OPCODE ip // jump to next instruction
5287 /* 10-13 instructions */
5288
5289
5290/* ------------------------------ */
5291 .balign 128
5292.L_op_rem_long_2addr: /* 0xbf */
5293/* File: arm64/op_rem_long_2addr.S */
5294/* File: arm64/binopWide2addr.S */
5295 /*
5296 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5297 * that specifies an instruction that performs "x0 = x0 op x1".
5298 * This must not be a function call, as we keep w2 live across it.
5299 *
5300 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5301 * vCC (w1). Useful for integer division and modulus.
5302 *
5303 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5304 * and-long/2addr, or-long/2addr, xor-long/2addr,
5305 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5306 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5307 */
5308 /* binop/2addr vA, vB */
5309 lsr w1, wINST, #12 // w1<- B
5310 ubfx w2, wINST, #8, #4 // w2<- A
5311 GET_VREG_WIDE x1, w1 // x1<- vB
5312 GET_VREG_WIDE x0, w2 // x0<- vA
5313 .if 1
5314 cbz x1, common_errDivideByZero
5315 .endif
5316 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5317 sdiv x3, x0, x1
5318 msub x0, x3, x1, x0 // result<- op
5319 GET_INST_OPCODE ip // extract opcode from rINST
5320 SET_VREG_WIDE x0, w2 // vAA<- result
5321 GOTO_OPCODE ip // jump to next instruction
5322 /* 10-13 instructions */
5323
5324
5325/* ------------------------------ */
5326 .balign 128
5327.L_op_and_long_2addr: /* 0xc0 */
5328/* File: arm64/op_and_long_2addr.S */
5329/* File: arm64/binopWide2addr.S */
5330 /*
5331 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5332 * that specifies an instruction that performs "x0 = x0 op x1".
5333 * This must not be a function call, as we keep w2 live across it.
5334 *
5335 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5336 * vCC (w1). Useful for integer division and modulus.
5337 *
5338 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5339 * and-long/2addr, or-long/2addr, xor-long/2addr,
5340 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5341 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5342 */
5343 /* binop/2addr vA, vB */
5344 lsr w1, wINST, #12 // w1<- B
5345 ubfx w2, wINST, #8, #4 // w2<- A
5346 GET_VREG_WIDE x1, w1 // x1<- vB
5347 GET_VREG_WIDE x0, w2 // x0<- vA
5348 .if 0
5349 cbz x1, common_errDivideByZero
5350 .endif
5351 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5352
5353 and x0, x0, x1 // result<- op
5354 GET_INST_OPCODE ip // extract opcode from rINST
5355 SET_VREG_WIDE x0, w2 // vAA<- result
5356 GOTO_OPCODE ip // jump to next instruction
5357 /* 10-13 instructions */
5358
5359
5360/* ------------------------------ */
5361 .balign 128
5362.L_op_or_long_2addr: /* 0xc1 */
5363/* File: arm64/op_or_long_2addr.S */
5364/* File: arm64/binopWide2addr.S */
5365 /*
5366 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5367 * that specifies an instruction that performs "x0 = x0 op x1".
5368 * This must not be a function call, as we keep w2 live across it.
5369 *
5370 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5371 * vCC (w1). Useful for integer division and modulus.
5372 *
5373 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5374 * and-long/2addr, or-long/2addr, xor-long/2addr,
5375 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5376 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5377 */
5378 /* binop/2addr vA, vB */
5379 lsr w1, wINST, #12 // w1<- B
5380 ubfx w2, wINST, #8, #4 // w2<- A
5381 GET_VREG_WIDE x1, w1 // x1<- vB
5382 GET_VREG_WIDE x0, w2 // x0<- vA
5383 .if 0
5384 cbz x1, common_errDivideByZero
5385 .endif
5386 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5387
5388 orr x0, x0, x1 // result<- op
5389 GET_INST_OPCODE ip // extract opcode from rINST
5390 SET_VREG_WIDE x0, w2 // vAA<- result
5391 GOTO_OPCODE ip // jump to next instruction
5392 /* 10-13 instructions */
5393
5394
5395/* ------------------------------ */
5396 .balign 128
5397.L_op_xor_long_2addr: /* 0xc2 */
5398/* File: arm64/op_xor_long_2addr.S */
5399/* File: arm64/binopWide2addr.S */
5400 /*
5401 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5402 * that specifies an instruction that performs "x0 = x0 op x1".
5403 * This must not be a function call, as we keep w2 live across it.
5404 *
5405 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5406 * vCC (w1). Useful for integer division and modulus.
5407 *
5408 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5409 * and-long/2addr, or-long/2addr, xor-long/2addr,
5410 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5411 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5412 */
5413 /* binop/2addr vA, vB */
5414 lsr w1, wINST, #12 // w1<- B
5415 ubfx w2, wINST, #8, #4 // w2<- A
5416 GET_VREG_WIDE x1, w1 // x1<- vB
5417 GET_VREG_WIDE x0, w2 // x0<- vA
5418 .if 0
5419 cbz x1, common_errDivideByZero
5420 .endif
5421 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5422
5423 eor x0, x0, x1 // result<- op
5424 GET_INST_OPCODE ip // extract opcode from rINST
5425 SET_VREG_WIDE x0, w2 // vAA<- result
5426 GOTO_OPCODE ip // jump to next instruction
5427 /* 10-13 instructions */
5428
5429
5430/* ------------------------------ */
5431 .balign 128
5432.L_op_shl_long_2addr: /* 0xc3 */
5433/* File: arm64/op_shl_long_2addr.S */
5434/* File: arm64/shiftWide2addr.S */
5435 /*
5436 * Generic 64-bit shift operation.
5437 */
5438 /* binop/2addr vA, vB */
5439 lsr w1, wINST, #12 // w1<- B
5440 ubfx w2, wINST, #8, #4 // w2<- A
5441 GET_VREG w1, w1 // x1<- vB
5442 GET_VREG_WIDE x0, w2 // x0<- vA
5443 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005444 lsl x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005445 GET_INST_OPCODE ip // extract opcode from rINST
5446 SET_VREG_WIDE x0, w2 // vAA<- result
5447 GOTO_OPCODE ip // jump to next instruction
5448 /* 10-13 instructions */
5449
5450
5451/* ------------------------------ */
5452 .balign 128
5453.L_op_shr_long_2addr: /* 0xc4 */
5454/* File: arm64/op_shr_long_2addr.S */
5455/* File: arm64/shiftWide2addr.S */
5456 /*
5457 * Generic 64-bit shift operation.
5458 */
5459 /* binop/2addr vA, vB */
5460 lsr w1, wINST, #12 // w1<- B
5461 ubfx w2, wINST, #8, #4 // w2<- A
5462 GET_VREG w1, w1 // x1<- vB
5463 GET_VREG_WIDE x0, w2 // x0<- vA
5464 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005465 asr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005466 GET_INST_OPCODE ip // extract opcode from rINST
5467 SET_VREG_WIDE x0, w2 // vAA<- result
5468 GOTO_OPCODE ip // jump to next instruction
5469 /* 10-13 instructions */
5470
5471
5472/* ------------------------------ */
5473 .balign 128
5474.L_op_ushr_long_2addr: /* 0xc5 */
5475/* File: arm64/op_ushr_long_2addr.S */
5476/* File: arm64/shiftWide2addr.S */
5477 /*
5478 * Generic 64-bit shift operation.
5479 */
5480 /* binop/2addr vA, vB */
5481 lsr w1, wINST, #12 // w1<- B
5482 ubfx w2, wINST, #8, #4 // w2<- A
5483 GET_VREG w1, w1 // x1<- vB
5484 GET_VREG_WIDE x0, w2 // x0<- vA
5485 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01005486 lsr x0, x0, x1 // Do the shift. Only low 6 bits of x1 are used.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005487 GET_INST_OPCODE ip // extract opcode from rINST
5488 SET_VREG_WIDE x0, w2 // vAA<- result
5489 GOTO_OPCODE ip // jump to next instruction
5490 /* 10-13 instructions */
5491
5492
5493/* ------------------------------ */
5494 .balign 128
5495.L_op_add_float_2addr: /* 0xc6 */
5496/* File: arm64/op_add_float_2addr.S */
5497/* File: arm64/fbinop2addr.S */
5498 /*
5499 * Generic 32-bit floating point "/2addr" binary operation. Provide
5500 * an "instr" line that specifies an instruction that performs
5501 * "s2 = s0 op s1".
5502 *
5503 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5504 */
5505 /* binop/2addr vA, vB */
5506 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005507 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005508 GET_VREG s1, w3
5509 GET_VREG s0, w9
5510 fadd s2, s0, s1 // s2<- op
5511 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5512 GET_INST_OPCODE ip // extract opcode from rINST
5513 SET_VREG s2, w9
5514 GOTO_OPCODE ip // jump to next instruction
5515
5516
5517/* ------------------------------ */
5518 .balign 128
5519.L_op_sub_float_2addr: /* 0xc7 */
5520/* File: arm64/op_sub_float_2addr.S */
5521/* File: arm64/fbinop2addr.S */
5522 /*
5523 * Generic 32-bit floating point "/2addr" binary operation. Provide
5524 * an "instr" line that specifies an instruction that performs
5525 * "s2 = s0 op s1".
5526 *
5527 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5528 */
5529 /* binop/2addr vA, vB */
5530 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005531 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005532 GET_VREG s1, w3
5533 GET_VREG s0, w9
5534 fsub s2, s0, s1 // s2<- op
5535 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5536 GET_INST_OPCODE ip // extract opcode from rINST
5537 SET_VREG s2, w9
5538 GOTO_OPCODE ip // jump to next instruction
5539
5540
5541/* ------------------------------ */
5542 .balign 128
5543.L_op_mul_float_2addr: /* 0xc8 */
5544/* File: arm64/op_mul_float_2addr.S */
5545/* File: arm64/fbinop2addr.S */
5546 /*
5547 * Generic 32-bit floating point "/2addr" binary operation. Provide
5548 * an "instr" line that specifies an instruction that performs
5549 * "s2 = s0 op s1".
5550 *
5551 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5552 */
5553 /* binop/2addr vA, vB */
5554 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005555 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005556 GET_VREG s1, w3
5557 GET_VREG s0, w9
5558 fmul s2, s0, s1 // s2<- op
5559 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5560 GET_INST_OPCODE ip // extract opcode from rINST
5561 SET_VREG s2, w9
5562 GOTO_OPCODE ip // jump to next instruction
5563
5564
5565/* ------------------------------ */
5566 .balign 128
5567.L_op_div_float_2addr: /* 0xc9 */
5568/* File: arm64/op_div_float_2addr.S */
5569/* File: arm64/fbinop2addr.S */
5570 /*
5571 * Generic 32-bit floating point "/2addr" binary operation. Provide
5572 * an "instr" line that specifies an instruction that performs
5573 * "s2 = s0 op s1".
5574 *
5575 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5576 */
5577 /* binop/2addr vA, vB */
5578 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005579 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005580 GET_VREG s1, w3
5581 GET_VREG s0, w9
5582 fdiv s2, s0, s1 // s2<- op
5583 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5584 GET_INST_OPCODE ip // extract opcode from rINST
5585 SET_VREG s2, w9
5586 GOTO_OPCODE ip // jump to next instruction
5587
5588
5589/* ------------------------------ */
5590 .balign 128
5591.L_op_rem_float_2addr: /* 0xca */
5592/* File: arm64/op_rem_float_2addr.S */
5593 /* rem vA, vB */
5594 lsr w3, wINST, #12 // w3<- B
Vladimir Markoe6220222016-07-20 14:25:30 +01005595 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005596 GET_VREG s1, w3
5597 GET_VREG s0, w9
5598 bl fmodf
Vladimir Markoe6220222016-07-20 14:25:30 +01005599 ubfx w9, wINST, #8, #4 // w9<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005600 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5601 GET_INST_OPCODE ip // extract opcode from rINST
5602 SET_VREG s0, w9
5603 GOTO_OPCODE ip // jump to next instruction
5604
5605/* ------------------------------ */
5606 .balign 128
5607.L_op_add_double_2addr: /* 0xcb */
5608/* File: arm64/op_add_double_2addr.S */
5609/* File: arm64/binopWide2addr.S */
5610 /*
5611 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5612 * that specifies an instruction that performs "x0 = x0 op x1".
5613 * This must not be a function call, as we keep w2 live across it.
5614 *
5615 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5616 * vCC (w1). Useful for integer division and modulus.
5617 *
5618 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5619 * and-long/2addr, or-long/2addr, xor-long/2addr,
5620 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5621 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5622 */
5623 /* binop/2addr vA, vB */
5624 lsr w1, wINST, #12 // w1<- B
5625 ubfx w2, wINST, #8, #4 // w2<- A
5626 GET_VREG_WIDE d1, w1 // x1<- vB
5627 GET_VREG_WIDE d0, w2 // x0<- vA
5628 .if 0
5629 cbz d1, common_errDivideByZero
5630 .endif
5631 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5632
5633 fadd d0, d0, d1 // result<- op
5634 GET_INST_OPCODE ip // extract opcode from rINST
5635 SET_VREG_WIDE d0, w2 // vAA<- result
5636 GOTO_OPCODE ip // jump to next instruction
5637 /* 10-13 instructions */
5638
5639
5640/* ------------------------------ */
5641 .balign 128
5642.L_op_sub_double_2addr: /* 0xcc */
5643/* File: arm64/op_sub_double_2addr.S */
5644/* File: arm64/binopWide2addr.S */
5645 /*
5646 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5647 * that specifies an instruction that performs "x0 = x0 op x1".
5648 * This must not be a function call, as we keep w2 live across it.
5649 *
5650 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5651 * vCC (w1). Useful for integer division and modulus.
5652 *
5653 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5654 * and-long/2addr, or-long/2addr, xor-long/2addr,
5655 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5656 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5657 */
5658 /* binop/2addr vA, vB */
5659 lsr w1, wINST, #12 // w1<- B
5660 ubfx w2, wINST, #8, #4 // w2<- A
5661 GET_VREG_WIDE d1, w1 // x1<- vB
5662 GET_VREG_WIDE d0, w2 // x0<- vA
5663 .if 0
5664 cbz d1, common_errDivideByZero
5665 .endif
5666 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5667
5668 fsub d0, d0, d1 // result<- op
5669 GET_INST_OPCODE ip // extract opcode from rINST
5670 SET_VREG_WIDE d0, w2 // vAA<- result
5671 GOTO_OPCODE ip // jump to next instruction
5672 /* 10-13 instructions */
5673
5674
5675/* ------------------------------ */
5676 .balign 128
5677.L_op_mul_double_2addr: /* 0xcd */
5678/* File: arm64/op_mul_double_2addr.S */
5679/* File: arm64/binopWide2addr.S */
5680 /*
5681 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5682 * that specifies an instruction that performs "x0 = x0 op x1".
5683 * This must not be a function call, as we keep w2 live across it.
5684 *
5685 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5686 * vCC (w1). Useful for integer division and modulus.
5687 *
5688 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5689 * and-long/2addr, or-long/2addr, xor-long/2addr,
5690 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5691 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5692 */
5693 /* binop/2addr vA, vB */
5694 lsr w1, wINST, #12 // w1<- B
5695 ubfx w2, wINST, #8, #4 // w2<- A
5696 GET_VREG_WIDE d1, w1 // x1<- vB
5697 GET_VREG_WIDE d0, w2 // x0<- vA
5698 .if 0
5699 cbz d1, common_errDivideByZero
5700 .endif
5701 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5702
5703 fmul d0, d0, d1 // result<- op
5704 GET_INST_OPCODE ip // extract opcode from rINST
5705 SET_VREG_WIDE d0, w2 // vAA<- result
5706 GOTO_OPCODE ip // jump to next instruction
5707 /* 10-13 instructions */
5708
5709
5710/* ------------------------------ */
5711 .balign 128
5712.L_op_div_double_2addr: /* 0xce */
5713/* File: arm64/op_div_double_2addr.S */
5714/* File: arm64/binopWide2addr.S */
5715 /*
5716 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5717 * that specifies an instruction that performs "x0 = x0 op x1".
5718 * This must not be a function call, as we keep w2 live across it.
5719 *
5720 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5721 * vCC (w1). Useful for integer division and modulus.
5722 *
5723 * For: add-long/2addr, sub-long/2addr, mul-long/2addr, div-long/2addr,
5724 * and-long/2addr, or-long/2addr, xor-long/2addr,
5725 * shl-long/2addr, shr-long/2addr, ushr-long/2addr, add-double/2addr,
5726 * sub-double/2addr, mul-double/2addr, div-double/2addr, rem-double/2addr
5727 */
5728 /* binop/2addr vA, vB */
5729 lsr w1, wINST, #12 // w1<- B
5730 ubfx w2, wINST, #8, #4 // w2<- A
5731 GET_VREG_WIDE d1, w1 // x1<- vB
5732 GET_VREG_WIDE d0, w2 // x0<- vA
5733 .if 0
5734 cbz d1, common_errDivideByZero
5735 .endif
5736 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
5737
5738 fdiv d0, d0, d1 // result<- op
5739 GET_INST_OPCODE ip // extract opcode from rINST
5740 SET_VREG_WIDE d0, w2 // vAA<- result
5741 GOTO_OPCODE ip // jump to next instruction
5742 /* 10-13 instructions */
5743
5744
5745/* ------------------------------ */
5746 .balign 128
5747.L_op_rem_double_2addr: /* 0xcf */
5748/* File: arm64/op_rem_double_2addr.S */
5749 /* rem vA, vB */
5750 lsr w1, wINST, #12 // w1<- B
5751 ubfx w2, wINST, #8, #4 // w2<- A
5752 GET_VREG_WIDE d1, w1 // d1<- vB
5753 GET_VREG_WIDE d0, w2 // d0<- vA
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005754 bl fmod
5755 ubfx w2, wINST, #8, #4 // w2<- A (need to reload - killed across call)
buzbee908c0b22016-03-16 14:39:50 -07005756 FETCH_ADVANCE_INST 1 // advance rPC, load rINST
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00005757 GET_INST_OPCODE ip // extract opcode from rINST
5758 SET_VREG_WIDE d0, w2 // vAA<- result
5759 GOTO_OPCODE ip // jump to next instruction
5760 /* 10-13 instructions */
5761
5762/* ------------------------------ */
5763 .balign 128
5764.L_op_add_int_lit16: /* 0xd0 */
5765/* File: arm64/op_add_int_lit16.S */
5766/* File: arm64/binopLit16.S */
5767 /*
5768 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5769 * that specifies an instruction that performs "result = w0 op w1".
5770 * This could be an ARM instruction or a function call. (If the result
5771 * comes back in a register other than w0, you can override "result".)
5772 *
5773 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5774 * vCC (w1). Useful for integer division and modulus.
5775 *
5776 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5777 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5778 */
5779 /* binop/lit16 vA, vB, #+CCCC */
5780 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5781 lsr w2, wINST, #12 // w2<- B
5782 ubfx w9, wINST, #8, #4 // w9<- A
5783 GET_VREG w0, w2 // w0<- vB
5784 .if 0
5785 cbz w1, common_errDivideByZero
5786 .endif
5787 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5788
5789 add w0, w0, w1 // w0<- op, w0-w3 changed
5790 GET_INST_OPCODE ip // extract opcode from rINST
5791 SET_VREG w0, w9 // vAA<- w0
5792 GOTO_OPCODE ip // jump to next instruction
5793 /* 10-13 instructions */
5794
5795
5796/* ------------------------------ */
5797 .balign 128
5798.L_op_rsub_int: /* 0xd1 */
5799/* File: arm64/op_rsub_int.S */
5800/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
5801/* File: arm64/binopLit16.S */
5802 /*
5803 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5804 * that specifies an instruction that performs "result = w0 op w1".
5805 * This could be an ARM instruction or a function call. (If the result
5806 * comes back in a register other than w0, you can override "result".)
5807 *
5808 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5809 * vCC (w1). Useful for integer division and modulus.
5810 *
5811 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5812 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5813 */
5814 /* binop/lit16 vA, vB, #+CCCC */
5815 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5816 lsr w2, wINST, #12 // w2<- B
5817 ubfx w9, wINST, #8, #4 // w9<- A
5818 GET_VREG w0, w2 // w0<- vB
5819 .if 0
5820 cbz w1, common_errDivideByZero
5821 .endif
5822 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5823
5824 sub w0, w1, w0 // w0<- op, w0-w3 changed
5825 GET_INST_OPCODE ip // extract opcode from rINST
5826 SET_VREG w0, w9 // vAA<- w0
5827 GOTO_OPCODE ip // jump to next instruction
5828 /* 10-13 instructions */
5829
5830
5831/* ------------------------------ */
5832 .balign 128
5833.L_op_mul_int_lit16: /* 0xd2 */
5834/* File: arm64/op_mul_int_lit16.S */
5835/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
5836/* File: arm64/binopLit16.S */
5837 /*
5838 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5839 * that specifies an instruction that performs "result = w0 op w1".
5840 * This could be an ARM instruction or a function call. (If the result
5841 * comes back in a register other than w0, you can override "result".)
5842 *
5843 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5844 * vCC (w1). Useful for integer division and modulus.
5845 *
5846 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5847 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5848 */
5849 /* binop/lit16 vA, vB, #+CCCC */
5850 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5851 lsr w2, wINST, #12 // w2<- B
5852 ubfx w9, wINST, #8, #4 // w9<- A
5853 GET_VREG w0, w2 // w0<- vB
5854 .if 0
5855 cbz w1, common_errDivideByZero
5856 .endif
5857 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5858
5859 mul w0, w1, w0 // w0<- op, w0-w3 changed
5860 GET_INST_OPCODE ip // extract opcode from rINST
5861 SET_VREG w0, w9 // vAA<- w0
5862 GOTO_OPCODE ip // jump to next instruction
5863 /* 10-13 instructions */
5864
5865
5866/* ------------------------------ */
5867 .balign 128
5868.L_op_div_int_lit16: /* 0xd3 */
5869/* File: arm64/op_div_int_lit16.S */
5870/* File: arm64/binopLit16.S */
5871 /*
5872 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5873 * that specifies an instruction that performs "result = w0 op w1".
5874 * This could be an ARM instruction or a function call. (If the result
5875 * comes back in a register other than w0, you can override "result".)
5876 *
5877 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5878 * vCC (w1). Useful for integer division and modulus.
5879 *
5880 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5881 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5882 */
5883 /* binop/lit16 vA, vB, #+CCCC */
5884 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5885 lsr w2, wINST, #12 // w2<- B
5886 ubfx w9, wINST, #8, #4 // w9<- A
5887 GET_VREG w0, w2 // w0<- vB
5888 .if 1
5889 cbz w1, common_errDivideByZero
5890 .endif
5891 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5892
5893 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
5894 GET_INST_OPCODE ip // extract opcode from rINST
5895 SET_VREG w0, w9 // vAA<- w0
5896 GOTO_OPCODE ip // jump to next instruction
5897 /* 10-13 instructions */
5898
5899
5900/* ------------------------------ */
5901 .balign 128
5902.L_op_rem_int_lit16: /* 0xd4 */
5903/* File: arm64/op_rem_int_lit16.S */
5904/* File: arm64/binopLit16.S */
5905 /*
5906 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5907 * that specifies an instruction that performs "result = w0 op w1".
5908 * This could be an ARM instruction or a function call. (If the result
5909 * comes back in a register other than w0, you can override "result".)
5910 *
5911 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5912 * vCC (w1). Useful for integer division and modulus.
5913 *
5914 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5915 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5916 */
5917 /* binop/lit16 vA, vB, #+CCCC */
5918 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5919 lsr w2, wINST, #12 // w2<- B
5920 ubfx w9, wINST, #8, #4 // w9<- A
5921 GET_VREG w0, w2 // w0<- vB
5922 .if 1
5923 cbz w1, common_errDivideByZero
5924 .endif
5925 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5926 sdiv w3, w0, w1
5927 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
5928 GET_INST_OPCODE ip // extract opcode from rINST
5929 SET_VREG w0, w9 // vAA<- w0
5930 GOTO_OPCODE ip // jump to next instruction
5931 /* 10-13 instructions */
5932
5933
5934/* ------------------------------ */
5935 .balign 128
5936.L_op_and_int_lit16: /* 0xd5 */
5937/* File: arm64/op_and_int_lit16.S */
5938/* File: arm64/binopLit16.S */
5939 /*
5940 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5941 * that specifies an instruction that performs "result = w0 op w1".
5942 * This could be an ARM instruction or a function call. (If the result
5943 * comes back in a register other than w0, you can override "result".)
5944 *
5945 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5946 * vCC (w1). Useful for integer division and modulus.
5947 *
5948 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5949 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5950 */
5951 /* binop/lit16 vA, vB, #+CCCC */
5952 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5953 lsr w2, wINST, #12 // w2<- B
5954 ubfx w9, wINST, #8, #4 // w9<- A
5955 GET_VREG w0, w2 // w0<- vB
5956 .if 0
5957 cbz w1, common_errDivideByZero
5958 .endif
5959 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5960
5961 and w0, w0, w1 // w0<- op, w0-w3 changed
5962 GET_INST_OPCODE ip // extract opcode from rINST
5963 SET_VREG w0, w9 // vAA<- w0
5964 GOTO_OPCODE ip // jump to next instruction
5965 /* 10-13 instructions */
5966
5967
5968/* ------------------------------ */
5969 .balign 128
5970.L_op_or_int_lit16: /* 0xd6 */
5971/* File: arm64/op_or_int_lit16.S */
5972/* File: arm64/binopLit16.S */
5973 /*
5974 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
5975 * that specifies an instruction that performs "result = w0 op w1".
5976 * This could be an ARM instruction or a function call. (If the result
5977 * comes back in a register other than w0, you can override "result".)
5978 *
5979 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5980 * vCC (w1). Useful for integer division and modulus.
5981 *
5982 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
5983 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
5984 */
5985 /* binop/lit16 vA, vB, #+CCCC */
5986 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
5987 lsr w2, wINST, #12 // w2<- B
5988 ubfx w9, wINST, #8, #4 // w9<- A
5989 GET_VREG w0, w2 // w0<- vB
5990 .if 0
5991 cbz w1, common_errDivideByZero
5992 .endif
5993 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
5994
5995 orr w0, w0, w1 // w0<- op, w0-w3 changed
5996 GET_INST_OPCODE ip // extract opcode from rINST
5997 SET_VREG w0, w9 // vAA<- w0
5998 GOTO_OPCODE ip // jump to next instruction
5999 /* 10-13 instructions */
6000
6001
6002/* ------------------------------ */
6003 .balign 128
6004.L_op_xor_int_lit16: /* 0xd7 */
6005/* File: arm64/op_xor_int_lit16.S */
6006/* File: arm64/binopLit16.S */
6007 /*
6008 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6009 * that specifies an instruction that performs "result = w0 op w1".
6010 * This could be an ARM instruction or a function call. (If the result
6011 * comes back in a register other than w0, you can override "result".)
6012 *
6013 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6014 * vCC (w1). Useful for integer division and modulus.
6015 *
6016 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6017 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6018 */
6019 /* binop/lit16 vA, vB, #+CCCC */
6020 FETCH_S w1, 1 // w1<- ssssCCCC (sign-extended)
6021 lsr w2, wINST, #12 // w2<- B
6022 ubfx w9, wINST, #8, #4 // w9<- A
6023 GET_VREG w0, w2 // w0<- vB
6024 .if 0
6025 cbz w1, common_errDivideByZero
6026 .endif
6027 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6028
6029 eor w0, w0, w1 // w0<- op, w0-w3 changed
6030 GET_INST_OPCODE ip // extract opcode from rINST
6031 SET_VREG w0, w9 // vAA<- w0
6032 GOTO_OPCODE ip // jump to next instruction
6033 /* 10-13 instructions */
6034
6035
6036/* ------------------------------ */
6037 .balign 128
6038.L_op_add_int_lit8: /* 0xd8 */
6039/* File: arm64/op_add_int_lit8.S */
6040/* File: arm64/binopLit8.S */
6041 /*
6042 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6043 * that specifies an instruction that performs "result = w0 op w1".
6044 * This could be an ARM instruction or a function call. (If the result
6045 * comes back in a register other than w0, you can override "result".)
6046 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006047 * You can override "extract" if the extraction of the literal value
6048 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6049 * can be omitted completely if the shift is embedded in "instr".
6050 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006051 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6052 * vCC (w1). Useful for integer division and modulus.
6053 *
6054 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6055 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6056 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6057 */
6058 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006059 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006060 lsr w9, wINST, #8 // w9<- AA
6061 and w2, w3, #255 // w2<- BB
6062 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006063 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006064 .if 0
6065 cbz w1, common_errDivideByZero
6066 .endif
6067 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6068 // optional op; may set condition codes
Vladimir Markofbcc8302016-08-08 12:08:06 +01006069 add w0, w0, w3, asr #8 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006070 GET_INST_OPCODE ip // extract opcode from rINST
6071 SET_VREG w0, w9 // vAA<- w0
6072 GOTO_OPCODE ip // jump to next instruction
6073 /* 10-12 instructions */
6074
6075
6076/* ------------------------------ */
6077 .balign 128
6078.L_op_rsub_int_lit8: /* 0xd9 */
6079/* File: arm64/op_rsub_int_lit8.S */
6080/* File: arm64/binopLit8.S */
6081 /*
6082 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6083 * that specifies an instruction that performs "result = w0 op w1".
6084 * This could be an ARM instruction or a function call. (If the result
6085 * comes back in a register other than w0, you can override "result".)
6086 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006087 * You can override "extract" if the extraction of the literal value
6088 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6089 * can be omitted completely if the shift is embedded in "instr".
6090 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006091 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6092 * vCC (w1). Useful for integer division and modulus.
6093 *
6094 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6095 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6096 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6097 */
6098 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006099 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006100 lsr w9, wINST, #8 // w9<- AA
6101 and w2, w3, #255 // w2<- BB
6102 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006103 asr w1, w3, #8 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006104 .if 0
6105 cbz w1, common_errDivideByZero
6106 .endif
6107 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6108 // optional op; may set condition codes
6109 sub w0, w1, w0 // w0<- op, w0-w3 changed
6110 GET_INST_OPCODE ip // extract opcode from rINST
6111 SET_VREG w0, w9 // vAA<- w0
6112 GOTO_OPCODE ip // jump to next instruction
6113 /* 10-12 instructions */
6114
6115
6116/* ------------------------------ */
6117 .balign 128
6118.L_op_mul_int_lit8: /* 0xda */
6119/* File: arm64/op_mul_int_lit8.S */
6120/* must be "mul w0, w1, w0" -- "w0, w0, w1" is illegal */
6121/* File: arm64/binopLit8.S */
6122 /*
6123 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6124 * that specifies an instruction that performs "result = w0 op w1".
6125 * This could be an ARM instruction or a function call. (If the result
6126 * comes back in a register other than w0, you can override "result".)
6127 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006128 * You can override "extract" if the extraction of the literal value
6129 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6130 * can be omitted completely if the shift is embedded in "instr".
6131 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006132 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6133 * vCC (w1). Useful for integer division and modulus.
6134 *
6135 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6136 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6137 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6138 */
6139 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006140 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006141 lsr w9, wINST, #8 // w9<- AA
6142 and w2, w3, #255 // w2<- BB
6143 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006144 asr w1, w3, #8 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006145 .if 0
6146 cbz w1, common_errDivideByZero
6147 .endif
6148 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6149 // optional op; may set condition codes
6150 mul w0, w1, w0 // w0<- op, w0-w3 changed
6151 GET_INST_OPCODE ip // extract opcode from rINST
6152 SET_VREG w0, w9 // vAA<- w0
6153 GOTO_OPCODE ip // jump to next instruction
6154 /* 10-12 instructions */
6155
6156
6157/* ------------------------------ */
6158 .balign 128
6159.L_op_div_int_lit8: /* 0xdb */
6160/* File: arm64/op_div_int_lit8.S */
6161/* File: arm64/binopLit8.S */
6162 /*
6163 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6164 * that specifies an instruction that performs "result = w0 op w1".
6165 * This could be an ARM instruction or a function call. (If the result
6166 * comes back in a register other than w0, you can override "result".)
6167 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006168 * You can override "extract" if the extraction of the literal value
6169 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6170 * can be omitted completely if the shift is embedded in "instr".
6171 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006172 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6173 * vCC (w1). Useful for integer division and modulus.
6174 *
6175 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6176 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6177 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6178 */
6179 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006180 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006181 lsr w9, wINST, #8 // w9<- AA
6182 and w2, w3, #255 // w2<- BB
6183 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006184 asr w1, w3, #8 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006185 .if 1
6186 cbz w1, common_errDivideByZero
6187 .endif
6188 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6189 // optional op; may set condition codes
6190 sdiv w0, w0, w1 // w0<- op, w0-w3 changed
6191 GET_INST_OPCODE ip // extract opcode from rINST
6192 SET_VREG w0, w9 // vAA<- w0
6193 GOTO_OPCODE ip // jump to next instruction
6194 /* 10-12 instructions */
6195
6196
6197/* ------------------------------ */
6198 .balign 128
6199.L_op_rem_int_lit8: /* 0xdc */
6200/* File: arm64/op_rem_int_lit8.S */
6201/* File: arm64/binopLit8.S */
6202 /*
6203 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6204 * that specifies an instruction that performs "result = w0 op w1".
6205 * This could be an ARM instruction or a function call. (If the result
6206 * comes back in a register other than w0, you can override "result".)
6207 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006208 * You can override "extract" if the extraction of the literal value
6209 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6210 * can be omitted completely if the shift is embedded in "instr".
6211 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006212 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6213 * vCC (w1). Useful for integer division and modulus.
6214 *
6215 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6216 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6217 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6218 */
6219 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006220 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006221 lsr w9, wINST, #8 // w9<- AA
6222 and w2, w3, #255 // w2<- BB
6223 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006224 asr w1, w3, #8 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006225 .if 1
6226 cbz w1, common_errDivideByZero
6227 .endif
6228 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6229 sdiv w3, w0, w1 // optional op; may set condition codes
6230 msub w0, w3, w1, w0 // w0<- op, w0-w3 changed
6231 GET_INST_OPCODE ip // extract opcode from rINST
6232 SET_VREG w0, w9 // vAA<- w0
6233 GOTO_OPCODE ip // jump to next instruction
6234 /* 10-12 instructions */
6235
6236
6237/* ------------------------------ */
6238 .balign 128
6239.L_op_and_int_lit8: /* 0xdd */
6240/* File: arm64/op_and_int_lit8.S */
6241/* File: arm64/binopLit8.S */
6242 /*
6243 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6244 * that specifies an instruction that performs "result = w0 op w1".
6245 * This could be an ARM instruction or a function call. (If the result
6246 * comes back in a register other than w0, you can override "result".)
6247 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006248 * You can override "extract" if the extraction of the literal value
6249 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6250 * can be omitted completely if the shift is embedded in "instr".
6251 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006252 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6253 * vCC (w1). Useful for integer division and modulus.
6254 *
6255 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6256 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6257 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6258 */
6259 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006260 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006261 lsr w9, wINST, #8 // w9<- AA
6262 and w2, w3, #255 // w2<- BB
6263 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006264 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006265 .if 0
6266 cbz w1, common_errDivideByZero
6267 .endif
6268 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6269 // optional op; may set condition codes
Vladimir Markofbcc8302016-08-08 12:08:06 +01006270 and w0, w0, w3, asr #8 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006271 GET_INST_OPCODE ip // extract opcode from rINST
6272 SET_VREG w0, w9 // vAA<- w0
6273 GOTO_OPCODE ip // jump to next instruction
6274 /* 10-12 instructions */
6275
6276
6277/* ------------------------------ */
6278 .balign 128
6279.L_op_or_int_lit8: /* 0xde */
6280/* File: arm64/op_or_int_lit8.S */
6281/* File: arm64/binopLit8.S */
6282 /*
6283 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6284 * that specifies an instruction that performs "result = w0 op w1".
6285 * This could be an ARM instruction or a function call. (If the result
6286 * comes back in a register other than w0, you can override "result".)
6287 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006288 * You can override "extract" if the extraction of the literal value
6289 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6290 * can be omitted completely if the shift is embedded in "instr".
6291 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006292 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6293 * vCC (w1). Useful for integer division and modulus.
6294 *
6295 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6296 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6297 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6298 */
6299 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006300 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006301 lsr w9, wINST, #8 // w9<- AA
6302 and w2, w3, #255 // w2<- BB
6303 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006304 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006305 .if 0
6306 cbz w1, common_errDivideByZero
6307 .endif
6308 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6309 // optional op; may set condition codes
Vladimir Markofbcc8302016-08-08 12:08:06 +01006310 orr w0, w0, w3, asr #8 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006311 GET_INST_OPCODE ip // extract opcode from rINST
6312 SET_VREG w0, w9 // vAA<- w0
6313 GOTO_OPCODE ip // jump to next instruction
6314 /* 10-12 instructions */
6315
6316
6317/* ------------------------------ */
6318 .balign 128
6319.L_op_xor_int_lit8: /* 0xdf */
6320/* File: arm64/op_xor_int_lit8.S */
6321/* File: arm64/binopLit8.S */
6322 /*
6323 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6324 * that specifies an instruction that performs "result = w0 op w1".
6325 * This could be an ARM instruction or a function call. (If the result
6326 * comes back in a register other than w0, you can override "result".)
6327 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006328 * You can override "extract" if the extraction of the literal value
6329 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6330 * can be omitted completely if the shift is embedded in "instr".
6331 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006332 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6333 * vCC (w1). Useful for integer division and modulus.
6334 *
6335 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6336 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6337 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6338 */
6339 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006340 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006341 lsr w9, wINST, #8 // w9<- AA
6342 and w2, w3, #255 // w2<- BB
6343 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006344 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006345 .if 0
6346 cbz w1, common_errDivideByZero
6347 .endif
6348 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6349 // optional op; may set condition codes
Vladimir Markofbcc8302016-08-08 12:08:06 +01006350 eor w0, w0, w3, asr #8 // w0<- op, w0-w3 changed
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006351 GET_INST_OPCODE ip // extract opcode from rINST
6352 SET_VREG w0, w9 // vAA<- w0
6353 GOTO_OPCODE ip // jump to next instruction
6354 /* 10-12 instructions */
6355
6356
6357/* ------------------------------ */
6358 .balign 128
6359.L_op_shl_int_lit8: /* 0xe0 */
6360/* File: arm64/op_shl_int_lit8.S */
6361/* File: arm64/binopLit8.S */
6362 /*
6363 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6364 * that specifies an instruction that performs "result = w0 op w1".
6365 * This could be an ARM instruction or a function call. (If the result
6366 * comes back in a register other than w0, you can override "result".)
6367 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006368 * You can override "extract" if the extraction of the literal value
6369 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6370 * can be omitted completely if the shift is embedded in "instr".
6371 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006372 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6373 * vCC (w1). Useful for integer division and modulus.
6374 *
6375 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6376 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6377 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6378 */
6379 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006380 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006381 lsr w9, wINST, #8 // w9<- AA
6382 and w2, w3, #255 // w2<- BB
6383 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006384 ubfx w1, w3, #8, #5 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006385 .if 0
6386 cbz w1, common_errDivideByZero
6387 .endif
6388 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006389 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006390 lsl w0, w0, w1 // w0<- op, w0-w3 changed
6391 GET_INST_OPCODE ip // extract opcode from rINST
6392 SET_VREG w0, w9 // vAA<- w0
6393 GOTO_OPCODE ip // jump to next instruction
6394 /* 10-12 instructions */
6395
6396
6397/* ------------------------------ */
6398 .balign 128
6399.L_op_shr_int_lit8: /* 0xe1 */
6400/* File: arm64/op_shr_int_lit8.S */
6401/* File: arm64/binopLit8.S */
6402 /*
6403 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6404 * that specifies an instruction that performs "result = w0 op w1".
6405 * This could be an ARM instruction or a function call. (If the result
6406 * comes back in a register other than w0, you can override "result".)
6407 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006408 * You can override "extract" if the extraction of the literal value
6409 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6410 * can be omitted completely if the shift is embedded in "instr".
6411 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006412 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6413 * vCC (w1). Useful for integer division and modulus.
6414 *
6415 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6416 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6417 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6418 */
6419 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006420 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006421 lsr w9, wINST, #8 // w9<- AA
6422 and w2, w3, #255 // w2<- BB
6423 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006424 ubfx w1, w3, #8, #5 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006425 .if 0
6426 cbz w1, common_errDivideByZero
6427 .endif
6428 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006429 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006430 asr w0, w0, w1 // w0<- op, w0-w3 changed
6431 GET_INST_OPCODE ip // extract opcode from rINST
6432 SET_VREG w0, w9 // vAA<- w0
6433 GOTO_OPCODE ip // jump to next instruction
6434 /* 10-12 instructions */
6435
6436
6437/* ------------------------------ */
6438 .balign 128
6439.L_op_ushr_int_lit8: /* 0xe2 */
6440/* File: arm64/op_ushr_int_lit8.S */
6441/* File: arm64/binopLit8.S */
6442 /*
6443 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6444 * that specifies an instruction that performs "result = w0 op w1".
6445 * This could be an ARM instruction or a function call. (If the result
6446 * comes back in a register other than w0, you can override "result".)
6447 *
Vladimir Markofbcc8302016-08-08 12:08:06 +01006448 * You can override "extract" if the extraction of the literal value
6449 * from w3 to w1 is not the default "asr w1, w3, #8". The extraction
6450 * can be omitted completely if the shift is embedded in "instr".
6451 *
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006452 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6453 * vCC (w1). Useful for integer division and modulus.
6454 *
6455 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6456 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6457 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6458 */
6459 /* binop/lit8 vAA, vBB, #+CC */
Vladimir Marko20421b92016-07-26 16:38:11 +01006460 FETCH_S w3, 1 // w3<- ssssCCBB (sign-extended for CC)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006461 lsr w9, wINST, #8 // w9<- AA
6462 and w2, w3, #255 // w2<- BB
6463 GET_VREG w0, w2 // w0<- vBB
Vladimir Markofbcc8302016-08-08 12:08:06 +01006464 ubfx w1, w3, #8, #5 // optional; typically w1<- ssssssCC (sign extended)
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006465 .if 0
6466 cbz w1, common_errDivideByZero
6467 .endif
6468 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
Vladimir Markoe6220222016-07-20 14:25:30 +01006469 // optional op; may set condition codes
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006470 lsr w0, w0, w1 // w0<- op, w0-w3 changed
6471 GET_INST_OPCODE ip // extract opcode from rINST
6472 SET_VREG w0, w9 // vAA<- w0
6473 GOTO_OPCODE ip // jump to next instruction
6474 /* 10-12 instructions */
6475
6476
6477/* ------------------------------ */
6478 .balign 128
6479.L_op_iget_quick: /* 0xe3 */
6480/* File: arm64/op_iget_quick.S */
6481 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6482 /* op vA, vB, offset//CCCC */
6483 lsr w2, wINST, #12 // w2<- B
6484 FETCH w1, 1 // w1<- field byte offset
6485 GET_VREG w3, w2 // w3<- object we're operating on
6486 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006487 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006488 ldr w0, [x3, x1] // w0<- obj.field
6489 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6490
6491 SET_VREG w0, w2 // fp[A]<- w0
6492 GET_INST_OPCODE ip // extract opcode from rINST
6493 GOTO_OPCODE ip // jump to next instruction
6494
6495/* ------------------------------ */
6496 .balign 128
6497.L_op_iget_wide_quick: /* 0xe4 */
6498/* File: arm64/op_iget_wide_quick.S */
6499 /* iget-wide-quick vA, vB, offset//CCCC */
6500 lsr w2, wINST, #12 // w2<- B
6501 FETCH w4, 1 // w4<- field byte offset
6502 GET_VREG w3, w2 // w3<- object we're operating on
6503 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006504 cbz w3, common_errNullObject // object was null
Vladimir Marko20421b92016-07-26 16:38:11 +01006505 ldr x0, [x3, x4] // x0<- obj.field
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006506 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
6507 SET_VREG_WIDE x0, w2
6508 GET_INST_OPCODE ip // extract opcode from wINST
6509 GOTO_OPCODE ip // jump to next instruction
6510
6511/* ------------------------------ */
6512 .balign 128
6513.L_op_iget_object_quick: /* 0xe5 */
6514/* File: arm64/op_iget_object_quick.S */
6515 /* For: iget-object-quick */
6516 /* op vA, vB, offset//CCCC */
6517 lsr w2, wINST, #12 // w2<- B
6518 FETCH w1, 1 // w1<- field byte offset
6519 EXPORT_PC
6520 GET_VREG w0, w2 // w0<- object we're operating on
6521 bl artIGetObjectFromMterp // (obj, offset)
6522 ldr x3, [xSELF, #THREAD_EXCEPTION_OFFSET]
6523 ubfx w2, wINST, #8, #4 // w2<- A
6524 PREFETCH_INST 2
6525 cbnz w3, MterpPossibleException // bail out
6526 SET_VREG_OBJECT w0, w2 // fp[A]<- w0
6527 ADVANCE 2 // advance rPC
6528 GET_INST_OPCODE ip // extract opcode from wINST
6529 GOTO_OPCODE ip // jump to next instruction
6530
6531/* ------------------------------ */
6532 .balign 128
6533.L_op_iput_quick: /* 0xe6 */
6534/* File: arm64/op_iput_quick.S */
6535 /* For: iput-quick, iput-object-quick */
6536 /* op vA, vB, offset//CCCC */
6537 lsr w2, wINST, #12 // w2<- B
6538 FETCH w1, 1 // w1<- field byte offset
6539 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6540 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006541 cbz w3, common_errNullObject // object was null
6542 GET_VREG w0, w2 // w0<- fp[A]
6543 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6544 str w0, [x3, x1] // obj.field<- w0
6545 GET_INST_OPCODE ip // extract opcode from rINST
6546 GOTO_OPCODE ip // jump to next instruction
6547
6548/* ------------------------------ */
6549 .balign 128
6550.L_op_iput_wide_quick: /* 0xe7 */
6551/* File: arm64/op_iput_wide_quick.S */
6552 /* iput-wide-quick vA, vB, offset//CCCC */
6553 lsr w2, wINST, #12 // w2<- B
6554 FETCH w3, 1 // w3<- field byte offset
6555 GET_VREG w2, w2 // w2<- fp[B], the object pointer
6556 ubfx w0, wINST, #8, #4 // w0<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006557 cbz w2, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006558 GET_VREG_WIDE x0, w0 // x0-< fp[A]
6559 FETCH_ADVANCE_INST 2 // advance rPC, load wINST
Vladimir Marko20421b92016-07-26 16:38:11 +01006560 str x0, [x2, x3] // obj.field<- x0
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006561 GET_INST_OPCODE ip // extract opcode from wINST
6562 GOTO_OPCODE ip // jump to next instruction
6563
6564/* ------------------------------ */
6565 .balign 128
6566.L_op_iput_object_quick: /* 0xe8 */
6567/* File: arm64/op_iput_object_quick.S */
6568 EXPORT_PC
6569 add x0, xFP, #OFF_FP_SHADOWFRAME
6570 mov x1, xPC
6571 mov w2, wINST
6572 bl MterpIputObjectQuick
6573 cbz w0, MterpException
6574 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6575 GET_INST_OPCODE ip // extract opcode from rINST
6576 GOTO_OPCODE ip // jump to next instruction
6577
6578/* ------------------------------ */
6579 .balign 128
6580.L_op_invoke_virtual_quick: /* 0xe9 */
6581/* File: arm64/op_invoke_virtual_quick.S */
6582/* File: arm64/invoke.S */
6583 /*
6584 * Generic invoke handler wrapper.
6585 */
6586 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6587 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6588 .extern MterpInvokeVirtualQuick
6589 EXPORT_PC
6590 mov x0, xSELF
6591 add x1, xFP, #OFF_FP_SHADOWFRAME
6592 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006593 mov x3, xINST
6594 bl MterpInvokeVirtualQuick
6595 cbz w0, MterpException
6596 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006597 bl MterpShouldSwitchInterpreters
6598 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006599 GET_INST_OPCODE ip
6600 GOTO_OPCODE ip
6601
6602
6603
6604/* ------------------------------ */
6605 .balign 128
6606.L_op_invoke_virtual_range_quick: /* 0xea */
6607/* File: arm64/op_invoke_virtual_range_quick.S */
6608/* File: arm64/invoke.S */
6609 /*
6610 * Generic invoke handler wrapper.
6611 */
6612 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
6613 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
6614 .extern MterpInvokeVirtualQuickRange
6615 EXPORT_PC
6616 mov x0, xSELF
6617 add x1, xFP, #OFF_FP_SHADOWFRAME
6618 mov x2, xPC
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006619 mov x3, xINST
6620 bl MterpInvokeVirtualQuickRange
6621 cbz w0, MterpException
6622 FETCH_ADVANCE_INST 3
Bill Buzbeefd522f92016-02-11 22:37:42 +00006623 bl MterpShouldSwitchInterpreters
6624 cbnz w0, MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006625 GET_INST_OPCODE ip
6626 GOTO_OPCODE ip
6627
6628
6629
6630/* ------------------------------ */
6631 .balign 128
6632.L_op_iput_boolean_quick: /* 0xeb */
6633/* File: arm64/op_iput_boolean_quick.S */
6634/* File: arm64/op_iput_quick.S */
6635 /* For: iput-quick, iput-object-quick */
6636 /* op vA, vB, offset//CCCC */
6637 lsr w2, wINST, #12 // w2<- B
6638 FETCH w1, 1 // w1<- field byte offset
6639 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6640 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006641 cbz w3, common_errNullObject // object was null
6642 GET_VREG w0, w2 // w0<- fp[A]
6643 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6644 strb w0, [x3, x1] // obj.field<- w0
6645 GET_INST_OPCODE ip // extract opcode from rINST
6646 GOTO_OPCODE ip // jump to next instruction
6647
6648
6649/* ------------------------------ */
6650 .balign 128
6651.L_op_iput_byte_quick: /* 0xec */
6652/* File: arm64/op_iput_byte_quick.S */
6653/* File: arm64/op_iput_quick.S */
6654 /* For: iput-quick, iput-object-quick */
6655 /* op vA, vB, offset//CCCC */
6656 lsr w2, wINST, #12 // w2<- B
6657 FETCH w1, 1 // w1<- field byte offset
6658 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6659 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006660 cbz w3, common_errNullObject // object was null
6661 GET_VREG w0, w2 // w0<- fp[A]
6662 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6663 strb w0, [x3, x1] // obj.field<- w0
6664 GET_INST_OPCODE ip // extract opcode from rINST
6665 GOTO_OPCODE ip // jump to next instruction
6666
6667
6668/* ------------------------------ */
6669 .balign 128
6670.L_op_iput_char_quick: /* 0xed */
6671/* File: arm64/op_iput_char_quick.S */
6672/* File: arm64/op_iput_quick.S */
6673 /* For: iput-quick, iput-object-quick */
6674 /* op vA, vB, offset//CCCC */
6675 lsr w2, wINST, #12 // w2<- B
6676 FETCH w1, 1 // w1<- field byte offset
6677 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6678 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006679 cbz w3, common_errNullObject // object was null
6680 GET_VREG w0, w2 // w0<- fp[A]
6681 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6682 strh w0, [x3, x1] // obj.field<- w0
6683 GET_INST_OPCODE ip // extract opcode from rINST
6684 GOTO_OPCODE ip // jump to next instruction
6685
6686
6687/* ------------------------------ */
6688 .balign 128
6689.L_op_iput_short_quick: /* 0xee */
6690/* File: arm64/op_iput_short_quick.S */
6691/* File: arm64/op_iput_quick.S */
6692 /* For: iput-quick, iput-object-quick */
6693 /* op vA, vB, offset//CCCC */
6694 lsr w2, wINST, #12 // w2<- B
6695 FETCH w1, 1 // w1<- field byte offset
6696 GET_VREG w3, w2 // w3<- fp[B], the object pointer
6697 ubfx w2, wINST, #8, #4 // w2<- A
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006698 cbz w3, common_errNullObject // object was null
6699 GET_VREG w0, w2 // w0<- fp[A]
6700 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6701 strh w0, [x3, x1] // obj.field<- w0
6702 GET_INST_OPCODE ip // extract opcode from rINST
6703 GOTO_OPCODE ip // jump to next instruction
6704
6705
6706/* ------------------------------ */
6707 .balign 128
6708.L_op_iget_boolean_quick: /* 0xef */
6709/* File: arm64/op_iget_boolean_quick.S */
6710/* File: arm64/op_iget_quick.S */
6711 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6712 /* op vA, vB, offset//CCCC */
6713 lsr w2, wINST, #12 // w2<- B
6714 FETCH w1, 1 // w1<- field byte offset
6715 GET_VREG w3, w2 // w3<- object we're operating on
6716 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006717 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006718 ldrb w0, [x3, x1] // w0<- obj.field
6719 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6720
6721 SET_VREG w0, w2 // fp[A]<- w0
6722 GET_INST_OPCODE ip // extract opcode from rINST
6723 GOTO_OPCODE ip // jump to next instruction
6724
6725
6726/* ------------------------------ */
6727 .balign 128
6728.L_op_iget_byte_quick: /* 0xf0 */
6729/* File: arm64/op_iget_byte_quick.S */
6730/* File: arm64/op_iget_quick.S */
6731 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6732 /* op vA, vB, offset//CCCC */
6733 lsr w2, wINST, #12 // w2<- B
6734 FETCH w1, 1 // w1<- field byte offset
6735 GET_VREG w3, w2 // w3<- object we're operating on
6736 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006737 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006738 ldrsb w0, [x3, x1] // w0<- obj.field
6739 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6740
6741 SET_VREG w0, w2 // fp[A]<- w0
6742 GET_INST_OPCODE ip // extract opcode from rINST
6743 GOTO_OPCODE ip // jump to next instruction
6744
6745
6746/* ------------------------------ */
6747 .balign 128
6748.L_op_iget_char_quick: /* 0xf1 */
6749/* File: arm64/op_iget_char_quick.S */
6750/* File: arm64/op_iget_quick.S */
6751 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6752 /* op vA, vB, offset//CCCC */
6753 lsr w2, wINST, #12 // w2<- B
6754 FETCH w1, 1 // w1<- field byte offset
6755 GET_VREG w3, w2 // w3<- object we're operating on
6756 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006757 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006758 ldrh w0, [x3, x1] // w0<- obj.field
6759 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6760
6761 SET_VREG w0, w2 // fp[A]<- w0
6762 GET_INST_OPCODE ip // extract opcode from rINST
6763 GOTO_OPCODE ip // jump to next instruction
6764
6765
6766/* ------------------------------ */
6767 .balign 128
6768.L_op_iget_short_quick: /* 0xf2 */
6769/* File: arm64/op_iget_short_quick.S */
6770/* File: arm64/op_iget_quick.S */
6771 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
6772 /* op vA, vB, offset//CCCC */
6773 lsr w2, wINST, #12 // w2<- B
6774 FETCH w1, 1 // w1<- field byte offset
6775 GET_VREG w3, w2 // w3<- object we're operating on
6776 ubfx w2, wINST, #8, #4 // w2<- A
Vladimir Markoe6220222016-07-20 14:25:30 +01006777 cbz w3, common_errNullObject // object was null
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006778 ldrsh w0, [x3, x1] // w0<- obj.field
6779 FETCH_ADVANCE_INST 2 // advance rPC, load rINST
6780
6781 SET_VREG w0, w2 // fp[A]<- w0
6782 GET_INST_OPCODE ip // extract opcode from rINST
6783 GOTO_OPCODE ip // jump to next instruction
6784
6785
6786/* ------------------------------ */
6787 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006788.L_op_unused_f3: /* 0xf3 */
6789/* File: arm64/op_unused_f3.S */
6790/* File: arm64/unused.S */
6791/*
6792 * Bail to reference interpreter to throw.
6793 */
6794 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006795
6796
6797/* ------------------------------ */
6798 .balign 128
6799.L_op_unused_f4: /* 0xf4 */
6800/* File: arm64/op_unused_f4.S */
6801/* File: arm64/unused.S */
6802/*
6803 * Bail to reference interpreter to throw.
6804 */
6805 b MterpFallback
6806
6807
6808/* ------------------------------ */
6809 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006810.L_op_unused_f5: /* 0xf5 */
6811/* File: arm64/op_unused_f5.S */
6812/* File: arm64/unused.S */
6813/*
6814 * Bail to reference interpreter to throw.
6815 */
6816 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006817
6818
6819/* ------------------------------ */
6820 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006821.L_op_unused_f6: /* 0xf6 */
6822/* File: arm64/op_unused_f6.S */
6823/* File: arm64/unused.S */
6824/*
6825 * Bail to reference interpreter to throw.
6826 */
6827 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006828
6829
6830/* ------------------------------ */
6831 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006832.L_op_unused_f7: /* 0xf7 */
6833/* File: arm64/op_unused_f7.S */
6834/* File: arm64/unused.S */
6835/*
6836 * Bail to reference interpreter to throw.
6837 */
6838 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006839
6840
6841/* ------------------------------ */
6842 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006843.L_op_unused_f8: /* 0xf8 */
6844/* File: arm64/op_unused_f8.S */
6845/* File: arm64/unused.S */
6846/*
6847 * Bail to reference interpreter to throw.
6848 */
6849 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006850
6851
6852/* ------------------------------ */
6853 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +01006854.L_op_unused_f9: /* 0xf9 */
6855/* File: arm64/op_unused_f9.S */
6856/* File: arm64/unused.S */
6857/*
6858 * Bail to reference interpreter to throw.
6859 */
6860 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006861
6862
6863/* ------------------------------ */
6864 .balign 128
buzbee8a287142016-10-07 12:56:32 -07006865.L_op_invoke_polymorphic: /* 0xfa */
6866/* Transfer stub to alternate interpreter */
6867 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006868
6869
6870/* ------------------------------ */
6871 .balign 128
buzbee8a287142016-10-07 12:56:32 -07006872.L_op_invoke_polymorphic_range: /* 0xfb */
6873/* Transfer stub to alternate interpreter */
6874 b MterpFallback
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00006875
6876
6877/* ------------------------------ */
6878 .balign 128
6879.L_op_unused_fc: /* 0xfc */
6880/* File: arm64/op_unused_fc.S */
6881/* File: arm64/unused.S */
6882/*
6883 * Bail to reference interpreter to throw.
6884 */
6885 b MterpFallback
6886
6887
6888/* ------------------------------ */
6889 .balign 128
6890.L_op_unused_fd: /* 0xfd */
6891/* File: arm64/op_unused_fd.S */
6892/* File: arm64/unused.S */
6893/*
6894 * Bail to reference interpreter to throw.
6895 */
6896 b MterpFallback
6897
6898
6899/* ------------------------------ */
6900 .balign 128
6901.L_op_unused_fe: /* 0xfe */
6902/* File: arm64/op_unused_fe.S */
6903/* File: arm64/unused.S */
6904/*
6905 * Bail to reference interpreter to throw.
6906 */
6907 b MterpFallback
6908
6909
6910/* ------------------------------ */
6911 .balign 128
6912.L_op_unused_ff: /* 0xff */
6913/* File: arm64/op_unused_ff.S */
6914/* File: arm64/unused.S */
6915/*
6916 * Bail to reference interpreter to throw.
6917 */
6918 b MterpFallback
6919
6920
6921 .balign 128
6922 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
6923 .global artMterpAsmInstructionEnd
6924artMterpAsmInstructionEnd:
6925
6926/*
6927 * ===========================================================================
6928 * Sister implementations
6929 * ===========================================================================
6930 */
6931 .global artMterpAsmSisterStart
6932 .type artMterpAsmSisterStart, %function
6933 .text
6934 .balign 4
6935artMterpAsmSisterStart:
6936
6937 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
6938 .global artMterpAsmSisterEnd
6939artMterpAsmSisterEnd:
6940
Vladimir Marko20421b92016-07-26 16:38:11 +01006941/* File: arm64/footer.S */
6942/*
6943 * ===========================================================================
6944 * Common subroutines and data
6945 * ===========================================================================
6946 */
6947
6948
6949/*
6950 * We've detected a condition that will result in an exception, but the exception
6951 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
6952 * TUNING: for consistency, we may want to just go ahead and handle these here.
6953 */
6954common_errDivideByZero:
6955 EXPORT_PC
6956#if MTERP_LOGGING
6957 mov x0, xSELF
6958 add x1, xFP, #OFF_FP_SHADOWFRAME
6959 bl MterpLogDivideByZeroException
6960#endif
6961 b MterpCommonFallback
6962
6963common_errArrayIndex:
6964 EXPORT_PC
6965#if MTERP_LOGGING
6966 mov x0, xSELF
6967 add x1, xFP, #OFF_FP_SHADOWFRAME
6968 bl MterpLogArrayIndexException
6969#endif
6970 b MterpCommonFallback
6971
6972common_errNegativeArraySize:
6973 EXPORT_PC
6974#if MTERP_LOGGING
6975 mov x0, xSELF
6976 add x1, xFP, #OFF_FP_SHADOWFRAME
6977 bl MterpLogNegativeArraySizeException
6978#endif
6979 b MterpCommonFallback
6980
6981common_errNoSuchMethod:
6982 EXPORT_PC
6983#if MTERP_LOGGING
6984 mov x0, xSELF
6985 add x1, xFP, #OFF_FP_SHADOWFRAME
6986 bl MterpLogNoSuchMethodException
6987#endif
6988 b MterpCommonFallback
6989
6990common_errNullObject:
6991 EXPORT_PC
6992#if MTERP_LOGGING
6993 mov x0, xSELF
6994 add x1, xFP, #OFF_FP_SHADOWFRAME
6995 bl MterpLogNullObjectException
6996#endif
6997 b MterpCommonFallback
6998
6999common_exceptionThrown:
7000 EXPORT_PC
7001#if MTERP_LOGGING
7002 mov x0, xSELF
7003 add x1, xFP, #OFF_FP_SHADOWFRAME
7004 bl MterpLogExceptionThrownException
7005#endif
7006 b MterpCommonFallback
7007
7008MterpSuspendFallback:
7009 EXPORT_PC
7010#if MTERP_LOGGING
7011 mov x0, xSELF
7012 add x1, xFP, #OFF_FP_SHADOWFRAME
7013 ldr x2, [xSELF, #THREAD_FLAGS_OFFSET]
7014 bl MterpLogSuspendFallback
7015#endif
7016 b MterpCommonFallback
7017
7018/*
7019 * If we're here, something is out of the ordinary. If there is a pending
7020 * exception, handle it. Otherwise, roll back and retry with the reference
7021 * interpreter.
7022 */
7023MterpPossibleException:
7024 ldr x0, [xSELF, #THREAD_EXCEPTION_OFFSET]
7025 cbz x0, MterpFallback // If not, fall back to reference interpreter.
7026 /* intentional fallthrough - handle pending exception. */
7027/*
7028 * On return from a runtime helper routine, we've found a pending exception.
7029 * Can we handle it here - or need to bail out to caller?
7030 *
7031 */
7032MterpException:
7033 mov x0, xSELF
7034 add x1, xFP, #OFF_FP_SHADOWFRAME
7035 bl MterpHandleException // (self, shadow_frame)
7036 cbz w0, MterpExceptionReturn // no local catch, back to caller.
7037 ldr x0, [xFP, #OFF_FP_CODE_ITEM]
7038 ldr w1, [xFP, #OFF_FP_DEX_PC]
7039 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET]
7040 add xPC, x0, #CODEITEM_INSNS_OFFSET
7041 add xPC, xPC, x1, lsl #1 // generate new dex_pc_ptr
7042 /* Do we need to switch interpreters? */
7043 bl MterpShouldSwitchInterpreters
7044 cbnz w0, MterpFallback
7045 /* resume execution at catch block */
7046 EXPORT_PC
7047 FETCH_INST
7048 GET_INST_OPCODE ip
7049 GOTO_OPCODE ip
7050 /* NOTE: no fallthrough */
7051/*
7052 * Common handling for branches with support for Jit profiling.
7053 * On entry:
7054 * wINST <= signed offset
7055 * wPROFILE <= signed hotness countdown (expanded to 32 bits)
7056 * condition bits <= set to establish sign of offset (use "NoFlags" entry if not)
7057 *
7058 * We have quite a few different cases for branch profiling, OSR detection and
7059 * suspend check support here.
7060 *
7061 * Taken backward branches:
7062 * If profiling active, do hotness countdown and report if we hit zero.
7063 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
7064 * Is there a pending suspend request? If so, suspend.
7065 *
7066 * Taken forward branches and not-taken backward branches:
7067 * If in osr check mode, see if our target is a compiled loop header entry and do OSR if so.
7068 *
7069 * Our most common case is expected to be a taken backward branch with active jit profiling,
7070 * but no full OSR check and no pending suspend request.
7071 * Next most common case is not-taken branch with no full OSR check.
7072 *
7073 */
7074MterpCommonTakenBranchNoFlags:
7075 cmp wINST, #0
7076 b.gt .L_forward_branch // don't add forward branches to hotness
7077 tbnz wPROFILE, #31, .L_no_count_backwards // go if negative
7078 subs wPROFILE, wPROFILE, #1 // countdown
7079 b.eq .L_add_batch // counted down to zero - report
7080.L_resume_backward_branch:
7081 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
7082 add w2, wINST, wINST // w2<- byte offset
7083 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
7084 REFRESH_IBASE
Hiroshi Yamauchi30493242016-11-03 13:06:52 -07007085 ands lr, lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Vladimir Marko20421b92016-07-26 16:38:11 +01007086 b.ne .L_suspend_request_pending
7087 GET_INST_OPCODE ip // extract opcode from wINST
7088 GOTO_OPCODE ip // jump to next instruction
7089
7090.L_suspend_request_pending:
7091 EXPORT_PC
7092 mov x0, xSELF
7093 bl MterpSuspendCheck // (self)
7094 cbnz x0, MterpFallback
7095 REFRESH_IBASE // might have changed during suspend
7096 GET_INST_OPCODE ip // extract opcode from wINST
7097 GOTO_OPCODE ip // jump to next instruction
7098
7099.L_no_count_backwards:
7100 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
7101 b.ne .L_resume_backward_branch
7102 mov x0, xSELF
7103 add x1, xFP, #OFF_FP_SHADOWFRAME
7104 mov x2, xINST
7105 EXPORT_PC
7106 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7107 cbnz x0, MterpOnStackReplacement
7108 b .L_resume_backward_branch
7109
7110.L_forward_branch:
7111 cmp wPROFILE, #JIT_CHECK_OSR // possible OSR re-entry?
7112 b.eq .L_check_osr_forward
7113.L_resume_forward_branch:
7114 add w2, wINST, wINST // w2<- byte offset
7115 FETCH_ADVANCE_INST_RB w2 // update rPC, load wINST
7116 GET_INST_OPCODE ip // extract opcode from wINST
7117 GOTO_OPCODE ip // jump to next instruction
7118
7119.L_check_osr_forward:
7120 mov x0, xSELF
7121 add x1, xFP, #OFF_FP_SHADOWFRAME
7122 mov x2, xINST
7123 EXPORT_PC
7124 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7125 cbnz x0, MterpOnStackReplacement
7126 b .L_resume_forward_branch
7127
7128.L_add_batch:
7129 add x1, xFP, #OFF_FP_SHADOWFRAME
7130 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
7131 ldr x0, [xFP, #OFF_FP_METHOD]
7132 mov x2, xSELF
7133 bl MterpAddHotnessBatch // (method, shadow_frame, self)
7134 mov wPROFILE, w0 // restore new hotness countdown to wPROFILE
7135 b .L_no_count_backwards
7136
7137/*
7138 * Entered from the conditional branch handlers when OSR check request active on
7139 * not-taken path. All Dalvik not-taken conditional branch offsets are 2.
7140 */
7141.L_check_not_taken_osr:
7142 mov x0, xSELF
7143 add x1, xFP, #OFF_FP_SHADOWFRAME
7144 mov x2, #2
7145 EXPORT_PC
7146 bl MterpMaybeDoOnStackReplacement // (self, shadow_frame, offset)
7147 cbnz x0, MterpOnStackReplacement
7148 FETCH_ADVANCE_INST 2
7149 GET_INST_OPCODE ip // extract opcode from wINST
7150 GOTO_OPCODE ip // jump to next instruction
7151
7152
7153/*
7154 * Check for suspend check request. Assumes wINST already loaded, xPC advanced and
7155 * still needs to get the opcode and branch to it, and flags are in lr.
7156 */
7157MterpCheckSuspendAndContinue:
7158 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh xIBASE
Hiroshi Yamauchi30493242016-11-03 13:06:52 -07007159 ands w7, w7, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Vladimir Marko20421b92016-07-26 16:38:11 +01007160 b.ne check1
7161 GET_INST_OPCODE ip // extract opcode from wINST
7162 GOTO_OPCODE ip // jump to next instruction
7163check1:
7164 EXPORT_PC
7165 mov x0, xSELF
7166 bl MterpSuspendCheck // (self)
7167 cbnz x0, MterpFallback // Something in the environment changed, switch interpreters
7168 GET_INST_OPCODE ip // extract opcode from wINST
7169 GOTO_OPCODE ip // jump to next instruction
7170
7171/*
7172 * On-stack replacement has happened, and now we've returned from the compiled method.
7173 */
7174MterpOnStackReplacement:
7175#if MTERP_LOGGING
7176 mov x0, xSELF
7177 add x1, xFP, #OFF_FP_SHADOWFRAME
7178 sxtw x2, wINST
7179 bl MterpLogOSR
7180#endif
7181 mov x0, #1 // Signal normal return
7182 b MterpDone
7183
7184/*
7185 * Bail out to reference interpreter.
7186 */
7187MterpFallback:
7188 EXPORT_PC
7189#if MTERP_LOGGING
7190 mov x0, xSELF
7191 add x1, xFP, #OFF_FP_SHADOWFRAME
7192 bl MterpLogFallback
7193#endif
7194MterpCommonFallback:
7195 mov x0, #0 // signal retry with reference interpreter.
7196 b MterpDone
7197
7198/*
7199 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
7200 * SP and LR. Here we restore SP, restore the registers, and then restore
7201 * LR to PC.
7202 *
7203 * On entry:
7204 * uint32_t* xFP (should still be live, pointer to base of vregs)
7205 */
7206MterpExceptionReturn:
7207 mov x0, #1 // signal return to caller.
7208 b MterpDone
7209MterpReturn:
7210 ldr x2, [xFP, #OFF_FP_RESULT_REGISTER]
7211 ldr lr, [xSELF, #THREAD_FLAGS_OFFSET]
7212 str x0, [x2]
7213 mov x0, xSELF
Hiroshi Yamauchi30493242016-11-03 13:06:52 -07007214 ands lr, lr, #THREAD_SUSPEND_OR_CHECKPOINT_REQUEST
Vladimir Marko20421b92016-07-26 16:38:11 +01007215 b.eq check2
7216 bl MterpSuspendCheck // (self)
7217check2:
7218 mov x0, #1 // signal return to caller.
7219MterpDone:
7220/*
7221 * At this point, we expect wPROFILE to be non-zero. If negative, hotness is disabled or we're
7222 * checking for OSR. If greater than zero, we might have unreported hotness to register
7223 * (the difference between the ending wPROFILE and the cached hotness counter). wPROFILE
7224 * should only reach zero immediately after a hotness decrement, and is then reset to either
7225 * a negative special state or the new non-zero countdown value.
7226 */
7227 cmp wPROFILE, #0
7228 bgt MterpProfileActive // if > 0, we may have some counts to report.
7229 ldp fp, lr, [sp, #64]
7230 ldp xPC, xFP, [sp, #48]
7231 ldp xSELF, xINST, [sp, #32]
7232 ldp xIBASE, xREFS, [sp, #16]
7233 ldp xPROFILE, x27, [sp], #80
7234 ret
7235
7236MterpProfileActive:
7237 mov xINST, x0 // stash return value
7238 /* Report cached hotness counts */
7239 ldr x0, [xFP, #OFF_FP_METHOD]
7240 add x1, xFP, #OFF_FP_SHADOWFRAME
7241 mov x2, xSELF
7242 strh wPROFILE, [x1, #SHADOWFRAME_HOTNESS_COUNTDOWN_OFFSET]
7243 bl MterpAddHotnessBatch // (method, shadow_frame, self)
7244 mov x0, xINST // restore return value
7245 ldp fp, lr, [sp, #64]
7246 ldp xPC, xFP, [sp, #48]
7247 ldp xSELF, xINST, [sp, #32]
7248 ldp xIBASE, xREFS, [sp, #16]
7249 ldp xPROFILE, x27, [sp], #80
7250 ret
7251
7252 .cfi_endproc
7253 .size ExecuteMterpImpl, .-ExecuteMterpImpl
7254
7255
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007256
7257 .global artMterpAsmAltInstructionStart
7258 .type artMterpAsmAltInstructionStart, %function
7259 .text
7260
7261artMterpAsmAltInstructionStart = .L_ALT_op_nop
7262/* ------------------------------ */
7263 .balign 128
7264.L_ALT_op_nop: /* 0x00 */
7265/* File: arm64/alt_stub.S */
7266/*
7267 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7268 * any interesting requests and then jump to the real instruction
7269 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7270 */
7271 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007272 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7273 adr lr, artMterpAsmInstructionStart + (0 * 128) // Addr of primary handler.
7274 mov x0, xSELF
7275 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007276 mov x2, xPC
7277 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007278
7279/* ------------------------------ */
7280 .balign 128
7281.L_ALT_op_move: /* 0x01 */
7282/* File: arm64/alt_stub.S */
7283/*
7284 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7285 * any interesting requests and then jump to the real instruction
7286 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7287 */
7288 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007289 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7290 adr lr, artMterpAsmInstructionStart + (1 * 128) // Addr of primary handler.
7291 mov x0, xSELF
7292 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007293 mov x2, xPC
7294 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007295
7296/* ------------------------------ */
7297 .balign 128
7298.L_ALT_op_move_from16: /* 0x02 */
7299/* File: arm64/alt_stub.S */
7300/*
7301 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7302 * any interesting requests and then jump to the real instruction
7303 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7304 */
7305 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007306 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7307 adr lr, artMterpAsmInstructionStart + (2 * 128) // Addr of primary handler.
7308 mov x0, xSELF
7309 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007310 mov x2, xPC
7311 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007312
7313/* ------------------------------ */
7314 .balign 128
7315.L_ALT_op_move_16: /* 0x03 */
7316/* File: arm64/alt_stub.S */
7317/*
7318 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7319 * any interesting requests and then jump to the real instruction
7320 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7321 */
7322 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007323 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7324 adr lr, artMterpAsmInstructionStart + (3 * 128) // Addr of primary handler.
7325 mov x0, xSELF
7326 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007327 mov x2, xPC
7328 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007329
7330/* ------------------------------ */
7331 .balign 128
7332.L_ALT_op_move_wide: /* 0x04 */
7333/* File: arm64/alt_stub.S */
7334/*
7335 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7336 * any interesting requests and then jump to the real instruction
7337 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7338 */
7339 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007340 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7341 adr lr, artMterpAsmInstructionStart + (4 * 128) // Addr of primary handler.
7342 mov x0, xSELF
7343 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007344 mov x2, xPC
7345 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007346
7347/* ------------------------------ */
7348 .balign 128
7349.L_ALT_op_move_wide_from16: /* 0x05 */
7350/* File: arm64/alt_stub.S */
7351/*
7352 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7353 * any interesting requests and then jump to the real instruction
7354 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7355 */
7356 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007357 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7358 adr lr, artMterpAsmInstructionStart + (5 * 128) // Addr of primary handler.
7359 mov x0, xSELF
7360 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007361 mov x2, xPC
7362 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007363
7364/* ------------------------------ */
7365 .balign 128
7366.L_ALT_op_move_wide_16: /* 0x06 */
7367/* File: arm64/alt_stub.S */
7368/*
7369 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7370 * any interesting requests and then jump to the real instruction
7371 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7372 */
7373 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007374 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7375 adr lr, artMterpAsmInstructionStart + (6 * 128) // Addr of primary handler.
7376 mov x0, xSELF
7377 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007378 mov x2, xPC
7379 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007380
7381/* ------------------------------ */
7382 .balign 128
7383.L_ALT_op_move_object: /* 0x07 */
7384/* File: arm64/alt_stub.S */
7385/*
7386 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7387 * any interesting requests and then jump to the real instruction
7388 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7389 */
7390 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007391 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7392 adr lr, artMterpAsmInstructionStart + (7 * 128) // Addr of primary handler.
7393 mov x0, xSELF
7394 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007395 mov x2, xPC
7396 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007397
7398/* ------------------------------ */
7399 .balign 128
7400.L_ALT_op_move_object_from16: /* 0x08 */
7401/* File: arm64/alt_stub.S */
7402/*
7403 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7404 * any interesting requests and then jump to the real instruction
7405 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7406 */
7407 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007408 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7409 adr lr, artMterpAsmInstructionStart + (8 * 128) // Addr of primary handler.
7410 mov x0, xSELF
7411 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007412 mov x2, xPC
7413 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007414
7415/* ------------------------------ */
7416 .balign 128
7417.L_ALT_op_move_object_16: /* 0x09 */
7418/* File: arm64/alt_stub.S */
7419/*
7420 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7421 * any interesting requests and then jump to the real instruction
7422 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7423 */
7424 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007425 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7426 adr lr, artMterpAsmInstructionStart + (9 * 128) // Addr of primary handler.
7427 mov x0, xSELF
7428 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007429 mov x2, xPC
7430 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007431
7432/* ------------------------------ */
7433 .balign 128
7434.L_ALT_op_move_result: /* 0x0a */
7435/* File: arm64/alt_stub.S */
7436/*
7437 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7438 * any interesting requests and then jump to the real instruction
7439 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7440 */
7441 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007442 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7443 adr lr, artMterpAsmInstructionStart + (10 * 128) // Addr of primary handler.
7444 mov x0, xSELF
7445 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007446 mov x2, xPC
7447 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007448
7449/* ------------------------------ */
7450 .balign 128
7451.L_ALT_op_move_result_wide: /* 0x0b */
7452/* File: arm64/alt_stub.S */
7453/*
7454 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7455 * any interesting requests and then jump to the real instruction
7456 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7457 */
7458 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007459 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7460 adr lr, artMterpAsmInstructionStart + (11 * 128) // Addr of primary handler.
7461 mov x0, xSELF
7462 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007463 mov x2, xPC
7464 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007465
7466/* ------------------------------ */
7467 .balign 128
7468.L_ALT_op_move_result_object: /* 0x0c */
7469/* File: arm64/alt_stub.S */
7470/*
7471 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7472 * any interesting requests and then jump to the real instruction
7473 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7474 */
7475 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007476 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7477 adr lr, artMterpAsmInstructionStart + (12 * 128) // Addr of primary handler.
7478 mov x0, xSELF
7479 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007480 mov x2, xPC
7481 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007482
7483/* ------------------------------ */
7484 .balign 128
7485.L_ALT_op_move_exception: /* 0x0d */
7486/* File: arm64/alt_stub.S */
7487/*
7488 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7489 * any interesting requests and then jump to the real instruction
7490 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7491 */
7492 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007493 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7494 adr lr, artMterpAsmInstructionStart + (13 * 128) // Addr of primary handler.
7495 mov x0, xSELF
7496 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007497 mov x2, xPC
7498 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007499
7500/* ------------------------------ */
7501 .balign 128
7502.L_ALT_op_return_void: /* 0x0e */
7503/* File: arm64/alt_stub.S */
7504/*
7505 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7506 * any interesting requests and then jump to the real instruction
7507 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7508 */
7509 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007510 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7511 adr lr, artMterpAsmInstructionStart + (14 * 128) // Addr of primary handler.
7512 mov x0, xSELF
7513 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007514 mov x2, xPC
7515 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007516
7517/* ------------------------------ */
7518 .balign 128
7519.L_ALT_op_return: /* 0x0f */
7520/* File: arm64/alt_stub.S */
7521/*
7522 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7523 * any interesting requests and then jump to the real instruction
7524 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7525 */
7526 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007527 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7528 adr lr, artMterpAsmInstructionStart + (15 * 128) // Addr of primary handler.
7529 mov x0, xSELF
7530 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007531 mov x2, xPC
7532 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007533
7534/* ------------------------------ */
7535 .balign 128
7536.L_ALT_op_return_wide: /* 0x10 */
7537/* File: arm64/alt_stub.S */
7538/*
7539 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7540 * any interesting requests and then jump to the real instruction
7541 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7542 */
7543 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007544 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7545 adr lr, artMterpAsmInstructionStart + (16 * 128) // Addr of primary handler.
7546 mov x0, xSELF
7547 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007548 mov x2, xPC
7549 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007550
7551/* ------------------------------ */
7552 .balign 128
7553.L_ALT_op_return_object: /* 0x11 */
7554/* File: arm64/alt_stub.S */
7555/*
7556 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7557 * any interesting requests and then jump to the real instruction
7558 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7559 */
7560 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007561 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7562 adr lr, artMterpAsmInstructionStart + (17 * 128) // Addr of primary handler.
7563 mov x0, xSELF
7564 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007565 mov x2, xPC
7566 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007567
7568/* ------------------------------ */
7569 .balign 128
7570.L_ALT_op_const_4: /* 0x12 */
7571/* File: arm64/alt_stub.S */
7572/*
7573 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7574 * any interesting requests and then jump to the real instruction
7575 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7576 */
7577 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007578 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7579 adr lr, artMterpAsmInstructionStart + (18 * 128) // Addr of primary handler.
7580 mov x0, xSELF
7581 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007582 mov x2, xPC
7583 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007584
7585/* ------------------------------ */
7586 .balign 128
7587.L_ALT_op_const_16: /* 0x13 */
7588/* File: arm64/alt_stub.S */
7589/*
7590 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7591 * any interesting requests and then jump to the real instruction
7592 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7593 */
7594 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007595 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7596 adr lr, artMterpAsmInstructionStart + (19 * 128) // Addr of primary handler.
7597 mov x0, xSELF
7598 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007599 mov x2, xPC
7600 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007601
7602/* ------------------------------ */
7603 .balign 128
7604.L_ALT_op_const: /* 0x14 */
7605/* File: arm64/alt_stub.S */
7606/*
7607 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7608 * any interesting requests and then jump to the real instruction
7609 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7610 */
7611 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007612 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7613 adr lr, artMterpAsmInstructionStart + (20 * 128) // Addr of primary handler.
7614 mov x0, xSELF
7615 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007616 mov x2, xPC
7617 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007618
7619/* ------------------------------ */
7620 .balign 128
7621.L_ALT_op_const_high16: /* 0x15 */
7622/* File: arm64/alt_stub.S */
7623/*
7624 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7625 * any interesting requests and then jump to the real instruction
7626 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7627 */
7628 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007629 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7630 adr lr, artMterpAsmInstructionStart + (21 * 128) // Addr of primary handler.
7631 mov x0, xSELF
7632 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007633 mov x2, xPC
7634 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007635
7636/* ------------------------------ */
7637 .balign 128
7638.L_ALT_op_const_wide_16: /* 0x16 */
7639/* File: arm64/alt_stub.S */
7640/*
7641 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7642 * any interesting requests and then jump to the real instruction
7643 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7644 */
7645 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007646 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7647 adr lr, artMterpAsmInstructionStart + (22 * 128) // Addr of primary handler.
7648 mov x0, xSELF
7649 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007650 mov x2, xPC
7651 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007652
7653/* ------------------------------ */
7654 .balign 128
7655.L_ALT_op_const_wide_32: /* 0x17 */
7656/* File: arm64/alt_stub.S */
7657/*
7658 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7659 * any interesting requests and then jump to the real instruction
7660 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7661 */
7662 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007663 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7664 adr lr, artMterpAsmInstructionStart + (23 * 128) // Addr of primary handler.
7665 mov x0, xSELF
7666 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007667 mov x2, xPC
7668 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007669
7670/* ------------------------------ */
7671 .balign 128
7672.L_ALT_op_const_wide: /* 0x18 */
7673/* File: arm64/alt_stub.S */
7674/*
7675 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7676 * any interesting requests and then jump to the real instruction
7677 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7678 */
7679 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007680 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7681 adr lr, artMterpAsmInstructionStart + (24 * 128) // Addr of primary handler.
7682 mov x0, xSELF
7683 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007684 mov x2, xPC
7685 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007686
7687/* ------------------------------ */
7688 .balign 128
7689.L_ALT_op_const_wide_high16: /* 0x19 */
7690/* File: arm64/alt_stub.S */
7691/*
7692 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7693 * any interesting requests and then jump to the real instruction
7694 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7695 */
7696 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007697 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7698 adr lr, artMterpAsmInstructionStart + (25 * 128) // Addr of primary handler.
7699 mov x0, xSELF
7700 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007701 mov x2, xPC
7702 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007703
7704/* ------------------------------ */
7705 .balign 128
7706.L_ALT_op_const_string: /* 0x1a */
7707/* File: arm64/alt_stub.S */
7708/*
7709 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7710 * any interesting requests and then jump to the real instruction
7711 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7712 */
7713 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007714 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7715 adr lr, artMterpAsmInstructionStart + (26 * 128) // Addr of primary handler.
7716 mov x0, xSELF
7717 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007718 mov x2, xPC
7719 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007720
7721/* ------------------------------ */
7722 .balign 128
7723.L_ALT_op_const_string_jumbo: /* 0x1b */
7724/* File: arm64/alt_stub.S */
7725/*
7726 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7727 * any interesting requests and then jump to the real instruction
7728 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7729 */
7730 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007731 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7732 adr lr, artMterpAsmInstructionStart + (27 * 128) // Addr of primary handler.
7733 mov x0, xSELF
7734 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007735 mov x2, xPC
7736 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007737
7738/* ------------------------------ */
7739 .balign 128
7740.L_ALT_op_const_class: /* 0x1c */
7741/* File: arm64/alt_stub.S */
7742/*
7743 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7744 * any interesting requests and then jump to the real instruction
7745 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7746 */
7747 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007748 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7749 adr lr, artMterpAsmInstructionStart + (28 * 128) // Addr of primary handler.
7750 mov x0, xSELF
7751 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007752 mov x2, xPC
7753 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007754
7755/* ------------------------------ */
7756 .balign 128
7757.L_ALT_op_monitor_enter: /* 0x1d */
7758/* File: arm64/alt_stub.S */
7759/*
7760 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7761 * any interesting requests and then jump to the real instruction
7762 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7763 */
7764 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007765 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7766 adr lr, artMterpAsmInstructionStart + (29 * 128) // Addr of primary handler.
7767 mov x0, xSELF
7768 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007769 mov x2, xPC
7770 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007771
7772/* ------------------------------ */
7773 .balign 128
7774.L_ALT_op_monitor_exit: /* 0x1e */
7775/* File: arm64/alt_stub.S */
7776/*
7777 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7778 * any interesting requests and then jump to the real instruction
7779 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7780 */
7781 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007782 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7783 adr lr, artMterpAsmInstructionStart + (30 * 128) // Addr of primary handler.
7784 mov x0, xSELF
7785 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007786 mov x2, xPC
7787 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007788
7789/* ------------------------------ */
7790 .balign 128
7791.L_ALT_op_check_cast: /* 0x1f */
7792/* File: arm64/alt_stub.S */
7793/*
7794 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7795 * any interesting requests and then jump to the real instruction
7796 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7797 */
7798 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007799 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7800 adr lr, artMterpAsmInstructionStart + (31 * 128) // Addr of primary handler.
7801 mov x0, xSELF
7802 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007803 mov x2, xPC
7804 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007805
7806/* ------------------------------ */
7807 .balign 128
7808.L_ALT_op_instance_of: /* 0x20 */
7809/* File: arm64/alt_stub.S */
7810/*
7811 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7812 * any interesting requests and then jump to the real instruction
7813 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7814 */
7815 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007816 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7817 adr lr, artMterpAsmInstructionStart + (32 * 128) // Addr of primary handler.
7818 mov x0, xSELF
7819 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007820 mov x2, xPC
7821 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007822
7823/* ------------------------------ */
7824 .balign 128
7825.L_ALT_op_array_length: /* 0x21 */
7826/* File: arm64/alt_stub.S */
7827/*
7828 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7829 * any interesting requests and then jump to the real instruction
7830 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7831 */
7832 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007833 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7834 adr lr, artMterpAsmInstructionStart + (33 * 128) // Addr of primary handler.
7835 mov x0, xSELF
7836 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007837 mov x2, xPC
7838 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007839
7840/* ------------------------------ */
7841 .balign 128
7842.L_ALT_op_new_instance: /* 0x22 */
7843/* File: arm64/alt_stub.S */
7844/*
7845 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7846 * any interesting requests and then jump to the real instruction
7847 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7848 */
7849 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007850 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7851 adr lr, artMterpAsmInstructionStart + (34 * 128) // Addr of primary handler.
7852 mov x0, xSELF
7853 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007854 mov x2, xPC
7855 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007856
7857/* ------------------------------ */
7858 .balign 128
7859.L_ALT_op_new_array: /* 0x23 */
7860/* File: arm64/alt_stub.S */
7861/*
7862 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7863 * any interesting requests and then jump to the real instruction
7864 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7865 */
7866 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007867 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7868 adr lr, artMterpAsmInstructionStart + (35 * 128) // Addr of primary handler.
7869 mov x0, xSELF
7870 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007871 mov x2, xPC
7872 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007873
7874/* ------------------------------ */
7875 .balign 128
7876.L_ALT_op_filled_new_array: /* 0x24 */
7877/* File: arm64/alt_stub.S */
7878/*
7879 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7880 * any interesting requests and then jump to the real instruction
7881 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7882 */
7883 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007884 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7885 adr lr, artMterpAsmInstructionStart + (36 * 128) // Addr of primary handler.
7886 mov x0, xSELF
7887 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007888 mov x2, xPC
7889 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007890
7891/* ------------------------------ */
7892 .balign 128
7893.L_ALT_op_filled_new_array_range: /* 0x25 */
7894/* File: arm64/alt_stub.S */
7895/*
7896 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7897 * any interesting requests and then jump to the real instruction
7898 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7899 */
7900 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007901 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7902 adr lr, artMterpAsmInstructionStart + (37 * 128) // Addr of primary handler.
7903 mov x0, xSELF
7904 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007905 mov x2, xPC
7906 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007907
7908/* ------------------------------ */
7909 .balign 128
7910.L_ALT_op_fill_array_data: /* 0x26 */
7911/* File: arm64/alt_stub.S */
7912/*
7913 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7914 * any interesting requests and then jump to the real instruction
7915 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7916 */
7917 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007918 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7919 adr lr, artMterpAsmInstructionStart + (38 * 128) // Addr of primary handler.
7920 mov x0, xSELF
7921 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007922 mov x2, xPC
7923 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007924
7925/* ------------------------------ */
7926 .balign 128
7927.L_ALT_op_throw: /* 0x27 */
7928/* File: arm64/alt_stub.S */
7929/*
7930 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7931 * any interesting requests and then jump to the real instruction
7932 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7933 */
7934 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007935 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7936 adr lr, artMterpAsmInstructionStart + (39 * 128) // Addr of primary handler.
7937 mov x0, xSELF
7938 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007939 mov x2, xPC
7940 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007941
7942/* ------------------------------ */
7943 .balign 128
7944.L_ALT_op_goto: /* 0x28 */
7945/* File: arm64/alt_stub.S */
7946/*
7947 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7948 * any interesting requests and then jump to the real instruction
7949 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7950 */
7951 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007952 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7953 adr lr, artMterpAsmInstructionStart + (40 * 128) // Addr of primary handler.
7954 mov x0, xSELF
7955 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007956 mov x2, xPC
7957 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007958
7959/* ------------------------------ */
7960 .balign 128
7961.L_ALT_op_goto_16: /* 0x29 */
7962/* File: arm64/alt_stub.S */
7963/*
7964 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7965 * any interesting requests and then jump to the real instruction
7966 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7967 */
7968 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007969 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7970 adr lr, artMterpAsmInstructionStart + (41 * 128) // Addr of primary handler.
7971 mov x0, xSELF
7972 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007973 mov x2, xPC
7974 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007975
7976/* ------------------------------ */
7977 .balign 128
7978.L_ALT_op_goto_32: /* 0x2a */
7979/* File: arm64/alt_stub.S */
7980/*
7981 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7982 * any interesting requests and then jump to the real instruction
7983 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7984 */
7985 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007986 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
7987 adr lr, artMterpAsmInstructionStart + (42 * 128) // Addr of primary handler.
7988 mov x0, xSELF
7989 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00007990 mov x2, xPC
7991 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00007992
7993/* ------------------------------ */
7994 .balign 128
7995.L_ALT_op_packed_switch: /* 0x2b */
7996/* File: arm64/alt_stub.S */
7997/*
7998 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7999 * any interesting requests and then jump to the real instruction
8000 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8001 */
8002 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008003 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8004 adr lr, artMterpAsmInstructionStart + (43 * 128) // Addr of primary handler.
8005 mov x0, xSELF
8006 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008007 mov x2, xPC
8008 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008009
8010/* ------------------------------ */
8011 .balign 128
8012.L_ALT_op_sparse_switch: /* 0x2c */
8013/* File: arm64/alt_stub.S */
8014/*
8015 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8016 * any interesting requests and then jump to the real instruction
8017 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8018 */
8019 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008020 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8021 adr lr, artMterpAsmInstructionStart + (44 * 128) // Addr of primary handler.
8022 mov x0, xSELF
8023 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008024 mov x2, xPC
8025 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008026
8027/* ------------------------------ */
8028 .balign 128
8029.L_ALT_op_cmpl_float: /* 0x2d */
8030/* File: arm64/alt_stub.S */
8031/*
8032 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8033 * any interesting requests and then jump to the real instruction
8034 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8035 */
8036 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008037 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8038 adr lr, artMterpAsmInstructionStart + (45 * 128) // Addr of primary handler.
8039 mov x0, xSELF
8040 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008041 mov x2, xPC
8042 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008043
8044/* ------------------------------ */
8045 .balign 128
8046.L_ALT_op_cmpg_float: /* 0x2e */
8047/* File: arm64/alt_stub.S */
8048/*
8049 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8050 * any interesting requests and then jump to the real instruction
8051 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8052 */
8053 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008054 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8055 adr lr, artMterpAsmInstructionStart + (46 * 128) // Addr of primary handler.
8056 mov x0, xSELF
8057 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008058 mov x2, xPC
8059 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008060
8061/* ------------------------------ */
8062 .balign 128
8063.L_ALT_op_cmpl_double: /* 0x2f */
8064/* File: arm64/alt_stub.S */
8065/*
8066 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8067 * any interesting requests and then jump to the real instruction
8068 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8069 */
8070 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008071 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8072 adr lr, artMterpAsmInstructionStart + (47 * 128) // Addr of primary handler.
8073 mov x0, xSELF
8074 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008075 mov x2, xPC
8076 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008077
8078/* ------------------------------ */
8079 .balign 128
8080.L_ALT_op_cmpg_double: /* 0x30 */
8081/* File: arm64/alt_stub.S */
8082/*
8083 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8084 * any interesting requests and then jump to the real instruction
8085 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8086 */
8087 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008088 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8089 adr lr, artMterpAsmInstructionStart + (48 * 128) // Addr of primary handler.
8090 mov x0, xSELF
8091 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008092 mov x2, xPC
8093 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008094
8095/* ------------------------------ */
8096 .balign 128
8097.L_ALT_op_cmp_long: /* 0x31 */
8098/* File: arm64/alt_stub.S */
8099/*
8100 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8101 * any interesting requests and then jump to the real instruction
8102 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8103 */
8104 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008105 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8106 adr lr, artMterpAsmInstructionStart + (49 * 128) // Addr of primary handler.
8107 mov x0, xSELF
8108 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008109 mov x2, xPC
8110 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008111
8112/* ------------------------------ */
8113 .balign 128
8114.L_ALT_op_if_eq: /* 0x32 */
8115/* File: arm64/alt_stub.S */
8116/*
8117 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8118 * any interesting requests and then jump to the real instruction
8119 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8120 */
8121 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008122 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8123 adr lr, artMterpAsmInstructionStart + (50 * 128) // Addr of primary handler.
8124 mov x0, xSELF
8125 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008126 mov x2, xPC
8127 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008128
8129/* ------------------------------ */
8130 .balign 128
8131.L_ALT_op_if_ne: /* 0x33 */
8132/* File: arm64/alt_stub.S */
8133/*
8134 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8135 * any interesting requests and then jump to the real instruction
8136 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8137 */
8138 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008139 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8140 adr lr, artMterpAsmInstructionStart + (51 * 128) // Addr of primary handler.
8141 mov x0, xSELF
8142 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008143 mov x2, xPC
8144 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008145
8146/* ------------------------------ */
8147 .balign 128
8148.L_ALT_op_if_lt: /* 0x34 */
8149/* File: arm64/alt_stub.S */
8150/*
8151 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8152 * any interesting requests and then jump to the real instruction
8153 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8154 */
8155 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008156 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8157 adr lr, artMterpAsmInstructionStart + (52 * 128) // Addr of primary handler.
8158 mov x0, xSELF
8159 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008160 mov x2, xPC
8161 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008162
8163/* ------------------------------ */
8164 .balign 128
8165.L_ALT_op_if_ge: /* 0x35 */
8166/* File: arm64/alt_stub.S */
8167/*
8168 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8169 * any interesting requests and then jump to the real instruction
8170 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8171 */
8172 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008173 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8174 adr lr, artMterpAsmInstructionStart + (53 * 128) // Addr of primary handler.
8175 mov x0, xSELF
8176 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008177 mov x2, xPC
8178 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008179
8180/* ------------------------------ */
8181 .balign 128
8182.L_ALT_op_if_gt: /* 0x36 */
8183/* File: arm64/alt_stub.S */
8184/*
8185 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8186 * any interesting requests and then jump to the real instruction
8187 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8188 */
8189 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008190 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8191 adr lr, artMterpAsmInstructionStart + (54 * 128) // Addr of primary handler.
8192 mov x0, xSELF
8193 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008194 mov x2, xPC
8195 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008196
8197/* ------------------------------ */
8198 .balign 128
8199.L_ALT_op_if_le: /* 0x37 */
8200/* File: arm64/alt_stub.S */
8201/*
8202 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8203 * any interesting requests and then jump to the real instruction
8204 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8205 */
8206 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008207 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8208 adr lr, artMterpAsmInstructionStart + (55 * 128) // Addr of primary handler.
8209 mov x0, xSELF
8210 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008211 mov x2, xPC
8212 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008213
8214/* ------------------------------ */
8215 .balign 128
8216.L_ALT_op_if_eqz: /* 0x38 */
8217/* File: arm64/alt_stub.S */
8218/*
8219 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8220 * any interesting requests and then jump to the real instruction
8221 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8222 */
8223 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008224 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8225 adr lr, artMterpAsmInstructionStart + (56 * 128) // Addr of primary handler.
8226 mov x0, xSELF
8227 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008228 mov x2, xPC
8229 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008230
8231/* ------------------------------ */
8232 .balign 128
8233.L_ALT_op_if_nez: /* 0x39 */
8234/* File: arm64/alt_stub.S */
8235/*
8236 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8237 * any interesting requests and then jump to the real instruction
8238 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8239 */
8240 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008241 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8242 adr lr, artMterpAsmInstructionStart + (57 * 128) // Addr of primary handler.
8243 mov x0, xSELF
8244 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008245 mov x2, xPC
8246 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008247
8248/* ------------------------------ */
8249 .balign 128
8250.L_ALT_op_if_ltz: /* 0x3a */
8251/* File: arm64/alt_stub.S */
8252/*
8253 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8254 * any interesting requests and then jump to the real instruction
8255 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8256 */
8257 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008258 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8259 adr lr, artMterpAsmInstructionStart + (58 * 128) // Addr of primary handler.
8260 mov x0, xSELF
8261 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008262 mov x2, xPC
8263 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008264
8265/* ------------------------------ */
8266 .balign 128
8267.L_ALT_op_if_gez: /* 0x3b */
8268/* File: arm64/alt_stub.S */
8269/*
8270 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8271 * any interesting requests and then jump to the real instruction
8272 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8273 */
8274 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008275 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8276 adr lr, artMterpAsmInstructionStart + (59 * 128) // Addr of primary handler.
8277 mov x0, xSELF
8278 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008279 mov x2, xPC
8280 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008281
8282/* ------------------------------ */
8283 .balign 128
8284.L_ALT_op_if_gtz: /* 0x3c */
8285/* File: arm64/alt_stub.S */
8286/*
8287 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8288 * any interesting requests and then jump to the real instruction
8289 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8290 */
8291 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008292 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8293 adr lr, artMterpAsmInstructionStart + (60 * 128) // Addr of primary handler.
8294 mov x0, xSELF
8295 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008296 mov x2, xPC
8297 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008298
8299/* ------------------------------ */
8300 .balign 128
8301.L_ALT_op_if_lez: /* 0x3d */
8302/* File: arm64/alt_stub.S */
8303/*
8304 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8305 * any interesting requests and then jump to the real instruction
8306 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8307 */
8308 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008309 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8310 adr lr, artMterpAsmInstructionStart + (61 * 128) // Addr of primary handler.
8311 mov x0, xSELF
8312 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008313 mov x2, xPC
8314 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008315
8316/* ------------------------------ */
8317 .balign 128
8318.L_ALT_op_unused_3e: /* 0x3e */
8319/* File: arm64/alt_stub.S */
8320/*
8321 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8322 * any interesting requests and then jump to the real instruction
8323 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8324 */
8325 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008326 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8327 adr lr, artMterpAsmInstructionStart + (62 * 128) // Addr of primary handler.
8328 mov x0, xSELF
8329 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008330 mov x2, xPC
8331 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008332
8333/* ------------------------------ */
8334 .balign 128
8335.L_ALT_op_unused_3f: /* 0x3f */
8336/* File: arm64/alt_stub.S */
8337/*
8338 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8339 * any interesting requests and then jump to the real instruction
8340 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8341 */
8342 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008343 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8344 adr lr, artMterpAsmInstructionStart + (63 * 128) // Addr of primary handler.
8345 mov x0, xSELF
8346 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008347 mov x2, xPC
8348 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008349
8350/* ------------------------------ */
8351 .balign 128
8352.L_ALT_op_unused_40: /* 0x40 */
8353/* File: arm64/alt_stub.S */
8354/*
8355 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8356 * any interesting requests and then jump to the real instruction
8357 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8358 */
8359 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008360 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8361 adr lr, artMterpAsmInstructionStart + (64 * 128) // Addr of primary handler.
8362 mov x0, xSELF
8363 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008364 mov x2, xPC
8365 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008366
8367/* ------------------------------ */
8368 .balign 128
8369.L_ALT_op_unused_41: /* 0x41 */
8370/* File: arm64/alt_stub.S */
8371/*
8372 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8373 * any interesting requests and then jump to the real instruction
8374 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8375 */
8376 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008377 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8378 adr lr, artMterpAsmInstructionStart + (65 * 128) // Addr of primary handler.
8379 mov x0, xSELF
8380 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008381 mov x2, xPC
8382 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008383
8384/* ------------------------------ */
8385 .balign 128
8386.L_ALT_op_unused_42: /* 0x42 */
8387/* File: arm64/alt_stub.S */
8388/*
8389 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8390 * any interesting requests and then jump to the real instruction
8391 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8392 */
8393 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008394 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8395 adr lr, artMterpAsmInstructionStart + (66 * 128) // Addr of primary handler.
8396 mov x0, xSELF
8397 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008398 mov x2, xPC
8399 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008400
8401/* ------------------------------ */
8402 .balign 128
8403.L_ALT_op_unused_43: /* 0x43 */
8404/* File: arm64/alt_stub.S */
8405/*
8406 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8407 * any interesting requests and then jump to the real instruction
8408 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8409 */
8410 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008411 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8412 adr lr, artMterpAsmInstructionStart + (67 * 128) // Addr of primary handler.
8413 mov x0, xSELF
8414 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008415 mov x2, xPC
8416 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008417
8418/* ------------------------------ */
8419 .balign 128
8420.L_ALT_op_aget: /* 0x44 */
8421/* File: arm64/alt_stub.S */
8422/*
8423 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8424 * any interesting requests and then jump to the real instruction
8425 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8426 */
8427 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008428 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8429 adr lr, artMterpAsmInstructionStart + (68 * 128) // Addr of primary handler.
8430 mov x0, xSELF
8431 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008432 mov x2, xPC
8433 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008434
8435/* ------------------------------ */
8436 .balign 128
8437.L_ALT_op_aget_wide: /* 0x45 */
8438/* File: arm64/alt_stub.S */
8439/*
8440 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8441 * any interesting requests and then jump to the real instruction
8442 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8443 */
8444 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008445 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8446 adr lr, artMterpAsmInstructionStart + (69 * 128) // Addr of primary handler.
8447 mov x0, xSELF
8448 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008449 mov x2, xPC
8450 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008451
8452/* ------------------------------ */
8453 .balign 128
8454.L_ALT_op_aget_object: /* 0x46 */
8455/* File: arm64/alt_stub.S */
8456/*
8457 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8458 * any interesting requests and then jump to the real instruction
8459 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8460 */
8461 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008462 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8463 adr lr, artMterpAsmInstructionStart + (70 * 128) // Addr of primary handler.
8464 mov x0, xSELF
8465 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008466 mov x2, xPC
8467 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008468
8469/* ------------------------------ */
8470 .balign 128
8471.L_ALT_op_aget_boolean: /* 0x47 */
8472/* File: arm64/alt_stub.S */
8473/*
8474 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8475 * any interesting requests and then jump to the real instruction
8476 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8477 */
8478 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008479 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8480 adr lr, artMterpAsmInstructionStart + (71 * 128) // Addr of primary handler.
8481 mov x0, xSELF
8482 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008483 mov x2, xPC
8484 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008485
8486/* ------------------------------ */
8487 .balign 128
8488.L_ALT_op_aget_byte: /* 0x48 */
8489/* File: arm64/alt_stub.S */
8490/*
8491 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8492 * any interesting requests and then jump to the real instruction
8493 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8494 */
8495 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008496 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8497 adr lr, artMterpAsmInstructionStart + (72 * 128) // Addr of primary handler.
8498 mov x0, xSELF
8499 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008500 mov x2, xPC
8501 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008502
8503/* ------------------------------ */
8504 .balign 128
8505.L_ALT_op_aget_char: /* 0x49 */
8506/* File: arm64/alt_stub.S */
8507/*
8508 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8509 * any interesting requests and then jump to the real instruction
8510 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8511 */
8512 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008513 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8514 adr lr, artMterpAsmInstructionStart + (73 * 128) // Addr of primary handler.
8515 mov x0, xSELF
8516 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008517 mov x2, xPC
8518 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008519
8520/* ------------------------------ */
8521 .balign 128
8522.L_ALT_op_aget_short: /* 0x4a */
8523/* File: arm64/alt_stub.S */
8524/*
8525 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8526 * any interesting requests and then jump to the real instruction
8527 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8528 */
8529 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008530 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8531 adr lr, artMterpAsmInstructionStart + (74 * 128) // Addr of primary handler.
8532 mov x0, xSELF
8533 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008534 mov x2, xPC
8535 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008536
8537/* ------------------------------ */
8538 .balign 128
8539.L_ALT_op_aput: /* 0x4b */
8540/* File: arm64/alt_stub.S */
8541/*
8542 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8543 * any interesting requests and then jump to the real instruction
8544 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8545 */
8546 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008547 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8548 adr lr, artMterpAsmInstructionStart + (75 * 128) // Addr of primary handler.
8549 mov x0, xSELF
8550 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008551 mov x2, xPC
8552 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008553
8554/* ------------------------------ */
8555 .balign 128
8556.L_ALT_op_aput_wide: /* 0x4c */
8557/* File: arm64/alt_stub.S */
8558/*
8559 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8560 * any interesting requests and then jump to the real instruction
8561 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8562 */
8563 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008564 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8565 adr lr, artMterpAsmInstructionStart + (76 * 128) // Addr of primary handler.
8566 mov x0, xSELF
8567 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008568 mov x2, xPC
8569 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008570
8571/* ------------------------------ */
8572 .balign 128
8573.L_ALT_op_aput_object: /* 0x4d */
8574/* File: arm64/alt_stub.S */
8575/*
8576 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8577 * any interesting requests and then jump to the real instruction
8578 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8579 */
8580 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008581 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8582 adr lr, artMterpAsmInstructionStart + (77 * 128) // Addr of primary handler.
8583 mov x0, xSELF
8584 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008585 mov x2, xPC
8586 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008587
8588/* ------------------------------ */
8589 .balign 128
8590.L_ALT_op_aput_boolean: /* 0x4e */
8591/* File: arm64/alt_stub.S */
8592/*
8593 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8594 * any interesting requests and then jump to the real instruction
8595 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8596 */
8597 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008598 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8599 adr lr, artMterpAsmInstructionStart + (78 * 128) // Addr of primary handler.
8600 mov x0, xSELF
8601 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008602 mov x2, xPC
8603 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008604
8605/* ------------------------------ */
8606 .balign 128
8607.L_ALT_op_aput_byte: /* 0x4f */
8608/* File: arm64/alt_stub.S */
8609/*
8610 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8611 * any interesting requests and then jump to the real instruction
8612 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8613 */
8614 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008615 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8616 adr lr, artMterpAsmInstructionStart + (79 * 128) // Addr of primary handler.
8617 mov x0, xSELF
8618 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008619 mov x2, xPC
8620 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008621
8622/* ------------------------------ */
8623 .balign 128
8624.L_ALT_op_aput_char: /* 0x50 */
8625/* File: arm64/alt_stub.S */
8626/*
8627 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8628 * any interesting requests and then jump to the real instruction
8629 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8630 */
8631 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008632 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8633 adr lr, artMterpAsmInstructionStart + (80 * 128) // Addr of primary handler.
8634 mov x0, xSELF
8635 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008636 mov x2, xPC
8637 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008638
8639/* ------------------------------ */
8640 .balign 128
8641.L_ALT_op_aput_short: /* 0x51 */
8642/* File: arm64/alt_stub.S */
8643/*
8644 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8645 * any interesting requests and then jump to the real instruction
8646 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8647 */
8648 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008649 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8650 adr lr, artMterpAsmInstructionStart + (81 * 128) // Addr of primary handler.
8651 mov x0, xSELF
8652 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008653 mov x2, xPC
8654 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008655
8656/* ------------------------------ */
8657 .balign 128
8658.L_ALT_op_iget: /* 0x52 */
8659/* File: arm64/alt_stub.S */
8660/*
8661 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8662 * any interesting requests and then jump to the real instruction
8663 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8664 */
8665 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008666 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8667 adr lr, artMterpAsmInstructionStart + (82 * 128) // Addr of primary handler.
8668 mov x0, xSELF
8669 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008670 mov x2, xPC
8671 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008672
8673/* ------------------------------ */
8674 .balign 128
8675.L_ALT_op_iget_wide: /* 0x53 */
8676/* File: arm64/alt_stub.S */
8677/*
8678 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8679 * any interesting requests and then jump to the real instruction
8680 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8681 */
8682 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008683 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8684 adr lr, artMterpAsmInstructionStart + (83 * 128) // Addr of primary handler.
8685 mov x0, xSELF
8686 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008687 mov x2, xPC
8688 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008689
8690/* ------------------------------ */
8691 .balign 128
8692.L_ALT_op_iget_object: /* 0x54 */
8693/* File: arm64/alt_stub.S */
8694/*
8695 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8696 * any interesting requests and then jump to the real instruction
8697 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8698 */
8699 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008700 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8701 adr lr, artMterpAsmInstructionStart + (84 * 128) // Addr of primary handler.
8702 mov x0, xSELF
8703 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008704 mov x2, xPC
8705 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008706
8707/* ------------------------------ */
8708 .balign 128
8709.L_ALT_op_iget_boolean: /* 0x55 */
8710/* File: arm64/alt_stub.S */
8711/*
8712 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8713 * any interesting requests and then jump to the real instruction
8714 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8715 */
8716 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008717 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8718 adr lr, artMterpAsmInstructionStart + (85 * 128) // Addr of primary handler.
8719 mov x0, xSELF
8720 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008721 mov x2, xPC
8722 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008723
8724/* ------------------------------ */
8725 .balign 128
8726.L_ALT_op_iget_byte: /* 0x56 */
8727/* File: arm64/alt_stub.S */
8728/*
8729 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8730 * any interesting requests and then jump to the real instruction
8731 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8732 */
8733 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008734 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8735 adr lr, artMterpAsmInstructionStart + (86 * 128) // Addr of primary handler.
8736 mov x0, xSELF
8737 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008738 mov x2, xPC
8739 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008740
8741/* ------------------------------ */
8742 .balign 128
8743.L_ALT_op_iget_char: /* 0x57 */
8744/* File: arm64/alt_stub.S */
8745/*
8746 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8747 * any interesting requests and then jump to the real instruction
8748 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8749 */
8750 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008751 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8752 adr lr, artMterpAsmInstructionStart + (87 * 128) // Addr of primary handler.
8753 mov x0, xSELF
8754 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008755 mov x2, xPC
8756 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008757
8758/* ------------------------------ */
8759 .balign 128
8760.L_ALT_op_iget_short: /* 0x58 */
8761/* File: arm64/alt_stub.S */
8762/*
8763 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8764 * any interesting requests and then jump to the real instruction
8765 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8766 */
8767 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008768 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8769 adr lr, artMterpAsmInstructionStart + (88 * 128) // Addr of primary handler.
8770 mov x0, xSELF
8771 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008772 mov x2, xPC
8773 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008774
8775/* ------------------------------ */
8776 .balign 128
8777.L_ALT_op_iput: /* 0x59 */
8778/* File: arm64/alt_stub.S */
8779/*
8780 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8781 * any interesting requests and then jump to the real instruction
8782 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8783 */
8784 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008785 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8786 adr lr, artMterpAsmInstructionStart + (89 * 128) // Addr of primary handler.
8787 mov x0, xSELF
8788 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008789 mov x2, xPC
8790 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008791
8792/* ------------------------------ */
8793 .balign 128
8794.L_ALT_op_iput_wide: /* 0x5a */
8795/* File: arm64/alt_stub.S */
8796/*
8797 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8798 * any interesting requests and then jump to the real instruction
8799 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8800 */
8801 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008802 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8803 adr lr, artMterpAsmInstructionStart + (90 * 128) // Addr of primary handler.
8804 mov x0, xSELF
8805 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008806 mov x2, xPC
8807 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008808
8809/* ------------------------------ */
8810 .balign 128
8811.L_ALT_op_iput_object: /* 0x5b */
8812/* File: arm64/alt_stub.S */
8813/*
8814 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8815 * any interesting requests and then jump to the real instruction
8816 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8817 */
8818 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008819 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8820 adr lr, artMterpAsmInstructionStart + (91 * 128) // Addr of primary handler.
8821 mov x0, xSELF
8822 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008823 mov x2, xPC
8824 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008825
8826/* ------------------------------ */
8827 .balign 128
8828.L_ALT_op_iput_boolean: /* 0x5c */
8829/* File: arm64/alt_stub.S */
8830/*
8831 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8832 * any interesting requests and then jump to the real instruction
8833 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8834 */
8835 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008836 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8837 adr lr, artMterpAsmInstructionStart + (92 * 128) // Addr of primary handler.
8838 mov x0, xSELF
8839 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008840 mov x2, xPC
8841 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008842
8843/* ------------------------------ */
8844 .balign 128
8845.L_ALT_op_iput_byte: /* 0x5d */
8846/* File: arm64/alt_stub.S */
8847/*
8848 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8849 * any interesting requests and then jump to the real instruction
8850 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8851 */
8852 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008853 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8854 adr lr, artMterpAsmInstructionStart + (93 * 128) // Addr of primary handler.
8855 mov x0, xSELF
8856 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008857 mov x2, xPC
8858 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008859
8860/* ------------------------------ */
8861 .balign 128
8862.L_ALT_op_iput_char: /* 0x5e */
8863/* File: arm64/alt_stub.S */
8864/*
8865 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8866 * any interesting requests and then jump to the real instruction
8867 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8868 */
8869 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008870 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8871 adr lr, artMterpAsmInstructionStart + (94 * 128) // Addr of primary handler.
8872 mov x0, xSELF
8873 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008874 mov x2, xPC
8875 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008876
8877/* ------------------------------ */
8878 .balign 128
8879.L_ALT_op_iput_short: /* 0x5f */
8880/* File: arm64/alt_stub.S */
8881/*
8882 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8883 * any interesting requests and then jump to the real instruction
8884 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8885 */
8886 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008887 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8888 adr lr, artMterpAsmInstructionStart + (95 * 128) // Addr of primary handler.
8889 mov x0, xSELF
8890 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008891 mov x2, xPC
8892 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008893
8894/* ------------------------------ */
8895 .balign 128
8896.L_ALT_op_sget: /* 0x60 */
8897/* File: arm64/alt_stub.S */
8898/*
8899 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8900 * any interesting requests and then jump to the real instruction
8901 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8902 */
8903 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008904 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8905 adr lr, artMterpAsmInstructionStart + (96 * 128) // Addr of primary handler.
8906 mov x0, xSELF
8907 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008908 mov x2, xPC
8909 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008910
8911/* ------------------------------ */
8912 .balign 128
8913.L_ALT_op_sget_wide: /* 0x61 */
8914/* File: arm64/alt_stub.S */
8915/*
8916 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8917 * any interesting requests and then jump to the real instruction
8918 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8919 */
8920 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008921 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8922 adr lr, artMterpAsmInstructionStart + (97 * 128) // Addr of primary handler.
8923 mov x0, xSELF
8924 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008925 mov x2, xPC
8926 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008927
8928/* ------------------------------ */
8929 .balign 128
8930.L_ALT_op_sget_object: /* 0x62 */
8931/* File: arm64/alt_stub.S */
8932/*
8933 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8934 * any interesting requests and then jump to the real instruction
8935 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8936 */
8937 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008938 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8939 adr lr, artMterpAsmInstructionStart + (98 * 128) // Addr of primary handler.
8940 mov x0, xSELF
8941 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008942 mov x2, xPC
8943 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008944
8945/* ------------------------------ */
8946 .balign 128
8947.L_ALT_op_sget_boolean: /* 0x63 */
8948/* File: arm64/alt_stub.S */
8949/*
8950 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8951 * any interesting requests and then jump to the real instruction
8952 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8953 */
8954 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008955 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8956 adr lr, artMterpAsmInstructionStart + (99 * 128) // Addr of primary handler.
8957 mov x0, xSELF
8958 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008959 mov x2, xPC
8960 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008961
8962/* ------------------------------ */
8963 .balign 128
8964.L_ALT_op_sget_byte: /* 0x64 */
8965/* File: arm64/alt_stub.S */
8966/*
8967 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8968 * any interesting requests and then jump to the real instruction
8969 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8970 */
8971 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008972 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8973 adr lr, artMterpAsmInstructionStart + (100 * 128) // Addr of primary handler.
8974 mov x0, xSELF
8975 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008976 mov x2, xPC
8977 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008978
8979/* ------------------------------ */
8980 .balign 128
8981.L_ALT_op_sget_char: /* 0x65 */
8982/* File: arm64/alt_stub.S */
8983/*
8984 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8985 * any interesting requests and then jump to the real instruction
8986 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8987 */
8988 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008989 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
8990 adr lr, artMterpAsmInstructionStart + (101 * 128) // Addr of primary handler.
8991 mov x0, xSELF
8992 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00008993 mov x2, xPC
8994 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00008995
8996/* ------------------------------ */
8997 .balign 128
8998.L_ALT_op_sget_short: /* 0x66 */
8999/* File: arm64/alt_stub.S */
9000/*
9001 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9002 * any interesting requests and then jump to the real instruction
9003 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9004 */
9005 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009006 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9007 adr lr, artMterpAsmInstructionStart + (102 * 128) // Addr of primary handler.
9008 mov x0, xSELF
9009 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009010 mov x2, xPC
9011 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009012
9013/* ------------------------------ */
9014 .balign 128
9015.L_ALT_op_sput: /* 0x67 */
9016/* File: arm64/alt_stub.S */
9017/*
9018 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9019 * any interesting requests and then jump to the real instruction
9020 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9021 */
9022 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009023 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9024 adr lr, artMterpAsmInstructionStart + (103 * 128) // Addr of primary handler.
9025 mov x0, xSELF
9026 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009027 mov x2, xPC
9028 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009029
9030/* ------------------------------ */
9031 .balign 128
9032.L_ALT_op_sput_wide: /* 0x68 */
9033/* File: arm64/alt_stub.S */
9034/*
9035 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9036 * any interesting requests and then jump to the real instruction
9037 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9038 */
9039 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009040 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9041 adr lr, artMterpAsmInstructionStart + (104 * 128) // Addr of primary handler.
9042 mov x0, xSELF
9043 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009044 mov x2, xPC
9045 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009046
9047/* ------------------------------ */
9048 .balign 128
9049.L_ALT_op_sput_object: /* 0x69 */
9050/* File: arm64/alt_stub.S */
9051/*
9052 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9053 * any interesting requests and then jump to the real instruction
9054 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9055 */
9056 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009057 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9058 adr lr, artMterpAsmInstructionStart + (105 * 128) // Addr of primary handler.
9059 mov x0, xSELF
9060 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009061 mov x2, xPC
9062 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009063
9064/* ------------------------------ */
9065 .balign 128
9066.L_ALT_op_sput_boolean: /* 0x6a */
9067/* File: arm64/alt_stub.S */
9068/*
9069 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9070 * any interesting requests and then jump to the real instruction
9071 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9072 */
9073 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009074 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9075 adr lr, artMterpAsmInstructionStart + (106 * 128) // Addr of primary handler.
9076 mov x0, xSELF
9077 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009078 mov x2, xPC
9079 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009080
9081/* ------------------------------ */
9082 .balign 128
9083.L_ALT_op_sput_byte: /* 0x6b */
9084/* File: arm64/alt_stub.S */
9085/*
9086 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9087 * any interesting requests and then jump to the real instruction
9088 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9089 */
9090 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009091 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9092 adr lr, artMterpAsmInstructionStart + (107 * 128) // Addr of primary handler.
9093 mov x0, xSELF
9094 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009095 mov x2, xPC
9096 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009097
9098/* ------------------------------ */
9099 .balign 128
9100.L_ALT_op_sput_char: /* 0x6c */
9101/* File: arm64/alt_stub.S */
9102/*
9103 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9104 * any interesting requests and then jump to the real instruction
9105 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9106 */
9107 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009108 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9109 adr lr, artMterpAsmInstructionStart + (108 * 128) // Addr of primary handler.
9110 mov x0, xSELF
9111 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009112 mov x2, xPC
9113 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009114
9115/* ------------------------------ */
9116 .balign 128
9117.L_ALT_op_sput_short: /* 0x6d */
9118/* File: arm64/alt_stub.S */
9119/*
9120 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9121 * any interesting requests and then jump to the real instruction
9122 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9123 */
9124 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009125 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9126 adr lr, artMterpAsmInstructionStart + (109 * 128) // Addr of primary handler.
9127 mov x0, xSELF
9128 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009129 mov x2, xPC
9130 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009131
9132/* ------------------------------ */
9133 .balign 128
9134.L_ALT_op_invoke_virtual: /* 0x6e */
9135/* File: arm64/alt_stub.S */
9136/*
9137 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9138 * any interesting requests and then jump to the real instruction
9139 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9140 */
9141 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009142 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9143 adr lr, artMterpAsmInstructionStart + (110 * 128) // Addr of primary handler.
9144 mov x0, xSELF
9145 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009146 mov x2, xPC
9147 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009148
9149/* ------------------------------ */
9150 .balign 128
9151.L_ALT_op_invoke_super: /* 0x6f */
9152/* File: arm64/alt_stub.S */
9153/*
9154 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9155 * any interesting requests and then jump to the real instruction
9156 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9157 */
9158 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009159 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9160 adr lr, artMterpAsmInstructionStart + (111 * 128) // Addr of primary handler.
9161 mov x0, xSELF
9162 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009163 mov x2, xPC
9164 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009165
9166/* ------------------------------ */
9167 .balign 128
9168.L_ALT_op_invoke_direct: /* 0x70 */
9169/* File: arm64/alt_stub.S */
9170/*
9171 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9172 * any interesting requests and then jump to the real instruction
9173 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9174 */
9175 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009176 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9177 adr lr, artMterpAsmInstructionStart + (112 * 128) // Addr of primary handler.
9178 mov x0, xSELF
9179 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009180 mov x2, xPC
9181 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009182
9183/* ------------------------------ */
9184 .balign 128
9185.L_ALT_op_invoke_static: /* 0x71 */
9186/* File: arm64/alt_stub.S */
9187/*
9188 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9189 * any interesting requests and then jump to the real instruction
9190 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9191 */
9192 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009193 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9194 adr lr, artMterpAsmInstructionStart + (113 * 128) // Addr of primary handler.
9195 mov x0, xSELF
9196 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009197 mov x2, xPC
9198 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009199
9200/* ------------------------------ */
9201 .balign 128
9202.L_ALT_op_invoke_interface: /* 0x72 */
9203/* File: arm64/alt_stub.S */
9204/*
9205 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9206 * any interesting requests and then jump to the real instruction
9207 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9208 */
9209 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009210 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9211 adr lr, artMterpAsmInstructionStart + (114 * 128) // Addr of primary handler.
9212 mov x0, xSELF
9213 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009214 mov x2, xPC
9215 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009216
9217/* ------------------------------ */
9218 .balign 128
9219.L_ALT_op_return_void_no_barrier: /* 0x73 */
9220/* File: arm64/alt_stub.S */
9221/*
9222 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9223 * any interesting requests and then jump to the real instruction
9224 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9225 */
9226 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009227 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9228 adr lr, artMterpAsmInstructionStart + (115 * 128) // Addr of primary handler.
9229 mov x0, xSELF
9230 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009231 mov x2, xPC
9232 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009233
9234/* ------------------------------ */
9235 .balign 128
9236.L_ALT_op_invoke_virtual_range: /* 0x74 */
9237/* File: arm64/alt_stub.S */
9238/*
9239 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9240 * any interesting requests and then jump to the real instruction
9241 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9242 */
9243 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009244 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9245 adr lr, artMterpAsmInstructionStart + (116 * 128) // Addr of primary handler.
9246 mov x0, xSELF
9247 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009248 mov x2, xPC
9249 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009250
9251/* ------------------------------ */
9252 .balign 128
9253.L_ALT_op_invoke_super_range: /* 0x75 */
9254/* File: arm64/alt_stub.S */
9255/*
9256 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9257 * any interesting requests and then jump to the real instruction
9258 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9259 */
9260 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009261 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9262 adr lr, artMterpAsmInstructionStart + (117 * 128) // Addr of primary handler.
9263 mov x0, xSELF
9264 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009265 mov x2, xPC
9266 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009267
9268/* ------------------------------ */
9269 .balign 128
9270.L_ALT_op_invoke_direct_range: /* 0x76 */
9271/* File: arm64/alt_stub.S */
9272/*
9273 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9274 * any interesting requests and then jump to the real instruction
9275 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9276 */
9277 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009278 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9279 adr lr, artMterpAsmInstructionStart + (118 * 128) // Addr of primary handler.
9280 mov x0, xSELF
9281 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009282 mov x2, xPC
9283 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009284
9285/* ------------------------------ */
9286 .balign 128
9287.L_ALT_op_invoke_static_range: /* 0x77 */
9288/* File: arm64/alt_stub.S */
9289/*
9290 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9291 * any interesting requests and then jump to the real instruction
9292 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9293 */
9294 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009295 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9296 adr lr, artMterpAsmInstructionStart + (119 * 128) // Addr of primary handler.
9297 mov x0, xSELF
9298 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009299 mov x2, xPC
9300 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009301
9302/* ------------------------------ */
9303 .balign 128
9304.L_ALT_op_invoke_interface_range: /* 0x78 */
9305/* File: arm64/alt_stub.S */
9306/*
9307 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9308 * any interesting requests and then jump to the real instruction
9309 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9310 */
9311 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009312 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9313 adr lr, artMterpAsmInstructionStart + (120 * 128) // Addr of primary handler.
9314 mov x0, xSELF
9315 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009316 mov x2, xPC
9317 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009318
9319/* ------------------------------ */
9320 .balign 128
9321.L_ALT_op_unused_79: /* 0x79 */
9322/* File: arm64/alt_stub.S */
9323/*
9324 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9325 * any interesting requests and then jump to the real instruction
9326 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9327 */
9328 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009329 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9330 adr lr, artMterpAsmInstructionStart + (121 * 128) // Addr of primary handler.
9331 mov x0, xSELF
9332 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009333 mov x2, xPC
9334 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009335
9336/* ------------------------------ */
9337 .balign 128
9338.L_ALT_op_unused_7a: /* 0x7a */
9339/* File: arm64/alt_stub.S */
9340/*
9341 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9342 * any interesting requests and then jump to the real instruction
9343 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9344 */
9345 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009346 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9347 adr lr, artMterpAsmInstructionStart + (122 * 128) // Addr of primary handler.
9348 mov x0, xSELF
9349 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009350 mov x2, xPC
9351 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009352
9353/* ------------------------------ */
9354 .balign 128
9355.L_ALT_op_neg_int: /* 0x7b */
9356/* File: arm64/alt_stub.S */
9357/*
9358 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9359 * any interesting requests and then jump to the real instruction
9360 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9361 */
9362 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009363 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9364 adr lr, artMterpAsmInstructionStart + (123 * 128) // Addr of primary handler.
9365 mov x0, xSELF
9366 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009367 mov x2, xPC
9368 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009369
9370/* ------------------------------ */
9371 .balign 128
9372.L_ALT_op_not_int: /* 0x7c */
9373/* File: arm64/alt_stub.S */
9374/*
9375 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9376 * any interesting requests and then jump to the real instruction
9377 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9378 */
9379 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009380 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9381 adr lr, artMterpAsmInstructionStart + (124 * 128) // Addr of primary handler.
9382 mov x0, xSELF
9383 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009384 mov x2, xPC
9385 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009386
9387/* ------------------------------ */
9388 .balign 128
9389.L_ALT_op_neg_long: /* 0x7d */
9390/* File: arm64/alt_stub.S */
9391/*
9392 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9393 * any interesting requests and then jump to the real instruction
9394 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9395 */
9396 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009397 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9398 adr lr, artMterpAsmInstructionStart + (125 * 128) // Addr of primary handler.
9399 mov x0, xSELF
9400 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009401 mov x2, xPC
9402 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009403
9404/* ------------------------------ */
9405 .balign 128
9406.L_ALT_op_not_long: /* 0x7e */
9407/* File: arm64/alt_stub.S */
9408/*
9409 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9410 * any interesting requests and then jump to the real instruction
9411 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9412 */
9413 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009414 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9415 adr lr, artMterpAsmInstructionStart + (126 * 128) // Addr of primary handler.
9416 mov x0, xSELF
9417 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009418 mov x2, xPC
9419 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009420
9421/* ------------------------------ */
9422 .balign 128
9423.L_ALT_op_neg_float: /* 0x7f */
9424/* File: arm64/alt_stub.S */
9425/*
9426 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9427 * any interesting requests and then jump to the real instruction
9428 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9429 */
9430 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009431 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9432 adr lr, artMterpAsmInstructionStart + (127 * 128) // Addr of primary handler.
9433 mov x0, xSELF
9434 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009435 mov x2, xPC
9436 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009437
9438/* ------------------------------ */
9439 .balign 128
9440.L_ALT_op_neg_double: /* 0x80 */
9441/* File: arm64/alt_stub.S */
9442/*
9443 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9444 * any interesting requests and then jump to the real instruction
9445 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9446 */
9447 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009448 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9449 adr lr, artMterpAsmInstructionStart + (128 * 128) // Addr of primary handler.
9450 mov x0, xSELF
9451 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009452 mov x2, xPC
9453 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009454
9455/* ------------------------------ */
9456 .balign 128
9457.L_ALT_op_int_to_long: /* 0x81 */
9458/* File: arm64/alt_stub.S */
9459/*
9460 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9461 * any interesting requests and then jump to the real instruction
9462 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9463 */
9464 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009465 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9466 adr lr, artMterpAsmInstructionStart + (129 * 128) // Addr of primary handler.
9467 mov x0, xSELF
9468 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009469 mov x2, xPC
9470 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009471
9472/* ------------------------------ */
9473 .balign 128
9474.L_ALT_op_int_to_float: /* 0x82 */
9475/* File: arm64/alt_stub.S */
9476/*
9477 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9478 * any interesting requests and then jump to the real instruction
9479 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9480 */
9481 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009482 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9483 adr lr, artMterpAsmInstructionStart + (130 * 128) // Addr of primary handler.
9484 mov x0, xSELF
9485 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009486 mov x2, xPC
9487 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009488
9489/* ------------------------------ */
9490 .balign 128
9491.L_ALT_op_int_to_double: /* 0x83 */
9492/* File: arm64/alt_stub.S */
9493/*
9494 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9495 * any interesting requests and then jump to the real instruction
9496 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9497 */
9498 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009499 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9500 adr lr, artMterpAsmInstructionStart + (131 * 128) // Addr of primary handler.
9501 mov x0, xSELF
9502 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009503 mov x2, xPC
9504 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009505
9506/* ------------------------------ */
9507 .balign 128
9508.L_ALT_op_long_to_int: /* 0x84 */
9509/* File: arm64/alt_stub.S */
9510/*
9511 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9512 * any interesting requests and then jump to the real instruction
9513 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9514 */
9515 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009516 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9517 adr lr, artMterpAsmInstructionStart + (132 * 128) // Addr of primary handler.
9518 mov x0, xSELF
9519 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009520 mov x2, xPC
9521 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009522
9523/* ------------------------------ */
9524 .balign 128
9525.L_ALT_op_long_to_float: /* 0x85 */
9526/* File: arm64/alt_stub.S */
9527/*
9528 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9529 * any interesting requests and then jump to the real instruction
9530 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9531 */
9532 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009533 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9534 adr lr, artMterpAsmInstructionStart + (133 * 128) // Addr of primary handler.
9535 mov x0, xSELF
9536 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009537 mov x2, xPC
9538 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009539
9540/* ------------------------------ */
9541 .balign 128
9542.L_ALT_op_long_to_double: /* 0x86 */
9543/* File: arm64/alt_stub.S */
9544/*
9545 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9546 * any interesting requests and then jump to the real instruction
9547 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9548 */
9549 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009550 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9551 adr lr, artMterpAsmInstructionStart + (134 * 128) // Addr of primary handler.
9552 mov x0, xSELF
9553 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009554 mov x2, xPC
9555 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009556
9557/* ------------------------------ */
9558 .balign 128
9559.L_ALT_op_float_to_int: /* 0x87 */
9560/* File: arm64/alt_stub.S */
9561/*
9562 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9563 * any interesting requests and then jump to the real instruction
9564 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9565 */
9566 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009567 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9568 adr lr, artMterpAsmInstructionStart + (135 * 128) // Addr of primary handler.
9569 mov x0, xSELF
9570 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009571 mov x2, xPC
9572 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009573
9574/* ------------------------------ */
9575 .balign 128
9576.L_ALT_op_float_to_long: /* 0x88 */
9577/* File: arm64/alt_stub.S */
9578/*
9579 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9580 * any interesting requests and then jump to the real instruction
9581 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9582 */
9583 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009584 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9585 adr lr, artMterpAsmInstructionStart + (136 * 128) // Addr of primary handler.
9586 mov x0, xSELF
9587 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009588 mov x2, xPC
9589 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009590
9591/* ------------------------------ */
9592 .balign 128
9593.L_ALT_op_float_to_double: /* 0x89 */
9594/* File: arm64/alt_stub.S */
9595/*
9596 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9597 * any interesting requests and then jump to the real instruction
9598 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9599 */
9600 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009601 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9602 adr lr, artMterpAsmInstructionStart + (137 * 128) // Addr of primary handler.
9603 mov x0, xSELF
9604 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009605 mov x2, xPC
9606 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009607
9608/* ------------------------------ */
9609 .balign 128
9610.L_ALT_op_double_to_int: /* 0x8a */
9611/* File: arm64/alt_stub.S */
9612/*
9613 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9614 * any interesting requests and then jump to the real instruction
9615 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9616 */
9617 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009618 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9619 adr lr, artMterpAsmInstructionStart + (138 * 128) // Addr of primary handler.
9620 mov x0, xSELF
9621 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009622 mov x2, xPC
9623 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009624
9625/* ------------------------------ */
9626 .balign 128
9627.L_ALT_op_double_to_long: /* 0x8b */
9628/* File: arm64/alt_stub.S */
9629/*
9630 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9631 * any interesting requests and then jump to the real instruction
9632 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9633 */
9634 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009635 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9636 adr lr, artMterpAsmInstructionStart + (139 * 128) // Addr of primary handler.
9637 mov x0, xSELF
9638 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009639 mov x2, xPC
9640 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009641
9642/* ------------------------------ */
9643 .balign 128
9644.L_ALT_op_double_to_float: /* 0x8c */
9645/* File: arm64/alt_stub.S */
9646/*
9647 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9648 * any interesting requests and then jump to the real instruction
9649 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9650 */
9651 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009652 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9653 adr lr, artMterpAsmInstructionStart + (140 * 128) // Addr of primary handler.
9654 mov x0, xSELF
9655 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009656 mov x2, xPC
9657 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009658
9659/* ------------------------------ */
9660 .balign 128
9661.L_ALT_op_int_to_byte: /* 0x8d */
9662/* File: arm64/alt_stub.S */
9663/*
9664 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9665 * any interesting requests and then jump to the real instruction
9666 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9667 */
9668 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009669 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9670 adr lr, artMterpAsmInstructionStart + (141 * 128) // Addr of primary handler.
9671 mov x0, xSELF
9672 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009673 mov x2, xPC
9674 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009675
9676/* ------------------------------ */
9677 .balign 128
9678.L_ALT_op_int_to_char: /* 0x8e */
9679/* File: arm64/alt_stub.S */
9680/*
9681 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9682 * any interesting requests and then jump to the real instruction
9683 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9684 */
9685 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009686 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9687 adr lr, artMterpAsmInstructionStart + (142 * 128) // Addr of primary handler.
9688 mov x0, xSELF
9689 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009690 mov x2, xPC
9691 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009692
9693/* ------------------------------ */
9694 .balign 128
9695.L_ALT_op_int_to_short: /* 0x8f */
9696/* File: arm64/alt_stub.S */
9697/*
9698 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9699 * any interesting requests and then jump to the real instruction
9700 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9701 */
9702 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009703 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9704 adr lr, artMterpAsmInstructionStart + (143 * 128) // Addr of primary handler.
9705 mov x0, xSELF
9706 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009707 mov x2, xPC
9708 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009709
9710/* ------------------------------ */
9711 .balign 128
9712.L_ALT_op_add_int: /* 0x90 */
9713/* File: arm64/alt_stub.S */
9714/*
9715 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9716 * any interesting requests and then jump to the real instruction
9717 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9718 */
9719 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009720 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9721 adr lr, artMterpAsmInstructionStart + (144 * 128) // Addr of primary handler.
9722 mov x0, xSELF
9723 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009724 mov x2, xPC
9725 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009726
9727/* ------------------------------ */
9728 .balign 128
9729.L_ALT_op_sub_int: /* 0x91 */
9730/* File: arm64/alt_stub.S */
9731/*
9732 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9733 * any interesting requests and then jump to the real instruction
9734 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9735 */
9736 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009737 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9738 adr lr, artMterpAsmInstructionStart + (145 * 128) // Addr of primary handler.
9739 mov x0, xSELF
9740 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009741 mov x2, xPC
9742 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009743
9744/* ------------------------------ */
9745 .balign 128
9746.L_ALT_op_mul_int: /* 0x92 */
9747/* File: arm64/alt_stub.S */
9748/*
9749 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9750 * any interesting requests and then jump to the real instruction
9751 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9752 */
9753 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009754 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9755 adr lr, artMterpAsmInstructionStart + (146 * 128) // Addr of primary handler.
9756 mov x0, xSELF
9757 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009758 mov x2, xPC
9759 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009760
9761/* ------------------------------ */
9762 .balign 128
9763.L_ALT_op_div_int: /* 0x93 */
9764/* File: arm64/alt_stub.S */
9765/*
9766 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9767 * any interesting requests and then jump to the real instruction
9768 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9769 */
9770 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009771 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9772 adr lr, artMterpAsmInstructionStart + (147 * 128) // Addr of primary handler.
9773 mov x0, xSELF
9774 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009775 mov x2, xPC
9776 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009777
9778/* ------------------------------ */
9779 .balign 128
9780.L_ALT_op_rem_int: /* 0x94 */
9781/* File: arm64/alt_stub.S */
9782/*
9783 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9784 * any interesting requests and then jump to the real instruction
9785 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9786 */
9787 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009788 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9789 adr lr, artMterpAsmInstructionStart + (148 * 128) // Addr of primary handler.
9790 mov x0, xSELF
9791 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009792 mov x2, xPC
9793 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009794
9795/* ------------------------------ */
9796 .balign 128
9797.L_ALT_op_and_int: /* 0x95 */
9798/* File: arm64/alt_stub.S */
9799/*
9800 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9801 * any interesting requests and then jump to the real instruction
9802 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9803 */
9804 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009805 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9806 adr lr, artMterpAsmInstructionStart + (149 * 128) // Addr of primary handler.
9807 mov x0, xSELF
9808 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009809 mov x2, xPC
9810 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009811
9812/* ------------------------------ */
9813 .balign 128
9814.L_ALT_op_or_int: /* 0x96 */
9815/* File: arm64/alt_stub.S */
9816/*
9817 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9818 * any interesting requests and then jump to the real instruction
9819 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9820 */
9821 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009822 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9823 adr lr, artMterpAsmInstructionStart + (150 * 128) // Addr of primary handler.
9824 mov x0, xSELF
9825 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009826 mov x2, xPC
9827 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009828
9829/* ------------------------------ */
9830 .balign 128
9831.L_ALT_op_xor_int: /* 0x97 */
9832/* File: arm64/alt_stub.S */
9833/*
9834 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9835 * any interesting requests and then jump to the real instruction
9836 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9837 */
9838 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009839 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9840 adr lr, artMterpAsmInstructionStart + (151 * 128) // Addr of primary handler.
9841 mov x0, xSELF
9842 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009843 mov x2, xPC
9844 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009845
9846/* ------------------------------ */
9847 .balign 128
9848.L_ALT_op_shl_int: /* 0x98 */
9849/* File: arm64/alt_stub.S */
9850/*
9851 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9852 * any interesting requests and then jump to the real instruction
9853 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9854 */
9855 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009856 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9857 adr lr, artMterpAsmInstructionStart + (152 * 128) // Addr of primary handler.
9858 mov x0, xSELF
9859 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009860 mov x2, xPC
9861 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009862
9863/* ------------------------------ */
9864 .balign 128
9865.L_ALT_op_shr_int: /* 0x99 */
9866/* File: arm64/alt_stub.S */
9867/*
9868 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9869 * any interesting requests and then jump to the real instruction
9870 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9871 */
9872 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009873 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9874 adr lr, artMterpAsmInstructionStart + (153 * 128) // Addr of primary handler.
9875 mov x0, xSELF
9876 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009877 mov x2, xPC
9878 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009879
9880/* ------------------------------ */
9881 .balign 128
9882.L_ALT_op_ushr_int: /* 0x9a */
9883/* File: arm64/alt_stub.S */
9884/*
9885 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9886 * any interesting requests and then jump to the real instruction
9887 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9888 */
9889 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009890 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9891 adr lr, artMterpAsmInstructionStart + (154 * 128) // Addr of primary handler.
9892 mov x0, xSELF
9893 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009894 mov x2, xPC
9895 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009896
9897/* ------------------------------ */
9898 .balign 128
9899.L_ALT_op_add_long: /* 0x9b */
9900/* File: arm64/alt_stub.S */
9901/*
9902 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9903 * any interesting requests and then jump to the real instruction
9904 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9905 */
9906 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009907 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9908 adr lr, artMterpAsmInstructionStart + (155 * 128) // Addr of primary handler.
9909 mov x0, xSELF
9910 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009911 mov x2, xPC
9912 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009913
9914/* ------------------------------ */
9915 .balign 128
9916.L_ALT_op_sub_long: /* 0x9c */
9917/* File: arm64/alt_stub.S */
9918/*
9919 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9920 * any interesting requests and then jump to the real instruction
9921 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9922 */
9923 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009924 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9925 adr lr, artMterpAsmInstructionStart + (156 * 128) // Addr of primary handler.
9926 mov x0, xSELF
9927 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009928 mov x2, xPC
9929 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009930
9931/* ------------------------------ */
9932 .balign 128
9933.L_ALT_op_mul_long: /* 0x9d */
9934/* File: arm64/alt_stub.S */
9935/*
9936 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9937 * any interesting requests and then jump to the real instruction
9938 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9939 */
9940 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009941 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9942 adr lr, artMterpAsmInstructionStart + (157 * 128) // Addr of primary handler.
9943 mov x0, xSELF
9944 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009945 mov x2, xPC
9946 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009947
9948/* ------------------------------ */
9949 .balign 128
9950.L_ALT_op_div_long: /* 0x9e */
9951/* File: arm64/alt_stub.S */
9952/*
9953 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9954 * any interesting requests and then jump to the real instruction
9955 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9956 */
9957 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009958 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9959 adr lr, artMterpAsmInstructionStart + (158 * 128) // Addr of primary handler.
9960 mov x0, xSELF
9961 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009962 mov x2, xPC
9963 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009964
9965/* ------------------------------ */
9966 .balign 128
9967.L_ALT_op_rem_long: /* 0x9f */
9968/* File: arm64/alt_stub.S */
9969/*
9970 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9971 * any interesting requests and then jump to the real instruction
9972 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9973 */
9974 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009975 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9976 adr lr, artMterpAsmInstructionStart + (159 * 128) // Addr of primary handler.
9977 mov x0, xSELF
9978 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009979 mov x2, xPC
9980 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009981
9982/* ------------------------------ */
9983 .balign 128
9984.L_ALT_op_and_long: /* 0xa0 */
9985/* File: arm64/alt_stub.S */
9986/*
9987 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9988 * any interesting requests and then jump to the real instruction
9989 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9990 */
9991 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009992 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
9993 adr lr, artMterpAsmInstructionStart + (160 * 128) // Addr of primary handler.
9994 mov x0, xSELF
9995 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +00009996 mov x2, xPC
9997 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +00009998
9999/* ------------------------------ */
10000 .balign 128
10001.L_ALT_op_or_long: /* 0xa1 */
10002/* File: arm64/alt_stub.S */
10003/*
10004 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10005 * any interesting requests and then jump to the real instruction
10006 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10007 */
10008 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010009 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10010 adr lr, artMterpAsmInstructionStart + (161 * 128) // Addr of primary handler.
10011 mov x0, xSELF
10012 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010013 mov x2, xPC
10014 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010015
10016/* ------------------------------ */
10017 .balign 128
10018.L_ALT_op_xor_long: /* 0xa2 */
10019/* File: arm64/alt_stub.S */
10020/*
10021 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10022 * any interesting requests and then jump to the real instruction
10023 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10024 */
10025 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010026 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10027 adr lr, artMterpAsmInstructionStart + (162 * 128) // Addr of primary handler.
10028 mov x0, xSELF
10029 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010030 mov x2, xPC
10031 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010032
10033/* ------------------------------ */
10034 .balign 128
10035.L_ALT_op_shl_long: /* 0xa3 */
10036/* File: arm64/alt_stub.S */
10037/*
10038 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10039 * any interesting requests and then jump to the real instruction
10040 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10041 */
10042 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010043 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10044 adr lr, artMterpAsmInstructionStart + (163 * 128) // Addr of primary handler.
10045 mov x0, xSELF
10046 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010047 mov x2, xPC
10048 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010049
10050/* ------------------------------ */
10051 .balign 128
10052.L_ALT_op_shr_long: /* 0xa4 */
10053/* File: arm64/alt_stub.S */
10054/*
10055 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10056 * any interesting requests and then jump to the real instruction
10057 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10058 */
10059 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010060 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10061 adr lr, artMterpAsmInstructionStart + (164 * 128) // Addr of primary handler.
10062 mov x0, xSELF
10063 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010064 mov x2, xPC
10065 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010066
10067/* ------------------------------ */
10068 .balign 128
10069.L_ALT_op_ushr_long: /* 0xa5 */
10070/* File: arm64/alt_stub.S */
10071/*
10072 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10073 * any interesting requests and then jump to the real instruction
10074 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10075 */
10076 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010077 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10078 adr lr, artMterpAsmInstructionStart + (165 * 128) // Addr of primary handler.
10079 mov x0, xSELF
10080 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010081 mov x2, xPC
10082 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010083
10084/* ------------------------------ */
10085 .balign 128
10086.L_ALT_op_add_float: /* 0xa6 */
10087/* File: arm64/alt_stub.S */
10088/*
10089 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10090 * any interesting requests and then jump to the real instruction
10091 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10092 */
10093 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010094 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10095 adr lr, artMterpAsmInstructionStart + (166 * 128) // Addr of primary handler.
10096 mov x0, xSELF
10097 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010098 mov x2, xPC
10099 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010100
10101/* ------------------------------ */
10102 .balign 128
10103.L_ALT_op_sub_float: /* 0xa7 */
10104/* File: arm64/alt_stub.S */
10105/*
10106 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10107 * any interesting requests and then jump to the real instruction
10108 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10109 */
10110 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010111 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10112 adr lr, artMterpAsmInstructionStart + (167 * 128) // Addr of primary handler.
10113 mov x0, xSELF
10114 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010115 mov x2, xPC
10116 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010117
10118/* ------------------------------ */
10119 .balign 128
10120.L_ALT_op_mul_float: /* 0xa8 */
10121/* File: arm64/alt_stub.S */
10122/*
10123 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10124 * any interesting requests and then jump to the real instruction
10125 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10126 */
10127 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010128 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10129 adr lr, artMterpAsmInstructionStart + (168 * 128) // Addr of primary handler.
10130 mov x0, xSELF
10131 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010132 mov x2, xPC
10133 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010134
10135/* ------------------------------ */
10136 .balign 128
10137.L_ALT_op_div_float: /* 0xa9 */
10138/* File: arm64/alt_stub.S */
10139/*
10140 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10141 * any interesting requests and then jump to the real instruction
10142 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10143 */
10144 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010145 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10146 adr lr, artMterpAsmInstructionStart + (169 * 128) // Addr of primary handler.
10147 mov x0, xSELF
10148 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010149 mov x2, xPC
10150 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010151
10152/* ------------------------------ */
10153 .balign 128
10154.L_ALT_op_rem_float: /* 0xaa */
10155/* File: arm64/alt_stub.S */
10156/*
10157 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10158 * any interesting requests and then jump to the real instruction
10159 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10160 */
10161 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010162 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10163 adr lr, artMterpAsmInstructionStart + (170 * 128) // Addr of primary handler.
10164 mov x0, xSELF
10165 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010166 mov x2, xPC
10167 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010168
10169/* ------------------------------ */
10170 .balign 128
10171.L_ALT_op_add_double: /* 0xab */
10172/* File: arm64/alt_stub.S */
10173/*
10174 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10175 * any interesting requests and then jump to the real instruction
10176 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10177 */
10178 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010179 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10180 adr lr, artMterpAsmInstructionStart + (171 * 128) // Addr of primary handler.
10181 mov x0, xSELF
10182 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010183 mov x2, xPC
10184 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010185
10186/* ------------------------------ */
10187 .balign 128
10188.L_ALT_op_sub_double: /* 0xac */
10189/* File: arm64/alt_stub.S */
10190/*
10191 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10192 * any interesting requests and then jump to the real instruction
10193 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10194 */
10195 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010196 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10197 adr lr, artMterpAsmInstructionStart + (172 * 128) // Addr of primary handler.
10198 mov x0, xSELF
10199 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010200 mov x2, xPC
10201 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010202
10203/* ------------------------------ */
10204 .balign 128
10205.L_ALT_op_mul_double: /* 0xad */
10206/* File: arm64/alt_stub.S */
10207/*
10208 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10209 * any interesting requests and then jump to the real instruction
10210 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10211 */
10212 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010213 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10214 adr lr, artMterpAsmInstructionStart + (173 * 128) // Addr of primary handler.
10215 mov x0, xSELF
10216 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010217 mov x2, xPC
10218 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010219
10220/* ------------------------------ */
10221 .balign 128
10222.L_ALT_op_div_double: /* 0xae */
10223/* File: arm64/alt_stub.S */
10224/*
10225 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10226 * any interesting requests and then jump to the real instruction
10227 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10228 */
10229 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010230 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10231 adr lr, artMterpAsmInstructionStart + (174 * 128) // Addr of primary handler.
10232 mov x0, xSELF
10233 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010234 mov x2, xPC
10235 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010236
10237/* ------------------------------ */
10238 .balign 128
10239.L_ALT_op_rem_double: /* 0xaf */
10240/* File: arm64/alt_stub.S */
10241/*
10242 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10243 * any interesting requests and then jump to the real instruction
10244 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10245 */
10246 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010247 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10248 adr lr, artMterpAsmInstructionStart + (175 * 128) // Addr of primary handler.
10249 mov x0, xSELF
10250 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010251 mov x2, xPC
10252 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010253
10254/* ------------------------------ */
10255 .balign 128
10256.L_ALT_op_add_int_2addr: /* 0xb0 */
10257/* File: arm64/alt_stub.S */
10258/*
10259 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10260 * any interesting requests and then jump to the real instruction
10261 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10262 */
10263 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010264 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10265 adr lr, artMterpAsmInstructionStart + (176 * 128) // Addr of primary handler.
10266 mov x0, xSELF
10267 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010268 mov x2, xPC
10269 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010270
10271/* ------------------------------ */
10272 .balign 128
10273.L_ALT_op_sub_int_2addr: /* 0xb1 */
10274/* File: arm64/alt_stub.S */
10275/*
10276 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10277 * any interesting requests and then jump to the real instruction
10278 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10279 */
10280 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010281 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10282 adr lr, artMterpAsmInstructionStart + (177 * 128) // Addr of primary handler.
10283 mov x0, xSELF
10284 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010285 mov x2, xPC
10286 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010287
10288/* ------------------------------ */
10289 .balign 128
10290.L_ALT_op_mul_int_2addr: /* 0xb2 */
10291/* File: arm64/alt_stub.S */
10292/*
10293 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10294 * any interesting requests and then jump to the real instruction
10295 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10296 */
10297 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010298 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10299 adr lr, artMterpAsmInstructionStart + (178 * 128) // Addr of primary handler.
10300 mov x0, xSELF
10301 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010302 mov x2, xPC
10303 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010304
10305/* ------------------------------ */
10306 .balign 128
10307.L_ALT_op_div_int_2addr: /* 0xb3 */
10308/* File: arm64/alt_stub.S */
10309/*
10310 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10311 * any interesting requests and then jump to the real instruction
10312 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10313 */
10314 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010315 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10316 adr lr, artMterpAsmInstructionStart + (179 * 128) // Addr of primary handler.
10317 mov x0, xSELF
10318 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010319 mov x2, xPC
10320 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010321
10322/* ------------------------------ */
10323 .balign 128
10324.L_ALT_op_rem_int_2addr: /* 0xb4 */
10325/* File: arm64/alt_stub.S */
10326/*
10327 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10328 * any interesting requests and then jump to the real instruction
10329 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10330 */
10331 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010332 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10333 adr lr, artMterpAsmInstructionStart + (180 * 128) // Addr of primary handler.
10334 mov x0, xSELF
10335 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010336 mov x2, xPC
10337 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010338
10339/* ------------------------------ */
10340 .balign 128
10341.L_ALT_op_and_int_2addr: /* 0xb5 */
10342/* File: arm64/alt_stub.S */
10343/*
10344 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10345 * any interesting requests and then jump to the real instruction
10346 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10347 */
10348 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010349 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10350 adr lr, artMterpAsmInstructionStart + (181 * 128) // Addr of primary handler.
10351 mov x0, xSELF
10352 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010353 mov x2, xPC
10354 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010355
10356/* ------------------------------ */
10357 .balign 128
10358.L_ALT_op_or_int_2addr: /* 0xb6 */
10359/* File: arm64/alt_stub.S */
10360/*
10361 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10362 * any interesting requests and then jump to the real instruction
10363 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10364 */
10365 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010366 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10367 adr lr, artMterpAsmInstructionStart + (182 * 128) // Addr of primary handler.
10368 mov x0, xSELF
10369 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010370 mov x2, xPC
10371 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010372
10373/* ------------------------------ */
10374 .balign 128
10375.L_ALT_op_xor_int_2addr: /* 0xb7 */
10376/* File: arm64/alt_stub.S */
10377/*
10378 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10379 * any interesting requests and then jump to the real instruction
10380 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10381 */
10382 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010383 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10384 adr lr, artMterpAsmInstructionStart + (183 * 128) // Addr of primary handler.
10385 mov x0, xSELF
10386 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010387 mov x2, xPC
10388 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010389
10390/* ------------------------------ */
10391 .balign 128
10392.L_ALT_op_shl_int_2addr: /* 0xb8 */
10393/* File: arm64/alt_stub.S */
10394/*
10395 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10396 * any interesting requests and then jump to the real instruction
10397 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10398 */
10399 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010400 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10401 adr lr, artMterpAsmInstructionStart + (184 * 128) // Addr of primary handler.
10402 mov x0, xSELF
10403 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010404 mov x2, xPC
10405 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010406
10407/* ------------------------------ */
10408 .balign 128
10409.L_ALT_op_shr_int_2addr: /* 0xb9 */
10410/* File: arm64/alt_stub.S */
10411/*
10412 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10413 * any interesting requests and then jump to the real instruction
10414 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10415 */
10416 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010417 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10418 adr lr, artMterpAsmInstructionStart + (185 * 128) // Addr of primary handler.
10419 mov x0, xSELF
10420 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010421 mov x2, xPC
10422 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010423
10424/* ------------------------------ */
10425 .balign 128
10426.L_ALT_op_ushr_int_2addr: /* 0xba */
10427/* File: arm64/alt_stub.S */
10428/*
10429 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10430 * any interesting requests and then jump to the real instruction
10431 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10432 */
10433 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010434 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10435 adr lr, artMterpAsmInstructionStart + (186 * 128) // Addr of primary handler.
10436 mov x0, xSELF
10437 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010438 mov x2, xPC
10439 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010440
10441/* ------------------------------ */
10442 .balign 128
10443.L_ALT_op_add_long_2addr: /* 0xbb */
10444/* File: arm64/alt_stub.S */
10445/*
10446 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10447 * any interesting requests and then jump to the real instruction
10448 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10449 */
10450 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010451 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10452 adr lr, artMterpAsmInstructionStart + (187 * 128) // Addr of primary handler.
10453 mov x0, xSELF
10454 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010455 mov x2, xPC
10456 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010457
10458/* ------------------------------ */
10459 .balign 128
10460.L_ALT_op_sub_long_2addr: /* 0xbc */
10461/* File: arm64/alt_stub.S */
10462/*
10463 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10464 * any interesting requests and then jump to the real instruction
10465 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10466 */
10467 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010468 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10469 adr lr, artMterpAsmInstructionStart + (188 * 128) // Addr of primary handler.
10470 mov x0, xSELF
10471 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010472 mov x2, xPC
10473 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010474
10475/* ------------------------------ */
10476 .balign 128
10477.L_ALT_op_mul_long_2addr: /* 0xbd */
10478/* File: arm64/alt_stub.S */
10479/*
10480 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10481 * any interesting requests and then jump to the real instruction
10482 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10483 */
10484 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010485 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10486 adr lr, artMterpAsmInstructionStart + (189 * 128) // Addr of primary handler.
10487 mov x0, xSELF
10488 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010489 mov x2, xPC
10490 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010491
10492/* ------------------------------ */
10493 .balign 128
10494.L_ALT_op_div_long_2addr: /* 0xbe */
10495/* File: arm64/alt_stub.S */
10496/*
10497 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10498 * any interesting requests and then jump to the real instruction
10499 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10500 */
10501 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010502 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10503 adr lr, artMterpAsmInstructionStart + (190 * 128) // Addr of primary handler.
10504 mov x0, xSELF
10505 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010506 mov x2, xPC
10507 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010508
10509/* ------------------------------ */
10510 .balign 128
10511.L_ALT_op_rem_long_2addr: /* 0xbf */
10512/* File: arm64/alt_stub.S */
10513/*
10514 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10515 * any interesting requests and then jump to the real instruction
10516 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10517 */
10518 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010519 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10520 adr lr, artMterpAsmInstructionStart + (191 * 128) // Addr of primary handler.
10521 mov x0, xSELF
10522 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010523 mov x2, xPC
10524 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010525
10526/* ------------------------------ */
10527 .balign 128
10528.L_ALT_op_and_long_2addr: /* 0xc0 */
10529/* File: arm64/alt_stub.S */
10530/*
10531 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10532 * any interesting requests and then jump to the real instruction
10533 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10534 */
10535 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010536 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10537 adr lr, artMterpAsmInstructionStart + (192 * 128) // Addr of primary handler.
10538 mov x0, xSELF
10539 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010540 mov x2, xPC
10541 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010542
10543/* ------------------------------ */
10544 .balign 128
10545.L_ALT_op_or_long_2addr: /* 0xc1 */
10546/* File: arm64/alt_stub.S */
10547/*
10548 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10549 * any interesting requests and then jump to the real instruction
10550 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10551 */
10552 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010553 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10554 adr lr, artMterpAsmInstructionStart + (193 * 128) // Addr of primary handler.
10555 mov x0, xSELF
10556 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010557 mov x2, xPC
10558 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010559
10560/* ------------------------------ */
10561 .balign 128
10562.L_ALT_op_xor_long_2addr: /* 0xc2 */
10563/* File: arm64/alt_stub.S */
10564/*
10565 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10566 * any interesting requests and then jump to the real instruction
10567 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10568 */
10569 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010570 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10571 adr lr, artMterpAsmInstructionStart + (194 * 128) // Addr of primary handler.
10572 mov x0, xSELF
10573 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010574 mov x2, xPC
10575 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010576
10577/* ------------------------------ */
10578 .balign 128
10579.L_ALT_op_shl_long_2addr: /* 0xc3 */
10580/* File: arm64/alt_stub.S */
10581/*
10582 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10583 * any interesting requests and then jump to the real instruction
10584 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10585 */
10586 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010587 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10588 adr lr, artMterpAsmInstructionStart + (195 * 128) // Addr of primary handler.
10589 mov x0, xSELF
10590 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010591 mov x2, xPC
10592 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010593
10594/* ------------------------------ */
10595 .balign 128
10596.L_ALT_op_shr_long_2addr: /* 0xc4 */
10597/* File: arm64/alt_stub.S */
10598/*
10599 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10600 * any interesting requests and then jump to the real instruction
10601 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10602 */
10603 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010604 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10605 adr lr, artMterpAsmInstructionStart + (196 * 128) // Addr of primary handler.
10606 mov x0, xSELF
10607 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010608 mov x2, xPC
10609 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010610
10611/* ------------------------------ */
10612 .balign 128
10613.L_ALT_op_ushr_long_2addr: /* 0xc5 */
10614/* File: arm64/alt_stub.S */
10615/*
10616 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10617 * any interesting requests and then jump to the real instruction
10618 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10619 */
10620 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010621 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10622 adr lr, artMterpAsmInstructionStart + (197 * 128) // Addr of primary handler.
10623 mov x0, xSELF
10624 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010625 mov x2, xPC
10626 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010627
10628/* ------------------------------ */
10629 .balign 128
10630.L_ALT_op_add_float_2addr: /* 0xc6 */
10631/* File: arm64/alt_stub.S */
10632/*
10633 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10634 * any interesting requests and then jump to the real instruction
10635 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10636 */
10637 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010638 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10639 adr lr, artMterpAsmInstructionStart + (198 * 128) // Addr of primary handler.
10640 mov x0, xSELF
10641 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010642 mov x2, xPC
10643 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010644
10645/* ------------------------------ */
10646 .balign 128
10647.L_ALT_op_sub_float_2addr: /* 0xc7 */
10648/* File: arm64/alt_stub.S */
10649/*
10650 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10651 * any interesting requests and then jump to the real instruction
10652 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10653 */
10654 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010655 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10656 adr lr, artMterpAsmInstructionStart + (199 * 128) // Addr of primary handler.
10657 mov x0, xSELF
10658 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010659 mov x2, xPC
10660 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010661
10662/* ------------------------------ */
10663 .balign 128
10664.L_ALT_op_mul_float_2addr: /* 0xc8 */
10665/* File: arm64/alt_stub.S */
10666/*
10667 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10668 * any interesting requests and then jump to the real instruction
10669 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10670 */
10671 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010672 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10673 adr lr, artMterpAsmInstructionStart + (200 * 128) // Addr of primary handler.
10674 mov x0, xSELF
10675 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010676 mov x2, xPC
10677 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010678
10679/* ------------------------------ */
10680 .balign 128
10681.L_ALT_op_div_float_2addr: /* 0xc9 */
10682/* File: arm64/alt_stub.S */
10683/*
10684 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10685 * any interesting requests and then jump to the real instruction
10686 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10687 */
10688 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010689 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10690 adr lr, artMterpAsmInstructionStart + (201 * 128) // Addr of primary handler.
10691 mov x0, xSELF
10692 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010693 mov x2, xPC
10694 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010695
10696/* ------------------------------ */
10697 .balign 128
10698.L_ALT_op_rem_float_2addr: /* 0xca */
10699/* File: arm64/alt_stub.S */
10700/*
10701 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10702 * any interesting requests and then jump to the real instruction
10703 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10704 */
10705 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010706 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10707 adr lr, artMterpAsmInstructionStart + (202 * 128) // Addr of primary handler.
10708 mov x0, xSELF
10709 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010710 mov x2, xPC
10711 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010712
10713/* ------------------------------ */
10714 .balign 128
10715.L_ALT_op_add_double_2addr: /* 0xcb */
10716/* File: arm64/alt_stub.S */
10717/*
10718 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10719 * any interesting requests and then jump to the real instruction
10720 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10721 */
10722 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010723 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10724 adr lr, artMterpAsmInstructionStart + (203 * 128) // Addr of primary handler.
10725 mov x0, xSELF
10726 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010727 mov x2, xPC
10728 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010729
10730/* ------------------------------ */
10731 .balign 128
10732.L_ALT_op_sub_double_2addr: /* 0xcc */
10733/* File: arm64/alt_stub.S */
10734/*
10735 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10736 * any interesting requests and then jump to the real instruction
10737 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10738 */
10739 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010740 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10741 adr lr, artMterpAsmInstructionStart + (204 * 128) // Addr of primary handler.
10742 mov x0, xSELF
10743 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010744 mov x2, xPC
10745 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010746
10747/* ------------------------------ */
10748 .balign 128
10749.L_ALT_op_mul_double_2addr: /* 0xcd */
10750/* File: arm64/alt_stub.S */
10751/*
10752 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10753 * any interesting requests and then jump to the real instruction
10754 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10755 */
10756 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010757 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10758 adr lr, artMterpAsmInstructionStart + (205 * 128) // Addr of primary handler.
10759 mov x0, xSELF
10760 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010761 mov x2, xPC
10762 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010763
10764/* ------------------------------ */
10765 .balign 128
10766.L_ALT_op_div_double_2addr: /* 0xce */
10767/* File: arm64/alt_stub.S */
10768/*
10769 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10770 * any interesting requests and then jump to the real instruction
10771 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10772 */
10773 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010774 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10775 adr lr, artMterpAsmInstructionStart + (206 * 128) // Addr of primary handler.
10776 mov x0, xSELF
10777 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010778 mov x2, xPC
10779 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010780
10781/* ------------------------------ */
10782 .balign 128
10783.L_ALT_op_rem_double_2addr: /* 0xcf */
10784/* File: arm64/alt_stub.S */
10785/*
10786 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10787 * any interesting requests and then jump to the real instruction
10788 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10789 */
10790 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010791 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10792 adr lr, artMterpAsmInstructionStart + (207 * 128) // Addr of primary handler.
10793 mov x0, xSELF
10794 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010795 mov x2, xPC
10796 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010797
10798/* ------------------------------ */
10799 .balign 128
10800.L_ALT_op_add_int_lit16: /* 0xd0 */
10801/* File: arm64/alt_stub.S */
10802/*
10803 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10804 * any interesting requests and then jump to the real instruction
10805 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10806 */
10807 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010808 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10809 adr lr, artMterpAsmInstructionStart + (208 * 128) // Addr of primary handler.
10810 mov x0, xSELF
10811 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010812 mov x2, xPC
10813 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010814
10815/* ------------------------------ */
10816 .balign 128
10817.L_ALT_op_rsub_int: /* 0xd1 */
10818/* File: arm64/alt_stub.S */
10819/*
10820 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10821 * any interesting requests and then jump to the real instruction
10822 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10823 */
10824 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010825 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10826 adr lr, artMterpAsmInstructionStart + (209 * 128) // Addr of primary handler.
10827 mov x0, xSELF
10828 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010829 mov x2, xPC
10830 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010831
10832/* ------------------------------ */
10833 .balign 128
10834.L_ALT_op_mul_int_lit16: /* 0xd2 */
10835/* File: arm64/alt_stub.S */
10836/*
10837 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10838 * any interesting requests and then jump to the real instruction
10839 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10840 */
10841 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010842 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10843 adr lr, artMterpAsmInstructionStart + (210 * 128) // Addr of primary handler.
10844 mov x0, xSELF
10845 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010846 mov x2, xPC
10847 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010848
10849/* ------------------------------ */
10850 .balign 128
10851.L_ALT_op_div_int_lit16: /* 0xd3 */
10852/* File: arm64/alt_stub.S */
10853/*
10854 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10855 * any interesting requests and then jump to the real instruction
10856 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10857 */
10858 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010859 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10860 adr lr, artMterpAsmInstructionStart + (211 * 128) // Addr of primary handler.
10861 mov x0, xSELF
10862 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010863 mov x2, xPC
10864 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010865
10866/* ------------------------------ */
10867 .balign 128
10868.L_ALT_op_rem_int_lit16: /* 0xd4 */
10869/* File: arm64/alt_stub.S */
10870/*
10871 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10872 * any interesting requests and then jump to the real instruction
10873 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10874 */
10875 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010876 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10877 adr lr, artMterpAsmInstructionStart + (212 * 128) // Addr of primary handler.
10878 mov x0, xSELF
10879 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010880 mov x2, xPC
10881 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010882
10883/* ------------------------------ */
10884 .balign 128
10885.L_ALT_op_and_int_lit16: /* 0xd5 */
10886/* File: arm64/alt_stub.S */
10887/*
10888 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10889 * any interesting requests and then jump to the real instruction
10890 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10891 */
10892 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010893 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10894 adr lr, artMterpAsmInstructionStart + (213 * 128) // Addr of primary handler.
10895 mov x0, xSELF
10896 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010897 mov x2, xPC
10898 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010899
10900/* ------------------------------ */
10901 .balign 128
10902.L_ALT_op_or_int_lit16: /* 0xd6 */
10903/* File: arm64/alt_stub.S */
10904/*
10905 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10906 * any interesting requests and then jump to the real instruction
10907 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10908 */
10909 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010910 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10911 adr lr, artMterpAsmInstructionStart + (214 * 128) // Addr of primary handler.
10912 mov x0, xSELF
10913 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010914 mov x2, xPC
10915 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010916
10917/* ------------------------------ */
10918 .balign 128
10919.L_ALT_op_xor_int_lit16: /* 0xd7 */
10920/* File: arm64/alt_stub.S */
10921/*
10922 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10923 * any interesting requests and then jump to the real instruction
10924 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10925 */
10926 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010927 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10928 adr lr, artMterpAsmInstructionStart + (215 * 128) // Addr of primary handler.
10929 mov x0, xSELF
10930 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010931 mov x2, xPC
10932 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010933
10934/* ------------------------------ */
10935 .balign 128
10936.L_ALT_op_add_int_lit8: /* 0xd8 */
10937/* File: arm64/alt_stub.S */
10938/*
10939 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10940 * any interesting requests and then jump to the real instruction
10941 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10942 */
10943 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010944 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10945 adr lr, artMterpAsmInstructionStart + (216 * 128) // Addr of primary handler.
10946 mov x0, xSELF
10947 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010948 mov x2, xPC
10949 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010950
10951/* ------------------------------ */
10952 .balign 128
10953.L_ALT_op_rsub_int_lit8: /* 0xd9 */
10954/* File: arm64/alt_stub.S */
10955/*
10956 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10957 * any interesting requests and then jump to the real instruction
10958 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10959 */
10960 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010961 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10962 adr lr, artMterpAsmInstructionStart + (217 * 128) // Addr of primary handler.
10963 mov x0, xSELF
10964 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010965 mov x2, xPC
10966 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010967
10968/* ------------------------------ */
10969 .balign 128
10970.L_ALT_op_mul_int_lit8: /* 0xda */
10971/* File: arm64/alt_stub.S */
10972/*
10973 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10974 * any interesting requests and then jump to the real instruction
10975 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10976 */
10977 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010978 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10979 adr lr, artMterpAsmInstructionStart + (218 * 128) // Addr of primary handler.
10980 mov x0, xSELF
10981 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010982 mov x2, xPC
10983 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010984
10985/* ------------------------------ */
10986 .balign 128
10987.L_ALT_op_div_int_lit8: /* 0xdb */
10988/* File: arm64/alt_stub.S */
10989/*
10990 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10991 * any interesting requests and then jump to the real instruction
10992 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10993 */
10994 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000010995 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
10996 adr lr, artMterpAsmInstructionStart + (219 * 128) // Addr of primary handler.
10997 mov x0, xSELF
10998 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000010999 mov x2, xPC
11000 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011001
11002/* ------------------------------ */
11003 .balign 128
11004.L_ALT_op_rem_int_lit8: /* 0xdc */
11005/* File: arm64/alt_stub.S */
11006/*
11007 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11008 * any interesting requests and then jump to the real instruction
11009 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11010 */
11011 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011012 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11013 adr lr, artMterpAsmInstructionStart + (220 * 128) // Addr of primary handler.
11014 mov x0, xSELF
11015 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011016 mov x2, xPC
11017 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011018
11019/* ------------------------------ */
11020 .balign 128
11021.L_ALT_op_and_int_lit8: /* 0xdd */
11022/* File: arm64/alt_stub.S */
11023/*
11024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11025 * any interesting requests and then jump to the real instruction
11026 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11027 */
11028 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011029 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11030 adr lr, artMterpAsmInstructionStart + (221 * 128) // Addr of primary handler.
11031 mov x0, xSELF
11032 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011033 mov x2, xPC
11034 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011035
11036/* ------------------------------ */
11037 .balign 128
11038.L_ALT_op_or_int_lit8: /* 0xde */
11039/* File: arm64/alt_stub.S */
11040/*
11041 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11042 * any interesting requests and then jump to the real instruction
11043 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11044 */
11045 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011046 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11047 adr lr, artMterpAsmInstructionStart + (222 * 128) // Addr of primary handler.
11048 mov x0, xSELF
11049 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011050 mov x2, xPC
11051 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011052
11053/* ------------------------------ */
11054 .balign 128
11055.L_ALT_op_xor_int_lit8: /* 0xdf */
11056/* File: arm64/alt_stub.S */
11057/*
11058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11059 * any interesting requests and then jump to the real instruction
11060 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11061 */
11062 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011063 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11064 adr lr, artMterpAsmInstructionStart + (223 * 128) // Addr of primary handler.
11065 mov x0, xSELF
11066 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011067 mov x2, xPC
11068 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011069
11070/* ------------------------------ */
11071 .balign 128
11072.L_ALT_op_shl_int_lit8: /* 0xe0 */
11073/* File: arm64/alt_stub.S */
11074/*
11075 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11076 * any interesting requests and then jump to the real instruction
11077 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11078 */
11079 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011080 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11081 adr lr, artMterpAsmInstructionStart + (224 * 128) // Addr of primary handler.
11082 mov x0, xSELF
11083 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011084 mov x2, xPC
11085 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011086
11087/* ------------------------------ */
11088 .balign 128
11089.L_ALT_op_shr_int_lit8: /* 0xe1 */
11090/* File: arm64/alt_stub.S */
11091/*
11092 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11093 * any interesting requests and then jump to the real instruction
11094 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11095 */
11096 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011097 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11098 adr lr, artMterpAsmInstructionStart + (225 * 128) // Addr of primary handler.
11099 mov x0, xSELF
11100 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011101 mov x2, xPC
11102 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011103
11104/* ------------------------------ */
11105 .balign 128
11106.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11107/* File: arm64/alt_stub.S */
11108/*
11109 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11110 * any interesting requests and then jump to the real instruction
11111 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11112 */
11113 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011114 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11115 adr lr, artMterpAsmInstructionStart + (226 * 128) // Addr of primary handler.
11116 mov x0, xSELF
11117 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011118 mov x2, xPC
11119 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011120
11121/* ------------------------------ */
11122 .balign 128
11123.L_ALT_op_iget_quick: /* 0xe3 */
11124/* File: arm64/alt_stub.S */
11125/*
11126 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11127 * any interesting requests and then jump to the real instruction
11128 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11129 */
11130 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011131 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11132 adr lr, artMterpAsmInstructionStart + (227 * 128) // Addr of primary handler.
11133 mov x0, xSELF
11134 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011135 mov x2, xPC
11136 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011137
11138/* ------------------------------ */
11139 .balign 128
11140.L_ALT_op_iget_wide_quick: /* 0xe4 */
11141/* File: arm64/alt_stub.S */
11142/*
11143 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11144 * any interesting requests and then jump to the real instruction
11145 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11146 */
11147 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011148 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11149 adr lr, artMterpAsmInstructionStart + (228 * 128) // Addr of primary handler.
11150 mov x0, xSELF
11151 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011152 mov x2, xPC
11153 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011154
11155/* ------------------------------ */
11156 .balign 128
11157.L_ALT_op_iget_object_quick: /* 0xe5 */
11158/* File: arm64/alt_stub.S */
11159/*
11160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11161 * any interesting requests and then jump to the real instruction
11162 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11163 */
11164 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011165 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11166 adr lr, artMterpAsmInstructionStart + (229 * 128) // Addr of primary handler.
11167 mov x0, xSELF
11168 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011169 mov x2, xPC
11170 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011171
11172/* ------------------------------ */
11173 .balign 128
11174.L_ALT_op_iput_quick: /* 0xe6 */
11175/* File: arm64/alt_stub.S */
11176/*
11177 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11178 * any interesting requests and then jump to the real instruction
11179 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11180 */
11181 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011182 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11183 adr lr, artMterpAsmInstructionStart + (230 * 128) // Addr of primary handler.
11184 mov x0, xSELF
11185 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011186 mov x2, xPC
11187 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011188
11189/* ------------------------------ */
11190 .balign 128
11191.L_ALT_op_iput_wide_quick: /* 0xe7 */
11192/* File: arm64/alt_stub.S */
11193/*
11194 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11195 * any interesting requests and then jump to the real instruction
11196 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11197 */
11198 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011199 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11200 adr lr, artMterpAsmInstructionStart + (231 * 128) // Addr of primary handler.
11201 mov x0, xSELF
11202 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011203 mov x2, xPC
11204 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011205
11206/* ------------------------------ */
11207 .balign 128
11208.L_ALT_op_iput_object_quick: /* 0xe8 */
11209/* File: arm64/alt_stub.S */
11210/*
11211 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11212 * any interesting requests and then jump to the real instruction
11213 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11214 */
11215 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011216 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11217 adr lr, artMterpAsmInstructionStart + (232 * 128) // Addr of primary handler.
11218 mov x0, xSELF
11219 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011220 mov x2, xPC
11221 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011222
11223/* ------------------------------ */
11224 .balign 128
11225.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11226/* File: arm64/alt_stub.S */
11227/*
11228 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11229 * any interesting requests and then jump to the real instruction
11230 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11231 */
11232 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011233 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11234 adr lr, artMterpAsmInstructionStart + (233 * 128) // Addr of primary handler.
11235 mov x0, xSELF
11236 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011237 mov x2, xPC
11238 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011239
11240/* ------------------------------ */
11241 .balign 128
11242.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11243/* File: arm64/alt_stub.S */
11244/*
11245 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11246 * any interesting requests and then jump to the real instruction
11247 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11248 */
11249 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011250 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11251 adr lr, artMterpAsmInstructionStart + (234 * 128) // Addr of primary handler.
11252 mov x0, xSELF
11253 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011254 mov x2, xPC
11255 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011256
11257/* ------------------------------ */
11258 .balign 128
11259.L_ALT_op_iput_boolean_quick: /* 0xeb */
11260/* File: arm64/alt_stub.S */
11261/*
11262 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11263 * any interesting requests and then jump to the real instruction
11264 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11265 */
11266 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011267 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11268 adr lr, artMterpAsmInstructionStart + (235 * 128) // Addr of primary handler.
11269 mov x0, xSELF
11270 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011271 mov x2, xPC
11272 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011273
11274/* ------------------------------ */
11275 .balign 128
11276.L_ALT_op_iput_byte_quick: /* 0xec */
11277/* File: arm64/alt_stub.S */
11278/*
11279 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11280 * any interesting requests and then jump to the real instruction
11281 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11282 */
11283 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011284 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11285 adr lr, artMterpAsmInstructionStart + (236 * 128) // Addr of primary handler.
11286 mov x0, xSELF
11287 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011288 mov x2, xPC
11289 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011290
11291/* ------------------------------ */
11292 .balign 128
11293.L_ALT_op_iput_char_quick: /* 0xed */
11294/* File: arm64/alt_stub.S */
11295/*
11296 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11297 * any interesting requests and then jump to the real instruction
11298 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11299 */
11300 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011301 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11302 adr lr, artMterpAsmInstructionStart + (237 * 128) // Addr of primary handler.
11303 mov x0, xSELF
11304 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011305 mov x2, xPC
11306 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011307
11308/* ------------------------------ */
11309 .balign 128
11310.L_ALT_op_iput_short_quick: /* 0xee */
11311/* File: arm64/alt_stub.S */
11312/*
11313 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11314 * any interesting requests and then jump to the real instruction
11315 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11316 */
11317 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011318 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11319 adr lr, artMterpAsmInstructionStart + (238 * 128) // Addr of primary handler.
11320 mov x0, xSELF
11321 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011322 mov x2, xPC
11323 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011324
11325/* ------------------------------ */
11326 .balign 128
11327.L_ALT_op_iget_boolean_quick: /* 0xef */
11328/* File: arm64/alt_stub.S */
11329/*
11330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11331 * any interesting requests and then jump to the real instruction
11332 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11333 */
11334 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011335 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11336 adr lr, artMterpAsmInstructionStart + (239 * 128) // Addr of primary handler.
11337 mov x0, xSELF
11338 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011339 mov x2, xPC
11340 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011341
11342/* ------------------------------ */
11343 .balign 128
11344.L_ALT_op_iget_byte_quick: /* 0xf0 */
11345/* File: arm64/alt_stub.S */
11346/*
11347 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11348 * any interesting requests and then jump to the real instruction
11349 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11350 */
11351 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011352 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11353 adr lr, artMterpAsmInstructionStart + (240 * 128) // Addr of primary handler.
11354 mov x0, xSELF
11355 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011356 mov x2, xPC
11357 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011358
11359/* ------------------------------ */
11360 .balign 128
11361.L_ALT_op_iget_char_quick: /* 0xf1 */
11362/* File: arm64/alt_stub.S */
11363/*
11364 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11365 * any interesting requests and then jump to the real instruction
11366 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11367 */
11368 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011369 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11370 adr lr, artMterpAsmInstructionStart + (241 * 128) // Addr of primary handler.
11371 mov x0, xSELF
11372 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011373 mov x2, xPC
11374 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011375
11376/* ------------------------------ */
11377 .balign 128
11378.L_ALT_op_iget_short_quick: /* 0xf2 */
11379/* File: arm64/alt_stub.S */
11380/*
11381 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11382 * any interesting requests and then jump to the real instruction
11383 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11384 */
11385 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011386 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11387 adr lr, artMterpAsmInstructionStart + (242 * 128) // Addr of primary handler.
11388 mov x0, xSELF
11389 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011390 mov x2, xPC
11391 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011392
11393/* ------------------------------ */
11394 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011395.L_ALT_op_unused_f3: /* 0xf3 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011396/* File: arm64/alt_stub.S */
11397/*
11398 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11399 * any interesting requests and then jump to the real instruction
11400 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11401 */
11402 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011403 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11404 adr lr, artMterpAsmInstructionStart + (243 * 128) // Addr of primary handler.
11405 mov x0, xSELF
11406 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011407 mov x2, xPC
11408 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011409
11410/* ------------------------------ */
11411 .balign 128
11412.L_ALT_op_unused_f4: /* 0xf4 */
11413/* File: arm64/alt_stub.S */
11414/*
11415 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11416 * any interesting requests and then jump to the real instruction
11417 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11418 */
11419 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011420 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11421 adr lr, artMterpAsmInstructionStart + (244 * 128) // Addr of primary handler.
11422 mov x0, xSELF
11423 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011424 mov x2, xPC
11425 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011426
11427/* ------------------------------ */
11428 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011429.L_ALT_op_unused_f5: /* 0xf5 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011430/* File: arm64/alt_stub.S */
11431/*
11432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11433 * any interesting requests and then jump to the real instruction
11434 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11435 */
11436 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011437 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11438 adr lr, artMterpAsmInstructionStart + (245 * 128) // Addr of primary handler.
11439 mov x0, xSELF
11440 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011441 mov x2, xPC
11442 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011443
11444/* ------------------------------ */
11445 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011446.L_ALT_op_unused_f6: /* 0xf6 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011447/* File: arm64/alt_stub.S */
11448/*
11449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11450 * any interesting requests and then jump to the real instruction
11451 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11452 */
11453 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011454 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11455 adr lr, artMterpAsmInstructionStart + (246 * 128) // Addr of primary handler.
11456 mov x0, xSELF
11457 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011458 mov x2, xPC
11459 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011460
11461/* ------------------------------ */
11462 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011463.L_ALT_op_unused_f7: /* 0xf7 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011464/* File: arm64/alt_stub.S */
11465/*
11466 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11467 * any interesting requests and then jump to the real instruction
11468 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11469 */
11470 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011471 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11472 adr lr, artMterpAsmInstructionStart + (247 * 128) // Addr of primary handler.
11473 mov x0, xSELF
11474 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011475 mov x2, xPC
11476 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011477
11478/* ------------------------------ */
11479 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011480.L_ALT_op_unused_f8: /* 0xf8 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011481/* File: arm64/alt_stub.S */
11482/*
11483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11484 * any interesting requests and then jump to the real instruction
11485 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11486 */
11487 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011488 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11489 adr lr, artMterpAsmInstructionStart + (248 * 128) // Addr of primary handler.
11490 mov x0, xSELF
11491 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011492 mov x2, xPC
11493 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011494
11495/* ------------------------------ */
11496 .balign 128
Narayan Kamath14832ef2016-08-05 11:44:32 +010011497.L_ALT_op_unused_f9: /* 0xf9 */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011498/* File: arm64/alt_stub.S */
11499/*
11500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11501 * any interesting requests and then jump to the real instruction
11502 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11503 */
11504 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011505 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11506 adr lr, artMterpAsmInstructionStart + (249 * 128) // Addr of primary handler.
11507 mov x0, xSELF
11508 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011509 mov x2, xPC
11510 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011511
11512/* ------------------------------ */
11513 .balign 128
buzbee8a287142016-10-07 12:56:32 -070011514.L_ALT_op_invoke_polymorphic: /* 0xfa */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011515/* File: arm64/alt_stub.S */
11516/*
11517 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11518 * any interesting requests and then jump to the real instruction
11519 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11520 */
11521 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011522 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11523 adr lr, artMterpAsmInstructionStart + (250 * 128) // Addr of primary handler.
11524 mov x0, xSELF
11525 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011526 mov x2, xPC
11527 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011528
11529/* ------------------------------ */
11530 .balign 128
buzbee8a287142016-10-07 12:56:32 -070011531.L_ALT_op_invoke_polymorphic_range: /* 0xfb */
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011532/* File: arm64/alt_stub.S */
11533/*
11534 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11535 * any interesting requests and then jump to the real instruction
11536 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11537 */
11538 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011539 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11540 adr lr, artMterpAsmInstructionStart + (251 * 128) // Addr of primary handler.
11541 mov x0, xSELF
11542 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011543 mov x2, xPC
11544 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011545
11546/* ------------------------------ */
11547 .balign 128
11548.L_ALT_op_unused_fc: /* 0xfc */
11549/* File: arm64/alt_stub.S */
11550/*
11551 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11552 * any interesting requests and then jump to the real instruction
11553 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11554 */
11555 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011556 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11557 adr lr, artMterpAsmInstructionStart + (252 * 128) // Addr of primary handler.
11558 mov x0, xSELF
11559 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011560 mov x2, xPC
11561 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011562
11563/* ------------------------------ */
11564 .balign 128
11565.L_ALT_op_unused_fd: /* 0xfd */
11566/* File: arm64/alt_stub.S */
11567/*
11568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11569 * any interesting requests and then jump to the real instruction
11570 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11571 */
11572 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011573 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11574 adr lr, artMterpAsmInstructionStart + (253 * 128) // Addr of primary handler.
11575 mov x0, xSELF
11576 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011577 mov x2, xPC
11578 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011579
11580/* ------------------------------ */
11581 .balign 128
11582.L_ALT_op_unused_fe: /* 0xfe */
11583/* File: arm64/alt_stub.S */
11584/*
11585 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11586 * any interesting requests and then jump to the real instruction
11587 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11588 */
11589 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011590 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11591 adr lr, artMterpAsmInstructionStart + (254 * 128) // Addr of primary handler.
11592 mov x0, xSELF
11593 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011594 mov x2, xPC
11595 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011596
11597/* ------------------------------ */
11598 .balign 128
11599.L_ALT_op_unused_ff: /* 0xff */
11600/* File: arm64/alt_stub.S */
11601/*
11602 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11603 * any interesting requests and then jump to the real instruction
11604 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11605 */
11606 .extern MterpCheckBefore
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011607 ldr xIBASE, [xSELF, #THREAD_CURRENT_IBASE_OFFSET] // refresh IBASE.
11608 adr lr, artMterpAsmInstructionStart + (255 * 128) // Addr of primary handler.
11609 mov x0, xSELF
11610 add x1, xFP, #OFF_FP_SHADOWFRAME
Bill Buzbeed47fd902016-07-07 14:42:43 +000011611 mov x2, xPC
11612 b MterpCheckBefore // (self, shadow_frame, dex_pc_ptr) Note: tail call.
Bill Buzbee3b0b4b92016-02-02 13:45:36 +000011613
11614 .balign 128
11615 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
11616 .global artMterpAsmAltInstructionEnd
11617artMterpAsmAltInstructionEnd: